Project

General

Profile

Download (6.93 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/****h* pfSense/config
3
 * NAME
4
 *   config.inc - Functions to manipulate config.xml
5
 * DESCRIPTION
6
 *   This include contains various config.xml specific functions.
7
 * HISTORY
8
 * $Id$
9
 ******
10

    
11
	config.inc
12
	Copyright (C) 2004-2010 Scott Ullrich
13
	All rights reserved.
14

    
15
	originally part of m0n0wall (http://m0n0.ch/wall)
16
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
17
	All rights reserved.
18

    
19
	Redistribution and use in source and binary forms, with or without
20
	modification, are permitted provided that the following conditions are met:
21

    
22
	1. Redistributions of source code must retain the above copyright notice,
23
	   this list of conditions and the following disclaimer.
24

    
25
	2. Redistributions in binary form must reproduce the above copyright
26
	   notice, this list of conditions and the following disclaimer in the
27
	   documentation and/or other materials provided with the distribution.
28

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

    
40

    
41
	pfSense_BUILDER_BINARIES:	/sbin/mount	/sbin/sysctl	/sbin/umount	/sbin/halt	/sbin/fsck	/bin/sync
42
	pfSense_MODULE:	config
43
*/
44

    
45
if($g['booting']) echo ".";
46

    
47
/* do not load this file twice. */
48
//if (in_array("/etc/inc/config.inc", get_included_files()))
49
//	return;
50

    
51
// Set the memory limit to 128M.  When someone has something like 500+ tunnels
52
// the parser needs quite a bit of ram.   Do not remove this line unless you 
53
// know what you are doing.  If in doubt, check with dev@ _/FIRST/_!
54
ini_set("memory_limit","128M");
55

    
56
/* include globals from notices.inc /utility/XML parser files */
57
require_once("notices.inc");
58
if($g['booting']) echo ".";
59
require_once('config.lib.inc');
60
if($g['booting']) echo ".";
61
require_once("util.inc");
62
if($g['booting']) echo ".";
63
if(file_exists("/cf/conf/use_xmlreader"))
64
	require_once("xmlreader.inc");
65
else
66
	require_once("xmlparse.inc");
67
if($g['booting']) echo ".";
68
require_once("crypt.inc");
69

    
70
/* read platform */
71
if($g['booting']) echo ".";
72
if (file_exists("{$g['etc_path']}/platform")) {
73
	$g['platform'] = chop(file_get_contents("{$g['etc_path']}/platform"));
74
} else {
75
	$g['platform'] = "unknown";
76
}
77

    
78
/* if /debugging exists, lets set $debugging
79
   so we can output more information */
80
if(file_exists("/debugging")) {
81
	$debugging = true;
82
	$g['debug'] = true;
83
}
84

    
85
if($g['booting']) echo ".";
86
if($g['booting'] && file_exists("/cf/conf/config.xml")) {
87
	$config_contents = file_get_contents("/cf/conf/config.xml");
88
	if(stristr($config_contents, "<m0n0wall>") == true) {
89
		if($g['booting']) echo ".";
90
		/* user has just upgraded to m0n0wall, replace root xml tags */
91
		log_error("Upgrading m0n0wall configuration to pfSense... ");
92
		$config_contents = str_replace("m0n0wall","pfsense", $config_contents);
93
		if (!config_validate("{$g['conf_path']}/config.xml"))
94
			log_error("ERROR!  Could not convert m0n0wall -> pfsense in config.xml");
95
		conf_mount_rw();
96
		$fd = fopen("/cf/conf/config.xml", "w");
97
		fwrite($fd, $config_contents);
98
		fclose($fd);
99
		conf_mount_ro();
100
	}
101
}
102

    
103
/* if our config file exists bail out, we're already set. */
104
else if ($g['booting'] and !file_exists($g['cf_conf_path'] . "/config.xml")  ) {
105
	if($g['booting']) echo ".";
106
	/* find the device where config.xml resides and write out an fstab */
107
	unset($cfgdevice);
108
	if($g['booting']) echo ".";
109
	/* check if there's already an fstab (NFS booting?) */
110
	if (!file_exists("{$g['etc_path']}/fstab")) {
111
		if($g['booting']) echo ".";
112
		if (strstr($g['platform'], "cdrom")) {
113
			/* config is on floppy disk for CD-ROM version */
114
			$cfgdevice = $cfgpartition = "fd0";
115
			$dmesg = `dmesg -a`;
116
			if(ereg("da0", $dmesg) == true) {
117
				$cfgdevice = $cfgpartition = "da0" ;
118
				if (mwexec("/sbin/mount -r /dev/{$cfgdevice} /cf")) {
119
					/* could not mount, fallback to floppy */
120
					$cfgdevice = $cfgpartition = "fd0";
121
				}
122
			}
123
			$cfgfstype = "msdosfs";
124
			echo "CDROM build\n";
125
			echo "   CFG: {$cfgpartition}\n";
126
			echo "  TYPE: {$cfgfstype}\n";
127
		} else {
128
			if($g['booting']) echo ".";
129
			/* probe kernel known disks until we find one with config.xml */
130
			$disks = explode(" ", trim(preg_replace("/kern.disks: /", "", exec("/sbin/sysctl kern.disks"))));
131
			foreach ($disks as $mountdisk) {
132
				/* skip mfs mounted filesystems */
133
				if (strstr($mountdisk, "md"))
134
					continue;
135
				if (mwexec("/sbin/mount -r /dev/{$mountdisk}a {$g['cf_path']}") == 0) {
136
					if (file_exists("{$g['cf_conf_path']}/config.xml")) {
137
						/* found it */
138
						$cfgdevice = $mountdisk;
139
						$cfgpartition = $cfgdevice . "a";
140
						$cfgfstype = "ufs";
141
						echo "Found configuration on $cfgdevice.\n";
142
					}
143

    
144
					mwexec("/sbin/umount -f {$g['cf_path']}");
145

    
146
					if ($cfgdevice)
147
						break;
148
				}
149
				if (mwexec("/sbin/mount -r /dev/{$mountdisk}d {$g['cf_path']}") == 0) {
150
					if($g['booting']) echo ".";
151
					if (file_exists("{$g['cf_conf_path']}/config.xml")) {
152
						/* found it */
153
						$cfgdevice = $mountdisk;
154
						$cfgpartition = $cfgdevice . "d";
155
						$cfgfstype = "ufs";
156
						echo "Found configuration on $cfgdevice.\n";
157
					}
158

    
159
					mwexec("/sbin/umount -f {$g['cf_path']}");
160

    
161
					if ($cfgdevice)
162
						break;
163
				}
164
			}
165
		}
166
		if($g['booting']) echo ".";
167
		if (!$cfgdevice) {
168
			$last_backup = discover_last_backup();
169
			if($last_backup) {
170
				log_error("No config.xml found, attempting last known config restore.");
171
				file_notice("config.xml", "No config.xml found, attempting last known config restore.", "pfSenseConfigurator", "");
172
				restore_backup("/cf/conf/backup/{$last_backup}");
173
			} else {
174
				log_error("No config.xml or config backups found, resetting to factory defaults.");
175
				restore_backup('/conf.default/config.xml');
176
			}
177
		}
178

    
179
		/* write device name to a file for rc.firmware */
180
		$fd = fopen("{$g['varetc_path']}/cfdevice", "w");
181
		fwrite($fd, $cfgdevice . "\n");
182
		fclose($fd);
183

    
184
		/* write out an fstab */
185
		$fd = fopen("{$g['etc_path']}/fstab", "w");
186

    
187
		$fstab = "/dev/{$cfgpartition} {$g['cf_path']} {$cfgfstype} ro,noatime 1 1\n";
188
		$fstab .= "proc /proc procfs rw 0 0\n";
189

    
190
		fwrite($fd, $fstab);
191
		fclose($fd);
192
	}
193
	if($g['booting']) echo ".";
194
	/* mount all filesystems */
195
	mwexec("/sbin/mount -a");
196
}
197

    
198
if($g['booting']) echo ".";
199
$config = parse_config();
200

    
201
/* set timezone */
202
$timezone = $config['system']['timezone'];
203
if (!$timezone)
204
	$timezone = "Etc/UTC";
205
date_default_timezone_set("$timezone");
206

    
207
if($config_parsed == true) {
208
	/* process packager manager custom rules */
209
	if(is_dir("/usr/local/pkg/parse_config")) {
210
		run_plugins("/usr/local/pkg/parse_config/");
211
	}
212
}
213

    
214
?>
(11-11/54)