Project

General

Profile

Download (24.6 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
$nocsrf = true;
53
require("guiconfig.inc");
54
require_once("functions.inc");
55
require_once("filter.inc");
56
require_once("shaper.inc");
57

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

    
89
function remove_bad_chars($string) {
90
	return preg_replace('/[^a-z_0-9]/i','',$string);
91
}
92

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

    
100
function spit_out_select_items($area, $showall) {
101
	global $config;
102

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

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

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

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

    
142
	echo $select;
143

    
144
}
145

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

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

    
166
	if ($_POST["nopackages"] <> "")
167
		$options = "nopackages";
168

    
169
	if ($_POST["ver"] <> "")
170
		$ver2restore = $_POST["ver"];
171

    
172
	if ($mode) {
173

    
174
		if ($mode == "download") {
175

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

    
183
			if (!$input_errors) {
184

    
185
				//$lockbckp = lock('config');
186

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

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

    
215
				//unlock($lockbckp);
216

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

    
222
				/*
223
				 *  Backup RRD Data
224
				 */
225
				if(!$_POST['donotbackuprrd']) {
226
					$data = str_replace("</pfsense>", "\t<rrddata>", $data);
227
					$rrd_files_var_db_rrd = split("\n",`cd /var/db/rrd && ls *.rrd`);
228
					foreach($rrd_files_var_db_rrd as $rrd) {
229
						if($rrd) {
230
							$rrd_data = file_get_contents("{$g['vardb_path']}/rrd/{$rrd}");
231
							if($rrd_data) {
232
								$data .= "\t\t<rrddatafile>\n";
233
								$data .= "\t\t\t<filename>{$rrd}</filename>\n";
234
								$data .= "\t\t\t<data>" . base64_encode(gzdeflate($rrd_data)) . "</data>\n";
235
								$data .= "\t\t</rrddatafile>\n";
236
							}
237
						}
238
					}
239
					$data .= "\t</rrddata>\n";
240
					$data .= "</pfsense>\n";
241
				}
242

    
243
				$size = strlen($data);
244
				header("Content-Type: application/octet-stream");
245
				header("Content-Disposition: attachment; filename={$name}");
246
				header("Content-Length: $size");
247
				if (isset($_SERVER['HTTPS'])) {
248
					header('Pragma: ');
249
					header('Cache-Control: ');
250
				} else {
251
					header("Pragma: private");
252
					header("Cache-Control: private, must-revalidate");
253
				}
254
				echo $data;
255

    
256
				exit;
257
			}
258
		}
259

    
260
		if ($mode == "restore") {
261

    
262
			if ($_POST['decrypt']) {
263
				if(!$_POST['decrypt_password'] || !$_POST['decrypt_passconf'])
264
					$input_errors[] = gettext("You must supply and confirm the password for decryption.");
265
				if($_POST['decrypt_password'] != $_POST['decrypt_passconf'])
266
					$input_errors[] = gettext("The supplied 'Password' and 'Confirm' field values must match.");
267
			}
268

    
269
			if (!$input_errors) {
270

    
271
				if (is_uploaded_file($_FILES['conffile']['tmp_name'])) {
272

    
273
					/* read the file contents */
274
					$data = file_get_contents($_FILES['conffile']['tmp_name']);
275
					if(!$data) {
276
						log_error(sprintf(gettext("Warning, could not read file %s"), $_FILES['conffile']['tmp_name']));
277
						return 1;
278
					}
279

    
280
					if ($_POST['decrypt']) {
281
						if (!tagfile_deformat($data, $data, "config.xml")) {
282
							$input_errors[] = gettext("The uploaded file does not appear to contain an encrypted pfsense configuration.");
283
							return 1;
284
						}
285
						$data = decrypt_data($data, $_POST['decrypt_password']);
286
					}
287

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

    
465
		if ($mode == "reinstallpackages") {
466

    
467
			header("Location: pkg_mgr_install.php?mode=reinstallall");
468
			exit;
469
                } else if ($mode == "restore_ver") {
470
			$input_errors[] = gettext("XXX - this feature may hose your config (do NOT backrev configs!) - billm");
471
			if ($ver2restore <> "") {
472
				$conf_file = "{$g['cf_conf_path']}/bak/config-" . strtotime($ver2restore) . ".xml";
473
				if (config_install($conf_file) == 0) {
474
						mark_subsystem_dirty("restore");
475
                        } else {
476
                        	$input_errors[] = gettext("The configuration could not be restored.");
477
                        }
478
                } else {
479
                        $input_errors[] = gettext("No version selected.");
480
                }
481
		}
482
	}
483
}
484

    
485
$id = rand() . '.' . time();
486

    
487
$mth = ini_get('upload_progress_meter.store_method');
488
$dir = ini_get('upload_progress_meter.file.filename_template');
489

    
490
$pgtitle = array(gettext("Diagnostics"),gettext("Backup/restore"));
491
include("head.inc");
492

    
493
?>
494

    
495
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
496
<?php include("fbegin.inc"); ?>
497
<script language="JavaScript">
498
<!--
499

    
500
function encrypt_change() {
501

    
502
	if (!document.iform.encrypt.checked)
503
		document.getElementById("encrypt_opts").style.display="none";
504
	else
505
		document.getElementById("encrypt_opts").style.display="";
506
}
507

    
508
function decrypt_change() {
509

    
510
	if (!document.iform.decrypt.checked)
511
		document.getElementById("decrypt_opts").style.display="none";
512
	else
513
		document.getElementById("decrypt_opts").style.display="";
514
}
515

    
516
function backuparea_change(obj) {
517

    
518
        if (obj.value == "")
519
                document.getElementById("dotnotbackuprrd").checked = false;
520
        else
521
                document.getElementById("dotnotbackuprrd").checked = true;
522
}
523
//-->
524
</script>
525

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

    
671
<script language="JavaScript">
672
<!--
673
encrypt_change();
674
decrypt_change();
675
//-->
676
</script>
677

    
678
<?php include("fend.inc"); ?>
679
</body>
680
</html>
681
<?php
682

    
683
if (is_subsystem_dirty('restore'))
684
	system_reboot();
685

    
686
?>
(6-6/220)