Project

General

Profile

Download (42.9 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
	system.inc
5
	part of m0n0wall (http://m0n0.ch/wall)
6

    
7
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
8
	All rights reserved.
9

    
10
	Redistribution and use in source and binary forms, with or without
11
	modification, are permitted provided that the following conditions are met:
12

    
13
	1. Redistributions of source code must retain the above copyright notice,
14
	   this list of conditions and the following disclaimer.
15

    
16
	2. Redistributions in binary form must reproduce the above copyright
17
	   notice, this list of conditions and the following disclaimer in the
18
	   documentation and/or other materials provided with the distribution.
19

    
20
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
21
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
24
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
	POSSIBILITY OF SUCH DAMAGE.
30
*/
31

    
32
/*
33
	pfSense_BUILDER_BINARIES:	/usr/sbin/powerd	/usr/bin/killall	/sbin/sysctl	/sbin/route
34
	pfSense_BUILDER_BINARIES:	/bin/hostname	/bin/ls	/usr/bin/netstat	/usr/sbin/syslogd	
35
	pfSense_BUILDER_BINARIES:	/usr/sbin/pccardd	/usr/local/sbin/lighttpd	/bin/chmod 	/bin/mkdir
36
	pfSense_BUILDER_BINARIES:	/usr/bin/tar		/usr/local/sbin/ntpd	/usr/sbin/ntpdate
37
	pfSense_BUILDER_BINARIES:	/usr/bin/nohup	/sbin/dmesg	/usr/local/sbin/atareinit	/sbin/kldload
38
	pfSense_MODULE:	utils
39
*/
40

    
41
function activate_powerd() {
42
	global $config, $g;
43
	if(isset($config['system']['powerd_enable'])) {
44
		if ($g["platform"] == "nanobsd")
45
			exec("/sbin/kldload cpufreq");
46
		exec("/usr/sbin/powerd -b adp -a adp");
47
	} else {
48
		if(is_process_running("powerd"))
49
			exec("/usr/bin/killall powerd");
50
	}
51
}
52

    
53
function get_default_sysctl_value($id) {
54
	global $sysctls;
55

    
56
	if (isset($sysctls[$id]))
57
		return $sysctls[$id];
58
}
59

    
60
function activate_sysctls() {
61
	global $config, $g;
62
	exec("/sbin/sysctl net.enc.out.ipsec_bpf_mask=0x00000001");
63
	exec("/sbin/sysctl net.enc.out.ipsec_filter_mask=0x00000001");
64
	exec("/sbin/sysctl net.enc.in.ipsec_bpf_mask=0x00000002");
65
	exec("/sbin/sysctl net.enc.in.ipsec_filter_mask=0x00000002");
66

    
67
	if(is_array($config['sysctl'])) {
68
		foreach($config['sysctl']['item'] as $tunable) {
69
			if($tunable['value'] == "default") {
70
				$value = get_default_sysctl_value($tunable['tunable']);
71
				mwexec("/sbin/sysctl " . $tunable['tunable'] . "=\"" . $value .  "\"");
72
			} else { 
73
				mwexec("/sbin/sysctl " . $tunable['tunable'] . "=\"" . $tunable['value'] .  "\"");
74
			}
75
		}
76
	}
77
}
78

    
79
function system_resolvconf_generate($dynupdate = false) {
80
	global $config, $g;
81

    
82
	if(isset($config['system']['developerspew'])) {
83
		$mt = microtime();
84
		echo "system_resolvconf_generate() being called $mt\n";
85
	}
86

    
87
	$syscfg = $config['system'];
88

    
89
	$fd = fopen("{$g['varetc_path']}/resolv.conf", "w");
90
	if (!$fd) {
91
		printf("Error: cannot open resolv.conf in system_resolvconf_generate().\n");
92
		return 1;
93
	}
94

    
95
	$resolvconf = "domain {$syscfg['domain']}\n";
96

    
97
	$havedns = false;
98

    
99
	if (isset($syscfg['dnsallowoverride'])) {
100
		/* get dynamically assigned DNS servers (if any) */
101
		$ns = array_unique(get_searchdomains());
102
		foreach($ns as $searchserver) {
103
			if($searchserver) {
104
				$resolvconf .= "search {$searchserver}\n";
105
				$havedns = true;
106
			}
107
		}
108
		$ns = array_unique(get_nameservers());
109
		foreach($ns as $nameserver) {
110
			if($nameserver) {
111
				$resolvconf .= "nameserver $nameserver\n";
112
				$havedns = true;
113
			}
114
		}
115
	}
116
	if (!$havedns && is_array($syscfg['dnsserver'])) {
117
		foreach ($syscfg['dnsserver'] as $ns) {
118
			if ($ns) {
119
				$resolvconf .= "nameserver $ns\n";
120
				$havedns = true;
121
			}
122
		}
123
	}
124

    
125
	fwrite($fd, $resolvconf);
126
	fclose($fd);
127

    
128
	if (!$g['booting']) {
129
		/* restart dhcpd (nameservers may have changed) */
130
		if (!$dynupdate)
131
			services_dhcpd_configure();
132
	}
133

    
134
	/* setup static routes for DNS servers. */
135
	for ($dnscounter=1; $dnscounter<5; $dnscounter++) {
136
		/* setup static routes for dns servers */
137
		$dnsgw = "dns{$dnscounter}gwint";
138
		if (isset($config['system'][$dnsgw])) {
139
			$interface = $config['system'][$dnsgw];
140
			if (($interface <> "") && ($interface <> "none")) {
141
				$gatewayip = get_interface_gateway($interface);
142
				if(is_ipaddr($gatewayip)) {
143
					/* dns server array starts at 0 */
144
					$dnscountermo = $dnscounter - 1;
145
					mwexec("route delete -host {$syscfg['dnsserver'][$dnscountermo]}", true);
146
					mwexec("route add -host {$syscfg['dnsserver'][$dnscountermo]} {$gatewayip}");
147
				}
148
			}
149
		}
150
	}
151
	
152
	return 0;
153
}
154

    
155
function get_searchdomains() {
156
	global $config, $g;
157

    
158
	$master_list = array();
159
	
160
	// Read in dhclient nameservers
161
	$search_list = split("\n", `/bin/cat /var/etc/searchdomain_* 2>/dev/null`);
162
	if (is_array($search_lists)) {
163
		foreach($search_lists as $dns) {
164
			if(is_hostname($dns)) 
165
				$master_list[] = $dns;
166
		}
167
	}
168

    
169
	return $master_list;
170
}
171

    
172
function get_nameservers() {
173
	global $config, $g;
174
	$master_list = array();
175
	
176
	// Read in dhclient nameservers
177
	$dns_lists = split("\n", `/bin/cat /var/etc/nameserver_* 2>/dev/null`);
178
	if (is_array($dns_lists)) {
179
		foreach($dns_lists as $dns) {
180
			if(is_ipaddr($dns)) 
181
				$master_list[] = $dns;
182
		}
183
	}
184

    
185
	// Read in any extra nameservers
186
	if(file_exists("/var/etc/nameservers.conf")) {
187
		$dns_lists = split("\n", `/bin/cat /var/etc/nameservers.conf`);
188
		if(is_array($dns_s))
189
			foreach($dns_s as $dns)
190
				if (is_ipaddr($dns))
191
					$master_list[] = $dns;
192
	}
193

    
194
	return $master_list;
195
}
196

    
197
function system_hosts_generate() {
198
	global $config, $g;
199
	if(isset($config['system']['developerspew'])) {
200
		$mt = microtime();
201
		echo "system_hosts_generate() being called $mt\n";
202
	}
203

    
204
	$syscfg = $config['system'];
205
	$dnsmasqcfg = $config['dnsmasq'];
206

    
207
	if (!is_array($dnsmasqcfg['hosts'])) {
208
		$dnsmasqcfg['hosts'] = array();
209
	}
210
	$hostscfg = $dnsmasqcfg['hosts'];
211

    
212
	$hosts = "127.0.0.1	localhost localhost.{$syscfg['domain']}\n";
213

    
214
	if ($config['interfaces']['lan']) {
215
		$cfgip = get_interface_ip("lan");
216
		if (is_ipaddr($cfgip))
217
			$hosts .= "{$cfgip}	{$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
218
	} else {
219
		$sysiflist = get_configured_interface_list();
220
		foreach ($sysiflist as $sysif) {
221
			if (!interface_has_gateway($sysif)) {
222
				$cfgip = get_interface_ip($sysif);
223
				if (is_ipaddr($cfgip)) {
224
					$hosts .= "{$cfgip}	{$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
225
					break;
226
				}
227
			}
228
		}
229
	}
230

    
231
	foreach ($hostscfg as $host) {
232
		if ($host['host'])
233
			$hosts .= "{$host['ip']}	{$host['host']}.{$host['domain']} {$host['host']}\n";
234
		else
235
			$hosts .= "{$host['ip']}	{$host['domain']}\n";
236
	}
237
	if (isset($dnsmasqcfg['regdhcpstatic']) && is_array($config['dhcpd'])) {
238
		foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf)
239
			if(is_array($dhcpifconf['staticmap']) && isset($dhcpifconf['enable']))
240
					foreach ($dhcpifconf['staticmap'] as $host)
241
						if ($host['ipaddr'] && $host['hostname'])
242
							$hosts .= "{$host['ipaddr']}	{$host['hostname']}.{$syscfg['domain']} {$host['hostname']}\n";
243
	}
244

    
245
	/*
246
	 * Do not remove this because dhcpleases monitors with kqueue it needs to be 
247
	 * killed before writing to hosts files.
248
	 */
249
	if (file_exists("{$g['varrun_path']}/dhcpleases.pid")) {
250
		sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "TERM");
251
                @unlink("{$g['varrun_path']}/dhcpleases.pid");
252
	}
253
	$fd = fopen("{$g['varetc_path']}/hosts", "w");
254
	if (!$fd) {
255
		log_error("Error: cannot open hosts file in system_hosts_generate().\n");
256
		return 1;
257
	}
258
	fwrite($fd, $hosts);
259
	fclose($fd);
260

    
261
	system_dhcpleases_configure();
262

    
263
	return 0;
264
}
265

    
266
function system_dhcpleases_configure() {
267
	global $config, $g;
268
	
269
	/* Start the monitoring process for dynamic dhcpclients. */
270
	if (isset($config['dnsmasq']['regdhcp'])) {
271
		/* Make sure we do not error out */
272
		@touch("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases");
273
		if (file_exists("{$g['varrun_path']}/dhcpleases.pid"))
274
				sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "HUP");
275
		else
276
			mwexec("/usr/local/sbin/dhcpleases -l {$g['dhcpd_chroot_path']}/var/db/dhcpd.leases -d {$config['system']['domain']} -p {$g['varrun_path']}/dnsmasq.pid -h {$g['varetc_path']}/hosts");
277
	} else {
278
		sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "TERM");
