Project

General

Profile

Download (12.5 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php -f
2
<?php
3
/* $Id$ */
4
/*
5
	rc.bootup
6
	part of pfSense by Scott Ullrich
7
	originally based on m0n0wall (http://m0n0.ch/wall)
8
	Copyright (C) 2004-2009 Scott Ullrich <sullrich@pfsense.org>.
9
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
10
	Copyright (C) 2009 Erik Kristensen
11
	All rights reserved.
12

    
13
	Redistribution and use in source and binary forms, with or without
14
	modification, are permitted provided that the following conditions are met:
15

    
16
	1. Redistributions of source code must retain the above copyright notice,
17
	   this list of conditions and the following disclaimer.
18

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

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

    
35
function rescue_detect_keypress() {
36
	// How long do you want the script to wait before moving on (in seconds)
37
	$timeout=9;
38
	echo "\n";
39
    echo "[ Press R to enter recovery mode or ]\n";
40
	echo "[  press I to launch the installer  ]\n\n";
41
	echo "(R)ecovery mode can assist by rescuing config.xml\n";
42
	echo "from a broken hard disk installation, etc.\n\n";
43
	echo "(I)nstaller may be invoked now if you do \n";
44
	echo "not wish to boot into the liveCD environment at this time.\n\n";
45
	echo "(C) continues the LiveCD bootup without further pause.\n\n";
46
	echo "Timeout before auto boot continues (seconds): {$timeout}";
47
	$key = null;
48
	exec("/bin/stty erase " . chr(8));
49
	while(!in_array($key, array("c", "C", "r","R", "i", "I", "~", "!"))) {
50
	        echo chr(8) . "{$timeout}";
51
	        `/bin/stty -icanon min 0 time 25`;
52
	        $key = trim(`KEY=\`dd count=1 2>/dev/null\`; echo \$KEY`);
53
	        `/bin/stty icanon`;
54
	        // Decrement our timeout value
55
	        $timeout--;
56
	        // If we have reached 0 exit and continue on
57
	        if ($timeout == 0) 
58
				break;
59
	}
60
	// If R or I was pressed do our logic here
61
	if (in_array($key, array("r", "R"))) {
62
	  putenv("TERM=cons25");
63
	  echo "\n\nRecovery mode selected...\n";
64
	  passthru("/usr/bin/env TERM=cons25 /bin/tcsh -c /scripts/lua_installer_rescue");
65
	} elseif (in_array($key, array("i", "I"))) {
66
	  putenv("TERM=cons25");  
67
	  echo "\n\nInstaller mode selected...\n";
68
	  passthru("/usr/bin/env TERM=cons25 /bin/tcsh -c /scripts/lua_installer");
69
	  if(file_exists("/tmp/install_complete")) {
70
		passthru("/etc/rc.reboot");
71
		exit;
72
	  }
73
	} elseif (in_array($key, array("!", "~"))) {
74
 		putenv("TERM=cons25");
75
		echo "\n\nRecovery shell selected...\n";
76
		echo "\n";
77
		touch("/tmp/donotbootup");
78
		exit;
79
	} else {
80
		echo "\n\n";
81
	}
82
}
83

    
84
echo " done.\n";
85

    
86
echo "Initializing...";
87
echo ".";
88
require_once("/etc/inc/globals.inc");
89
echo ".";
90
require_once("/etc/inc/led.inc");
91
led_normalize();
92
echo ".";
93
if (led_count() >= 3) {
94
	led_kitt();
95
}
96

    
97
/* let the other functions know we're booting */
98
$pkg_interface = 'console';
99
$g['booting'] = true;
100

    
101
/* parse the configuration and include all functions used below */
102
require_once("/etc/inc/config.inc");
103
echo ".";
104
require_once("/etc/inc/config.console.inc");
105
echo ".";
106
require_once("/etc/inc/auth.inc");
107
echo ".";
108
require_once("/etc/inc/functions.inc");
109
echo ".";
110
require_once("/etc/inc/filter.inc");
111
echo ".";
112
require_once("/etc/inc/shaper.inc");
113
echo ".";
114
require_once("/etc/inc/ipsec.inc");
115
echo ".";
116
require_once("/etc/inc/vpn.inc");
117
echo ".";
118
require_once("/etc/inc/openvpn.inc");
119
echo ".";
120
require_once("/etc/inc/captiveportal.inc");
121
echo ".";
122
require_once("/etc/inc/rrd.inc");
123
echo ".";
124
require_once("/etc/inc/pfsense-utils.inc");
125
echo ".";
126

    
127
/* get system memory amount */
128
$memory = get_memory();
129
$avail = $memory[1];
130
echo " done.\n";
131

    
132
conf_mount_rw();
133

    
134
/* save dmesg output to file */
135
system_dmesg_save();
136

    
137
/* check whether config reset is desired (via hardware button on WRAP/ALIX) */
138
system_check_reset_button();
139

    
140
/* remove previous firmware upgrade if present */
141
if (file_exists("/root/firmware.tgz")) 
142
	unlink("/root/firmware.tgz");
143

    
144
/* start devd (dhclient now uses it) */
145
echo "Starting device manager (devd)...";
146
mute_kernel_msgs();
147
start_devd();
148
set_device_perms();
149
unmute_kernel_msgs();
150
echo "done.\n";
151

    
152
// Display rescue configuration option
153
if($g['platform'] == "cdrom") 
154
		rescue_detect_keypress();
155

    
156
echo "Loading configuration...";
157
parse_config_bootup();
158
echo "done.\n";
159

    
160
if($g['platform'] == "jail") {
161
	/* We must determine what network settings have been configured for us */
162
	$wanif = "lo0";	/* defaults, if the jail admin hasn't set us up */
163
	$ipaddr = "127.0.0.1";
164
	$iflist = get_interface_list();
165
	foreach ($iflist as $iface => $ifa) {
166
		if (isset($ifa['ipaddr'])) {
167
			$wanif = $iface;
168
			$ipaddr = $ifa['ipaddr'];
169
			break;
170
		}
171
	}
172
	$config['interfaces'] = array();
173
	$config['interfaces']['lan'] = array();
174
	$config['interfaces']['lan']['enable'] = false;
175
	$config['interfaces']['wan'] = array();
176
	/* XXX, todo */
177
	$config['interfaces']['wan']['if'] = $wanif;
178
	$config['interfaces']['wan']['ipaddr'] = $ipaddr;
179
	$config['interfaces']['wan']['subnet'] = "32";	/* XXX right? */
180
	$config['interfaces']['wan']['enable'] = true;
181
	if($config['dhcpd']['lan']) 
182
		unset($config['dhcpd']['lan']['enable']);
183
	unlink_if_exists('/conf/trigger_initial_wizard');
184
	write_config();
185
} else {
186
	/*
187
	 *  Determine if we need to throw a interface exception
188
	 *  and ask the user to reassign interfaces.  This will
189
	 *  avoid a reboot and thats a good thing.
190
	 */
191
	while(is_interface_mismatch() == true) {
192
		led_assigninterfaces();
193
		if (isset($config['revision'])) {
194
			if (file_exists("{$g['tmp_path']}/missing_interfaces"))
195
				echo "Warning: Configuration references interfaces that do not exist: " . file_get_contents("{$g['tmp_path']}/missing_interfaces") . "\n";
196
			echo "\nNetwork interface mismatch -- Running interface assignment option.\n";
197
		} else
198
			echo "\nDefault interfaces not found -- Running interface assignment option.\n";
199
		$ifaces = get_interface_list();
200
		if (is_array($ifaces)) {
201
			foreach($ifaces as $iface => $ifdata)
202
				interfaces_bring_up($iface);
203
		}
204
		set_networking_interfaces_ports();
205
		led_kitt();
206
	}
207
}
208

    
209
/* convert config and clean backups */
210
echo "Updating configuration...";
211
convert_config();
212
echo "done.\n";
213

    
214
echo "Cleaning backup cache...";
215
cleanup_backupcache(true);
216
echo "done.\n";
217

    
218
/* read in /etc/sysctl.conf and set values if needed */
219
echo "Setting up extended sysctls...";
220
system_setup_sysctl();
221
echo "done.\n";
222

    
223
/* enable optional crypto modules */
224
load_crypto();
225

    
226
/* enable optional thermal sensor modules */
227
load_thermal_hardware();
228

    
229
/* run any early shell commands specified in config.xml */
230
system_do_shell_commands(1);
231

    
232
/* set up our timezone */
233
system_timezone_configure();
234

    
235
/* set up our hostname */
236
system_hostname_configure();
237

    
238
/* make hosts file */
239
system_hosts_generate();
240

    
241
/* configure loopback interface */
242
interfaces_loopback_configure();
243

    
244
/* start syslogd */
245
system_syslogd_start();
246

    
247
echo "Starting Secure Shell Services...";
248
mwexec_bg("/etc/sshd");
249
echo "done.\n";
250

    
251
/* setup polling */
252
echo "Setting up polling defaults...";
253
setup_polling();
254
echo "done.\n";
255

    
256
/* setup interface microcode which improves tcp/ip speed */
257
echo "Setting up interfaces microcode...";
258
setup_microcode();
259
echo "done.\n";
260

    
261
/* set up interfaces */
262
if(!$debugging)
263
	mute_kernel_msgs();
264
interfaces_configure();
265
if(!$debugging)
266
	unmute_kernel_msgs();
267

    
268
/* re-make hosts file after configuring interfaces */
269
system_hosts_generate();
270

    
271
/* start OpenVPN server & clients */
272
echo "Syncing OpenVPN settings...";
273
openvpn_resync_all();
274
echo "done.\n";
275

    
276
/* generate resolv.conf */
277
system_resolvconf_generate();
278

    
279
/* setup altq + pf */
280
filter_configure_sync();
281

    
282
/* start pflog */
283
echo "Starting PFLOG...";
284
filter_pflog_start();
285
echo "done.\n";
286

    
287
/* reconfigure our gateway monitor */
288
echo "Setting up gateway monitors...";
289
setup_gateways_monitor();
290
echo "done.\n";
291

    
292
echo "Synchronizing user settings...";
293
local_sync_accounts();
294
echo "done.\n";
295

    
296
if($avail > 0 and $avail < 65) {
297
	echo "System has less than 65 megabytes of ram {$avail}.  Delaying webConfigurator startup.\n";
298
	/* start webConfigurator up on final pass */
299
	mwexec("/usr/local/sbin/pfSctl -c 'service restart webgui'");
300
} else {
301
	/* start web server */
302
	system_webgui_start();
303
}
304

    
305
/* configure cron service */
306
echo "Configuring CRON...";
307
configure_cron();
308
echo "done.\n";
309

    
310
/* set up static routes */
311
system_routing_configure();
312

    
313
/* enable routing */
314
system_routing_enable();
315

    
316
/* start dnsmasq service */
317
services_dnsmasq_configure();
318

    
319
/* Do an initial time sync */
320
echo "Starting NTP time client...";
321
/* At bootup this will just write the config, ntpd will launch from ntpdate_sync_once.sh */
322
system_ntp_configure(false);
323
mwexec_bg("/usr/local/sbin/ntpdate_sync_once.sh", true);
324
echo "done.\n";
325

    
326
/* start load balancer daemon */
327
relayd_configure();
328

    
329
/* configure console menu */
330
system_console_configure();
331

    
332
/* start DHCP service */
333
services_dhcpd_configure();
334

    
335
/* start dhcpleases dhpcp hosts leases program */
336
system_dhcpleases_configure();
337

    
338
/* start DHCP relay */
339
services_dhcrelay_configure();
340

    
341
/* dyndns service updates */
342
send_event("service reload dyndnsall");
343

    
344
/* Run a filter configure now that most all services have started */
345
filter_configure_sync();
346

    
347
/* setup pppoe and pptp */
348
vpn_setup();
349

    
350
/* start the captive portal */
351
captiveportal_configure();
352

    
353
/* start Voucher support */
354
voucher_configure();
355

    
356
/* run any shell commands specified in config.xml */
357
system_do_shell_commands();
358

    
359
/* start IPsec tunnels */
360
vpn_ipsec_configure();
361
/* Reload dynamic hostname tunnels after bootup finishes */
362
send_event("service reload ipsecdns");
363

    
364
/* start SNMP service */
365
services_snmpd_configure();
366

    
367
/* power down hard drive if needed/set */
368
system_set_harddisk_standby();
369

    
370
/* lock down console if necessary */
371
auto_login();
372

    
373
/* load graphing functions */
374
enable_rrd_graphing();
375

    
376
/* startup routed if needed */
377
include_once("/usr/local/pkg/routed.inc");
378
setup_routed();
379

    
380
/* enable watchdog if supported */
381
enable_watchdog();
382

    
383
/* if <system><afterbootupshellcmd> exists, execute the command */
384
if($config['system']['afterbootupshellcmd'] <> "") {
385
	echo "Running afterbootupshellcmd {$config['system']['afterbootupshellcmd']}\n";
386
	mwexec($config['system']['afterbootupshellcmd']);
387
}
388

    
389
if($avail < $g['minimum_ram_warning']) {
390
	require_once("/etc/inc/notices.inc");
391
	file_notice("{$g['product_name']}MemoryRequirements", "{$g['product_name']} requires at least {$g['minimum_ram_warning_text']} of RAM.  Expect unusual performance.  This platform is not supported.", "Memory", "", 1);
392
	mwexec("/sbin/sysctl net.inet.tcp.recvspace=4096");
393
	mwexec("/sbin/sysctl net.inet.tcp.sendspace=4096");
394
}
395

    
396
/* if we are operating at 1000 then increase timeouts.
397
   this was never accounted for after moving to 1000 hz */
398
$kern_hz = `/sbin/sysctl kern.clockrate | /usr/bin/awk '{ print $5 }' | /usr/bin/cut -d"," -f1`;
399
$kern_hz = trim($kern_hz, "\r\n");
400
if($kern_hz == "1000") 
401
	mwexec("/sbin/sysctl net.inet.tcp.rexmit_min=30");
402

    
403
/* start the igmpproxy daemon */
404
services_igmpproxy_configure();
405

    
406
/* start the upnp daemon if it is enabled */
407
upnp_start();
408

    
409
/* If powerd is enabled, lets launch it */
410
activate_powerd();
411

    
412
/* Remove the old shutdown binary if we kept it. */
413
if (file_exists("/sbin/shutdown.old"))
414
	@unlink("/sbin/shutdown.old");
415

    
416
/* Resync / Reinstall packages if need be */
417
if(file_exists('/conf/needs_package_sync')) {
418
	if($config['installedpackages'] <> '' && is_array($config['installedpackages']['package'])) {
419
		require_once("pkg-utils.inc");
420
		if($g['platform'] == "pfSense" || $g['platform'] == "nanobsd") {
421
			mark_subsystem_dirty('packagelock');
422
			pkg_reinstall_all();
423
			clear_subsystem_dirty('packagelock');
424
		}
425
	}
426
	@unlink('/conf/needs_package_sync');
427
}
428

    
429
/* If syslogd is forwarding to an IPv6 server, give it a kick since otherwise syslogd 
430
	won't forward to a v6 server. See #2370 (https://redmine.pfsense.org/issues/2370). */
431

    
432
if (is_ipaddrv6($config['syslog']['remoteserver']) || is_ipaddrv6($config['syslog']['remoteserver2']) || is_ipaddrv6($config['syslog']['remoteserver3'])) {
433
	system_syslogd_start();
434
}
435

    
436
/* done */
437
unset($g['booting']);
438

    
439
led_normalize();
440

    
441
conf_mount_ro();
442

    
443
?>
(38-38/108)