Project

General

Profile

Download (22.8 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
	diag_backup.php
5
	Copyright (C) 2004-2009 Scott Ullrich
6
	All rights reserved.
7

    
8
	originally part of m0n0wall (http://m0n0.ch/wall)
9
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
10
	All rights reserved.
11

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

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

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

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

    
34
/*
35
	pfSense_BUILDER_BINARIES:	/sbin/shutdown
36
	pfSense_MODULE:	backup
37
*/
38

    
39
##|+PRIV
40
##|*IDENT=page-diagnostics-backup/restore
41
##|*NAME=Diagnostics: Backup/restore page
42
##|*DESCR=Allow access to the 'Diagnostics: Backup/restore' page.
43
##|*MATCH=diag_backup.php*
44
##|-PRIV
45

    
46
/* Allow additional execution time 0 = no limit. */
47
ini_set('max_execution_time', '0');
48
ini_set('max_input_time', '0');
49

    
50
/* omit no-cache headers because it confuses IE with file downloads */
51
$omit_nocacheheaders = true;
52
require("guiconfig.inc");
53
require_once("functions.inc");
54
require_once("filter.inc");
55
require_once("shaper.inc");
56

    
57
function add_base_packages_menu_items() {
58
	global $g, $config;
59
	$base_packages = split($g['base_packages'], ",");
60
	$modified_config = false;
61
	foreach($base_packages as $bp) {
62
		$basepkg_path = "/usr/local/pkg/{$bp}";
63
		$tmpinfo = pathinfo($basepkg_path, PATHINFO_EXTENSION); 
64
		if($tmpinfo['extension'] == "xml" && file_exists($basepkg_path)) {
65
			$pkg_config = parse_xml_config_pkg($basepkg_path, "packagegui");
66
			if($pkg_config['menu'] != "") {
67
				if(is_array($pkg_config['menu'])) {
68
					foreach($pkg_config['menu'] as $menu) {
69
						if(is_array($config['installedpackages']['menu']))
70
							foreach($config['installedpackages']['menu'] as $amenu)
71
								if($amenu['name'] == $menu['name'])
72
									continue;
73
						$config['installedpackages']['menu'][] = $menu;
74
						$modified_config = true;
75
					}
76
				}
77
				$static_output .= "done.\n";
78
				update_output_window($static_output);
79
			}
80
		}
81
	}
82
	if($modified_config) {
83
		write_confg("Restored base_package menus after configuration restore.");
84
		$config = parse_config(true);
85
	}
86
}
87

    
88
function remove_bad_chars($string) {
89
	return preg_replace('/[^a-z|_|0-9]/i','',$string);
90
}
91

    
92
function check_and_returnif_section_exists($section) {
93
	global $config;
94
	if(is_array($config[$section]))
95
		return true;
96
	return false;
97
}
98

    
99
function spit_out_select_items($area, $showall) {
100
	global $config;
101
		
102
	$areas = array("aliases" => "Aliases", 
103
				   "captiveportal" => "Captive Portal",
104
				   "dnsmasq" => "DNS Forwarder",				
105
				   "dhcpd" => "DHCP Server",
106
				   "filter" => "Firewall Rules",
107
				   "interfaces" => "Interfaces",
108
				   "ipsec" => "IPSEC",
109
				   "nat" => "NAT",
110
				   "ovpn" => "OpenVPN",
111
				   "installedpackages" => "Package Manager",
112
				   "pptpd" => "PPTP Server",
113
				   "cron" => "Scheduled Tasks",				
114
				   "syslog" => "Syslog",
115
				   "system" => "System",
116
				   "staticroutes" => "Static routes",
117
				   "sysctl" => "System tunables",
118
				   "snmpd" => "SNMP Server",
119
				   "shaper" => "Traffic Shaper",
120
				   "vlans" => "VLANS",
121
				   "wol" => "Wake on LAN"
122
	);
123

    
124
	$select  = "<select name=\"{$area}\" id=\"{$aread}\" ";
125
	if ($area == "backuparea")
126
		$select .= " onChange=backuparea_change(this)";
127
	$select .= " >\n";
128
	$select .= "<option VALUE=\"\">ALL</option>";
129

    
130
	if($showall == true) 
131
		foreach($areas as $area => $areaname)
132
			$select .= "<option value='{$area}'>{$areaname}</option>\n";
133
	else 
134
		foreach($areas as $area => $areaname)
135
			if(check_and_returnif_section_exists($area) == true)
136
				$select .= "<option value='{$area}'>{$areaname}</option>\n";
137

    
138
	$select .= "</select>\n";
139
		
140
	echo $select;
141

    
142
}
143

    
144
if ($_POST['apply']) {
145
        ob_flush();
146
        flush();
147
		conf_mount_rw();
148
		clear_subsystem_dirty("restore");
149
		conf_mount_ro();
150
        exit;
151
}
152

    
153
if ($_POST) {
154
	unset($input_errors);
155
	if (stristr($_POST['Submit'], "Restore configuration"))
156
		$mode = "restore";
157
	else if (stristr($_POST['Submit'], "Reinstall"))
158
		$mode = "reinstallpackages";
159
	else if (stristr($_POST['Submit'], "Download"))
160
		$mode = "download";
161
	else if (stristr($_POST['Submit'], "Restore version"))
162
		$mode = "restore_ver";
163

    
164
	if ($_POST["nopackages"] <> "")
165
		$options = "nopackages";
166

    
167
	if ($_POST["ver"] <> "")
168
		$ver2restore = $_POST["ver"];
169

    
170
	if ($mode) {
171

    
172
		if ($mode == "download") {
173

    
174
			if ($_POST['encrypt']) {
175
				if(!$_POST['encrypt_password'] || !$_POST['encrypt_passconf'])
176
					$input_errors[] = "You must supply and confirm the password for encryption.";
177
				if($_POST['encrypt_password'] != $_POST['encrypt_passconf'])
178
					$input_errors[] = "The supplied 'Password' and 'Confirm' field values must match.";
179
			}
180

    
181
			if (!$input_errors) {
182

    
183
				//$lockbckp = lock('config');
184

    
185
				$host = "{$config['system']['hostname']}.{$config['system']['domain']}";
186
				$name = "config-{$host}-".date("YmdHis").".xml";
187
				$data = "";
188

    
189
				if($options == "nopackages") {
190
					if(!$_POST['backuparea']) {
191
						/* backup entire configuration */
192
						$data = file_get_contents("{$g['conf_path']}/config.xml");
193
					} else {
194
						/* backup specific area of configuration */
195
						$data = backup_config_section($_POST['backuparea']);
196
						$name = "{$_POST['backuparea']}-{$name}";
197
					}
198
					$sfn = "{$g['tmp_path']}/config.xml.nopkg";
199
					file_put_contents($sfn, $data);
200
					exec("sed '/<installedpackages>/,/<\/installedpackages>/d' {$sfn} > {$sfn}-new");
201
					$data = file_get_contents($sfn . "-new");					
202
				} else {
203
					if(!$_POST['backuparea']) {
204
						/* backup entire configuration */
205
						$data = file_get_contents("{$g['conf_path']}/config.xml");
206
					} else {
207
						/* backup specific area of configuration */
208
						$data = backup_config_section($_POST['backuparea']);
209
						$name = "{$_POST['backuparea']}-{$name}";
210
					}
211
				}
212

    
213
				//unlock($lockbckp);
214

    
215
				if ($_POST['encrypt']) {
216
					$data = encrypt_data($data, $_POST['encrypt_password']);
217
					tagfile_reformat($data, $data, "config.xml");
218
				}
219

    
220
				/* 
221
				 *  Backup RRD Data
222
				 */
223
				if(!$_POST['donotbackuprrd']) {
224
					$data = str_replace("</pfsense>", "\t<rrddata>", $data);
225
					$rrd_files_var_db_rrd = split("\n",`cd /var/db/rrd && ls *.rrd`);
226
					foreach($rrd_files_var_db_rrd as $rrd) {
227
						if($rrd) {
228
							$rrd_data = file_get_contents("{$g['vardb_path']}/rrd/{$rrd}");
229
							if($rrd_data) {
230
								$data .= "\t\t<rrddatafile>\n";
231
								$data .= "\t\t\t<filename>{$rrd}</filename>\n";
232
								$data .= "\t\t\t<data>" . base64_encode($rrd_data) . "</data>\n";
233
								$data .= "\t\t</rrddatafile>\n";
234
							}
235
						}
236
					}
237
					$data .= "\t</rrddata>\n";
238
					$data .= "</pfsense>\n";
239
				}
240
				
241
				$size = strlen($data);
242
				header("Content-Type: application/octet-stream");
243
				header("Content-Disposition: attachment; filename={$name}");
244
				header("Content-Length: $size");
245
				echo $data;
246

    
247
				exit;
248
			}
249
		}
250

    
251
		if ($mode == "restore") {
252

    
253
			if ($_POST['decrypt']) {
254
				if(!$_POST['decrypt_password'] || !$_POST['decrypt_passconf'])
255
					$input_errors[] = "You must supply and confirm the password for decryption.";
256
				if($_POST['decrypt_password'] != $_POST['decrypt_passconf'])
257
					$input_errors[] = "The supplied 'Password' and 'Confirm' field values must match.";
258
			}
259

    
260
			if (!$input_errors) {
261

    
262
				if (is_uploaded_file($_FILES['conffile']['tmp_name'])) {
263

    
264
					/* read the file contents */
265
					$data = file_get_contents($_FILES['conffile']['tmp_name']);
266
					if(!$data) {
267
						log_error("Warning, could not read file " . $_FILES['conffile']['tmp_name']);
268
						return 1;
269
					}
270

    
271
					if ($_POST['decrypt']) {
272
						if (!tagfile_deformat($data, $data, "config.xml")) {
273
							$input_errors[] = "The uploaded file does not appear to contain an encrypted pfsense configuration.";
274
							return 1;
275
						}
276
						$data = decrypt_data($data, $_POST['decrypt_password']);
277
					}
278

    
279
					if(stristr($data, "<m0n0wall>")) {
280
						log_error("Upgrading m0n0wall configuration to pfsense.");
281
						/* m0n0wall was found in config.  convert it. */
282
						$data = str_replace("m0n0wall", "pfsense", $data);
283
						$m0n0wall_upgrade = true;
284
					}
285
					if($_POST['restorearea']) {
286
						/* restore a specific area of the configuration */
287
						if(!stristr($data, $_POST['restorearea'])) {
288
							$input_errors[] = "You have selected to restore an area but we could not locate the correct xml tag.";
289
						} else {
290
							restore_config_section($_POST['restorearea'], $data);
291
							filter_configure();
292
							$savemsg = "The configuration area has been restored.  You may need to reboot the firewall.";
293
						}
294
					} else {
295
						if(!stristr($data, "<" . $g['xml_rootobj'] . ">")) {
296
							$input_errors[] = "You have selected to restore the full configuration but we could not locate a " . $g['xml_rootobj'] . " tag.";
297
						} else {
298
							/* restore the entire configuration */
299
							file_put_contents($_FILES['conffile']['tmp_name'], $data);
300
							if (config_install($_FILES['conffile']['tmp_name']) == 0) {
301
								/* this will be picked up by /index.php */
302
								conf_mount_rw();
303
								mark_subsystem_dirty("restore");
304
								touch("/conf/needs_package_sync");
305
								/* remove cache, we will force a config reboot */
306
								if(file_exists("{$g['tmp_path']}/config.cache"))
307
									unlink("{$g['tmp_path']}/config.cache");
308
								$config = parse_config(true);
309
								/* extract out rrd items, unset from $confgi when done */
310
								if($config['rrddata']) {
311
									foreach($config['rrddata']['rrddatafile'] as $rrd) {
312
										$rrd_fd = fopen("{$g['vardb_path']}/rrd/{$rrd['filename']}", "w");
313
										fwrite($rrd_fd, base64_decode($rrd['data']));
314
										fclose($rrd_fd);
315
									}
316
									unset($config['rrddata']);
317
									unlink_if_exists("{$g['tmp_path']}/config.cache");
318
									write_config();
319
									add_base_packages_menu_items();
320
									convert_config();
321
									conf_mount_ro();
322
								}
323
								if($m0n0wall_upgrade == true) {
324
									if($config['system']['gateway'] <> "")
325
										$config['interfaces']['wan']['gateway'] = $config['system']['gateway'];
326
									unset($config['shaper']);
327
									/* optional if list */
328
									$ifdescrs = get_configured_interface_list(true, true);
329
									/* remove special characters from interface descriptions */
330
									if(is_array($ifdescrs))
331
										foreach($ifdescrs as $iface)
332
											$config['interfaces'][$iface]['descr'] = remove_bad_chars($config['interfaces'][$iface]['descr']);
333
									/* check for interface names with an alias */
334
									if(is_array($ifdescrs)) {
335
										foreach($ifdescrs as $iface) {
336
											if(is_alias($config['interfaces'][$iface]['descr'])) {
337
												// Firewall rules
338
												$origname = $config['interfaces'][$iface]['descr'];
339
												$newname  = $config['interfaces'][$iface]['descr'] . "Alias";
340
												update_alias_names_upon_change('filter', 'rule', 'source', 'address', $newname, $origname);
341
												update_alias_names_upon_change('filter', 'rule', 'destination', 'address', $newname, $origname);
342
												// NAT Rules
343
												update_alias_names_upon_change('nat', 'rule', 'target', '', $newname, $origname);
344
												update_alias_names_upon_change('nat', 'rule', 'external-port', '', $newname, $origname);
345
												update_alias_names_upon_change('nat', 'rule', 'local-port', '', $newname, $origname);
346
												// Alias in an alias
347
												update_alias_names_upon_change('aliases', 'alias', 'address', '', $newname, $origname);
348
											}
349
										}
350
									}
351
									unlink_if_exists("{$g['tmp_path']}/config.cache");
352
									// Reset configuration version to something low
353
									// in order to force the config upgrade code to 
354
									// run through with all steps that are required.
355
									$config['system']['version'] = "1.0";
356
									// Deal with descriptions longer than 63 characters
357
									for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
358
										if(count($config['filter']['rule'][$i]['descr']) > 63)
359
											$config['filter']['rule'][$i]['descr'] = substr($config['filter']['rule'][$i]['descr'], 0, 63);
360
									}
361
									// Move interface from ipsec to enc0
362
									for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
363
										if($config['filter']['rule'][$i]['interface'] == "ipsec")
364
											$config['filter']['rule'][$i]['interface'] = "enc0";
365
									}
366
									// Convert icmp types
367
									// http://www.openbsd.org/cgi-bin/man.cgi?query=icmp&sektion=4&arch=i386&apropos=0&manpath=OpenBSD+Current
368
									for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
369
										if($config["filter"]["rule"][$i]['icmptype']) {
370
											switch($config["filter"]["rule"][$i]['icmptype']) {
371
												case "echo":
372
													$config["filter"]["rule"][$i]['icmptype'] = "echoreq";
373
													break;
374
					                            case "unreach":
375
													$config["filter"]["rule"][$i]['icmptype'] = "unreach";
376
													break;
377
					                            case "echorep":
378
													$config["filter"]["rule"][$i]['icmptype'] = "echorep";
379
													break;
380
					                            case "squench":
381
													$config["filter"]["rule"][$i]['icmptype'] = "squench";
382
													break;
383
					                            case "redir":
384
													$config["filter"]["rule"][$i]['icmptype'] = "redir";
385
													break;
386
					                            case "timex":
387
													$config["filter"]["rule"][$i]['icmptype'] = "timex";
388
													break;
389
					                            case "paramprob":
390
													$config["filter"]["rule"][$i]['icmptype'] = "paramprob";
391
													break;
392
					                            case "timest":
393
													$config["filter"]["rule"][$i]['icmptype'] = "timereq";
394
													break;
395
					                            case "timestrep":
396
													$config["filter"]["rule"][$i]['icmptype'] = "timerep";
397
													break;
398
					                            case "inforeq":
399
													$config["filter"]["rule"][$i]['icmptype'] = "inforeq";
400
													break;
401
					                            case "inforep":
402
													$config["filter"]["rule"][$i]['icmptype'] = "inforep";
403
													break;
404
					                            case "maskreq":
405
													$config["filter"]["rule"][$i]['icmptype'] = "maskreq";
406
													break;
407
					                            case "maskrep":
408
													$config["filter"]["rule"][$i]['icmptype'] = "maskrep";
409
													break;
410
											}
411
										}
412
									}
413
									$config['diag']['ipv6nat'] = true;
414
									write_config();
415
									add_base_packages_menu_items();									
416
									convert_config();
417
									conf_mount_ro();
418
									$savemsg = "The m0n0wall configuration has been restored and upgraded to pfSense.";
419
									mark_subsystem_dirty("restore");
420
								}
421
								if(isset($config['captiveportal']['enable'])) {
422
									/* for some reason ipfw doesn't init correctly except on bootup sequence */
423
									mark_subsystem_dirty("restore");
424
								}
425
								setup_serial_port();
426
								if(is_interface_mismatch() == true) {
427
									touch("/var/run/interface_mismatch_reboot_needed");
428
									clear_subsystem_dirty("restore");
429
									convert_config();
430
									header("Location: interfaces_assign.php");
431
									exit;
432
								}
433
							} else {
434
								$input_errors[] = "The configuration could not be restored.";
435
							}
436
						}
437
					}
438
				} else {
439
					$input_errors[] = "The configuration could not be restored (file upload error).";
440
				}
441
			}
442
		}
443

    
444
		if ($mode == "reinstallpackages") {
445

    
446
			header("Location: pkg_mgr_install.php?mode=reinstallall");
447
			exit;
448
                } else if ($mode == "restore_ver") {
449
			$input_errors[] = "XXX - this feature may hose your config (do NOT backrev configs!) - billm";
450
			if ($ver2restore <> "") {
451
				$conf_file = "{$g['cf_conf_path']}/bak/config-" . strtotime($ver2restore) . ".xml";
452
				if (config_install($conf_file) == 0) {
453
						mark_subsystem_dirty("restore");
454
                        } else {
455
                        	$input_errors[] = "The configuration could not be restored.";
456
                        }
457
                } else {
458
                        $input_errors[] = "No version selected.";
459
                }
460
		}
461
	}
