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']) {
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 '