Project

General

Profile

Download (49 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/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/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 ($g['platform'] == 'jail')
44
		return;
45
	if(is_process_running("powerd"))
46
		exec("/usr/bin/killall powerd");
47
	if(isset($config['system']['powerd_enable'])) {
48
		if ($g["platform"] == "nanobsd")
49
			exec("/sbin/kldload cpufreq");
50
		$mode = "hadp";
51
		if (!empty($config['system']['powerd_mode']))
52
			$mode = $config['system']['powerd_mode'];
53
		mwexec("/usr/sbin/powerd -b $mode -a $mode");
54
	}
55
}
56

    
57
function get_default_sysctl_value($id) {
58
	global $sysctls;
59

    
60
	if (isset($sysctls[$id]))
61
		return $sysctls[$id];
62
}
63

    
64
function activate_sysctls() {
65
	global $config, $g;
66
	if ($g['platform'] == 'jail')
67
		return;
68
	exec("/sbin/sysctl net.enc.out.ipsec_bpf_mask=0x00000001");
69
	exec("/sbin/sysctl net.enc.out.ipsec_filter_mask=0x00000001");
70
	exec("/sbin/sysctl net.enc.in.ipsec_bpf_mask=0x00000002");
71
	exec("/sbin/sysctl net.enc.in.ipsec_filter_mask=0x00000002");
72

    
73
	if(is_array($config['sysctl'])) {
74
		foreach($config['sysctl']['item'] as $tunable) {
75
			if($tunable['value'] == "default") {
76
				$value = get_default_sysctl_value($tunable['tunable']);
77
				mwexec("/sbin/sysctl " . $tunable['tunable'] . "=\"" . $value .  "\"");
78
			} else { 
79
				mwexec("/sbin/sysctl " . $tunable['tunable'] . "=\"" . $tunable['value'] .  "\"");
80
			}
81
		}
82
	}
83
}
84

    
85
function system_resolvconf_generate($dynupdate = false) {
86
	global $config, $g;
87

    
88
	if(isset($config['system']['developerspew'])) {
89
		$mt = microtime();
90
		echo "system_resolvconf_generate() being called $mt\n";
91
	}
92

    
93
	$syscfg = $config['system'];
94

    
95
	// Do not create blank domain lines, it breaks tools like dig.
96
	if($syscfg['domain'])
97
		$resolvconf = "domain {$syscfg['domain']}\n";
98

    
99
	if (isset($config['dnsmasq']['enable']) && !isset($config['system']['dnslocalhost']))
100
		$resolvconf .= "nameserver 127.0.0.1\n";
101

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

    
122
	$dnslock = lock('resolvconf', LOCK_EX);
123

    
124
	$fd = fopen("{$g['varetc_path']}/resolv.conf", "w");
125
	if (!$fd) {
126
		printf("Error: cannot open resolv.conf in system_resolvconf_generate().\n");
127
		unlock($dnslock);
128
		return 1;
129
	}
130

    
131
	fwrite($fd, $resolvconf);
132
	fclose($fd);
133

    
134
	if (!$g['booting']) {
135
		/* restart dhcpd (nameservers may have changed) */
136
		if (!$dynupdate)
137
			services_dhcpd_configure();
138
	}
139

    
140
	/* setup static routes for DNS servers. */
141
	for ($dnscounter=1; $dnscounter<5; $dnscounter++) {
142
		/* setup static routes for dns servers */
143
		$dnsgw = "dns{$dnscounter}gw";
144
		if (isset($config['system'][$dnsgw])) {
145
			$gwname = $config['system'][$dnsgw];
146
			if (($gwname <> "") && ($gwname <> "none")) {
147
				$gatewayip = lookup_gateway_ip_by_name($gwname);
148
				if (is_ipaddrv4($gatewayip)) {
149
					/* dns server array starts at 0 */
150
					$dnscountermo = $dnscounter - 1;
151
					mwexec("route change -host " . $syscfg['dnsserver'][$dnscountermo] . " {$gatewayip}");
152
				}
153
				if (is_ipaddrv6($gatewayip)) {
154
					/* dns server array starts at 0 */
155
					$dnscountermo = $dnscounter - 1;
156
					mwexec("route change -host -inet6 " . $syscfg['dnsserver'][$dnscountermo] . " {$gatewayip}");
157
				}
158
			}
159
		}
160
	}
161

    
162
	unlock($dnslock);
163

    
164
	return 0;
165
}
166

    
167
function get_searchdomains() {
168
	global $config, $g;
169

    
170
	$master_list = array();
171
	
172
	// Read in dhclient nameservers
173
	$search_list = glob("/var/etc/searchdomain_*");
174
	if (is_array($search_lists)) {
175
		foreach($search_lists as $fdns) {
176
			$contents = file($fdns, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
177
			if (!is_array($contents))
178
				continue;
179
			foreach ($contents as $dns) {
180
				if(is_hostname($dns)) 
181
					$master_list[] = $dns;
182
			}
183
		}
184
	}
185

    
186
	return $master_list;
187
}
188

    
189
function get_nameservers() {
190
	global $config, $g;
191
	$master_list = array();
192
	
193
	// Read in dhclient nameservers
194
	$dns_lists = glob("/var/etc/nameserver_*");
195
	if (is_array($dns_lists)) {
196
		foreach($dns_lists as $fdns) {
197
			$contents = file($fdns, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
198
			if (!is_array($contents))
199
				continue;
200
			foreach ($contents as $dns) {
201
				if(is_ipaddr($dns)) 
202
					$master_list[] = $dns;
203
			}
204
		}
205
	}
206

    
207
	// Read in any extra nameservers
208
	if(file_exists("/var/etc/nameservers.conf")) {
209
		$dns_s = file("/var/etc/nameservers.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
210
		if(is_array($dns_s)) {
211
			foreach($dns_s as $dns)
212
				if (is_ipaddr($dns))
213
					$master_list[] = $dns;
214
		}
215
	}
216

    
217
	return $master_list;
218
}
219

    
220
function system_hosts_generate() {
221
	global $config, $g;
222
	if(isset($config['system']['developerspew'])) {
223
		$mt = microtime();
224
		echo "system_hosts_generate() being called $mt\n";
225
	}
226

    
227
	$syscfg = $config['system'];
228
	$dnsmasqcfg = $config['dnsmasq'];
229

    
230
	if (!is_array($dnsmasqcfg['hosts'])) {
231
		$dnsmasqcfg['hosts'] = array();
232
	}
233
	$hostscfg = $dnsmasqcfg['hosts'];
234

    
235
	$hosts = "127.0.0.1	localhost localhost.{$syscfg['domain']}\n";
236
	$lhosts = "";
237
	$dhosts = "";
238

    
239
	if ($config['interfaces']['lan']) {
240
		$cfgip = get_interface_ip("lan");
241
		if (is_ipaddr($cfgip))
242
			$hosts .= "{$cfgip}	{$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
243
	} else {
244
		$sysiflist = get_configured_interface_list();
245
		foreach ($sysiflist as $sysif) {
246
			if (!interface_has_gateway($sysif)) {
247
				$cfgip = get_interface_ip($sysif);
248
				if (is_ipaddr($cfgip)) {
249
					$hosts .= "{$cfgip}	{$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
250
					break;
251
				}
252
			}
253
		}
254
	}
255

    
256
	foreach ($hostscfg as $host) {
257
		if ($host['host'])
258
			$lhosts .= "{$host['ip']}	{$host['host']}.{$host['domain']} {$host['host']}\n";
259
		else
260
			$lhosts .= "{$host['ip']}	{$host['domain']}\n";
261
		if (!is_array($host['aliases']) || !is_array($host['aliases']['item']))
262
			continue;
263
		foreach ($host['aliases']['item'] as $alias) {
264
			if ($alias['host'])
265
				$lhosts .= "{$host['ip']}	{$alias['host']}.{$alias['domain']} {$alias['host']}\n";
266
			else
267
				$lhosts .= "{$host['ip']}	{$alias['domain']}\n";
268
		}
269
	}
270
	if (isset($dnsmasqcfg['regdhcpstatic']) && is_array($config['dhcpd'])) {
271
		foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf)
272
			if(is_array($dhcpifconf['staticmap']) && isset($dhcpifconf['enable']))
273
					foreach ($dhcpifconf['staticmap'] as $host)
274
						if ($host['ipaddr'] && $host['hostname'])
275
							$dhosts .= "{$host['ipaddr']}	{$host['hostname']}.{$syscfg['domain']} {$host['hostname']}\n";
276
	}
277
	if (isset($dnsmasqcfg['regdhcpstatic']) && is_array($config['dhcpdv6'])) {
278
		foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf)
279
			if(is_array($dhcpifconf['staticmap']) && isset($dhcpifconf['enable']))
280
					foreach ($dhcpifconf['staticmap'] as $host)
281
						if ($host['ipaddrv6'] && $host['hostname'])
282
							$dhosts .= "{$host['ipaddrv6']}	{$host['hostname']}.{$syscfg['domain']} {$host['hostname']}\n";
283
	}
284

    
285
	if (isset($dnsmasqcfg['dhcpfirst']))
286
		$hosts .= $dhosts . $lhosts;
287
	else
288
		$hosts .= $lhosts . $dhosts;
289

    
290
	/*
291
	 * Do not remove this because dhcpleases monitors with kqueue it needs to be 
292
	 * killed before writing to hosts files.
293
	 */
294
	if (file_exists("{$g['varrun_path']}/dhcpleases.pid")) {
295
		sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "TERM");
296
                @unlink("{$g['varrun_path']}/dhcpleases.pid");
297
	}
298
	$fd = fopen("{$g['varetc_path']}/hosts", "w");
299
	if (!$fd) {
300
		log_error("Error: cannot open hosts file in system_hosts_generate().\n");
301
		return 1;
302
	}
303
	fwrite($fd, $hosts);
304
	fclose($fd);
305

    
306
	system_dhcpleases_configure();
307

    
308
	return 0;
309
}
310

    
311
function system_dhcpleases_configure() {
312
	global $config, $g;
313
	
314
	if ($g['platform'] == 'jail')
315
		return;
316
	/* Start the monitoring process for dynamic dhcpclients. */
317
	if (isset($config['dnsmasq']['regdhcp'])) {
318
		/* Make sure we do not error out */
319
		@touch("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases");
320
		if (file_exists("{$g['varrun_path']}/dhcpleases.pid"))
321
				sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "HUP");
322
		else
323
			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");
324
	} else {
325
		sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "TERM");