462
}
463

    
464
$id = rand() . '.' . time();
465

    
466
$mth = ini_get('upload_progress_meter.store_method');
467
$dir = ini_get('upload_progress_meter.file.filename_template');
468

    
469
$pgtitle = array("Diagnostics","Backup/restore");
470
include("head.inc");
471

    
472
?>
473

    
474
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
475
<?php include("fbegin.inc"); ?>
476
<script language="JavaScript">
477
<!--
478

    
479
function encrypt_change() {
480

    
481
	if (!document.iform.encrypt.checked)
482
		document.getElementById("encrypt_opts").style.display="none";
483
	else
484
		document.getElementById("encrypt_opts").style.display="";
485
}
486

    
487
function decrypt_change() {
488

    
489
	if (!document.iform.decrypt.checked)
490
		document.getElementById("decrypt_opts").style.display="none";
491
	else
492
		document.getElementById("decrypt_opts").style.display="";
493
}
494

    
495
function backuparea_change(obj) {
496

    
497
        if (obj.value == "")
498
                document.getElementById("dotnotbackuprrd").checked = false;
499
        else
500
                document.getElementById("dotnotbackuprrd").checked = true;
501
}
502
//-->
503
</script>
504

    
505
<?php if ($input_errors) print_input_errors($input_errors); ?>
506
<?php if ($savemsg) print_info_box($savemsg); ?>
507
<?php if (is_subsystem_dirty('restore')): ?><p>
508
<form action="reboot.php" method="post">
509
<input name="Submit" type="hidden" value=" Yes ">
510
<?php print_info_box("The firewall configuration has been changed.<br/>The firewall is now rebooting.");?><br>
511
</form>
512
<?php endif; ?>
513
<form action="diag_backup.php" method="post" name="iform" enctype="multipart/form-data">
514
<table width="100%" border="0" cellspacing="0" cellpadding="0">
515
	<tr>
