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	/bin/sync	/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
	foreach($sysctls as $sysctl => $value) {
56
		if($sysctl == $id)
57
			return $value;
58
	}
59
}
60

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

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

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

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

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

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

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

    
98
	$havedns = false;
99

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

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

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

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

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

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

    
170
	return $master_list;
171
}
172

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

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

    
195
	return $master_list;
196
}
197

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

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

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

    
213
	$fd = fopen("{$g['varetc_path']}/hosts", "w");
214
	if (!$fd) {
215
		log_error("Error: cannot open hosts file in system_hosts_generate().\n");
216
		return 1;
217
	}
218

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

    
221
	if ($config['interfaces']['lan']) {
222
		$cfgip = get_interface_ip("lan");
223
		if (is_ipaddr($cfgip))
224
			$hosts .= "{$cfgip}	{$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
225
	} else {
226
		$sysiflist = get_configured_interface_list();
227
		foreach ($sysiflist as $sysif) {
228
			if (!interface_has_gateway($sysif)) {
229
				$cfgip = get_interface_ip($sysif);
230
				if (is_ipaddr($cfgip)) {
231
					$hosts .= "{$cfgip}	{$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
232
					break;
233
				}
234
			}
235
		}
236
	}
237

    
238
	foreach ($hostscfg as $host) {
239
		if ($host['host'])
240
			$hosts .= "{$host['ip']}	{$host['host']}.{$host['domain']} {$host['host']}\n";
241
		else
242
			$hosts .= "{$host['ip']}	{$host['domain']}\n";
243
	}
244
	if (isset($dnsmasqcfg['regdhcpstatic']) && is_array($config['dhcpd'])) {
245
		foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf)
246
			if(is_array($dhcpifconf['staticmap']) && isset($dhcpifconf['enable']))
247
					foreach ($dhcpifconf['staticmap'] as $host)
248
						if ($host['ipaddr'] && $host['hostname'])
249
							$hosts .= "{$host['ipaddr']}	{$host['hostname']}.{$syscfg['domain']} {$host['hostname']}\n";
250
	}
251
	fwrite($fd, $hosts);
252
	fclose($fd);
253

    
254
	system_dhcpleases_configure();
255

    
256
	return 0;
257
}
258

    
259
function system_dhcpleases_configure() {
260
	global $config, $g;
261
	
262
	/* Start the monitoring process for dynamic dhcpclients. */
263
	if (isset($config['dnsmasq']['regdhcp'])) {
264
		/* Make sure we do not error out */
265
		@touch("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases");
266
		if (file_exists("{$g['varrun_path']}/dhcpleases.pid"))
267
				sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "HUP");
268
		else
269
			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");
270
	} else {
271
		sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "TERM");
272
		@unlink("{$g['varrun_path']}/dhcpleases.pid");
273
	}
274
}
275

    
276
function system_hostname_configure() {
277
	global $config, $g;
278
	if(isset($config['system']['developerspew'])) {
279
		$mt = microtime();
280
		echo "system_hostname_configure() being called $mt\n";
281
	}
282

    
283
	$syscfg = $config['system'];
284

    
285
	/* set hostname */
286
	$status = mwexec("/bin/hostname " .
287
		escapeshellarg("{$syscfg['hostname']}.{$syscfg['domain']}"));
288

    
289
    /* Setup host GUID ID.  This is used by ZFS. */
290
	mwexec("/etc/rc.d/hostid start");
291

    
292
	return $status;
293
}
294

    
295
function system_routing_configure($interface = "") {
296
	global $config, $g;
297
	if(isset($config['system']['developerspew'])) {
298
		$mt = microtime();
299
		echo "system_routing_configure() being called $mt\n";
300
	}
301

    
302
	/* Enable fast routing, if enabled */
303
	/* XXX: More checks need to be done for subsystems that are not compatibel with fast routing. */
304
	if(isset($config['staticroutes']['enablefastrouting']) && !isset($config['ipsec']['enable']))
305
		mwexec("/sbin/sysctl net.inet.ip.fastforwarding=1");
306

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

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

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

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

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

    
398
	return 0;
399
}
400

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

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

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

    
418
	$syslogcfg = $config['syslog'];
419

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

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

    
436
	// Which logging type are we using this week??
437
	if(isset($config['system']['usefifolog'])) {
438
		$log_directive = $fifolog_log;
439
		$log_create_directive = $fifolog_create;		
440
	} else { // Defaults to CLOG
441
		$log_directive = $clog_log;
442
		$log_create_directive = $clog_create;
443
	}
444
	
445
	if (isset($syslogcfg)) {
446
		$separatelogfacilities = array('ntpd','racoon','openvpn');
447
		if($config['installedpackages']['package']) {
448
			foreach($config['installedpackages']['package'] as $package) {
449
				if($package['logging']) {
450
					$pkgfacilities[] = $package['logging']['facilityname'];
451
					$separatelogfacilities = $separatelogfacilities + $pkgfacilities;
452
					$facilitylist = implode(',', $pkgfacilities);
453
					mwexec("{$log_create_directive} 10240 {$g['varlog_path']}/{$package['logging']['logfilename']}");
454
					$syslogconf .= "!{$facilitylist}\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 .= "!pptp\n";
472
		if (!isset($syslogcfg['disablelocallogging'])) 
473
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/pptp.log\n";
474
		$syslogconf .= "!pppoe\n";
475
		if (!isset($syslogcfg['disablelocallogging'])) 
476
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/pppoe.log\n";
477
		$syslogconf .= "!l2tp\n";
478
		if (!isset($syslogcfg['disablelocallogging'])) 
479
			$syslogconf .= "*.*					 {$log_directive}{$g['varlog_path']}/l2tp.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
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 -f {$g['varetc_path']}/syslog.conf");
619
		else
620
			$retval = system("/usr/sbin/syslogd -c -f {$g['varetc_path']}/syslog.conf");
621

    
622
	} else {
623
		$retval = mwexec("/usr/sbin/syslogd -c");
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
			mwexec('/bin/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)