326
		@unlink("{$g['varrun_path']}/dhcpleases.pid");
327
	}
328
}
329

    
330
function system_hostname_configure() {
331
	global $config, $g;
332
	if(isset($config['system']['developerspew'])) {
333
		$mt = microtime();
334
		echo "system_hostname_configure() being called $mt\n";
335
	}
336

    
337
	$syscfg = $config['system'];
338

    
339
	/* set hostname */
340
	$status = mwexec("/bin/hostname " .
341
		escapeshellarg("{$syscfg['hostname']}.{$syscfg['domain']}"));
342

    
343
    /* Setup host GUID ID.  This is used by ZFS. */
344
	mwexec("/etc/rc.d/hostid start");
345

    
346
	return $status;
347
}
348

    
349
function system_routing_configure($interface = "") {
350
	global $config, $g;
351
	if ($g['platform'] == 'jail')
352
		return;
353
	if(isset($config['system']['developerspew'])) {
354
		$mt = microtime();
355
		echo "system_routing_configure() being called $mt\n";
356
	}
357

    
358
	$gatewayip = "";
359
	$interfacegw = "";
360
	$foundgw = false;
361
	$gatewayipv6 = "";
362
	$interfacegwv6 = "";
363
	$foundgwv6 = false;
364
	/* tack on all the hard defined gateways as well */
365
	if (is_array($config['gateways']['gateway_item'])) {
366
		mwexec("/bin/rm {$g['tmp_path']}/*_defaultgw", true);
367
		foreach	($config['gateways']['gateway_item'] as $gateway) {
368
			if (isset($gateway['defaultgw']) && ((is_ipaddrv4($gateway['gateway'])) || ($gateway['gateway'] == "dynamic"))) {
369
				if(strstr($gateway['gateway'], ":"))
370
					break;
371
				if ($gateway['gateway'] == "dynamic")
372
					$gateway['gateway'] = get_interface_gateway($gateway['interface']);
373
				$gatewayip = $gateway['gateway'];
374
				$interfacegw = $gateway['interface'];
375
				if (!empty($interfacegw)) {
376
					$defaultif = get_real_interface($gateway['interface']);
377
					if ($defaultif)
378
						@file_put_contents("{$g['tmp_path']}/{$defaultif}_defaultgw", $gatewayip);
379
				}
380
				$foundgw = true;
381
				break;
382
			}
383
		}
384
		foreach	($config['gateways']['gateway_item'] as $gateway) {
385
			if (isset($gateway['defaultgw']) && ((is_ipaddrv6($gateway['gateway'])) || ($gateway['gateway'] == "dynamic6"))) {
386
				if ($gateway['gateway'] == "dynamic6")
387
					$gateway['gateway'] = get_interface_gateway_v6($gateway['interface']);
388
				$gatewayipv6 = $gateway['gateway'];
389
				$interfacegwv6 = $gateway['interface'];
390
				if (!empty($interfacegwv6)) {
391
					$defaultifv6 = get_real_interface($gateway['interface']);
392
					if ($defaultifv6)
393
						@file_put_contents("{$g['tmp_path']}/{$defaultifv6}_defaultgwv6", $gatewayipv6);
394
				}
395
				$foundgwv6 = true;
396
				break;
397
			}
398
		}
399
	}
400
	if ($foundgw == false) {
401
		$defaultif = get_real_interface("wan");
402
		$interfacegw = "wan";
403
		$gatewayip = get_interface_gateway("wan");
404
		@touch("{$g['tmp_path']}/{$defaultif}_defaultgw");
405
	}	
406
	if ($foundgwv6 == false) {
407
		$defaultifv6 = get_real_interface("wan");
408
		$interfacegwv6 = "wan";
409
		$gatewayipv6 = get_interface_gateway_v6("wan");
410
		@touch("{$g['tmp_path']}/{$defaultif}_defaultgwv6");
411
	}
412
	$dont_add_route = false;
413
	/* if OLSRD is enabled, allow WAN to house DHCP. */
414
	if($config['installedpackages']['olsrd']) {
415
		foreach($config['installedpackages']['olsrd']['config'] as $olsrd) {
416
			if(($olsrd['enabledyngw'] == "on") && ($olsrd['enable'] == "on")) {
417
				$dont_add_route = true;
418
				log_error(sprintf(gettext("Not adding default route because OLSR dynamic gateway is enabled.")));
419
				break;
420
			}
421
		}
422
	}
423

    
424
	if ($dont_add_route == false ) {
425
		if (!empty($interface) && $interface != $interfacegw)
426
			;
427
		else if (($interfacegw <> "bgpd") && (is_ipaddrv4($gatewayip))) {
428
			log_error("ROUTING: setting default route to $gatewayip");
429
			mwexec("/sbin/route change -inet default " . escapeshellarg($gatewayip));
430
		}
431

    
432
		if (!empty($interface) && $interface != $interfacegwv6)
433
			;
434
		else if (($interfacegwv6 <> "bgpd") && (is_ipaddrv6($gatewayipv6))) {
435
			if(preg_match("/fe80::/i", $gatewayipv6))
436
				$ifscope = "%{$defaultifv6}";
437
			log_error("ROUTING: setting IPv6 default route to {$gatewayipv6}{$ifscope}");
438
			mwexec("/sbin/route change -inet6 default " . escapeshellarg($gatewayipv6) ."{$ifscope}");
439
		}
440
	}
441

    
442
	$static_routes = get_staticroutes();
443
	if (count($static_routes)) {
444
		$gateways_arr = return_gateways_array();
445

    
446
		foreach ($static_routes as $rtent) {
447
			$gatewayip = "";
448
			if (empty($gateways_arr[$rtent['gateway']])) {
449
				log_error(sprintf(gettext("Static Routes: Gateway IP could not be found for %s"), $rtent['network']));
450
				continue;
451
			}
452
			$gateway = $gateways_arr[$rtent['gateway']];
453
			if (!empty($interface) && $interface != $gateway['friendlyiface'])
454
				continue;
455

    
456
			if(isset($rtent['disabled'])) {
457
				mwexec("/sbin/route delete " . escapeshellarg($rtent['network']), true);
458
				continue;
459
			}
460

    
461
			$gatewayip = $gateway['gateway'];
462
			$interfacegw = $gateway['interface'];
463

    
464
			if(is_ipaddrv6($gatewayip)) {
465
				$inetfamily = "-inet6";
466
			} else {
467
				$inetfamily = "-inet";
468
			}
469
			if (is_ipaddr($gatewayip)) {
470
				mwexec("/sbin/route change {$inetfamily} " . escapeshellarg($rtent['network']) .
471
					" " . escapeshellarg($gatewayip));
472
			} else if (!empty($interfacegw)) {
473
				mwexec("/sbin/route change {$inetfamily} " . escapeshellarg($rtent['network']) .
474
					" -iface " . escapeshellarg($interfacegw));
475
			}
476
		}
477
	}
478

    
479
	return 0;
480
}
481

    
482
function system_routing_enable() {
483
	global $config, $g;
484
	if(isset($config['system']['developerspew'])) {
485
		$mt = microtime();
486
		echo "system_routing_enable() being called $mt\n";
487
	}
488

    
489
	mwexec("/sbin/sysctl net.inet.ip.forwarding=1");
490
	mwexec("/sbin/sysctl net.inet6.ip6.forwarding=1");
491
	return;
492
}
493

    
494
function system_syslogd_fixup_server($server) {
495
	/* If it's an IPv6 IP alone, encase it in brackets */
496
	if (is_ipaddrv6($server))
497
		return "[$server]";
498
	else
499
		return $server;
500
}
501

    
502
function system_syslogd_get_remote_servers($syslogcfg, $facility = "*.*") {
503
	// Rather than repeatedly use the same code, use this function to build a list of remote servers.
504
	$facility .= " ".
505
	$remote_servers = "";
506
	$pad_to  = 56;
507
	$padding = ceil(($pad_to - strlen($facility))/8)+1;
508
	if($syslogcfg['remoteserver'])
509
		$remote_servers .= "{$facility}" . str_repeat("\t", $padding) . "@" . system_syslogd_fixup_server($syslogcfg['remoteserver']) . "\n";
510
	if($syslogcfg['remoteserver2'])
511
		$remote_servers .= "{$facility}" . str_repeat("\t", $padding) . "@" . system_syslogd_fixup_server($syslogcfg['remoteserver2']) . "\n";
512
	if($syslogcfg['remoteserver3'])
513
		$remote_servers .= "{$facility}" . str_repeat("\t", $padding) . "@" . system_syslogd_fixup_server($syslogcfg['remoteserver3']) . "\n";
514
	return $remote_servers;
515
}
516

    
517
function system_syslogd_start() {
518
	global $config, $g;
519
	if(isset($config['system']['developerspew'])) {
520
		$mt = microtime();
521
		echo "system_syslogd_start() being called $mt\n";
522
	}
523

    
524
	mwexec("/etc/rc.d/hostid start");
525

    
526
	$syslogcfg = $config['syslog'];
527

    
528
	if ($g['booting'])
529
		echo gettext("Starting syslog...");
530
	else
531
		killbypid("{$g['varrun_path']}/syslog.pid");
532

    
533
	if(is_process_running("syslogd"))
534
		mwexec('/bin/pkill syslogd');
535
	if(is_process_running("fifolog_writer"))
536
		mwexec('/bin/pkill fifolog_writer');
537
	
538
	// Define carious commands for logging
539
	$fifolog_create = "/usr/sbin/fifolog_create -s ";
540
	$fifolog_log = "|/usr/sbin/fifolog_writer ";
541
	$clog_create = "/usr/sbin/clog -i -s ";
542
	$clog_log = "%";
543

    
544
	// Which logging type are we using this week??
545
	if(isset($config['system']['usefifolog'])) {
546
		$log_directive = $fifolog_log;
547
		$log_create_directive = $fifolog_create;
548
	} else { // Defaults to CLOG
549
		$log_directive = $clog_log;
550
		$log_create_directive = $clog_create;
551
	}
552
	
553
	if (isset($syslogcfg)) {
554
		$separatelogfacilities = array('ntp','ntpd','ntpdate','racoon','openvpn','pptps','poes','l2tps','relayd','hostapd','dnsmasq','unbound','dhcpd','dhcrelay','apinger','radvd','routed','olsrd','zebra','ospfd','bgpd');
555
		if($config['installedpackages']['package']) {
556
			foreach($config['installedpackages']['package'] as $package) {
557
				if($package['logging']) {
558
					array_push($separatelogfacilities, $package['logging']['facilityname']);
559
					mwexec("{$log_create_directive} 10240 {$g['varlog_path']}/{$package['logging']['logfilename']}");
560
					$syslogconf .= "!{$package['logging']['facilityname']}\n*.*\t\t\t\t\t\t {$log_directive}{$g['varlog_path']}/{$package['logging']['logfilename']}\n";
561
				}
562
			}
563
		}
564
		$facilitylist = implode(',', array_unique($separatelogfacilities));
565
		/* write syslog.conf */		
566
		$fd = fopen("{$g['varetc_path']}/syslog.conf", "w");
567
		if (!$fd) {
568
			printf(gettext("Error: cannot open syslog.conf in system_syslogd_start().%s"), "\n");
569
			return 1;
570
		}
571
		$syslogconf .= "!radvd,routed,olsrd,zebra,ospfd,bgpd\n";
572
		if (!isset($syslogcfg['disablelocallogging']))
573
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/routing.log\n";
574

    
575
		$syslogconf .= "!ntp,ntpd,ntpdate\n";
576
		if (!isset($syslogcfg['disablelocallogging'])) 
577
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/ntpd.log\n";
578

    
579
		$syslogconf .= "!ppp\n";
580
		if (!isset($syslogcfg['disablelocallogging'])) 
581
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/ppp.log\n";
582

    
583
		$syslogconf .= "!pptps\n";
584
		if (!isset($syslogcfg['disablelocallogging'])) 
585
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/pptps.log\n";
586

    
587
		$syslogconf .= "!poes\n";
588
		if (!isset($syslogcfg['disablelocallogging'])) 
589
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/poes.log\n";
590

    
591
		$syslogconf .= "!l2tps\n";
592
		if (!isset($syslogcfg['disablelocallogging'])) 
593
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/l2tps.log\n";
594

    
595
		$syslogconf .= "!racoon\n";
596
		if (!isset($syslogcfg['disablelocallogging'])) 
597
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/ipsec.log\n";
598
		if (isset($syslogcfg['vpn']))
599
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
600

    
601
		$syslogconf .= "!openvpn\n";
602
		if (!isset($syslogcfg['disablelocallogging'])) 
603
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/openvpn.log\n";
604
		if (isset($syslogcfg['vpn']))
605
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
606

    
607
		$syslogconf .= "!apinger\n";
608
		if (!isset($syslogcfg['disablelocallogging']))
609
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/gateways.log\n";
610
		if (isset($syslogcfg['apinger']))
611
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
612

    
613
		$syslogconf .= "!dnsmasq,unbound\n";
614
		if (!isset($syslogcfg['disablelocallogging']))
615
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/resolver.log\n";
616
		if (isset($syslogcfg['apinger']))
617
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
618

    
619
		$syslogconf .= "!dhcpd,dhcrelay\n";
620
		if (!isset($syslogcfg['disablelocallogging']))
621
			$syslogconf .= "*.*								{$log_directive}{$g['varlog_path']}/dhcpd.log\n";
622
		if (isset($syslogcfg['apinger']))
623
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
624

    
625
		$syslogconf .= "!relayd\n";
626
		if (!isset($syslogcfg['disablelocallogging']))
627
			$syslogconf .= "*.* 								{$log_directive}{$g['varlog_path']}/relayd.log\n";
628
		if (isset($syslogcfg['relayd']))
629
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
630

    
631
		$syslogconf .= "!hostapd\n";
632
		if (!isset($syslogcfg['disablelocallogging']))
633
			$syslogconf .= "*.* 								{$log_directive}{$g['varlog_path']}/wireless.log\n";
634
		if (isset($syslogcfg['hostapd']))
635
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
636

    
637
		$syslogconf .= "!-{$facilitylist}\n";
638
		if (!isset($syslogcfg['disablelocallogging'])) 
639
			$syslogconf .= <<<EOD
640
local0.*							{$log_directive}{$g['varlog_path']}/filter.log
641
local3.*							{$log_directive}{$g['varlog_path']}/vpn.log
642
local4.*							{$log_directive}{$g['varlog_path']}/portalauth.log
643
local7.*							{$log_directive}{$g['varlog_path']}/dhcpd.log
644
*.notice;kern.debug;lpr.info;mail.crit;				{$log_directive}{$g['varlog_path']}/system.log
645
news.err;local0.none;local3.none;local4.none;			{$log_directive}{$g['varlog_path']}/system.log
646
local7.none							{$log_directive}{$g['varlog_path']}/system.log
647
security.*							{$log_directive}{$g['varlog_path']}/system.log
648
auth.info;authpriv.info;daemon.info				{$log_directive}{$g['varlog_path']}/system.log
649
auth.info;authpriv.info 					|exec /usr/local/sbin/sshlockout_pf 15
650
*.emerg								*
651

    
652
EOD;
653
		if (isset($syslogcfg['filter']))
654
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local0.*");
655
		if (isset($syslogcfg['vpn']))
656
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local3.*");
657
		if (isset($syslogcfg['portalauth']))
658
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local4.*");
659
		if (isset($syslogcfg['dhcp']))
660
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local7.*");
661
		if (isset($syslogcfg['system'])) {
662
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.notice;kern.debug;lpr.info;mail.crit;");
663
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "news.err;local0.none;local3.none;local7.none");
664
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "security.*");
665
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "auth.info;authpriv.info;daemon.info");
666
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.emerg");
667
		}