516
		<td>
517
<?php
518
		$tab_array = array();
519
		$tab_array[0] = array("Config History", false, "diag_confbak.php");
520
		$tab_array[1] = array("Backup/Restore", true, "diag_backup.php");
521
		display_top_tabs($tab_array);
522
?>
523
		</td>
524
	</tr>
525
	<tr>
526
		<td>
527
			<div id="mainarea">
528
			<table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0">
529
				<tr>
530
					<td colspan="2" class="listtopic">Backup configuration</td>
531
				</tr>
532
				<tr>
533
					<td width="22%" valign="baseline" class="vncell">&nbsp;</td>
534
					<td width="78%" class="vtable">
535
						<p>Click this button to download the system configuration in XML format.<br /><br /> Backup area: <?php spit_out_select_items("backuparea", false); ?></p>
536
						<table>
537
							<tr>
538
								<td>
539
									<input name="nopackages" type="checkbox" class="formcheckbox" id="nopackages">
540
								</td>
541
								<td>
542
									<span class="vexpl">Do not backup package information.</span>
543
								</td>
544
							</tr>
545
						</table>
546
						<table>
547
							<tr>
548
								<td>
549
									<input name="encrypt" type="checkbox" class="formcheckbox" id="nopackages" onClick="encrypt_change()">
