Project

General

Profile

Download (42.7 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
		// Are we logging to a least one remote server ?
617
		if(strpos($syslogconf, "@") != false)
618
			$retval = system("/usr/sbin/syslogd -c c -l /var/dhcpd/var/run/log -f {$g['varetc_path']}/syslog.conf");
619
		else
620
			$retval = system("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log -f {$g['varetc_path']}/syslog.conf");
621

    
622
	} else {
623
		$retval = mwexec("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log");
624
	}
625

    
626
	if ($g['booting'])
627
		echo "done.\n";
628

    
629
	return $retval;
630
}
631

    
632
function system_pccard_start() {
633
	global $config, $g;
634
	if(isset($config['system']['developerspew'])) {
635
		$mt = microtime();
636
		echo "system_pccard_start() being called $mt\n";
637
	}
638

    
639
	if ($g['booting'])
640
		echo "Initializing PCMCIA...";
641

    
642
	/* kill any running pccardd */
643
	killbypid("{$g['varrun_path']}/pccardd.pid");
644

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

    
648
	if ($g['booting']) {
649
		if ($res == 0)
650
			echo "done.\n";
651
		else
652
			echo "failed!\n";
653
	}
654

    
655
	return $res;
656
}
657

    
658

    
659
function system_webgui_start() {
660
	global $config, $g;
661

    
662
	if ($g['booting'])
663
		echo "Starting webConfigurator...";
664

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

    
668
	sleep(1);
669

    
670
	chdir($g['www_path']);
671

    
672
	/* defaults */
673
	$portarg = "80";
674
	$crt = "";
675
	$key = "";
676
	$ca = "";
677

    
678
	/* non-standard port? */
679
	if (isset($config['system']['webgui']['port']) && $config['system']['webgui']['port'] <> "")
680
		$portarg = "{$config['system']['webgui']['port']}";
681

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

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

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

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

    
731
	if ($g['booting']) {
732
		if ($res == 0)
733
			echo "done.\n";
734
		else
735
			echo "failed!\n";
736
	}
737

    
738
	return $res;
739
}
740

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

    
755
	global $config, $g;
756

    
757
	if(!is_dir("{$g['tmp_path']}/lighttpdcompress"))
758
		mkdir("{$g['tmp_path']}/lighttpdcompress");
759

    
760
	if(isset($config['system']['developerspew'])) {
761
		$mt = microtime();
762
		echo "system_generate_lighty_config() being called $mt\n";
763
	}
764

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

    
792
	$memory = get_memory();
793
	$avail = $memory[0];
794

    
795
	if($avail > 0 and $avail < 65) {
796
		$fast_cgi_enable = false;
797
	}
798

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

    
818
	if($captive_portal == true)  {	
819
		$bin_environment =  <<<EOC
820
        "bin-environment" => (
821
           "PHP_FCGI_CHILDREN" => "$max_procs",
822
           "PHP_FCGI_MAX_REQUESTS" => "500"
823
        ), 
824
EOC;
825

    
826
	} else if ($avail > 0 and $avail < 128) {
827
		$bin_environment = <<<EOC
828
		"bin-environment" => (
829
			"PHP_FCGI_CHILDREN" => "$max_procs",
830
			"PHP_FCGI_MAX_REQUESTS" => "2",
831
	),
832

    
833
EOC;
834
	} else
835
		$bin_environment =  <<<EOC
836
        "bin-environment" => (
837
           "PHP_FCGI_CHILDREN" => "$max_procs",
838
           "PHP_FCGI_MAX_REQUESTS" => "500"
839
        ), 
840
EOC;
841

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

    
860
#### CGI module
861
cgi.assign                 = ( ".cgi" => "" )
862

    
863
EOD;
864
	} else {
865
		$fastcgi_config = "";
866
		$module = "\"mod_cgi\"";
867
		$cgi_config = <<<EOD
868
#### CGI module
869
cgi.assign                 = ( ".php"  => "/usr/local/bin/php",
870
                               ".cgi" => "" )
871

    
872
EOD;
873
	}
874

    
875
	$lighty_config = "";
876
	$lighty_config .= <<<EOD