668
		if (isset($syslogcfg['logall'])) {
669
			// Make everything mean everything, including facilities excluded above.
670
			$syslogconf .= "!*\n";
671
			$syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
672
		}
673

    
674
		if (isset($syslogcfg['zmqserver'])) {
675
				$syslogconf .= <<<EOD
676
*.*								^{$syslogcfg['zmqserver']}
677

    
678
EOD;
679
		}
680
		fwrite($fd, $syslogconf);
681
		fclose($fd);
682

    
683
		// Ensure that the log directory exists
684
		if(!is_dir("{$g['dhcpd_chroot_path']}/var/run"))
685
			exec("/bin/mkdir -p {$g['dhcpd_chroot_path']}/var/run");
686

    
687
		// Are we logging to a least one remote server ?
688
		if(strpos($syslogconf, "@") != false)
689
			$retval = mwexec_bg("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log -f {$g['varetc_path']}/syslog.conf");
690
		else {
691
			$retval = mwexec_bg("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log -f {$g['varetc_path']}/syslog.conf");
692
		}
693

    
694
	} else {
695
		$retval = mwexec_bg("/usr/sbin/syslogd -c -c -l /var/dhcpd/var/run/log");
696
	}
697

    
698
	if ($g['booting'])
699
		echo gettext("done.") . "\n";