550
								</td>
551
								<td>
552
									<span class="vexpl">Encrypt this configuration file.</span>
553
								</td>
554
							</tr>
555
							<tr>
556
								<td>
557
									<input name="donotbackuprrd" type="checkbox" class="formcheckbox" id="dotnotbackuprrd">
558
								</td>
559
								<td>
560
									<span class="vexpl">Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config.xml space!)</span>
561
								</td>
562
							</tr>
563
						</table>
564
						<table id="encrypt_opts">
565
							<tr>
566
								<td>
567
									<span class="vexpl">Password :</span>
568
								</td>
569
								<td>
570
									<input name="encrypt_password" type="password" class="formfld pwd" size="20" value="" />
571
								</td>
572
							</tr>
573
							<tr>
574
								<td>
575
									<span class="vexpl">confirm :</span>
576
								</td>
577
								<td>
578
									<input name="encrypt_passconf" type="password" class="formfld pwd" size="20" value="" />
579
								</td>
580
							</tr>
581
						</table>
582
						<p><input name="Submit" type="submit" class="formbtn" id="download" value="Download configuration"></p>
583
					</td>
584
				</tr>
585
				<tr>
586
					<td colspan="2" class="list" height="12">&nbsp;</td>
587
                </tr>
588
                <tr>
589
					<td colspan="2" class="listtopic">Restore configuration</td>
