From cc344bf3c35c99c52c3d511c0aaa21a1cf4b2bae Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Fri, 12 Feb 2016 14:21:55 -0600 Subject: [PATCH] Use Oxidized's built in diffing capability. Drops the need for xdiff and one http call. --- html/pages/device/showconfig.inc.php | 63 ++++++++++++++++------------ 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/html/pages/device/showconfig.inc.php b/html/pages/device/showconfig.inc.php index dd8af7cc2..c79c4aacb 100644 --- a/html/pages/device/showconfig.inc.php +++ b/html/pages/device/showconfig.inc.php @@ -105,51 +105,60 @@ if (is_admin()) { else if ($config['oxidized']['enabled'] === true && isset($config['oxidized']['url'])) { // fetch info about the node and then a list of versions for that node $node_info = json_decode(file_get_contents($config['oxidized']['url'].'/node/show/'.$device['hostname'].'?format=json'), true); - $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); + $config_versions = json_decode(file_get_contents($config['oxidized']['url'].'/node/version?node_full='.(isset($node_info['full_name']) ? $node_info['full_name'] : $device['hostname']).'&format=json'), true); if (is_array($config_versions)) { $config_total = count($config_versions); } if ($config_total > 1) { - if (isset($_POST['config'])) { // versioning with selected version + // populate current_version + if (isset($_POST['config'])) { list($oid,$date,$version) = explode('|',mres($_POST['config'])); - $current_version = array('oid'=>$oid, 'date'=>$date, 'version'=>$version); + $current_config = 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); + $current_config = array('oid'=>$config_versions[0]['oid'], 'date'=>$current_config[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 + // populate previous_version + if (isset($_POST['diff'])) { // diff requested list($oid,$date,$version) = explode('|',mres($_POST['prevconfig'])); - if ($current_version['oid'] == $oid) { // the same version is selected, assume the previous revision + if (isset($oid) && $oid != $current_config['oid']) { + $previous_config = array('oid'=>$oid, 'date'=>$date, 'version'=>$version); + } + else if ($current_config['version'] != 1) { // assume previous, unless current is first config foreach ($config_versions as $key => $version) { - if ($version['oid'] == $current_version['oid']) { + if ($version['oid'] == $current_config['oid']) { $prev_key = $key + 1; - $oid = $config_versions[$prev_key]['oid']; - $date = $config_versions[$prev_key]['date']; - $version = $config_total - $prev_key; + $previous_config['oid'] = $config_versions[$prev_key]['oid']; + $previous_config['date'] = $config_versions[$prev_key]['date']; + $previous_config['version'] = $config_total - $prev_key; break; } } } - - 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)) { - $previous_version = array('oid'=>$oid, 'date'=>$date, 'version'=>$version); - $text = xdiff_string_diff($text, $previous_text); // requires pecl xdiff - } - } else { + else { print_error('No previous version, please select a different version.'); } } + + if (isset($previous_config)) { + $url = $config['oxidized']['url'].'/node/version/diffs?node='.$device['hostname'].'&group='; + if (!empty($node_info['group'])) { + $url .= $node_info['group']; + } + $url .= '&oid='.$previous_config['oid'].'&date='.urlencode($previous_config['date']).'&num='.$previous_config['version'].'&oid2='.$current_config['oid'].'&format=text'; + + $text = file_get_contents($url); // fetch diff + } else { + // 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_config['oid'].'&date='.urlencode($current_config['date']).'&num='.$current_config['version'].'&format=text'); + } } 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) { @@ -186,15 +195,15 @@ if (is_admin()) { $i = $config_total; foreach ($config_versions as $version) { echo '