700

    
701
	return $retval;
702
}
703

    
704
function system_pccard_start() {
705
	global $config, $g;
706
	if(isset($config['system']['developerspew'])) {
707
		$mt = microtime();
708
		echo "system_pccard_start() being called $mt\n";
709
	}
710

    
711
	if ($g['booting'])
712
		echo gettext("Initializing PCMCIA...");
713

    
714
	/* kill any running pccardd */
715
	killbypid("{$g['varrun_path']}/pccardd.pid");
716

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

    
720
	if ($g['booting']) {
721
		if ($res == 0)
722
			echo gettext("done.") . "\n";
723
		else
724
			echo gettext("failed!") . "\n";
725
	}
726

    
727
	return $res;
728
}
729

    
730

    
731
function system_webgui_start() {
732
	global $config, $g;
733

    
734
	if ($g['booting'])
735
		echo gettext("Starting webConfigurator...");
736

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

    
740
	sleep(1);
741

    
742
	chdir($g['www_path']);
743

    
744
	/* defaults */
745
	$portarg = "80";
746
	$crt = "";
747
	$key = "";
748
	$ca = "";
749

    
750
	/* non-standard port? */
751
	if (isset($config['system']['webgui']['port']) && $config['system']['webgui']['port'] <> "")
752
		$portarg = "{$config['system']['webgui']['port']}";
753

    
754
	if ($config['system']['webgui']['protocol'] == "https") {
755
		// Ensure that we have a webConfigurator CERT
756
		$cert =& lookup_cert($config['system']['webgui']['ssl-certref']);
757
		if(!is_array($cert) && !$cert['crt'] && !$cert['prv']) {
758
			if (!is_array($config['ca']))
759
				$config['ca'] = array();
760
			$a_ca =& $config['ca'];
761
			if (!is_array($config['cert']))
762
				$config['cert'] = array();
763
			$a_cert =& $config['cert'];
764
			log_error("Creating SSL Certificate for this host");
765
			$cert = array();
766
			$cert['refid'] = uniqid();
767
			$cert['descr'] = gettext("webConfigurator default");
768
			mwexec("/usr/bin/openssl genrsa 1024 > {$g['tmp_path']}/ssl.key");
769
			mwexec("/usr/bin/openssl req -new -x509 -nodes -sha1 -days 2000 -key {$g['tmp_path']}/ssl.key > {$g['tmp_path']}/ssl.crt");
770
			$crt = file_get_contents("{$g['tmp_path']}/ssl.crt");
771
			$key = file_get_contents("{$g['tmp_path']}/ssl.key");
772
			unlink("{$g['tmp_path']}/ssl.key");
773
			unlink("{$g['tmp_path']}/ssl.crt");
774
			cert_import($cert, $crt, $key);
775
			$a_cert[] = $cert;
776
			$config['system']['webgui']['ssl-certref'] = $cert['refid'];
777
			write_config(gettext("Importing HTTPS certificate"));
778
			if(!$config['system']['webgui']['port'])
779
				$portarg = "443";
780
			$ca = ca_chain($cert);
781
		} else {
782
			$crt = base64_decode($cert['crt']);
783
			$key = base64_decode($cert['prv']);
784
			if(!$config['system']['webgui']['port'])
785
				$portarg = "443";
786
			$ca = ca_chain($cert);
787
		}
788
	}
789

    
790
	/* generate lighttpd configuration */
791
	system_generate_lighty_config("{$g['varetc_path']}/lighty-webConfigurator.conf",
792
		$crt, $key, $ca, "lighty-webConfigurator.pid", $portarg, "/usr/local/www/",
793
		"cert.pem", "ca.pem");
794

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

    
798
	/* fetch page to preload apc cache */
799
	$proto = "http";
800
	if ($config['system']['webgui']['protocol'])
801
		$proto = $config['system']['webgui']['protocol'];
802
	mwexec_bg("/usr/bin/fetch -o /dev/null -q {$proto}://localhost:{$portarg}/preload.php");
803

    
804
	if ($g['booting']) {
805
		if ($res == 0)
806
			echo gettext("done.") . "\n";
807
		else
808
			echo gettext("failed!") . "\n";
809
	}
810

    
811
	return $res;
812
}
813

    
814
function system_generate_lighty_config($filename,
815
	$cert,
816
	$key,
817
	$ca,
818
	$pid_file,
819
	$port = 80,
820
	$document_root = "/usr/local/www/",
821
	$cert_location = "cert.pem",
822
	$ca_location = "ca.pem",
823
	$max_requests = "2",
824
	$fast_cgi_enable = true,
825
	$captive_portal = false) {
826

    
827
	global $config, $g;
828

    
829
	if(!is_dir("{$g['tmp_path']}/lighttpdcompress"))
830
		mkdir("{$g['tmp_path']}/lighttpdcompress");
831

    
832
	if(isset($config['system']['developerspew'])) {
833
		$mt = microtime();
834
		echo "system_generate_lighty_config() being called $mt\n";
835
	}
836

    
837
	if($captive_portal != false)  {
838
		$captiveportal = ",\"mod_rewrite\"";
839
		$captive_portal_rewrite = "url.rewrite-once = ( \"(.*captiveportal.*)\" => \"$1\", \"(.*)\" => \"/index.php?zone={$captive_portal}&redirurl=$1\" )\n";
840
		$captive_portal_module = "";
841
		$maxprocperip = $config['captiveportal']['maxprocperip'];
842
		if($maxprocperip and $maxprocperip > 0)
843
			$captive_portal_mod_evasive = "evasive.max-conns-per-ip = {$maxprocperip}";
844
		else
845
			$captive_portal_mod_evasive = "";
846
		$server_upload_dirs = "server.upload-dirs = ( \"{$g['tmp_path']}/captiveportal/\" )\n";
847
		exec("mkdir -p {$g['tmp_path']}/captiveportal");
848
		exec("chmod a-w {$g['tmp_path']}/captiveportal");
849
		$server_max_request_size = "server.max-request-size    = 384";
850
	} else {
851
		$captiveportal = "";
852
		$captive_portal_rewrite = "";
853
		$captive_portal_module = "";
854
		$captive_portal_mod_evasive = "";
855
		$server_upload_dirs = "server.upload-dirs = ( \"{$g['upload_path']}/\", \"{$g['tmp_path']}/\", \"/var/\" )\n";
856
		$server_max_request_size = "server.max-request-size    = 2097152";
857
	}
858
	
859
	if($port <> "")
860
		$lighty_port = $port;
861
	else
862
		$lighty_port = "80";
863

    
864
	$memory = get_memory();
865
	$avail = $memory[0];
866

    
867
	// Determine web GUI process settings and take into account low memory systems
868
	if($avail > 0 and $avail < 65) {
869
		$fast_cgi_enable = false;
870
	}
871
	if($avail > 64 and $avail < 256) {
872
		$max_procs = ($config['system']['webgui']['max_procs']) ? $config['system']['webgui']['max_procs'] : 1;
873
	}
874
	if($avail > 255 ) {
875
		$max_procs = ($config['system']['webgui']['max_procs']) ? $config['system']['webgui']['max_procs'] : 2;
876
	}
877

    
878
	// Ramp up captive portal max procs, assuming each PHP process can consume up to 64MB RAM 
879
	if($captive_portal == true)  {
880
		if($avail > 107 and $avail < 256) {
881
			$max_procs += 1; // 2 worker processes
882
		}
883
		if($avail > 255 and $avail < 320) {
884
			$max_procs += 1; // 3 worker processes
885
		}
886
		if($avail > 319 and $avail < 384) {
887
			$max_procs += 2; // 4 worker processes
888
		}
889
		if($avail > 383 and $avail < 448) {
890
			$max_procs += 3; // 5 worker processes
891
		}
892
		if($avail > 447) {
893
			$max_procs += 4; // 6 worker processes
894
		}
895
	}
896

    
897
	if($captive_portal == true)  {	
898
		$bin_environment =  <<<EOC
899
			"bin-environment" => (
900
				"PHP_FCGI_CHILDREN" => "0",
901
				"PHP_FCGI_MAX_REQUESTS" => "500"
902
			),
903
EOC;
904

    
905
	} else if ($avail > 0 and $avail < 128) {
906
		$bin_environment = <<<EOC
907
			"bin-environment" => (
908
				"PHP_FCGI_CHILDREN" => "0",
909
				"PHP_FCGI_MAX_REQUESTS" => "2",
910
			),
911

    
912
EOC;
913
	} else
914
		$bin_environment =  <<<EOC
915
			"bin-environment" => (
916
				"PHP_FCGI_CHILDREN" => "0",
917
				"PHP_FCGI_MAX_REQUESTS" => "500"
918
			),
919
EOC;
920

    
921
	if($fast_cgi_enable == true) {
922
		$module = "\"mod_fastcgi\", \"mod_cgi\"";
923
		if ($captive_portal != false)
924
			$fast_cgi_path = "{$g['tmp_path']}/php-fastcgi-{$captive_portal}.socket";
925
		else
926
			$fast_cgi_path = "{$g['tmp_path']}/php-fastcgi.socket";
927
		$cgi_config = "";
928
		$fastcgi_config = <<<EOD
929
#### fastcgi module
930
## read fastcgi.txt for more info
931
fastcgi.server = ( ".php" =>
932
	( "localhost" =>
933
		(
934
			"socket" => "{$fast_cgi_path}",
935
			"min-procs" => 0,
936
			"max-procs" => {$max_procs},
937
{$bin_environment}
938
			"bin-path" => "/usr/local/bin/php"
939
		)
940
	)
941
)
942

    
943
#### CGI module
944
cgi.assign                 = ( ".cgi" => "" )
945

    
946
EOD;
947
	} else {
948
		$fastcgi_config = "";
949
		$module = "\"mod_cgi\"";
950
		$cgi_config = <<<EOD
951
#### CGI module
952
cgi.assign                 = ( ".php"  => "/usr/local/bin/php",
953
                               ".cgi" => "" )
954

    
955
EOD;
956
	}
957

    
958
	$lighty_config = "";
959
	$lighty_config .= <<<EOD
960
#
961
# lighttpd configuration file
962
#
963
# use a it as base for lighttpd 1.0.0 and above
964
#
965
############ Options you really have to take care of ####################
966

    
967
## FreeBSD!
968
server.event-handler	= "freebsd-kqueue"
969
server.network-backend 	= "writev"
970
#server.use-ipv6 = "enable"
971

    
972
## modules to load
973
server.modules              =   (
974
	{$captive_portal_module}
975
	"mod_access", "mod_accesslog", "mod_expire", "mod_compress", "mod_redirect",
976
	{$module}{$captiveportal}
977
)
978

    
979
## Unused modules
980
#                               "mod_setenv",
981
#                               "mod_rewrite",
982
#                               "mod_ssi",
983
#                               "mod_usertrack",
984
#                               "mod_expire",
985
#                               "mod_secdownload",
986
#                               "mod_rrdtool",
987
#                               "mod_auth",
988
#                               "mod_status",
989
#                               "mod_alias",
990
#                               "mod_proxy",
991
#                               "mod_simple_vhost",
992
#                               "mod_evhost",
993
#                               "mod_userdir",
994
#                               "mod_cgi",
995

    
996
server.max-keep-alive-requests = 15
997
server.max-keep-alive-idle = 30
998

    
999
## a static document-root, for virtual-hosting take look at the
1000
## server.virtual-* options
1001
server.document-root        = "{$document_root}"
1002
{$captive_portal_rewrite}
1003

    
1004
# Maximum idle time with nothing being written (php downloading)
1005
server.max-write-idle = 999
1006

    
1007
## where to send error-messages to
1008
server.errorlog             = "/var/log/lighttpd.error.log"
1009

    
1010
# files to check for if .../ is requested
1011
server.indexfiles           = ( "index.php", "index.html",
1012
                                "index.htm", "default.htm" )
1013

    
1014
# mimetype mapping
1015
mimetype.assign             = (
1016
  ".pdf"          =>      "application/pdf",
1017
  ".sig"          =>      "application/pgp-signature",
1018
  ".spl"          =>      "application/futuresplash",
1019
  ".class"        =>      "application/octet-stream",
1020
  ".ps"           =>      "application/postscript",
1021
  ".torrent"      =>      "application/x-bittorrent",
1022
  ".dvi"          =>      "application/x-dvi",
1023
  ".gz"           =>      "application/x-gzip",
1024
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
1025
  ".swf"          =>      "application/x-shockwave-flash",
1026
  ".tar.gz"       =>      "application/x-tgz",
1027
  ".tgz"          =>      "application/x-tgz",
1028
  ".tar"          =>      "application/x-tar",
1029
  ".zip"          =>      "application/zip",
1030
  ".mp3"          =>      "audio/mpeg",
1031
  ".m3u"          =>      "audio/x-mpegurl",
1032
  ".wma"          =>      "audio/x-ms-wma",
1033
  ".wax"          =>      "audio/x-ms-wax",
1034
  ".ogg"          =>      "audio/x-wav",
1035
  ".wav"          =>      "audio/x-wav",
1036
  ".gif"          =>      "image/gif",
1037
  ".jpg"          =>      "image/jpeg",
1038
  ".jpeg"         =>      "image/jpeg",
1039
  ".png"          =>      "image/png",
1040
  ".xbm"          =>      "image/x-xbitmap",
1041
  ".xpm"          =>      "image/x-xpixmap",
1042
  ".xwd"          =>      "image/x-xwindowdump",
1043
  ".css"          =>      "text/css",
1044
  ".html"         =>      "text/html",
1045
  ".htm"          =>      "text/html",
1046
  ".js"           =>      "text/javascript",
1047
  ".asc"          =>      "text/plain",
1048
  ".c"            =>      "text/plain",
1049
  ".conf"         =>      "text/plain",
1050
  ".text"         =>      "text/plain",
1051
  ".txt"          =>      "text/plain",
1052
  ".dtd"          =>      "text/xml",
1053
  ".xml"          =>      "text/xml",
1054
  ".mpeg"         =>      "video/mpeg",
1055
  ".mpg"          =>      "video/mpeg",
1056
  ".mov"          =>      "video/quicktime",
1057
  ".qt"           =>      "video/quicktime",
1058
  ".avi"          =>      "video/x-msvideo",
1059
  ".asf"          =>      "video/x-ms-asf",
1060
  ".asx"          =>      "video/x-ms-asf",
1061
  ".wmv"          =>      "video/x-ms-wmv",
1062
  ".bz2"          =>      "application/x-bzip",
1063
  ".tbz"          =>      "application/x-bzip-compressed-tar",
1064
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar"
1065
 )
1066

    
1067
# Use the "Content-Type" extended attribute to obtain mime type if possible
1068
#mimetypes.use-xattr        = "enable"
1069

    
1070
#### accesslog module
1071
#accesslog.filename          = "/dev/null"
1072

    
1073
## deny access the file-extensions
1074
#
1075
# ~    is for backupfiles from vi, emacs, joe, ...
1076
# .inc is often used for code includes which should in general not be part
1077
#      of the document-root
1078
url.access-deny             = ( "~", ".inc" )
1079

    
1080

    
1081
######### Options that are good to be but not neccesary to be changed #######
1082

    
1083
## bind to port (default: 80)
1084

    
1085
EOD;
1086

    
1087
	if($captive_portal == true) {
1088
		$lighty_config .= "server.bind  = \"0.0.0.0\"\n";
1089
		$lighty_config .= "server.port  = {$lighty_port}\n";
1090
		$lighty_config .= "\$SERVER[\"socket\"]  == \"0.0.0.0:{$lighty_port}\" { }\n";
1091
		$lighty_config .= "\$SERVER[\"socket\"]  == \"[::1]:{$lighty_port}\" { \n";
1092
		if($cert <> "" and $key <> "") {
1093
			$lighty_config .= "\n";
1094
			$lighty_config .= "## ssl configuration\n";
1095
			$lighty_config .= "ssl.engine = \"enable\"\n";
1096
			$lighty_config .= "ssl.pemfile = \"{$g['varetc_path']}/{$cert_location}\"\n\n";
1097
			if($ca <> "")
1098
				$lighty_config .= "ssl.ca-file = \"{$g['varetc_path']}/{$ca_location}\"\n\n";
1099
		}
1100
		$lighty_config .= " }\n";
1101
	} else {
1102
		$lighty_config .= "server.bind  = \"0.0.0.0\"\n";
1103
		$lighty_config .= "server.port  = {$lighty_port}\n";
1104
		$lighty_config .= "\$SERVER[\"socket\"]  == \"0.0.0.0:{$lighty_port}\" { }\n";
1105
		$lighty_config .= "\$SERVER[\"socket\"]  == \"[::]:{$lighty_port}\" { \n";
1106
		if($cert <> "" and $key <> "") {
1107
			$lighty_config .= "\n";
1108
			$lighty_config .= "## ssl configuration\n";
1109
			$lighty_config .= "ssl.engine = \"enable\"\n";
1110
			$lighty_config .= "ssl.pemfile = \"{$g['varetc_path']}/{$cert_location}\"\n\n";
1111
			if($ca <> "")
1112
				$lighty_config .= "ssl.ca-file = \"{$g['varetc_path']}/{$ca_location}\"\n\n";
1113
		}
1114
		$lighty_config .= " }\n";
1115
	}
1116

    
1117

    
1118
	$lighty_config .= <<<EOD
1119

    
1120
## error-handler for status 404
1121
#server.error-handler-404   = "/error-handler.html"
1122
#server.error-handler-404   = "/error-handler.php"
1123

    
1124
## to help the rc.scripts
1125
server.pid-file            = "/var/run/{$pid_file}"
1126

    
1127
## virtual directory listings
1128
server.dir-listing         = "disable"
1129

    
1130
## enable debugging
1131
debug.log-request-header   = "disable"
1132
debug.log-response-header  = "disable"
1133
debug.log-request-handling = "disable"
1134
debug.log-file-not-found   = "disable"
1135

    
1136
# gzip compression
1137
compress.cache-dir = "{$g['tmp_path']}/lighttpdcompress/"
1138
compress.filetype  = ("text/plain","text/css", "text/xml", "text/javascript" )
1139

    
1140
{$server_upload_dirs}
1141

    
1142
{$server_max_request_size}
1143

    
1144
{$fastcgi_config}
1145

    
1146
{$cgi_config}
1147

    
1148
{$captive_portal_mod_evasive}
1149

    
1150
expire.url = (
1151
				"" => "access 50 hours",	
1152
        )
1153

    
1154
EOD;
1155

    
1156
	$cert = str_replace("\r", "", $cert);
1157
	$key = str_replace("\r", "", $key);
1158
	$ca = str_replace("\r", "", $ca);
1159

    
1160
	$cert = str_replace("\n\n", "\n", $cert);
1161
	$key = str_replace("\n\n", "\n", $key);
1162
	$ca = str_replace("\n\n", "\n", $ca);
1163

    
1164
	if($cert <> "" and $key <> "") {
1165
		$fd = fopen("{$g['varetc_path']}/{$cert_location}", "w");
1166
		if (!$fd) {
1167
			printf(gettext("Error: cannot open cert.pem in system_webgui_start().%s"), "\n");
1168
			return 1;
1169
		}
1170
		chmod("{$g['varetc_path']}/{$cert_location}", 0600);
1171
		fwrite($fd, $cert);
1172
		fwrite($fd, "\n");
1173
		fwrite($fd, $key);
1174
		fclose($fd);
1175
		if(!(empty($ca) || (strlen(trim($ca)) == 0))) {
1176
			$fd = fopen("{$g['varetc_path']}/{$ca_location}", "w");
1177
			if (!$fd) {
1178
				printf(gettext("Error: cannot open ca.pem in system_webgui_start().%s"), "\n");
1179
				return 1;
1180
			}
1181
			chmod("{$g['varetc_path']}/{$ca_location}", 0600);
1182
			fwrite($fd, $ca);
1183
			fclose($fd);
1184
		}
1185
		$lighty_config .= "\n";
1186
		$lighty_config .= "## " . gettext("ssl configuration") . "\n";
1187
		$lighty_config .= "ssl.engine = \"enable\"\n";
1188
		$lighty_config .= "ssl.pemfile = \"{$g['varetc_path']}/{$cert_location}\"\n\n";
1189

    
1190
		// Harden SSL a bit for PCI conformance testing
1191
		$lighty_config .= "ssl.use-sslv2 = \"disable\"\n";
1192
		$lighty_config .= "ssl.cipher-list = \"TLSv1+HIGH !SSLv2 RC4+MEDIUM !aNULL !eNULL !3DES @STRENGTH\"\n";
1193

    
1194
		if(!(empty($ca) || (strlen(trim($ca)) == 0)))
1195
			$lighty_config .= "ssl.ca-file = \"{$g['varetc_path']}/{$ca_location}\"\n\n";
1196
	}
1197

    
1198
	// Add HTTP to HTTPS redirect	
1199
	if ($captive_portal == false && $config['system']['webgui']['protocol'] == "https" && !isset($config['system']['webgui']['disablehttpredirect'])) {
1200
		if($lighty_port != "443") 
1201
			$redirectport = ":{$lighty_port}";
1202
		$lighty_config .= <<<EOD
1203
\$SERVER["socket"] == ":80" {
1204
	\$HTTP["host"] =~ "(.*)" {
1205
		url.redirect = ( "^/(.*)" => "https://%1{$redirectport}/$1" )
1206
	}
1207
}
1208
EOD;
1209
	}
1210

    
1211
	$fd = fopen("{$filename}", "w");
1212
	if (!$fd) {
1213
		printf(gettext("Error: cannot open %s in system_generate_lighty_config().%s"), $filename, "\n");
1214
		return 1;
1215
	}
1216
	fwrite($fd, $lighty_config);
1217
	fclose($fd);
1218

    
1219
	return 0;
1220

    
1221
}
1222

    
1223
function system_timezone_configure() {
1224
	global $config, $g;
1225
	if(isset($config['system']['developerspew'])) {
1226
		$mt = microtime();
1227
		echo "system_timezone_configure() being called $mt\n";
1228
	}
1229

    
1230
	$syscfg = $config['system'];
1231

    
1232
	if ($g['booting'])
1233
		echo gettext("Setting timezone...");
1234

    
1235
	/* extract appropriate timezone file */
1236
	$timezone = $syscfg['timezone'];
1237
	if (!$timezone)
1238
		$timezone = "Etc/UTC";
1239

    
1240
	conf_mount_rw();
1241

    
1242
	exec("LANG=C /usr/bin/tar xzfO /usr/share/zoneinfo.tgz " .
1243
		escapeshellarg($timezone) . " > /etc/localtime");
1244

    
1245
	mwexec("sync");
1246
	conf_mount_ro();
1247

    
1248
	if ($g['booting'])
1249
		echo gettext("done.") . "\n";
1250
}
1251

    
1252
function system_ntp_configure($start_ntpd=true) {
1253
	global $config, $g;
1254
	$driftfile = "/var/db/ntpd.drift";
1255

    
1256
	if ($g['platform'] == 'jail')
1257
		return;
1258

    
1259
	$ntpcfg = "# \n";
1260
	$ntpcfg .= "# pfSense ntp configuration file \n";
1261
	$ntpcfg .= "# \n\n";
1262

    
1263
	/* foreach through servers and write out to ntpd.conf */
1264
	foreach (explode(' ', $config['system']['timeservers']) as $ts)
1265
		$ntpcfg .= "server {$ts} iburst maxpoll 9\n";
1266

    
1267
	$ntpcfg .= "driftfile {$driftfile}\n";
1268

    
1269
	/* open configuration for wrting or bail */
1270
	$fd = fopen("{$g['varetc_path']}/ntpd.conf","w");
1271
	if(!$fd) {
1272
		log_error("Could not open {$g['varetc_path']}/ntpd.conf for writing");
1273
		return;
1274
	}
1275
	fwrite($fd, $ntpcfg);
1276

    
1277
	/* slurp! */
1278
	fclose($fd);
1279

    
1280
	/* At bootup we just want to write out the config. */
1281
	if (!$start_ntpd)
1282
		return;
1283

    
1284
	/* if ntpd is running, kill it */
1285
	while(is_process_running("ntpd")) {
1286
		killbyname("ntpd");
1287
	}
1288

    
1289
	/* if /var/empty does not exist, create it */
1290
	if(!is_dir("/var/empty"))
1291
		exec("/bin/mkdir -p /var/empty && chmod ug+rw /var/empty/.");
1292

    
1293
	/* start opentpd, set time now and use /var/etc/ntpd.conf */
1294
	$oldset = array();
1295
	pcntl_sigprocmask(SIG_SETMASK, array(), $oldset);
1296
	exec("/usr/sbin/ntpd -g -c {$g['varetc_path']}/ntpd.conf");
1297
	pcntl_sigprocmask(SIG_SETMASK, $oldset);
1298
	
1299
	// Note that we are starting up
1300
	log_error("NTPD is starting up.");
1301
	return;
1302
}
1303

    
1304
function sync_system_time() {
1305
	global $config, $g;
1306

    
1307
	if ($g['booting'])
1308
		echo gettext("Syncing system time before startup...");
1309

    
1310
	/* foreach through servers and write out to ntpd.conf */
1311
	foreach (explode(' ', $config['system']['timeservers']) as $ts) {
1312
		mwexec("/usr/sbin/ntpdate -s $ts");
1313
	}
1314
	
1315
	if ($g['booting'])
1316
		echo gettext("done.") . "\n";
1317
	
1318
}
1319

    
1320
function system_halt() {
1321
	global $g;
1322

    
1323
	system_reboot_cleanup();
1324

    
1325
	mwexec("/usr/bin/nohup /etc/rc.halt > /dev/null 2>&1 &");
1326
}
1327

    
1328
function system_reboot() {
1329
	global $g;
1330

    
1331
	system_reboot_cleanup();
1332

    
1333
	mwexec("nohup /etc/rc.reboot > /dev/null 2>&1 &");
1334
}
1335

    
1336
function system_reboot_sync() {
1337
	global $g;
1338

    
1339
	system_reboot_cleanup();
1340

    
1341
	mwexec("/etc/rc.reboot > /dev/null 2>&1");
1342
}
1343

    
1344
function system_reboot_cleanup() {
1345
	mwexec("/usr/local/bin/beep.sh stop");
1346
	require_once("captiveportal.inc");
1347
	captiveportal_radius_stop_all();
1348
	require_once("voucher.inc");
1349
	voucher_save_db_to_config();
1350
	require_once("pkg-utils.inc");
1351
	stop_packages();
1352
}
1353

    
1354
function system_do_shell_commands($early = 0) {
1355
	global $config, $g;
1356
	if(isset($config['system']['developerspew'])) {
1357
		$mt = microtime();
1358
		echo "system_do_shell_commands() being called $mt\n";
1359
	}
1360

    
1361
	if ($early)
1362
		$cmdn = "earlyshellcmd";
1363
	else
1364
		$cmdn = "shellcmd";
1365

    
1366
	if (is_array($config['system'][$cmdn])) {
1367

    
1368
		/* *cmd is an array, loop through */
1369
		foreach ($config['system'][$cmdn] as $cmd) {
1370
			exec($cmd);
1371
		}
1372

    
1373
	} elseif($config['system'][$cmdn] <> "") {
1374

    
1375
		/* execute single item */
1376
		exec($config['system'][$cmdn]);
1377

    
1378
	}
1379
}
1380

    
1381
function system_console_configure() {
1382
	global $config, $g;
1383
	if(isset($config['system']['developerspew'])) {
1384
		$mt = microtime();
1385
		echo "system_console_configure() being called $mt\n";
1386
	}
1387

    
1388
	if (isset($config['system']['disableconsolemenu'])) {
1389
		touch("{$g['varetc_path']}/disableconsole");
1390
	} else {
1391
		unlink_if_exists("{$g['varetc_path']}/disableconsole");
1392
	}
1393
}
1394

    
1395
function system_dmesg_save() {
1396
	global $g;
1397
	if(isset($config['system']['developerspew'])) {
1398
		$mt = microtime();
1399
		echo "system_dmesg_save() being called $mt\n";
1400
	}
1401

    
1402
	$dmesg = "";
1403
	exec("/sbin/dmesg", $dmesg);
1404

    
1405
	/* find last copyright line (output from previous boots may be present) */
1406
	$lastcpline = 0;
1407

    
1408
	for ($i = 0; $i < count($dmesg); $i++) {
1409
		if (strstr($dmesg[$i], "Copyright (c) 1992-"))
1410
			$lastcpline = $i;
1411
	}
1412

    
1413
	$fd = fopen("{$g['varlog_path']}/dmesg.boot", "w");
1414
	if (!$fd) {
1415
		printf(gettext("Error: cannot open dmesg.boot in system_dmesg_save().%s"), "\n");
1416
		return 1;
1417
	}
1418

    
1419
	for ($i = $lastcpline; $i < count($dmesg); $i++)
1420
		fwrite($fd, $dmesg[$i] . "\n");
1421

    
1422
	fclose($fd);
1423

    
1424
	return 0;
1425
}
1426

    
1427
function system_set_harddisk_standby() {
1428
	global $g, $config;
1429
	if(isset($config['system']['developerspew'])) {
1430
		$mt = microtime();
1431
		echo "system_set_harddisk_standby() being called $mt\n";
1432
	}
1433

    
1434
	if (isset($config['system']['harddiskstandby'])) {
1435
		if ($g['booting']) {
1436
			echo gettext('Setting hard disk standby... ');
1437
		}
1438

    
1439
		$standby = $config['system']['harddiskstandby'];
1440
		// Check for a numeric value
1441
		if (is_numeric($standby)) {
1442
			// Sync the disk(s)
1443
			pfSense_sync();
1444
			if (!mwexec('/sbin/sysctl hw.ata.standby=' . ((int)$standby))) {
1445
				// Reinitialize ATA-drives
1446
				mwexec('/usr/local/sbin/atareinit');
1447
				if ($g['booting']) {
1448
					echo gettext("done.") . "\n";
1449
				}
1450
			} else if ($g['booting']) {
1451
				echo gettext("failed!") . "\n";
1452
			}
1453
		} else if ($g['booting']) {
1454
			echo gettext("failed!") . "\n";
1455
		}
1456
	}
1457
}
1458

    
1459
function system_setup_sysctl() {
1460
	global $config;
1461
	if(isset($config['system']['developerspew'])) {
1462
		$mt = microtime();
1463
		echo "system_setup_sysctl() being called $mt\n";
1464
	}
1465

    
1466
	activate_sysctls();	
1467

    
1468
	if (isset($config['system']['sharednet'])) {
1469
		system_disable_arp_wrong_if();
1470
	}
1471
}
1472

    
1473
function system_disable_arp_wrong_if() {
1474
	global $config;
1475
	if(isset($config['system']['developerspew'])) {
1476
		$mt = microtime();
1477
		echo "system_disable_arp_wrong_if() being called $mt\n";
1478
	}
1479
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_wrong_iface=0");
1480
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_movements=0");
1481
}
1482

    
1483
function system_enable_arp_wrong_if() {
1484
	global $config;
1485
	if(isset($config['system']['developerspew'])) {
1486
		$mt = microtime();
1487
		echo "system_enable_arp_wrong_if() being called $mt\n";
1488
	}
1489
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_wrong_iface=1");
1490
	mwexec("/sbin/sysctl -n net.link.ether.inet.log_arp_movements=1");
1491
}
1492

    
1493
function enable_watchdog() {
1494
	global $config;
1495
	return;
1496
	$install_watchdog = false;
1497
	$supported_watchdogs = array("Geode");
1498
	$file = file_get_contents("/var/log/dmesg.boot");
1499
	foreach($supported_watchdogs as $sd) {
1500
		if(stristr($file, "Geode")) {
1501
			$install_watchdog = true;
1502
		}
1503
	}
1504
	if($install_watchdog == true) {
1505
		if(is_process_running("watchdogd"))
1506
			mwexec("/usr/bin/killall watchdogd", true);
1507
		exec("/usr/sbin/watchdogd");
1508
	}
1509
}
1510

    
1511
function system_check_reset_button() {
1512
	global $g;
1513
	if($g['platform'] != "nanobsd")
1514
		return 0;
1515

    
1516
	$specplatform = system_identify_specific_platform();
1517

    
1518
	if ($specplatform['name'] != "wrap" && $specplatform['name'] != "alix")
1519
		return 0;
1520

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

    
1523
	if ($retval == 99) {
1524
		/* user has pressed reset button for 2 seconds - 
1525
		   reset to factory defaults */
1526
		echo <<<EOD
1527

    
1528
***********************************************************************
1529
* Reset button pressed - resetting configuration to factory defaults. *
1530
* The system will reboot after this completes.                        *
1531
***********************************************************************
1532

    
1533

    
1534
EOD;
1535
		
1536
		reset_factory_defaults();
1537
		system_reboot_sync();
1538
		exit(0);
1539
	}
1540

    
1541
	return 0;
1542
}
1543

    
1544
/* attempt to identify the specific platform (for embedded systems)
1545
   Returns an array with two elements:
1546
	name => platform string (e.g. 'wrap', 'alix' etc.)
1547
	descr => human-readable description (e.g. "PC Engines WRAP")
1548
*/
1549
function system_identify_specific_platform() {
1550
	global $g;
1551
	
1552
	if ($g['platform'] == 'generic-pc')
1553
		return array('name' => 'generic-pc', 'descr' => gettext("Generic PC"));
1554
	
1555
	if ($g['platform'] == 'generic-pc-cdrom')
1556
		return array('name' => 'generic-pc-cdrom', 'descr' => gettext("Generic PC (CD-ROM)"));
1557
	
1558
	/* the rest of the code only deals with 'embedded' platforms */
1559
	if ($g['platform'] != 'nanobsd')
1560
		return array('name' => $g['platform'], 'descr' => $g['platform']);
1561
	
1562
	$dmesg = system_get_dmesg_boot();
1563
	
1564
	if (strpos($dmesg, "PC Engines WRAP") !== false)
1565
		return array('name' => 'wrap', 'descr' => gettext('PC Engines WRAP'));
1566
	
1567
	if (strpos($dmesg, "PC Engines ALIX") !== false)
1568
		return array('name' => 'alix', 'descr' => gettext('PC Engines ALIX'));
1569

    
1570
	if (preg_match("/Soekris net45../", $dmesg, $matches))
1571
		return array('name' => 'net45xx', 'descr' => $matches[0]);
1572
	
1573
	if (preg_match("/Soekris net48../", $dmesg, $matches))
1574
		return array('name' => 'net48xx', 'descr' => $matches[0]);
1575
		
1576
	if (preg_match("/Soekris net55../", $dmesg, $matches))
1577
		return array('name' => 'net55xx', 'descr' => $matches[0]);
1578
	
1579
	/* unknown embedded platform */
1580
	return array('name' => 'embedded', 'descr' => gettext('embedded (unknown)'));
1581
}
1582

    
1583
function system_get_dmesg_boot() {
1584
	global $g;
1585
		
1586
	return file_get_contents("{$g['varlog_path']}/dmesg.boot");
1587
}
1588

    
1589
function get_possible_listen_ips() {
1590
	$interfaces = get_configured_interface_with_descr();
1591
	$carplist = get_configured_carp_interface_list();
1592
	$listenips = array();
1593
	foreach ($carplist as $cif => $carpip)
1594
		$interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
1595
	$aliaslist = get_configured_ip_aliases_list();
1596
	foreach ($aliaslist as $aliasip => $aliasif)
1597
		$interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
1598
	foreach ($interfaces as $iface => $ifacename) {
1599
		$tmp["name"]  = $ifacename;
1600
		$tmp["value"] = $iface;
1601
		$listenips[] = $tmp;
1602
	}
1603
	$tmp["name"]  = "Localhost";
1604
	$tmp["value"] = "lo0";
1605
	$listenips[] = $tmp;
1606
	return $listenips;
1607
}
1608

    
1609
?>
(50-50/65)