Project

General

Profile

Download (23.1 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', 'source', 'address', $newname, $origname);
344
												update_alias_names_upon_change('nat', 'rule', 'source', 'port', $newname, $origname);
345
												update_alias_names_upon_change('nat', 'rule', 'destination', 'address', $newname, $origname);
346
												update_alias_names_upon_change('nat', 'rule', 'destination', 'port', $newname, $origname);
347
												update_alias_names_upon_change('nat', 'rule', 'target', '', $newname, $origname);
348
												update_alias_names_upon_change('nat', 'rule', 'local-port', '', $newname, $origname);
349
												// Alias in an alias
350
												update_alias_names_upon_change('aliases', 'alias', 'address', '', $newname, $origname);
351
											}
352
										}
353
									}
354
									unlink_if_exists("{$g['tmp_path']}/config.cache");
355
									// Reset configuration version to something low
356
									// in order to force the config upgrade code to 
357
									// run through with all steps that are required.
358
									$config['system']['version'] = "1.0";
359
									// Deal with descriptions longer than 63 characters
360
									for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
361
										if(count($config['filter']['rule'][$i]['descr']) > 63)
362
											$config['filter']['rule'][$i]['descr'] = substr($config['filter']['rule'][$i]['descr'], 0, 63);
363
									}
364
									// Move interface from ipsec to enc0
365
									for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
366
										if($config['filter']['rule'][$i]['interface'] == "ipsec")
367
											$config['filter']['rule'][$i]['interface'] = "enc0";
368
									}
369
									// Convert icmp types
370
									// http://www.openbsd.org/cgi-bin/man.cgi?query=icmp&sektion=4&arch=i386&apropos=0&manpath=OpenBSD+Current
371
									for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
372
										if($config["filter"]["rule"][$i]['icmptype']) {
373
											switch($config["filter"]["rule"][$i]['icmptype']) {
374
												case "echo":
375
													$config["filter"]["rule"][$i]['icmptype'] = "echoreq";
376
													break;
377
					                            case "unreach":
378
													$config["filter"]["rule"][$i]['icmptype'] = "unreach";
379
													break;
380
					                            case "echorep":
381
													$config["filter"]["rule"][$i]['icmptype'] = "echorep";
382
													break;
383
					                            case "squench":
384
													$config["filter"]["rule"][$i]['icmptype'] = "squench";
385
													break;
386
					                            case "redir":
387
													$config["filter"]["rule"][$i]['icmptype'] = "redir";
388
													break;
389
					                            case "timex":
390
													$config["filter"]["rule"][$i]['icmptype'] = "timex";
391
													break;
392
					                            case "paramprob":
393
													$config["filter"]["rule"][$i]['icmptype'] = "paramprob";
394
													break;
395
					                            case "timest":
396
													$config["filter"]["rule"][$i]['icmptype'] = "timereq";
397
													break;
398
					                            case "timestrep":
399
													$config["filter"]["rule"][$i]['icmptype'] = "timerep";
400
													break;
401
					                            case "inforeq":
402
													$config["filter"]["rule"][$i]['icmptype'] = "inforeq";
403
													break;
404
					                            case "inforep":
405
													$config["filter"]["rule"][$i]['icmptype'] = "inforep";
406
													break;
407
					                            case "maskreq":
408
													$config["filter"]["rule"][$i]['icmptype'] = "maskreq";
409
													break;
410
					                            case "maskrep":
411
													$config["filter"]["rule"][$i]['icmptype'] = "maskrep";
412
													break;
413
											}
414
										}
415
									}
416
									$config['diag']['ipv6nat'] = true;
417
									write_config();
418
									add_base_packages_menu_items();									
419
									convert_config();
420
									conf_mount_ro();
421
									$savemsg = "The m0n0wall configuration has been restored and upgraded to pfSense.";
422
									mark_subsystem_dirty("restore");
423
								}
424
								if(isset($config['captiveportal']['enable'])) {
425
									/* for some reason ipfw doesn't init correctly except on bootup sequence */
426
									mark_subsystem_dirty("restore");
427
								}
428
								setup_serial_port();
429
								if(is_interface_mismatch() == true) {
430
									touch("/var/run/interface_mismatch_reboot_needed");
431
									clear_subsystem_dirty("restore");
432
									convert_config();
433
									header("Location: interfaces_assign.php");
434
									exit;
435
								}
436
							} else {
437
								$input_errors[] = "The configuration could not be restored.";
438
							}
439
						}
440
					}
441
				} else {
442
					$input_errors[] = "The configuration could not be restored (file upload error).";
443
				}
444
			}
445
		}
446

    
447
		if ($mode == "reinstallpackages") {
448

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

    
467
$id = rand() . '.' . time();
468

    
469
$mth = ini_get('upload_progress_meter.store_method');
470
$dir = ini_get('upload_progress_meter.file.filename_template');
471

    
472
$pgtitle = array("Diagnostics","Backup/restore");
473
include("head.inc");
474

    
475
?>
476

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

    
482
function encrypt_change() {
483

    
484
	if (!document.iform.encrypt.checked)
485
		document.getElementById("encrypt_opts").style.display="none";
486
	else
487
		document.getElementById("encrypt_opts").style.display="";
488
}
489

    
490
function decrypt_change() {
491

    
492
	if (!document.iform.decrypt.checked)
493
		document.getElementById("decrypt_opts").style.display="none";
494
	else
495
		document.getElementById("decrypt_opts").style.display="";
496
}
497

    
498
function backuparea_change(obj) {
499

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

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

    
653
<script language="JavaScript">
654
<!--
655
encrypt_change();
656
decrypt_change();
657
//-->
658
</script>
659

    
660
<?php include("fend.inc"); ?>
661
</body>
662
</html>
663
<?php
664

    
665
if (is_subsystem_dirty('restore'))
666
	exec("/etc/rc.reboot");
667

    
668
?>
(6-6/216)