From b5106f4e17aa2bd4438011149caef3cb9253683b Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Wed, 10 Feb 2016 12:17:37 -0600 Subject: [PATCH] Generate and display diffs between versions. Clicking show diff generates a diff between the shown version and the selected version. --- html/pages/device.inc.php | 4 +- html/pages/device/showconfig.inc.php | 84 +++++++++++++++++++++------- 2 files changed, 67 insertions(+), 21 deletions(-) diff --git a/html/pages/device.inc.php b/html/pages/device.inc.php index 94a296822..54fe3f093 100644 --- a/html/pages/device.inc.php +++ b/html/pages/device.inc.php @@ -304,7 +304,7 @@ if (device_permitted($vars['device']) || $check_device == $vars['device']) { '; } - if ($_SESSION['userlevel'] >= '7') { + if (is_admin()) { if (!is_array($config['rancid_configs'])) { $config['rancid_configs'] = array($config['rancid_configs']); } @@ -392,7 +392,7 @@ if (device_permitted($vars['device']) || $check_device == $vars['device']) {
  • ssh
  • telnet
  • '; - if ($_SESSION['userlevel'] >= '7') { + if (is_admin()) { echo '
  • diff --git a/html/pages/device/showconfig.inc.php b/html/pages/device/showconfig.inc.php index ed9219cf2..2455aee6b 100644 --- a/html/pages/device/showconfig.inc.php +++ b/html/pages/device/showconfig.inc.php @@ -3,7 +3,7 @@ require 'includes/geshi/geshi.php'; // FIXME svn stuff still using optc etc, won't work, needs updating! -if ($_SESSION['userlevel'] >= '7') { +if (is_admin()) { if (!is_array($config['rancid_configs'])) { $config['rancid_configs'] = array($config['rancid_configs']); } @@ -104,18 +104,50 @@ if ($_SESSION['userlevel'] >= '7') { } else if ($config['oxidized']['enabled'] === true && isset($config['oxidized']['url'])) { $node_info = json_decode(file_get_contents($config['oxidized']['url'].'/node/show/'.$device['hostname'].'?format=json'), true); - if ($config['oxidized']['features']['versioning'] === true && isset($_POST['config'])) { - list($oid,$date,$version) = explode('|',mres($_POST['config'])); - $text = file_get_contents($config['oxidized']['url'].'/node/version/view?node='.$device['hostname'].'&group='.(!empty($node_info['group']) ? $node_info['group'] : '').'&oid='.$oid.'&date='.urlencode($date).'&num='.$version.'&format=text'); - } - else { - $text = file_get_contents($config['oxidized']['url'].'/node/fetch/'.(!empty($node_info['group']) ? $node_info['group'].'/' : '').$device['hostname']); - } - if ($config['oxidized']['features']['versioning'] === true) { + + if ($config['oxidized']['features']['versioning'] === true) { // fetch a list of versions $config_versions = json_decode(file_get_contents($config['oxidized']['url'].'/node/version?node_full='.(!empty($node_info['group']) ? $node_info['group'].'/' : '').$device['hostname'].'&format=json'), true); } + if (is_array($config_versions)) { + $config_total = count($config_versions); + } - if (is_array($node_info) || is_array($config_versions)) { + if ($config_total > 1) { + if (isset($_POST['config'])) { // versioning with selected version + list($oid,$date,$version) = explode('|',mres($_POST['config'])); + $current_version = array('oid'=>$oid, 'date'=>$date, 'version'=>$version); + } + else { // no version selected + $current_version = array('oid'=>$config_versions[0]['oid'], 'date'=>$current_version[0]['date'], 'version'=>$config_total); + } + + // fetch current_version + $text = file_get_contents($config['oxidized']['url'].'/node/version/view?node='.$device['hostname'].'&group='.(!empty($node_info['group']) ? $node_info['group'] : '').'&oid='.$current_version['oid'].'&date='.urlencode($current_version['date']).'&num='.$current_version['version'].'&format=text'); + + if (isset($_POST['diff']) && isset($_POST['prevconfig'])) { // diff requested + list($oid,$date,$version) = explode('|',mres($_POST['prevconfig'])); + if ($current_version['oid'] == $oid) { // the same version is selected, assume the previous revision + $key = array_search($oid, array_column($config_versions, 'oid')) + 1; // >=PHP 5.5.0 + $oid = $config_versions[$key]['oid']; + $date = $config_versions[$key]['date']; + $version = $config_total - $key; + } + + if ($version > 0) { // if we know the version doesn't exist, don't even try to fetch it + $previous_text = file_get_contents($config['oxidized']['url'].'/node/version/view?node='.$device['hostname'].'&group='.(!empty($node_info['group']) ? $node_info['group'] : '').'&oid='.$oid.'&date='.urlencode($date).'&num='.$version.'&format=text'); + if (!empty($previous_text)) { + $text = xdiff_string_diff($text, $previous_text); // requires pecl xdiff + } + } else { + print_error('No previous version, please select a different version.'); + } + } + } + else { // just fetch the only version + $text = file_get_contents($config['oxidized']['url'].'/node/fetch/'.(!empty($node_info['group']) ? $node_info['group'].'/' : '').$device['hostname']); + } + + if (is_array($node_info) || $config_total > 1) { echo '
    '; @@ -136,7 +168,7 @@ if ($_SESSION['userlevel'] >= '7') { '; } - if (is_array($config_versions)) { + if ($config_total > 1) { echo '
    @@ -144,13 +176,19 @@ if ($_SESSION['userlevel'] >= '7') {
    + +
    @@ -177,9 +219,13 @@ if ($_SESSION['userlevel'] >= '7') { }//end if if (!empty($text)) { - $language = 'ios'; - $geshi = new GeSHi($text, $language); - $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS); +// if (!empty($previous_text)) { + $language = 'diff'; +// } else { +// $language = 'ios'; +// } + $geshi = new GeSHi($text, $language); +// $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS); $geshi->set_overall_style('color: black;'); // $geshi->set_line_style('color: #999999'); echo $geshi->parse_code();