877
#
878
# lighttpd configuration file
879
#
880
# use a it as base for lighttpd 1.0.0 and above
881
#
882
############ Options you really have to take care of ####################
883

    
884
## FreeBSD!
885
server.event-handler	= "freebsd-kqueue"
886
server.network-backend 	= "writev"
887

    
888
## modules to load
889
server.modules              =   (
890
									{$captive_portal_module}
891
									"mod_access", "mod_accesslog", "mod_expire", "mod_compress", "mod_redirect",
892
									{$module}{$captiveportal}
893
								)
894

    
895
## Unused modules
896
#                               "mod_setenv",
897
#                               "mod_rewrite",
898
#                               "mod_ssi",
899
#                               "mod_usertrack",
900
#                               "mod_expire",
901
#                               "mod_secdownload",
902
#                               "mod_rrdtool",
903
#                               "mod_auth",
904
#                               "mod_status",
905
#                               "mod_alias",
906
#                               "mod_proxy",
907
#                               "mod_simple_vhost",
908
#                               "mod_evhost",
909
#                               "mod_userdir",
910
#                               "mod_cgi",
911

    
912
server.max-keep-alive-requests = 15
913
server.max-keep-alive-idle = 30
914

    
915
## a static document-root, for virtual-hosting take look at the
916
## server.virtual-* options
917
server.document-root        = "{$document_root}"
918
{$captive_portal_rewrite}
919

    
920
# Maximum idle time with nothing being written (php downloading)
921
server.max-write-idle = 999
922

    
923
## where to send error-messages to
924
server.errorlog             = "/var/log/lighttpd.error.log"
925

    
926
# files to check for if .../ is requested
927
server.indexfiles           = ( "index.php", "index.html",
928
                                "index.htm", "default.htm" )
929

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

    
983
# Use the "Content-Type" extended attribute to obtain mime type if possible
984
#mimetypes.use-xattr        = "enable"
985

    
986
#### accesslog module
987
#accesslog.filename          = "/dev/null"
988

    
989
## deny access the file-extensions
990
#
991
# ~    is for backupfiles from vi, emacs, joe, ...
992
# .inc is often used for code includes which should in general not be part
993
#      of the document-root
994
url.access-deny             = ( "~", ".inc" )
995

    
996

    
997
######### Options that are good to be but not neccesary to be changed #######
998

    
999
## bind to port (default: 80)
1000
server.port                = {$lighty_port}
1001

    
1002
## error-handler for status 404
1003
#server.error-handler-404   = "/error-handler.html"
1004
#server.error-handler-404   = "/error-handler.php"
1005

    
1006
## to help the rc.scripts
1007
server.pid-file            = "/var/run/{$pid_file}"
1008

    
1009
## virtual directory listings
1010
server.dir-listing         = "disable"
1011

    
1012
## enable debugging
1013
debug.log-request-header   = "disable"
1014
debug.log-response-header  = "disable"
1015
debug.log-request-handling = "disable"
1016
debug.log-file-not-found   = "disable"
1017

    
1018
# gzip compression
1019
compress.cache-dir = "{$g['tmp_path']}/lighttpdcompress/"
1020
compress.filetype  = ("text/plain","text/css", "text/xml", "text/javascript" )
1021

    
1022
{$server_upload_dirs}
1023

    
1024
{$server_max_request_size}
1025

    
1026
{$fastcgi_config}
1027

    
1028
{$cgi_config}
1029

    
1030
{$captive_portal_mod_evasive}
1031

    
1032
expire.url = (
1033
				"" => "access 50 hours",	
1034
        )
1035

    
1036
EOD;
1037

    
1038
	$cert = str_replace("\r", "", $cert);
1039
	$key = str_replace("\r", "", $key);
1040
	$ca = str_replace("\r", "", $ca);
1041

    
1042
	$cert = str_replace("\n\n", "\n", $cert);
1043
	$key = str_replace("\n\n", "\n", $key);
1044
	$ca = str_replace("\n\n", "\n", $ca);
1045

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

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

    
1088
	$fd = fopen("{$filename}", "w");
1089
	if (!$fd) {
1090
		printf("Error: cannot open {$filename} in system_generate_lighty_config().\n");
1091
		return 1;
1092
	}
