diff options
author | Bill Marquette <bill.marquette@gmail.com> | 2009-02-06 19:18:00 -0600 |
---|---|---|
committer | Bill Marquette <bill.marquette@gmail.com> | 2009-02-06 19:18:00 -0600 |
commit | 55eddd7accf2c5f9b0f52b22a010c4c4b7c130d1 (patch) | |
tree | ba4783bab1dd65f1ceef2dfac9fdbd515531d18b /config/autoconfigbackup/autoconfigbackup.php | |
parent | 67780cc9d469288742aea5bc378c29a54edd5ec5 (diff) | |
download | pfsense-packages-55eddd7accf2c5f9b0f52b22a010c4c4b7c130d1.tar.gz pfsense-packages-55eddd7accf2c5f9b0f52b22a010c4c4b7c130d1.tar.bz2 pfsense-packages-55eddd7accf2c5f9b0f52b22a010c4c4b7c130d1.zip |
mv packages to config dir to match web layout
Diffstat (limited to 'config/autoconfigbackup/autoconfigbackup.php')
-rw-r--r-- | config/autoconfigbackup/autoconfigbackup.php | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/config/autoconfigbackup/autoconfigbackup.php b/config/autoconfigbackup/autoconfigbackup.php new file mode 100644 index 00000000..80db5543 --- /dev/null +++ b/config/autoconfigbackup/autoconfigbackup.php @@ -0,0 +1,387 @@ +<?php +/* $Id$ */ +/* + autoconfigbackup.php + Copyright (C) 2008 Scott Ullrich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require("guiconfig.inc"); + +$pfSversion = str_replace("\n", "", file_get_contents("/etc/version")); +if(strstr($pfSversion, "1.2")) + require("crypt_acb.php"); + +// Seperator used during client / server communications +$oper_sep = "\|\|"; + +// Encryption password +$decrypt_password = $config['installedpackages']['autoconfigbackup']['config'][0]['crypto_password']; + +// Defined username +$username = $config['installedpackages']['autoconfigbackup']['config'][0]['username']; + +// Defined password +$password = $config['installedpackages']['autoconfigbackup']['config'][0]['password']; + +// URL to restore.php +$get_url = "https://{$username}:{$password}@portal.pfsense.org/pfSconfigbackups/restore.php"; + +// URL to stats +$stats_url = "https://{$username}:{$password}@portal.pfsense.org/pfSconfigbackups/showstats.php"; + +// URL to delete.php +$del_url = "https://{$username}:{$password}@portal.pfsense.org/pfSconfigbackups/delete.php"; + +// Set hostname +if($_REQUEST['hostname']) + $hostname = $_REQUEST['hostname']; +else + $hostname = $config['system']['hostname'] . "." . $config['system']['domain']; + +// Hostname of local machine +$myhostname = $config['system']['hostname'] . "." . $config['system']['domain']; + +if(!$username) { + Header("Location: /pkg_edit.php?xml=autoconfigbackup.xml&id=0"); + exit; +} + +if($_REQUEST['savemsg']) + $savemsg = htmlentities($_REQUEST['savemsg']); + +if($_REQUEST['download']) + $pgtitle = "Diagnostics: Auto Configuration Backup revision information"; +else + $pgtitle = "Diagnostics: Auto Configuration Backup"; + +include("head.inc"); + +function get_hostnames() { + global $stats_url, $username, $oper_sep; + // Populate available backups + $curl_session = curl_init(); + curl_setopt($curl_session, CURLOPT_URL, $stats_url); + curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_session, CURLOPT_POST, 1); + curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_session, CURLOPT_POSTFIELDS, "action=showstats"); + $data = curl_exec($curl_session); + if (curl_errno($curl_session)) { + $fd = fopen("/tmp/acb_statsdebug.txt", "w"); + fwrite($fd, $stats_url . "" . "action=showstats" . "\n\n"); + fwrite($fd, $data); + fwrite($fd, curl_error($curl_session)); + fclose($fd); + } else { + curl_close($curl_session); + } + // Loop through and create new confvers + $data_split = split("\n", $data); + $statvers = array(); + foreach($data_split as $ds) { + $ds_split = split($oper_sep, $ds); + if($ds_split[0]) + $statvers[] = $ds_split[0];; + } + return $statvers; +} + +?> +<body link="#0000CC" vlink="#0000CC" alink="#0000CC"> +<div id='maincontent'> +<script src="/javascript/scriptaculous/prototype.js" type="text/javascript"></script> +<?php + include("fbegin.inc"); + if(strstr($pfSversion, "1.2")) + echo "<p class=\"pgtitle\">{$pgtitle}</p>"; + if($savemsg) { + echo "<div id='savemsg'>"; + print_info_box($savemsg); + echo "</div>"; + } + if ($input_errors) + print_input_errors($input_errors); + if($hostname <> $myhostname) + print_info_box("Warning! You are currently viewing an alternate hosts backup history ($hostname)"); +?> +<table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr><td> +<div id='feedbackdiv'></div> + <?php + $tab_array = array(); + $tab_array[0] = array("Settings", false, "/pkg_edit.php?xml=autoconfigbackup.xml&id=0"); + if($_REQUEST['download']) + $active = false; + else + $active = true; + $tab_array[1] = array("Restore", $active, "/autoconfigbackup.php"); + if($_REQUEST['download']) + $tab_array[] = array("Revision", true, "/autoconfigbackup.php?download={$_REQUEST['download']}"); + $tab_array[] = array("Backup now", false, "/autoconfigbackup_backup.php"); + $tab_array[] = array("Stats", false, "/autoconfigbackup_stats.php"); + display_top_tabs($tab_array); + $hostnames = get_hostnames(); + ?> + </td></tr> + <tr> + <td> + <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0"> + <tr> + <td colspan="2" align="left"> + <div id="loading"> + <img src="themes/metallic/images/misc/loader.gif"> Loading, please wait... + </div> + <?php + if($_REQUEST['rmver'] != "") { + $curl_session = curl_init(); + curl_setopt($curl_session, CURLOPT_URL, $del_url); + curl_setopt($curl_session, CURLOPT_POST, 3); + curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_session, CURLOPT_POSTFIELDS, "action=delete" . + "&hostname=" . urlencode($hostname) . + "&revision=" . urlencode($_REQUEST['rmver'])); + $data = curl_exec($curl_session); + if (curl_errno($curl_session)) { + $fd = fopen("/tmp/acb_deletedebug.txt", "w"); + fwrite($fd, $get_url . "" . "action=delete&hostname=" . + urlencode($hostname) . "&revision=" . + urlencode($_REQUEST['rmver']) . "\n\n"); + fwrite($fd, $data); + fwrite($fd, curl_error($curl_session)); + fclose($fd); + $savemsg = "An error occurred while trying to remove the item from portal.pfsense.org."; + } else { + curl_close($curl_session); + $savemsg = "Backup revision {$_REQUEST['rmver']} has been removed."; + } + print_info_box($savemsg); + } + if($_REQUEST['newver'] != "") { + // Phone home and obtain backups + $curl_session = curl_init(); + curl_setopt($curl_session, CURLOPT_URL, $get_url); + curl_setopt($curl_session, CURLOPT_POST, 3); + curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_session, CURLOPT_POSTFIELDS, "action=restore" . + "&hostname=" . urlencode($hostname) . + "&revision=" . urlencode($_REQUEST['newver'])); + $data = curl_exec($curl_session); + $data_split = split("\+\+\+\+", $data); + $sha256 = $data_split[0]; // sha256 + $data = $data_split[1]; + if (!tagfile_deformat($data, $data, "config.xml")) + $input_errors[] = "The downloaded file does not appear to contain an encrypted pfSense configuration."; + $data = decrypt_data($data, $decrypt_password); + $fd = fopen("/tmp/config_restore.xml", "w"); + fwrite($fd, $data); + fclose($fd); + if(strlen($data) < 50) + $input_errors[] = "The decrypted config.xml is under 50 characters, something went wrong. Aborting."; + $ondisksha256 = trim(`/sbin/sha256 /tmp/config_restore.xml | awk '{ print $4 }'`); + if($sha256 != "0" && $sha256 != "") // we might not have a sha256 on file for older backups + if($ondisksha256 <> $sha256) + $input_errors[] = "SHA256 values does not match, cannot restore."; + if (curl_errno($curl_session)) { + /* If an error occured, log the error in /tmp/ */ + $fd = fopen("/tmp/acb_restoredebug.txt", "w"); + fwrite($fd, $get_url . "" . "action=restore&hostname={$hostname}&revision=" . urlencode($_REQUEST['newver']) . "\n\n"); + fwrite($fd, $data); + fwrite($fd, curl_error($curl_session)); + fclose($fd); + } else { + curl_close($curl_session); + } + if(!$input_errors && $data) { + if(config_restore("/tmp/config_restore.xml") == 0) { + $savemsg = "Successfully reverted the pfSense configuration to revision " . urldecode($_REQUEST['newver']) . "."; + $savemsg .= <<<EOF + <p/> + <form action="reboot.php" method="post"> + Would you like to reboot? + <input name="Submit" type="submit" class="formbtn" value=" Yes "> + <input name="Submit" type="submit" class="formbtn" value=" No "> + </form> +EOF; + } else { + $savemsg = "Unable to revert to the selected configuration."; + } + print_info_box($savemsg); + } + unlink("/tmp/config_restore.xml"); + } + if($_REQUEST['download']) { + // Phone home and obtain backups + $curl_session = curl_init(); + curl_setopt($curl_session, CURLOPT_URL, $get_url); + curl_setopt($curl_session, CURLOPT_POST, 3); + curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_session, CURLOPT_POSTFIELDS, "action=restore" . + "&hostname=" . urlencode($hostname) . + "&revision=" . urlencode($_REQUEST['download'])); + $data = curl_exec($curl_session); + if (!tagfile_deformat($data, $data1, "config.xml")) + $input_errors[] = "The downloaded file does not appear to contain an encrypted pfSense configuration."; + if ($input_errors) { + print_input_errors($input_errors); + } else { + $ds = split("\+\+\+\+", $data); + $revision = $_REQUEST['download']; + $sha256sum = $ds[0]; + if($sha256sum == "0") + $sha256sum = "None on file."; + $data = $ds[1]; + $configtype = "Encrypted"; + if (!tagfile_deformat($data, $data, "config.xml")) + $input_errors[] = "The downloaded file does not appear to contain an encrypted pfSense configuration."; + $data = decrypt_data($data, $decrypt_password); + if(!strstr($data, "pfsense")) { + $data = "Could not decrypt. Different encryption key?"; + $input_errors[] = "Could not decrypt config.xml"; + } + echo "<h2>Hostname</h2>"; + echo "<textarea rows='1' cols='70'>{$hostname}</textarea>"; + echo "<h2>Revision date/time</h2>"; + echo "<textarea name='download' rows='1' cols='70'>{$_REQUEST['download']}</textarea>"; + echo "<h2>Revision reason</h2>"; + echo "<textarea name='download' rows='1' cols='70'>{$_REQUEST['reason']}</textarea>"; + echo "<h2>SHA256 summary</h2>"; + echo "<textarea name='shasum' rows='1' cols='70'>{$sha256sum}</textarea>"; + echo "<h2>Encrypted config.xml</h2>"; + echo "<textarea name='config_xml' rows='40' cols='70'>{$ds[1]}</textarea>"; + echo "<h2>Decrypted config.xml</h2>"; + echo "<textarea name='dec_config_xml' rows='40' cols='70'>{$data}</textarea>"; + } + if(!$input_errors) + echo "<p/><input type=\"button\" value=\"Install this revision\" onClick=\"document.location='autoconfigbackup.php?newver=" . urlencode($_REQUEST['download']) . "';\">"; + echo "<script type=\"text/javascript\">"; + echo "$('loading').innerHTML = '';"; + echo "</script>"; + echo "</td></tr></table></div></td></td></tr></tr></table></form>"; + require("fend.inc"); + exit; + } + // Populate available backups + $curl_session = curl_init(); + curl_setopt($curl_session, CURLOPT_URL, $get_url); + curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_session, CURLOPT_POST, 1); + curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_session, CURLOPT_POSTFIELDS, "action=showbackups&hostname={$hostname}"); + $data = curl_exec($curl_session); + if (curl_errno($curl_session)) { + $fd = fopen("/tmp/acb_backupdebug.txt", "w"); + fwrite($fd, $get_url . "" . "action=showbackups" . "\n\n"); + fwrite($fd, $data); + fwrite($fd, curl_error($curl_session)); + fclose($fd); + } else { + curl_close($curl_session); + } + // Loop through and create new confvers + $data_split = split("\n", $data); + $confvers = array(); + foreach($data_split as $ds) { + $ds_split = split($oper_sep, $ds); + $tmp_array = array(); + $tmp_array['username'] = $ds_split[0]; + $tmp_array['reason'] = $ds_split[1]; + $tmp_array['time'] = $ds_split[2]; + if($ds_split[2] && $ds_split[0]) + $confvers[] = $tmp_array; + } + ?> + </td> + </tr> + <tr> + <td colspan="2"> + <center> + <b>Hostname:</b> + <select id="hostname" name="hostname" onChange="document.location='autoconfigbackup.php?hostname=' + this.value;"> + <?foreach($hostnames as $hn):?> + <option value='<?=$hn?>'><?=$hn?></option> + <?endforeach?> + <option value='<?=$hostname?>' SELECTED><?=$hostname?></option> + </select> + </td> + </tr> + + <tr> + <td width="30%" class="listhdrr">Date</td> + <td width="70%" class="listhdrr">Configuration Change</td> + </tr> +<?php + $counter = 0; + echo "<script type=\"text/javascript\">"; + echo "$('loading').innerHTML = '';"; + echo "</script>"; + foreach($confvers as $cv): +?> + <tr valign="top"> + <td class="listlr"> <?= $cv['time']; ?></td> + <td class="listbg"> <?= $cv['reason']; ?></td> + <td colspan="2" valign="middle" class="list" nowrap> + <a title="Restore this revision" onClick="return confirm('Are you sure you want to restore <?= $cv['time']; ?>?')" href="autoconfigbackup.php?hostname=<?=urlencode($hostname)?>&newver=<?=urlencode($cv['time']);?>"> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"> + </a> + <a title="Show info" href="autoconfigbackup.php?download=<?=urlencode($cv['time']);?>&hostname=<?=urlencode($hostname)?>&reason=<?php echo urlencode($cv['reason']);?>"> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_down.gif" width="17" height="17" border="0"> + </a> + <a title="Delete" onClick="return confirm('Are you sure you want to delete <?= $cv['time']; ?>?')"href="autoconfigbackup.php?hostname=<?=urlencode($hostname)?>&rmver=<?=urlencode($cv['time']);?>"> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0"> + </a> + </td> + </tr> +<?php + $counter++; + endforeach; + if($counter == 0) + echo "<tr><td colspan='3'><center>Sorry, we could not locate any backups at portal.pfsense.org for this hostname ({$hostname}).</td></tr>"; + else + echo "<tr><td colspan='3'><center><br/>Backups hosted currently for this hostname on portalpfsense.org: {$counter}.</td></tr>"; +?> + </table> + </div> + </td> + <tr> + <td> + <p> + <strong> + + <span class="red"> + Hint: + </span> + </strong> + Click the + sign next to the revision you would like to restore. + </p> + </td> + </tr> + </tr> +</table> +</form> +<?php include("fend.inc"); ?> +</body> +</html>
\ No newline at end of file |