590
				</tr>
591
				<tr>
592
					<td width="22%" valign="baseline" class="vncell">&nbsp;</td>
593
					<td width="78%" class="vtable">
594
						Open a <?=$g['[product_name']?> configuration XML file and click the button below to restore the configuration. <br /><br /> Restore area: <?php spit_out_select_items("restorearea", true); ?>
595
						<p><input name="conffile" type="file" class="formfld unknown" id="conffile" size="40"></p>
596
						<table>
597
							<tr>
598
								<td>
599
									<input name="decrypt" type="checkbox" class="formcheckbox" id="nopackages" onClick="decrypt_change()">
600
								</td>
601
								<td>
602
									<span class="vexpl">Configuration file is encrypted.</span>
603
								</td>
604
							</tr>
605
						</table>
606
						<table id="decrypt_opts">
607
							<tr>
608
								<td>
609
									<span class="vexpl">Password :</span>
610
								</td>
611
								<td>
612
									<input name="decrypt_password" type="password" class="formfld pwd" size="20" value="" />
613
								</td>
614
							</tr>
615
							<tr>
616
								<td>
617
									<span class="vexpl">confirm :</span>
618
								</td>
619
								<td>
620
									<input name="decrypt_passconf" type="password" class="formfld pwd" size="20" value="" />