1093
	fwrite($fd, $lighty_config);
1094
	fclose($fd);
1095

    
1096
	return 0;
1097

    
1098
}
1099

    
1100
function system_timezone_configure() {
1101
	global $config, $g;
1102
	if(isset($config['system']['developerspew'])) {
1103
		$mt = microtime();
1104
		echo "system_timezone_configure() being called $mt\n";
1105
	}
1106

    
1107
	$syscfg = $config['system'];
1108

    
1109
	if ($g['booting'])
1110
		echo "Setting timezone...";
1111

    
1112
	/* extract appropriate timezone file */
1113
	$timezone = $syscfg['timezone'];
1114
	if (!$timezone)
1115
		$timezone = "Etc/UTC";
1116

    
1117
	conf_mount_rw();
1118

    
1119
	exec("LANG=C /usr/bin/tar xzfO /usr/share/zoneinfo.tgz " .
1120
		escapeshellarg($timezone) . " > /etc/localtime");
1121

    
1122
	mwexec("sync");
1123
	conf_mount_ro();
1124

    
1125
	if ($g['booting'])
1126
		echo "done.\n";
1127
}
1128

    
1129
function system_ntp_configure() {
1130
	global $config, $g;
1131

    
1132
	$syscfg =& $config['system'];
1133

    
1134
	/* open configuration for wrting or bail */
1135
	$fd = fopen("{$g['varetc_path']}/ntpd.conf","w");
1136
	if(!$fd) {
1137
		log_error("Could not open {$g['varetc_path']}/ntpd.conf for writing");
1138
		return;
1139
	}
1140

    
1141
	fwrite($fd, "# \n");
1142
	fwrite($fd, "# pfSense OpenNTPD configuration file \n");
1143
	fwrite($fd, "# \n\n");
1144

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

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

    
1165
	fwrite($fd, "\n");
1166

    
1167
	/* slurp! */
1168
	fclose($fd);
1169

    
1170
	/* if openntpd is running, kill it */
1171
	while(is_process_running("ntpd")) {
1172
		killbyname("ntpd");
1173
	}
1174

    
1175
	/* if /var/empty does not exist, create it */
1176
	if(!is_dir("/var/empty"))
1177
		exec("/bin/mkdir -p /var/empty && chmod ug+rw /var/empty/.");
1178

    
1179
	if ($g['booting'])
1180
		return;
1181

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

    
1188
}
1189

    
1190
function sync_system_time() {
1191
	global $config, $g;
1192

    
1193
	$syscfg = $config['system'];
1194

    
1195
	if ($g['booting'])
1196
		echo "Syncing system time before startup...";
1197

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

    
1208
function system_halt() {
1209
	global $g;
1210

    
1211
	system_reboot_cleanup();
1212

    
1213
	mwexec("/usr/bin/nohup /etc/rc.halt > /dev/null 2>&1 &");
1214
}
1215

    
1216
function system_reboot() {
1217
	global $g;
1218

    
1219
	system_reboot_cleanup();
1220

    
1221
	mwexec("nohup /etc/rc.reboot > /dev/null 2>&1 &");
1222
}
1223

    
1224
function system_reboot_sync() {
1225
	global $g;
1226

    
1227
	system_reboot_cleanup();
1228

    
1229
	mwexec("/etc/rc.reboot > /dev/null 2>&1");
1230
}
1231

    
1232
function system_reboot_cleanup() {
1233
	mwexec("/usr/local/bin/beep.sh stop");
1234
	require_once("captiveportal.inc");
1235
	captiveportal_radius_stop_all();
1236
	require_once("voucher.inc");
1237
	voucher_save_db_to_config();
1238
}
1239

    
1240
function system_do_shell_commands($early = 0) {
1241
	global $config, $g;
1242
	if(isset($config['system']['developerspew'])) {
1243
		$mt = microtime();
1244
		echo "system_do_shell_commands() being called $mt\n";
1245
	}
1246

    
1247
	if ($early)
1248
		$cmdn = "earlyshellcmd";
1249
	else
1250
		$cmdn = "shellcmd";
1251

    
1252
	if (is_array($config['system'][$cmdn])) {
1253

    
1254
		/* *cmd is an array, loop through */
1255
		foreach ($config['system'][$cmdn] as $cmd) {
1256
			exec($cmd);
1257
		}
1258

    
1259
	} elseif($config['system'][$cmdn] <> "") {
1260

    
1261
		/* execute single item */
1262
		exec($config['system'][$cmdn]);
1263

    
1264
	}
1265
}
1266

    
1267
function system_console_configure() {
1268
	global $config, $g;
1269
	if(isset($config['system']['developerspew'])) {
1270
		$mt = microtime();
1271
		echo "system_console_configure() being called $mt\n";
1272
	}
1273

    
1274
	if (isset($config['system']['disableconsolemenu'])) {
1275
		touch("{$g['varetc_path']}/disableconsole");
1276
	} else {
1277
		unlink_if_exists("{$g['varetc_path']}/disableconsole");
1278
	}
1279
}
1280

    
1281
function system_dmesg_save() {
1282
	global $g;
1283
	if(isset($config['system']['developerspew'])) {
1284
		$mt = microtime();
1285
		echo "system_dmesg_save() being called $mt\n";
1286
	}
1287

    
1288
	$dmesg = "";
1289
	exec("/sbin/dmesg", $dmesg);
1290

    
1291
	/* find last copyright line (output from previous boots may be present) */
1292
	$lastcpline = 0;
1293

    
1294
	for ($i = 0; $i < count($dmesg); $i++) {
1295
		if (strstr($dmesg[$i], "Copyright (c) 1992-"))
1296
			$lastcpline = $i;
1297
	}
1298

    
1299
	$fd = fopen("{$g['varlog_path']}/dmesg.boot", "w");
1300
	if (!$fd) {
1301
		printf("Error: cannot open dmesg.boot in system_dmesg_save().\n");
1302
		return 1;
1303
	}
1304

    
1305
	for ($i = $lastcpline; $i < count($dmesg); $i++)
1306
		fwrite($fd, $dmesg[$i] . "\n");
1307

    
1308
	fclose($fd);
1309

    
1310
	return 0;
1311
}
1312

    
1313
function system_set_harddisk_standby() {
1314
	global $g, $config;
1315
	if(isset($config['system']['developerspew'])) {
1316
		$mt = microtime();
1317
		echo "system_set_harddisk_standby() being called $mt\n";
1318
	}
1319

    
1320
	if (isset($config['system']['harddiskstandby'])) {
1321
		if ($g['booting']) {
1322
			echo 'Setting hard disk standby... ';
1323
		}
1324

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

    
1345
function system_setup_sysctl() {
1346
	global $config;
1347
	if(isset($config['system']['developerspew'])) {
1348
		$mt = microtime();
1349
		echo "system_setup_sysctl() being called $mt\n";
1350
	}
1351

    
1352
	activate_sysctls();	
1353

    
1354
	if (isset($config['system']['sharednet'])) {
1355
		system_disable_arp_wrong_if();
1356
	}
1357
}
1358

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

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

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

    
1397
function system_check_reset_button() {
1398
	global $g;
1399
	if($g['platform'] != "nanobsd")
1400
		return 0;
1401

    
1402
	$specplatform = system_identify_specific_platform();
1403

    
1404
	if ($specplatform['name'] != "wrap" && $specplatform['name'] != "alix")
1405
		return 0;
1406

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

    
1409
	if ($retval == 99) {
1410
		/* user has pressed reset button for 2 seconds - 
1411
		   reset to factory defaults */
1412
		echo <<<EOD
1413

    
1414
***********************************************************************
1415
* Reset button pressed - resetting configuration to factory defaults. *
1416
* The system will reboot after this completes.                        *
1417
***********************************************************************
1418

    
1419

    
1420
EOD;
1421
		
1422
		reset_factory_defaults();
1423
		system_reboot_sync();
1424
		exit(0);
1425
	}
1426

    
1427
	return 0;
1428
}
1429

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

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

    
1469
function system_get_dmesg_boot() {
1470
	global $g;
1471
		
1472
	return file_get_contents("{$g['varlog_path']}/dmesg.boot");
1473
}
1474

    
1475
?>
(40-40/54)