279
		@unlink("{$g['varrun_path']}/dhcpleases.pid");
280
	}
281
}
282

    
283
function system_hostname_configure() {
284
	global $config, $g;
285
	if(isset($config['system']['developerspew'])) {
286
		$mt = microtime();
287
		echo "system_hostname_configure() being called $mt\n";
288
	}
289

    
290
	$syscfg = $config['system'];
291

    
292
	/* set hostname */
293
	$status = mwexec("/bin/hostname " .
294
		escapeshellarg("{$syscfg['hostname']}.{$syscfg['domain']}"));
295

    
296
    /* Setup host GUID ID.  This is used by ZFS. */
297
	mwexec("/etc/rc.d/hostid start");
298

    
299
	return $status;
300
}
301

    
302
function system_routing_configure($interface = "") {
303
	global $config, $g;
304
	if(isset($config['system']['developerspew'])) {
305
		$mt = microtime();
306
		echo "system_routing_configure() being called $mt\n";
307
	}
308

    
309
	$gatewayip = "";
310
	$interfacegw = "";
311
	$foundgw = false;
312
	/* tack on all the hard defined gateways as well */
313
	if (is_array($config['gateways']['gateway_item'])) {
314
		mwexec("/bin/rm {$g['tmp_path']}/*_defaultgw", true);
315
		foreach	($config['gateways']['gateway_item'] as $gateway) {
316
			if (isset($gateway['defaultgw'])) {
317
				if ($gateway['gateway'] == "dynamic")
318
					$gateway['gateway'] = get_interface_gateway($gateway['interface']);
319
				$gatewayip = $gateway['gateway'];
320
				$interfacegw = $gateway['interface'];
321
				if (!empty($interfacegw)) {
322
					$defaultif = get_real_interface($gateway['interface']);
323
					if ($defaultif)
324
						@file_put_contents("{$g['tmp_path']}/{$defaultif}_defaultgw", $gatewayip);
325
				}
326
				$foundgw = true;
327
				break;
328
			}
329
		}
330
	}
331
	if ($foundgw == false) {
332
		$defaultif = get_real_interface("wan");
333
		$interfacegw = "wan";
334
		$gatewayip = get_interface_gateway("wan");
335
		@touch("{$g['tmp_path']}/{$defaultif}_defaultgw");
336
	}	
337
	$dont_add_route = false;
338
	/* if OLSRD is enabled, allow WAN to house DHCP. */
339
	if($config['installedpackages']['olsrd']) {
340
		foreach($config['installedpackages']['olsrd']['config'] as $olsrd) {
341
			if($olsrd['enabledyngw'] == "on") {
342
				$dont_add_route = true;
343
				break;
344
			}
345
		}
346
	}
347
	/* Create a array from the existing route table */
348
	exec("/usr/bin/netstat -rnf inet", $route_str);
349
	array_shift($route_str);
350
	array_shift($route_str);
351
	array_shift($route_str);
352
	array_shift($route_str);
353
	$route_arr = array();
354
	foreach($route_str as $routeline) {
355
		$items = preg_split("/[ ]+/i", $routeline);
356
		$route_arr[$items[0]] = array($items[0], $items[1], $items[5]);
357
	}
358

    
359
	if ($dont_add_route == false ) {
360
		if (!empty($interface) && $interface != $interfacegw)
361
			;
362
		else if (($interfacegw <> "bgpd") && (is_ipaddr($gatewayip))) {
363
			$action = "add";
364
			if(isset($route_arr['default'])) {
365
				$action = "change";
366
			}
367
			log_error("ROUTING: $action default route to $gatewayip");
368
			mwexec("/sbin/route {$action} default " . escapeshellarg($gatewayip));
369
		}
370
	}
371

    
372
	if (is_array($config['staticroutes']['route'])) {
373
		$gateways_arr = return_gateways_array();
374

    
375
		foreach ($config['staticroutes']['route'] as $rtent) {
376
			$gatewayip = "";
377
			if (empty($gateways_arr[$rtent['gateway']])) {
378
				log_error("Static Routes: Gateway IP could not be found for {$rtent['network']}");
379
				continue;
380
			}
381
			$gateway = $gateways_arr[$rtent['gateway']];
382
			if ($interface == $gateway['friendlyiface'])
383
				continue;
384
			$gatewayip = $gateway['gateway'];
385
			$interfacegw = $gateway['interface'];
386
			$action = "add";
387
			if (isset($route_arr[$rtent['network']]))
388
				$action = "change";
389

    
390
			if (is_ipaddr($gatewayip)) {
391
				mwexec("/sbin/route {$action} " . escapeshellarg($rtent['network']) .
392
					" " . escapeshellarg($gatewayip));
393
			} else if (!empty($interfacegw)) {
394
				mwexec("/sbin/route {$action} " . escapeshellarg($rtent['network']) .
395
					" -iface " . escapeshellarg($interfacegw));
396
			}
397
		}
398
	}
399

    
400
	return 0;
401
}
402

    
403
function system_routing_enable() {
404
	global $config, $g;
405
	if(isset($config['system']['developerspew'])) {
406
		$mt = microtime();
407
		echo "system_routing_enable() being called $mt\n";
408
	}
409

    
410
	return mwexec("/sbin/sysctl net.inet.ip.forwarding=1");
411
}
412

    
413
function system_syslogd_start() {
414
	global $config, $g;
415
	if(isset($config['system']['developerspew'])) {
416
		$mt = microtime();
417
		echo "system_syslogd_start() being called $mt\n";
418
	}
419

    
420
	$syslogcfg = $config['syslog'];
421

    
422
	if ($g['booting'])
423
		echo "Starting syslog...";
424
	else
425
		killbypid("{$g['varrun_path']}/syslog.pid");
426

    
427
	if(is_process_running("syslogd"))
428
		mwexec("/usr/bin/killall -9 syslogd");
429
	if(is_process_running("fifolog_writer"))
430
		mwexec("/usr/bin/killall -9 fifolog_writer");
431
	
432
	// Define carious commands for logging
433
	$fifolog_create = "/usr/sbin/fifolog_create -s ";
434
	$fifolog_log = "|/usr/sbin/fifolog_writer ";
435
	$clog_create = "/usr/sbin/clog -i -s ";
436
	$clog_log = "%";
437

    
438
	// Which logging type are we using this week??
439
	if(isset($config['system']['usefifolog'])) {
440
		$log_directive = $fifolog_log;
441
		$log_create_directive = $fifolog_create;		
442
	} else { // Defaults to CLOG
443
		$log_directive = $clog_log;
444
		$log_create_directive = $clog_create;
445
	}
446
	
447
	if (isset($syslogcfg)) {
448
		$separatelogfacilities = array('ntpd','racoon','openvpn','pptps','poes','l2tps');
449
		if($config['installedpackages']['package']) {
450
			foreach($config['installedpackages']['package'] as $package) {
451
				if($package['logging']) {
452
					array_push($separatelogfacilities, $package['logging']['facilityname']);
453
					mwexec("{$log_create_directive} 10240 {$g['varlog_path']}/{$package['logging']['logfilename']}");
454
					$syslogconf .= "!{$package['logging']['facilityname']}\n*.*\t\t\t\t\t\t {$log_directive}{$g['varlog_path']}/{$package['logging']['logfilename']}\n";
455
				}
456
			}
457
		}
458
		$facilitylist = implode(',', array_unique($separatelogfacilities));
459
		/* write syslog.conf */		
460
		$fd = fopen("{$g['varetc_path']}/syslog.conf", "w");
461
		if (!$fd) {
462
			printf("Error: cannot open syslog.conf in system_syslogd_start().\n");
463
			return 1;
464
		}
465
		$syslogconf .= "!ntpdate,!ntpd\n";
466
		if (!isset($syslogcfg['disablelocallogging'])) 
467
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/ntpd.log\n";
468
		$syslogconf .= "!ppp\n";
469
		if (!isset($syslogcfg['disablelocallogging'])) 
470
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/ppp.log\n";
471
		$syslogconf .= "!pptps\n";
472
		if (!isset($syslogcfg['disablelocallogging'])) 
473
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/pptps.log\n";
474
		$syslogconf .= "!poes\n";
475
		if (!isset($syslogcfg['disablelocallogging'])) 
476
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/poes.log\n";
477
		$syslogconf .= "!l2tps\n";
478
		if (!isset($syslogcfg['disablelocallogging'])) 
479
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/l2tps.log\n";
480
		$syslogconf .= "!racoon\n";
481
		if (!isset($syslogcfg['disablelocallogging'])) 
482
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/ipsec.log\n";
483
		if (isset($syslogcfg['vpn'])) {
484
			if($syslogcfg['remoteserver'])
485
				$syslogconf .= "*.*					 @{$syslogcfg['remoteserver']}\n";
486
			if($syslogcfg['remoteserver2'])
487
				$syslogconf .= "*.*					 @{$syslogcfg['remoteserver2']}\n";
488
			if($syslogcfg['remoteserver3'])
489
				$syslogconf .= "*.*					 @{$syslogcfg['remoteserver3']}\n";
490
		}
491
		$syslogconf .= "!openvpn\n";
492
		if (!isset($syslogcfg['disablelocallogging'])) 
493
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/openvpn.log\n";
494
		if (isset($syslogcfg['vpn'])) {
495
			if($syslogcfg['remoteserver'])
496
				$syslogconf .= "*.*					 @{$syslogcfg['remoteserver']}\n";
497
			if($syslogcfg['remoteserver2'])
498
				$syslogconf .= "*.*					 @{$syslogcfg['remoteserver3']}\n";
499
			if($syslogcfg['remoteserver3'])
500
				$syslogconf .= "*.*					 @{$syslogcfg['remoteserver3']}\n";
501
		}
502
		$syslogconf .= "!apinger\n";
503
		if (!isset($syslogcfg['disablelocallogging']))
504
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/apinger.log\n";
505
		$syslogconf .= "!relayd\n";
506
		$syslogconf .= "*.* 						{$log_directive}{$g['varlog_path']}/relayd.log\n";
507
		$syslogconf .= "!-{$facilitylist}\n";
508
		if (!isset($syslogcfg['disablelocallogging'])) 
509
			$syslogconf .= <<<EOD
510
local0.*										 {$log_directive}{$g['varlog_path']}/filter.log
511
local3.*										 {$log_directive}{$g['varlog_path']}/vpn.log
512
local4.*										 {$log_directive}{$g['varlog_path']}/portalauth.log
513
local7.*										 {$log_directive}{$g['varlog_path']}/dhcpd.log
514
*.notice;kern.debug;lpr.info;mail.crit; 		 {$log_directive}{$g['varlog_path']}/system.log
515
news.err;local0.none;local3.none;local4.none; 	 {$log_directive}{$g['varlog_path']}/system.log
516
local7.none										 {$log_directive}{$g['varlog_path']}/system.log
517
security.*										 {$log_directive}{$g['varlog_path']}/system.log
518
auth.info;authpriv.info;daemon.info				 {$log_directive}{$g['varlog_path']}/system.log
519
auth.info;authpriv.info 						 |exec /usr/local/sbin/sshlockout_pf 15
520
*.emerg											 *
521

    
522
EOD;
523
		if (isset($syslogcfg['filter'])) {
524
			if($syslogcfg['remoteserver'])
525
				$syslogconf .= "local0.*			 @{$syslogcfg['remoteserver']}\n";
526
			if($syslogcfg['remoteserver2'])
527
				$syslogconf .= "local0.*			 @{$syslogcfg['remoteserver2']}\n";
528
			if($syslogcfg['remoteserver3'])
529
				$syslogconf .= "local0.*			 @{$syslogcfg['remoteserver3']}\n";
530

    
531
		}
532
		if (isset($syslogcfg['vpn'])) {
533
			if($syslogcfg['remoteserver'])
534
				$syslogconf .= "local3.*			 @{$syslogcfg['remoteserver']}\n";
535
			if($syslogcfg['remoteserver2'])
536
				$syslogconf .= "local3.*			 @{$syslogcfg['remoteserver2']}\n";
537
			if($syslogcfg['remoteserver3'])
538
				$syslogconf .= "local3.*			 @{$syslogcfg['remoteserver3']}\n";
539
		}
540
		if (isset($syslogcfg['portalauth'])) {
541
			if($syslogcfg['remoteserver'])
542
				$syslogconf .= "local4.*			 @{$syslogcfg['remoteserver']}\n";
543
			if($syslogcfg['remoteserver2'])
544
				$syslogconf .= "local4.*			 @{$syslogcfg['remoteserver2']}\n";
545
			if($syslogcfg['remoteserver3'])
546
				$syslogconf .= "local4.*			 @{$syslogcfg['remoteserver3']}\n";
547
		}
548
		if (isset($syslogcfg['dhcp'])) {
549
			if($syslogcfg['remoteserver'])
550
				$syslogconf .= "local7.*			 @{$syslogcfg['remoteserver']}\n";
551
			if($syslogcfg['remoteserver2'])
552
				$syslogconf .= "local7.*			 @{$syslogcfg['remoteserver2']}\n";
553
			if($syslogcfg['remoteserver3'])
554
				$syslogconf .= "local7.*			 @{$syslogcfg['remoteserver3']}\n";
555
		}
556
		if (isset($syslogcfg['system'])) {
557
			if($syslogcfg['remoteserver'])
558
				$syslogconf .= <<<EOD
559
*.notice;kern.debug;lpr.info;mail.crit;			 @{$syslogcfg['remoteserver']}
560
news.err;local0.none;local3.none;local7.none	 @{$syslogcfg['remoteserver']}
561
security.*										 @{$syslogcfg['remoteserver']}
562
auth.info;authpriv.info;daemon.info				 @{$syslogcfg['remoteserver']}
563
*.emerg											 @{$syslogcfg['remoteserver']}
564

    
565
EOD;
566

    
567
}
568

    
569
		if (isset($syslogcfg['system'])) {
570
			if($syslogcfg['remoteserver2'])
571
				$syslogconf .= <<<EOD
572
*.notice;kern.debug;lpr.info;mail.crit;			 @{$syslogcfg['remoteserver2']}
573
news.err;local0.none;local3.none;local7.none	 @{$syslogcfg['remoteserver2']}
574
security.*										 @{$syslogcfg['remoteserver2']}
575
auth.info;authpriv.info;daemon.info				 @{$syslogcfg['remoteserver2']}
576
*.emerg											 @{$syslogcfg['remoteserver2']}
577

    
578
EOD;
579

    
580
}
581

    
582
		if (isset($syslogcfg['system'])) {
583
			if($syslogcfg['remoteserver3'])
584
				$syslogconf .= <<<EOD
585
*.notice;kern.debug;lpr.info;mail.crit;			 @{$syslogcfg['remoteserver3']}
586
news.err;local0.none;local3.none;local7.none	 @{$syslogcfg['remoteserver3']}
587
security.*										 @{$syslogcfg['remoteserver3']}
588
auth.info;authpriv.info;daemon.info				 @{$syslogcfg['remoteserver3']}
589
*.emerg											 @{$syslogcfg['remoteserver3']}
590

    
591
EOD;
592

    
593
}
594
		if (isset($syslogcfg['logall'])) {
595
			if($syslogcfg['remoteserver'])
596
				$syslogconf .= <<<EOD
597
*.*								@{$syslogcfg['remoteserver']}
598

    
599
EOD;
600

    
601
			if($syslogcfg['remoteserver2'])
602
				$syslogconf .= <<<EOD
603
*.*								@{$syslogcfg['remoteserver2']}
604

    
605
EOD;
606

    
607
			if($syslogcfg['remoteserver3'])
608
				$syslogconf .= <<<EOD
609
*.*								@{$syslogcfg['remoteserver3']}
610

    
611
EOD;
612

    
613
}
614
		fwrite($fd, $syslogconf);
615
		fclose($fd);
616

    
617
		// Ensure that the log directory exists
618
		if(!is_dir("{$g['dhcpd_chroot_path']}/var/run"))
619
			exec("/bin/mkdir -p {$g['dhcpd_chroot_path']}/var/run");
620

    
621
		// Are we logging to a least one remote server ?
622
		if(strpos($syslogconf, "@") != false)
623
			$retval = system("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log -f {$g['varetc_path']}/syslog.conf");
624
		else
625
			$retval = system("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log -f {$g['varetc_path']}/syslog.conf");
626

    
627
	} else {
628
		$retval = mwexec("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log");
629
	}
630

    
631
	if ($g['booting'])
632
		echo "done.\n";
633

    
634
	return $retval;
635
}
636

    
637
function system_pccard_start() {
638
	global $config, $g;
639
	if(isset($config['system']['developerspew'])) {
640
		$mt = microtime();
641
		echo "system_pccard_start() being called $mt\n";
642
	}
643

    
644
	if ($g['booting'])
645
		echo "Initializing PCMCIA...";
646

    
647
	/* kill any running pccardd */
648
	killbypid("{$g['varrun_path']}/pccardd.pid");
649

    
650
	/* fire up pccardd */
651
	$res = mwexec("/usr/sbin/pccardd -z -f {$g['etc_path']}/pccard.conf");
652

    
653
	if ($g['booting']) {
654
		if ($res == 0)
655
			echo "done.\n";
656
		else
657
			echo "failed!\n";
658
	}
659

    
660
	return $res;
661
}
662

    
663

    
664
function system_webgui_start() {
665
	global $config, $g;
666

    
667
	if ($g['booting'])
668
		echo "Starting webConfigurator...";
669

    
670
	/* kill any running lighttpd */
671
	killbypid("{$g['varrun_path']}/lighty-webConfigurator.pid");
672

    
673
	sleep(1);
674

    
675
	chdir($g['www_path']);
676

    
677
	/* defaults */
678
	$portarg = "80";
679
	$crt = "";
680
	$key = "";
681
	$ca = "";
682

    
683
	/* non-standard port? */
684
	if (isset($config['system']['webgui']['port']) && $config['system']['webgui']['port'] <> "")
685
		$portarg = "{$config['system']['webgui']['port']}";
686

    
687
	if ($config['system']['webgui']['protocol'] == "https") {
688
		// Ensure that we have a webConfigurator CERT
689
		$cert =& lookup_cert($config['system']['webgui']['ssl-certref']);
690
		if(!is_array($cert) && !$cert['crt'] && !$cert['prv']) {
691
			if (!is_array($config['ca']))
692
				$config['ca'] = array();
693
			$a_ca =& $config['ca'];
694
			if (!is_array($config['cert']))
695
				$config['cert'] = array();
696
			$a_cert =& $config['cert'];
697
			log_error("Creating SSL Certificate for this host");
698
			$cert = array();
699
			$cert['refid'] = uniqid();
700
			$cert['descr'] = "webConfigurator default";
701
			mwexec("/usr/bin/openssl genrsa 1024 > {$g['tmp_path']}/ssl.key");
702
			mwexec("/usr/bin/openssl req -new -x509 -nodes -sha1 -days 2000 -key {$g['tmp_path']}/ssl.key > {$g['tmp_path']}/ssl.crt");
703
			$crt = file_get_contents("{$g['tmp_path']}/ssl.crt");
704
			$key = file_get_contents("{$g['tmp_path']}/ssl.key");
705
			unlink("{$g['tmp_path']}/ssl.key");
706
			unlink("{$g['tmp_path']}/ssl.crt");
707
			cert_import($cert, $crt, $key);
708
			$a_cert[] = $cert;
709
			$config['system']['webgui']['ssl-certref'] = $cert['refid'];
710
			write_config("Importing HTTPS certificate");
711
			if(!$config['system']['webgui']['port'])
712
				$portarg = "443";
713
			$ca = ca_chain($cert);
714
		} else {
715
			$crt = base64_decode($cert['crt']);
716
			$key = base64_decode($cert['prv']);
717
			if(!$config['system']['webgui']['port'])
718
				$portarg = "443";
719
			$ca = ca_chain($cert);
720
		}
721
	}
722

    
723
	/* generate lighttpd configuration */
724
	system_generate_lighty_config("{$g['varetc_path']}/lighty-webConfigurator.conf",
725
		$crt, $key, $ca, "lighty-webConfigurator.pid", $portarg, "/usr/local/www/");
726

    
727
	/* attempt to start lighthttpd */
728
	$res = mwexec("/usr/local/sbin/lighttpd -f {$g['varetc_path']}/lighty-webConfigurator.conf");
729

    
730
	/* fetch page to preload apc cache */
731
	$proto = "http";
732
	if ($config['system']['webgui']['protocol'])
733
		$proto = $config['system']['webgui']['protocol'];
734
	mwexec_bg("/usr/bin/fetch -o /dev/null -q {$proto}://localhost:{$portarg}/preload.php");
735

    
736
	if ($g['booting']) {
737
		if ($res == 0)
738
			echo "done.\n";
739
		else
740
			echo "failed!\n";
741
	}
742

    
743
	return $res;
744
}
745

    
746
function system_generate_lighty_config($filename,
747
	$cert,
748
	$key,
749
	$ca,
750
	$pid_file,
751
	$port = 80,
752
	$document_root = "/usr/local/www/",
753
	$cert_location = "cert.pem",
754
	$ca_location = "ca.pem",
755
	$max_procs = 2,
756
	$max_requests = "2",
757
	$fast_cgi_enable = true,
758
	$captive_portal = false) {
759

    
760
	global $config, $g;
761

    
762
	if(!is_dir("{$g['tmp_path']}/lighttpdcompress"))
763
		mkdir("{$g['tmp_path']}/lighttpdcompress");
764

    
765
	if(isset($config['system']['developerspew'])) {
766
		$mt = microtime();
767
		echo "system_generate_lighty_config() being called $mt\n";
768
	}
769

    
770
	if($captive_portal == true)  {
771
		$captiveportal = ",\"mod_rewrite\"";
772
		$captive_portal_rewrite = "url.rewrite-once = ( \"(.*captiveportal.*)\" => \"$1\", \"(.*)\" => \"/index.php?redirurl=$1\" )\n";
773
		$captive_portal_module = "\"mod_accesslog\", ";
774
		$maxprocperip = $config['captiveportal']['maxprocperip'];
775
		if(!$maxprocperip and $maxprocperip > 0)
776
			$captive_portal_mod_evasive = "evasive.max-conns-per-ip = {$maxprocperip}";
777
		else
778
			$captive_portal_mod_evasive = "";
779
		$server_upload_dirs = "server.upload-dirs = ( \"{$g['tmp_path']}/captiveportal/\" )\n";
780
		exec("mkdir -p {$g['tmp_path']}/captiveportal");
781
		exec("chmod a-w {$g['tmp_path']}/captiveportal");
782
		$server_max_request_size = "server.max-request-size    = 384";
783
	} else {
784
		$captiveportal = "";
785
		$captive_portal_rewrite = "";
786
		$captive_portal_module = "";
787
		$captive_portal_mod_evasive = "";
788
		$server_upload_dirs = "server.upload-dirs = ( \"{$g['upload_path']}/\", \"{$g['tmp_path']}/\", \"/var/\" )\n";
789
		$server_max_request_size = "server.max-request-size    = 2097152";
790
	}
791
	
792
	if($port <> "")
793
		$lighty_port = $port;
794
	else
795
		$lighty_port = "80";
796

    
797
	$memory = get_memory();
798
	$avail = $memory[0];
799

    
800
	if($avail > 0 and $avail < 65) {
801
		$fast_cgi_enable = false;
802
	}
803

    
804
	// Ramp up captive portal max procs
805
	if($captive_portal == true)  {
806
		if($avail > 65 and $avail < 98) {
807
			$max_procs = 1;
808
		}
809
		if($avail > 97 and $avail < 128) {
810
			$max_procs = 2;
811
		}
812
		if($avail > 127 and $avail < 256) {
813
			$max_procs = 3;
814
		}
815
		if($avail > 255 and $avail < 384) {
816
			$max_procs = 4;
817
		}
818
		if($avail > 383) {
819
			$max_procs = 5;
820
		}
821
	}
822

    
823
	if($captive_portal == true)  {	
824
		$bin_environment =  <<<EOC
825
        "bin-environment" => (
826
           "PHP_FCGI_CHILDREN" => "$max_procs",
827
           "PHP_FCGI_MAX_REQUESTS" => "500"
828
        ), 
829
EOC;
830

    
831
	} else if ($avail > 0 and $avail < 128) {
832
		$bin_environment = <<<EOC
833
		"bin-environment" => (
834
			"PHP_FCGI_CHILDREN" => "$max_procs",
835
			"PHP_FCGI_MAX_REQUESTS" => "2",
836
	),
837

    
838
EOC;
839
	} else
840
		$bin_environment =  <<<EOC
841
        "bin-environment" => (
842
           "PHP_FCGI_CHILDREN" => "$max_procs",
843
           "PHP_FCGI_MAX_REQUESTS" => "500"
844
        ), 
845
EOC;
846

    
847
	if($fast_cgi_enable == true) {
848
		$module = "\"mod_fastcgi\", \"mod_cgi\"";
849
		$cgi_config = "";
850
		$fastcgi_config = <<<EOD
851
#### fastcgi module
852
## read fastcgi.txt for more info
853
fastcgi.server = ( ".php" =>
854
	( "localhost" =>
855
		(
856
			"socket" => "{$g['tmp_path']}/php-fastcgi.socket",
857
			"min-procs" => 0,
858
			"max-procs" => {$max_procs},
859
			{$bin_environment}			
860
			"bin-path" => "/usr/local/bin/php"
861
		)
862
	)
863
)
864

    
865
#### CGI module
866
cgi.assign                 = ( ".cgi" => "" )
867

    
868
EOD;
869
	} else {
870
		$fastcgi_config = "";
871
		$module = "\"mod_cgi\"";
872
		$cgi_config = <<<EOD
873
#### CGI module
874
cgi.assign                 = ( ".php"  => "/usr/local/bin/php",
875
                               ".cgi" => "" )
876

    
877
EOD;
878
	}
879

    
880
	$lighty_config = "";
881
	$lighty_config .= <<<EOD
882
#
883
# lighttpd configuration file
884
#
885
# use a it as base for lighttpd 1.0.0 and above
886
#
887
############ Options you really have to take care of ####################
888

    
889
## FreeBSD!
890
server.event-handler	= "freebsd-kqueue"
891
server.network-backend 	= "writev"
892

    
893
## modules to load
894
server.modules              =   (
895
									{$captive_portal_module}
896
									"mod_access", "mod_accesslog", "mod_expire", "mod_compress", "mod_redirect",
897
									{$module}{$captiveportal}
898
								)
899

    
900
## Unused modules
901
#                               "mod_setenv",
902
#                               "mod_rewrite",
903
#                               "mod_ssi",
904
#                               "mod_usertrack",
905
#                               "mod_expire",
906
#                               "mod_secdownload",
907
#                               "mod_rrdtool",
908
#                               "mod_auth",
909
#                               "mod_status",
910
#                               "mod_alias",
911
#                               "mod_proxy",
912
#                               "mod_simple_vhost",
913
#                               "mod_evhost",
914
#                               "mod_userdir",
915
#                               "mod_cgi",
916

    
917
server.max-keep-alive-requests = 15
918
server.max-keep-alive-idle = 30
919

    
920
## a static document-root, for virtual-hosting take look at the
921
## server.virtual-* options
922
server.document-root        = "{$document_root}"
923
{$captive_portal_rewrite}
924

    
925
# Maximum idle time with nothing being written (php downloading)
926
server.max-write-idle = 999
927

    
928
## where to send error-messages to
929
server.errorlog             = "/var/log/lighttpd.error.log"
930

    
931
# files to check for if .../ is requested
932
server.indexfiles           = ( "index.php", "index.html",
933
                                "index.htm", "default.htm" )
934

    
935
# mimetype mapping
936
mimetype.assign             = (
937
  ".pdf"          =>      "application/pdf",
938
  ".sig"          =>      "application/pgp-signature",
939
  ".spl"          =>      "application/futuresplash",
940
  ".class"        =>      "application/octet-stream",
941
  ".ps"           =>      "application/postscript",
942
  ".torrent"      =>      "application/x-bittorrent",
943
  ".dvi"          =>      "application/x-dvi",
944
  ".gz"           =>      "application/x-gzip",
945
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
946
  ".swf"          =>      "application/x-shockwave-flash",
947
  ".tar.gz"       =>      "application/x-tgz",
948
  ".tgz"          =>      "application/x-tgz",
949
  ".tar"          =>      "application/x-tar",
950
  ".zip"          =>      "application/zip",
951
  ".mp3"          =>      "audio/mpeg",
952
  ".m3u"          =>      "audio/x-mpegurl",
953
  ".wma"          =>      "audio/x-ms-wma",
954
  ".wax"          =>      "audio/x-ms-wax",
955
  ".ogg"          =>      "audio/x-wav",
956
  ".wav"          =>      "audio/x-wav",
957
  ".gif"          =>      "image/gif",
958
  ".jpg"          =>      "image/jpeg",
959
  ".jpeg"         =>      "image/jpeg",
960
  ".png"          =>      "image/png",
961
  ".xbm"          =>      "image/x-xbitmap",
962
  ".xpm"          =>      "image/x-xpixmap",
963
  ".xwd"          =>      "image/x-xwindowdump",
964
  ".css"          =>      "text/css",
965
  ".html"         =>      "text/html",
966
  ".htm"          =>      "text/html",
967
  ".js"           =>      "text/javascript",
968
  ".asc"          =>      "text/plain",
969
  ".c"            =>      "text/plain",
970
  ".conf"         =>      "text/plain",
971
  ".text"         =>      "text/plain",
972
  ".txt"          =>      "text/plain",
973
  ".dtd"          =>      "text/xml",
974
  ".xml"          =>      "text/xml",
975
  ".mpeg"         =>      "video/mpeg",
976
  ".mpg"          =>      "video/mpeg",
977
  ".mov"          =>      "video/quicktime",
978
  ".qt"           =>      "video/quicktime",
979
  ".avi"          =>      "video/x-msvideo",
980
  ".asf"          =>      "video/x-ms-asf",
981
  ".asx"          =>      "video/x-ms-asf",
982
  ".wmv"          =>      "video/x-ms-wmv",
983
  ".bz2"          =>      "application/x-bzip",
984
  ".tbz"          =>      "application/x-bzip-compressed-tar",
985
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar"
986
 )
987

    
988
# Use the "Content-Type" extended attribute to obtain mime type if possible
989
#mimetypes.use-xattr        = "enable"
990

    
991
#### accesslog module
992
#accesslog.filename          = "/dev/null"
993

    
994
## deny access the file-extensions
995
#
996
# ~    is for backupfiles from vi, emacs, joe, ...
997
# .inc is often used for code includes which should in general not be part
998
#      of the document-root
999
url.access-deny             = ( "~", ".inc" )
1000

    
1001

    
1002
######### Options that are good to be but not neccesary to be changed #######
1003

    
1004
## bind to port (default: 80)
1005
server.port                = {$lighty_port}
1006

    
1007
## error-handler for status 404
1008
#server.error-handler-404   = "/error-handler.html"
1009
#server.error-handler-404   = "/error-handler.php"
1010

    
1011
## to help the rc.scripts
1012
server.pid-file            = "/var/run/{$pid_file}"
1013

    
1014
## virtual directory listings
1015
server.dir-listing         = "disable"
1016

    
1017
## enable debugging
1018
debug.log-request-header   = "disable"
1019
debug.log-response-header  = "disable"
1020
debug.log-request-handling = "disable"
1021
debug.log-file-not-found   = "disable"
1022

    
1023
# gzip compression
1024
compress.cache-dir = "{$g['tmp_path']}/lighttpdcompress/"
1025
compress.filetype  = ("text/plain","text/css", "text/xml", "text/javascript" )
1026

    
1027
{$server_upload_dirs}
1028

    
1029
{$server_max_request_size}
1030

    
1031
{$fastcgi_config}
1032

    
1033
{$cgi_config}
1034

    
1035
{$captive_portal_mod_evasive}
1036

    
1037
expire.url = (
1038
				"" => "access 50 hours",	
1039
        )
1040

    
1041
EOD;
1042

    
1043
	$cert = str_replace("\r", "", $cert);
1044
	$key = str_replace("\r", "", $key);
1045
	$ca = str_replace("\r", "", $ca);
1046

    
1047
	$cert = str_replace("\n\n", "\n", $cert);
1048
	$key = str_replace("\n\n", "\n", $key);
1049
	$ca = str_replace("\n\n", "\n", $ca);
1050

    
1051
	if($cert <> "" and $key <> "") {
1052
		$fd = fopen("{$g['varetc_path']}/{$cert_location}", "w");
1053
		if (!$fd) {
1054
			printf("Error: cannot open cert.pem in system_webgui_start().\n");
1055
			return 1;
1056
		}
1057
		chmod("{$g['varetc_path']}/{$cert_location}", 0600);
1058
		fwrite($fd, $cert);
1059
		fwrite($fd, "\n");
1060
		fwrite($fd, $key);
1061
		fclose($fd);
1062
		if($ca <> "") {
1063
			$fd = fopen("{$g['varetc_path']}/{$ca_location}", "w");
1064
			if (!$fd) {
1065
				printf("Error: cannot open ca.pem in system_webgui_start().\n");
1066
				return 1;
1067
			}
1068
			chmod("{$g['varetc_path']}/{$ca_location}", 0600);
1069
			fwrite($fd, $ca);
1070
			fclose($fd);
1071
		}
1072
		$lighty_config .= "\n";
1073
		$lighty_config .= "## ssl configuration\n";
1074
		$lighty_config .= "ssl.engine = \"enable\"\n";
1075
		$lighty_config .= "ssl.pemfile = \"{$g['varetc_path']}/{$cert_location}\"\n\n";
1076
		if($ca <> "")
1077
			$lighty_config .= "ssl.ca-file = \"{$g['varetc_path']}/{$ca_location}\"\n\n";
1078
	}
1079

    
1080
	// Add HTTP to HTTPS redirect	
1081
	if ($captive_portal == false && $config['system']['webgui']['protocol'] == "https" && !isset($config['system']['webgui']['disablehttpredirect'])) {
1082
		if($lighty_port != "443") 
1083
			$redirectport = ":{$lighty_port}";
1084
		$lighty_config .= <<<EOD
1085
\$SERVER["socket"] == ":80" {
1086
	\$HTTP["host"] =~ "(.*)" {
1087
		url.redirect = ( "^/(.*)" => "https://%1{$redirectport}/$1" )
1088
	}
1089
}
1090
EOD;
1091
	}
1092

    
1093
	$fd = fopen("{$filename}", "w");
1094
	if (!$fd) {
1095
		printf("Error: cannot open {$filename} in system_generate_lighty_config().\n");
1096
		return 1;
1097
	}
1098
	fwrite($fd, $lighty_config);
1099
	fclose($fd);
1100

    
1101
	return 0;
1102

    
1103
}
1104

    
1105
function system_timezone_configure() {
1106
	global $config, $g;
1107
	if(isset($config['system']['developerspew'])) {
1108
		$mt = microtime();
1109
		echo "system_timezone_configure() being called $mt\n";
1110
	}
1111

    
1112
	$syscfg = $config['system'];
1113

    
1114
	if ($g['booting'])
1115
		echo "Setting timezone...";
1116

    
1117
	/* extract appropriate timezone file */
1118
	$timezone = $syscfg['timezone'];
1119
	if (!$timezone)
1120
		$timezone = "Etc/UTC";
1121

    
1122
	conf_mount_rw();
1123

    
1124
	exec("LANG=C /usr/bin/tar xzfO /usr/share/zoneinfo.tgz " .
1125
		escapeshellarg($timezone) . " > /etc/localtime");
1126

    
1127
	mwexec("sync");
1128
	conf_mount_ro();
1129

    
1130
	if ($g['booting'])
1131
		echo "done.\n";
1132
}
1133

    
1134
function system_ntp_configure() {
1135
	global $config, $g;
1136

    
1137
	$syscfg =& $config['system'];
1138

    
1139
	/* open configuration for wrting or bail */
1140
	$fd = fopen("{$g['varetc_path']}/ntpd.conf","w");
1141
	if(!$fd) {
1142
		log_error("Could not open {$g['varetc_path']}/ntpd.conf for writing");
1143
		return;
1144
	}
1145

    
1146
	fwrite($fd, "# \n");
1147
	fwrite($fd, "# pfSense OpenNTPD configuration file \n");
1148
	fwrite($fd, "# \n\n");
1149

    
1150
	/* foreach through servers and write out to ntpd.conf */
1151
	foreach (explode(' ', $syscfg['timeservers']) as $ts)
1152
		fwrite($fd, "servers {$ts}\n");
1153

    
1154
	/* Setup listener(s) if the user has configured one */
1155
        if ($config['installedpackages']['openntpd']) {
1156
    		/* server config is in coregui1 */
1157
		$xmlsettings = $config['installedpackages']['openntpd']['config'][0];
1158
		if ($xmlsettings['enable'] == 'on') {
1159
			$ifaces = explode(',', $xmlsettings['interface']);
1160
			$ifaces = array_map('get_real_interface', $ifaces);
1161
			$ifaces = array_filter($ifaces, 'does_interface_exist');
1162
			$ips = array_map('find_interface_ip', $ifaces);
1163
			foreach ($ips as $ip) {
1164
				if (is_ipaddr($ip))
1165
					fwrite($fd, "listen on $ip\n");
1166
			}
1167
		}
1168
	}
1169

    
1170
	fwrite($fd, "\n");
1171

    
1172
	/* slurp! */
1173
	fclose($fd);
1174

    
1175
	/* if openntpd is running, kill it */
1176
	while(is_process_running("ntpd")) {
1177
		killbyname("ntpd");
1178
	}
1179

    
1180
	/* if /var/empty does not exist, create it */
1181
	if(!is_dir("/var/empty"))
1182
		exec("/bin/mkdir -p /var/empty && chmod ug+rw /var/empty/.");
1183

    
1184
	if ($g['booting'])
1185
		return;
1186

    
1187
	/* start opentpd, set time now and use /var/etc/ntpd.conf */
1188
	exec("/usr/local/sbin/ntpd -s -f {$g['varetc_path']}/ntpd.conf");
1189
	
1190
	// Note that we are starting up
1191
	exec("echo 'OpenNTPD is starting up' >> {$g['varlog_path']}/ntpd.log");
1192

    
1193
}
1194

    
1195
function sync_system_time() {
1196
	global $config, $g;
1197

    
1198
	$syscfg = $config['system'];
1199

    
1200
	if ($g['booting'])
1201
		echo "Syncing system time before startup...";
1202

    
1203
	/* foreach through servers and write out to ntpd.conf */
1204
	foreach (explode(' ', $syscfg['timeservers']) as $ts) {
1205
		mwexec("/usr/sbin/ntpdate -s $ts");
1206
	}
1207
	
1208
	if ($g['booting'])
1209
		echo "done.\n";
1210
	
1211
}
1212

    
1213
function system_halt() {
1214
	global $g;
1215

    
1216
	system_reboot_cleanup();
1217

    
1218
	mwexec("/usr/bin/nohup /etc/rc.halt > /dev/null 2>&1 &");
1219
}
1220

    
1221
function system_reboot() {
1222
	global $g;
1223

    
1224
	system_reboot_cleanup();
1225

    
1226
	mwexec("nohup /etc/rc.reboot > /dev/null 2>&1 &");
1227
}
1228

    
1229
function system_reboot_sync() {
1230
	global $g;
1231

    
1232
	system_reboot_cleanup();
1233

    
1234
	mwexec("/etc/rc.reboot > /dev/null 2>&1");
1235
}
1236

    
1237
function system_reboot_cleanup() {
1238
	mwexec("/usr/local/bin/beep.sh stop");
1239
	require_once("captiveportal.inc");
1240
	captiveportal_radius_stop_all();
1241
	require_once("voucher.inc");
1242
	voucher_save_db_to_config();
1243
}
1244

    
1245
function system_do_shell_commands($early = 0) {
1246
	global $config, $g;
1247
	if(isset($config['system']['developerspew'])) {
1248
		$mt = microtime();
1249
		echo "system_do_shell_commands() being called $mt\n";
1250
	}
1251

    
1252
	if ($early)
1253
		$cmdn = "earlyshellcmd";
1254
	else
1255
		$cmdn = "shellcmd";
1256

    
1257
	if (is_array($config['system'][$cmdn])) {
1258

    
1259
		/* *cmd is an array, loop through */
1260
		foreach ($config['system'][$cmdn] as $cmd) {
1261
			exec($cmd);
1262
		}
1263

    
1264
	} elseif($config['system'][$cmdn] <> "") {
1265

    
1266
		/* execute single item */
1267
		exec($config['system'][$cmdn]);
1268

    
1269
	}
1270
}
1271

    
1272
function system_console_configure() {
1273
	global $config, $g;
1274
	if(isset($config['system']['developerspew'])) {
1275
		$mt = microtime();
1276
		echo "system_console_configure() being called $mt\n";
1277
	}
1278

    
1279
	if (isset($config['system']['disableconsolemenu'])) {
1280
		touch("{$g['varetc_path']}/disableconsole");
1281
	} else {
1282
		unlink_if_exists("{$g['varetc_path']}/disableconsole");
1283
	}
1284
}
1285

    
1286
function system_dmesg_save() {
1287
	global $g;
1288
	if(isset($config['system']['developerspew'])) {
1289
		$mt = microtime();
1290
		echo "system_dmesg_save() being called $mt\n";
1291
	}
1292

    
1293
	$dmesg = "";
1294
	exec("/sbin/dmesg", $dmesg);
1295

    
1296
	/* find last copyright line (output from previous boots may be present) */
1297
	$lastcpline = 0;
1298

    
1299
	for ($i = 0; $i < count($dmesg); $i++) {
1300
		if (strstr($dmesg[$i], "Copyright (c) 1992-"))
1301
			$lastcpline = $i;
1302
	}
1303

    
1304
	$fd = fopen("{$g['varlog_path']}/dmesg.boot", "w");
1305
	if (!$fd) {
1306
		printf("Error: cannot open dmesg.boot in system_dmesg_save().\n");
1307
		return 1;
1308
	}
1309

    
1310
	for ($i = $lastcpline; $i < count($dmesg); $i++)
1311
		fwrite($fd, $dmesg[$i] . "\n");
1312

    
1313
	fclose($fd);
1314

    
1315
	return 0;
1316
}
1317

    
1318
function system_set_harddisk_standby() {
1319
	global $g, $config;
1320
	if(isset($config['system']['developerspew'])) {
1321
		$mt = microtime();
1322
		echo "system_set_harddisk_standby() being called $mt\n";
1323
	}
1324

    
1325
	if (isset($config['system']['harddiskstandby'])) {
1326
		if ($g['booting']) {
1327
			echo 'Setting hard disk standby... ';
1328
		}
1329

    
1330
		$standby = $config['system']['harddiskstandby'];
1331
		// Check for a numeric value
1332
		if (is_numeric($standby)) {
1333
			// Sync the disk(s)
1334
			pfSense_sync();
1335
			if (!mwexec('/sbin/sysctl hw.ata.standby=' . ((int)$standby))) {
1336
				// Reinitialize ATA-drives
1337
				mwexec('/usr/local/sbin/atareinit');
1338
				if ($g['booting']) {
1339
					echo "done.\n";
1340
				}
1341
			} else if ($g['booting']) {
1342
				echo "failed!\n";
1343
			}
1344
		} else if ($g['booting']) {
1345
			echo "failed!\n";
1346
		}
1347
	}
1348
}
1349

    
1350
function system_setup_sysctl() {
1351
	global $config;
1352
	if(isset($config['system']['developerspew'])) {
1353
		$mt = microtime();
1354
		echo "system_setup_sysctl() being called $mt\n";
1355
	}
1356

    
1357
	activate_sysctls();	
1358

    
1359
	if (isset($config['system']['sharednet'])) {
1360
		system_disable_arp_wrong_if();
1361
	}
1362
}
1363

    
1364
function system_disable_arp_wrong_if() {
1365
	global $config;
1366
	if(isset($config['system']['developerspew'])) {
1367
		$mt = microtime();
1368
		echo "system_disable_arp_wrong_if() being called $mt\n";
1369
	}
1370
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_wrong_iface=0");
1371
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_movements=0");
1372
}
1373

    
1374
function system_enable_arp_wrong_if() {
1375
	global $config;
1376
	if(isset($config['system']['developerspew'])) {
1377
		$mt = microtime();
1378
		echo "system_enable_arp_wrong_if() being called $mt\n";
1379
	}
1380
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_wrong_iface=1");
1381
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_movements=1");
1382
}
1383

    
1384
function enable_watchdog() {
1385
	global $config;
1386
	return;
1387
	$install_watchdog = false;
1388
	$supported_watchdogs = array("Geode");
1389
	$file = file_get_contents("/var/log/dmesg.boot");
1390
	foreach($supported_watchdogs as $sd) {
1391
		if(stristr($file, "Geode")) {
1392
			$install_watchdog = true;
1393
		}
1394
	}
1395
	if($install_watchdog == true) {
1396
		if(is_process_running("watchdogd"))
1397
			mwexec("/usr/bin/killall watchdogd", true);
1398
		exec("/usr/sbin/watchdogd");
1399
	}
1400
}
1401

    
1402
function system_check_reset_button() {
1403
	global $g;
1404
	if($g['platform'] != "nanobsd")
1405
		return 0;
1406

    
1407
	$specplatform = system_identify_specific_platform();
1408

    
1409
	if ($specplatform['name'] != "wrap" && $specplatform['name'] != "alix")
1410
		return 0;
1411

    
1412
	$retval = mwexec("/usr/local/sbin/" . $specplatform['name'] . "resetbtn");
1413

    
1414
	if ($retval == 99) {
1415
		/* user has pressed reset button for 2 seconds - 
1416
		   reset to factory defaults */
1417
		echo <<<EOD
1418

    
1419
***********************************************************************
1420
* Reset button pressed - resetting configuration to factory defaults. *
1421
* The system will reboot after this completes.                        *
1422
***********************************************************************
1423

    
1424

    
1425
EOD;
1426
		
1427
		reset_factory_defaults();
1428
		system_reboot_sync();
1429
		exit(0);
1430
	}
1431

    
1432
	return 0;
1433
}
1434

    
1435
/* attempt to identify the specific platform (for embedded systems)
1436
   Returns an array with two elements:
1437
	name => platform string (e.g. 'wrap', 'alix' etc.)
1438
	descr => human-readable description (e.g. "PC Engines WRAP")
1439
*/
1440
function system_identify_specific_platform() {
1441
	global $g;
1442
	
1443
	if ($g['platform'] == 'generic-pc')
1444
		return array('name' => 'generic-pc', 'descr' => "Generic PC");
1445
	
1446
	if ($g['platform'] == 'generic-pc-cdrom')
1447
		return array('name' => 'generic-pc-cdrom', 'descr' => "Generic PC (CD-ROM)");
1448
	
1449
	/* the rest of the code only deals with 'embedded' platforms */
1450
	if ($g['platform'] != 'nanobsd')
1451
		return array('name' => $g['platform'], 'descr' => $g['platform']);
1452
	
1453
	$dmesg = system_get_dmesg_boot();
1454
	
1455
	if (strpos($dmesg, "PC Engines WRAP") !== false)
1456
		return array('name' => 'wrap', 'descr' => 'PC Engines WRAP');
1457
	
1458
	if (strpos($dmesg, "PC Engines ALIX") !== false)
1459
		return array('name' => 'alix', 'descr' => 'PC Engines ALIX');
1460

    
1461
	if (preg_match("/Soekris net45../", $dmesg, $matches))
1462
		return array('name' => 'net45xx', 'descr' => $matches[0]);
1463
	
1464
	if (preg_match("/Soekris net48../", $dmesg, $matches))
1465
		return array('name' => 'net48xx', 'descr' => $matches[0]);
1466
		
1467
	if (preg_match("/Soekris net55../", $dmesg, $matches))
1468
		return array('name' => 'net55xx', 'descr' => $matches[0]);
1469
	
1470
	/* unknown embedded platform */
1471
	return array('name' => 'embedded', 'descr' => 'embedded (unknown)');
1472
}
1473

    
1474
function system_get_dmesg_boot() {
1475
	global $g;
1476
		
1477
	return file_get_contents("{$g['varlog_path']}/dmesg.boot");
1478
}
1479

    
1480
?>
(40-40/54)