621
								</td>
622
							</tr>
623
						</table>
624
						<p><input name="Submit" type="submit" class="formbtn" id="restore" value="Restore configuration"></p>
625
                      	<p><strong><span class="red">Note:</span></strong><br />The firewall will reboot after restoring the configuration.<br /></p>
626
					</td>
627
				</tr>
628
				<?php if($config['installedpackages']['package'] != "") { ?>
629
				<tr>
630
					<td colspan="2" class="list" height="12">&nbsp;</td>
631
				</tr>
632
				<tr>
633
					<td colspan="2" class="listtopic">Reinstall packages</td>
634
				</tr>
635
				<tr>
636
					<td width="22%" valign="baseline" class="vncell">&nbsp;</td>
637
					<td width="78%" class="vtable">
638
						<p>Click this button to reinstall all system packages.  This may take a while. <br /><br />
639
		  				<input name="Submit" type="submit" class="formbtn" id="reinstallpackages" value="Reinstall packages">
640
					</td>
641
				</tr>
642
				<?php } ?>
643
			</table>
644
			</div>
645
		</td>
646
	</tr>
647
</table>
648
</form>
649

    
650
<script language="JavaScript">
651
<!--
652
encrypt_change();
653
decrypt_change();
654
//-->
655
</script>
656

    
657
<?php include("fend.inc"); ?>
658
</body>
659
</html>
660
<?php
661

    
662
if (is_subsystem_dirty('restore'))
663
	exec("/etc/rc.reboot");
664

    
665
?>
(6-6/218)