hasGlobalAdmin()) {
if (!is_array(Config::get('rancid_configs'))) {
Config::set('rancid_configs', array(Config::get('rancid_configs')));
}
if (isset(Config::get('rancid_configs')[0])) {
foreach (Config::get('rancid_configs') as $configs) {
if ($configs[(strlen($configs) - 1)] != '/') {
$configs .= '/';
}
if (is_file($configs.$device['hostname'])) {
$file = $configs.$device['hostname'];
} elseif (is_file($configs.strtok($device['hostname'], '.'))) { // Strip domain
$file = $configs.strtok($device['hostname'], '.');
} else {
if (!empty(Config::get('mydomain'))) { // Try with domain name if set
if (is_file($configs.$device['hostname'].'.'.Config::get('mydomain'))) {
$file = $configs.$device['hostname'].'.'.Config::get('mydomain');
}
}
} // end if
}
echo '
';
print_optionbar_start('', '');
echo "
Config » ";
if (!$vars['rev']) {
echo '';
} else {
echo generate_link('Latest', array('page' => 'device', 'device' => $device['device_id'], 'tab' => 'showconfig'));
}
if (Config::get('rancid_repo_type') == 'svn' && function_exists('svn_log')) {
$sep = ' | ';
$svnlogs = svn_log($file, SVN_REVISION_HEAD, null, 8);
$revlist = array();
foreach ($svnlogs as $svnlog) {
echo $sep;
$revlist[] = $svnlog['rev'];
if ($vars['rev'] == $svnlog['rev']) {
echo '';
}
$sep = ' | ';
}
}//end if
if (Config::get('rancid_repo_type') == 'git') {
$sep = ' | ';
$process = new Process(array('git', 'log', '-n 8', '--pretty=format:%h;%ct', $file), $configs);
$process->run();
$gitlogs_raw = explode(PHP_EOL, $process->getOutput());
$gitlogs = array();
foreach ($gitlogs_raw as $gl) {
list($rev, $ts) = explode(";", $gl);
$gitlogs[] = array("rev" => $rev, "date" => $ts);
}
$revlist = array();
foreach ($gitlogs as $gitlog) {
echo $sep;
$revlist[] = $gitlog['rev'];
if ($vars['rev'] == $gitlog['rev']) {
echo '';
}
$sep = ' | ';
}
}
print_optionbar_end();
if (Config::get('rancid_repo_type') == 'svn') {
if (function_exists('svn_log') && in_array($vars['rev'], $revlist)) {
list($diff, $errors) = svn_diff($file, ($vars['rev'] - 1), $file, $vars['rev']);
if (!$diff) {
$text = 'No Difference';
} else {
$text = '';
while (!feof($diff)) {
$text .= fread($diff, 8192);
}
fclose($diff);
fclose($errors);
}
} else {
$fh = fopen($file, 'r') or die("Can't open file");
$text = fread($fh, filesize($file));
fclose($fh);
}
} elseif (Config::get('rancid_repo_type') == 'git') {
if (in_array($vars['rev'], $revlist)) {
$process = new Process(array('git', 'diff', $vars['rev'] . '^', $vars['rev'], $file), $configs);
$process->run();
$diff = $process->getOutput();
if (!$diff) {
$text = 'No Difference';
} else {
$text = $diff;
$previous_config = $vars['rev'] . '^';
}
} else {
$fh = fopen($file, 'r') or die("Can't open file");
$text = fread($fh, filesize($file));
fclose($fh);
}
}
if (Config::get('rancid_ignorecomments')) {
$lines = explode("\n", $text);
for ($i = 0; $i < count($lines); $i++) {
if ($lines[$i][0] == '#') {
unset($lines[$i]);
}
}
$text = join("\n", $lines);
}
} elseif (Config::get('oxidized')['enabled'] === true && isset(Config::get('oxidized')['url'])) {
// Try with hostname as set in librenms first
$oxidized_hostname = $device['hostname'];
// fetch info about the node and then a list of versions for that node
$node_info = json_decode(file_get_contents(Config::get('oxidized')['url'].'/node/show/'.$oxidized_hostname.'?format=json'), true);
// Try other hostname format if Oxidized request failed
if (! $node_info) {
// Adjust hostname based on whether domain was already in it or not
if (strpos($oxidized_hostname, '.') !== false) {
// Use short name
$oxidized_hostname = strtok($device['hostname'], '.');
} elseif (Config::get('mydomain')) {
$oxidized_hostname = $device['hostname'].'.'.Config::get('mydomain');
}
// Try Oxidized again with new hostname, if it has changed
if ($oxidized_hostname != $device['hostname']) {
$node_info = json_decode(file_get_contents(Config::get('oxidized')['url'].'/node/show/'.$oxidized_hostname.'?format=json'), true);
}
}
if (Config::get('oxidized')['features']['versioning'] === true) { // fetch a list of versions
$config_versions = json_decode(file_get_contents(Config::get('oxidized')['url'].'/node/version?node_full='.(isset($node_info['full_name']) ? $node_info['full_name'] : $oxidized_hostname).'&format=json'), true);
}
$config_total = 1;
if (is_array($config_versions)) {
$config_total = count($config_versions);
}
if ($config_total > 1) {
// populate current_version
if (isset($_POST['config'])) {
list($oid,$date,$version) = explode('|', mres($_POST['config']));
$current_config = array('oid'=>$oid, 'date'=>$date, 'version'=>$version);
} else { // no version selected
$current_config = array('oid'=>$config_versions[0]['oid'], 'date'=>$current_config[0]['date'], 'version'=>$config_total);
}
// populate previous_version
if (isset($_POST['diff'])) { // diff requested
list($oid,$date,$version) = explode('|', mres($_POST['prevconfig']));
if (isset($oid) && $oid != $current_config['oid']) {
$previous_config = array('oid'=>$oid, 'date'=>$date, 'version'=>$version);
} elseif ($current_config['version'] != 1) { // assume previous, unless current is first config
foreach ($config_versions as $key => $version) {
if ($version['oid'] == $current_config['oid']) {
$prev_key = $key + 1;
$previous_config['oid'] = $config_versions[$prev_key]['oid'];
$previous_config['date'] = $config_versions[$prev_key]['date'];
$previous_config['version'] = $config_total - $prev_key;
break;
}
}
} else {
print_error('No previous version, please select a different version.');
}
}
if (isset($previous_config)) {
$url = Config::get('oxidized')['url'].'/node/version/diffs?node='.$oxidized_hostname;
if (!empty($node_info['group'])) {
$url .= '&group='.$node_info['group'];
}
$url .= '&oid='.$current_config['oid'].'&date='.urlencode($current_config['date']).'&num='.$current_config['version'].'&oid2='.$previous_config['oid'].'&format=text';
$text = file_get_contents($url); // fetch diff
} else {
// fetch current_version
$text = file_get_contents(Config::get('oxidized')['url'].'/node/version/view?node='.$oxidized_hostname.(!empty($node_info['group']) ? '&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::get('oxidized')['url'].'/node/fetch/'.(!empty($node_info['group']) ? $node_info['group'].'/' : '').$oxidized_hostname);
}
if (is_array($node_info) || $config_total > 1) {
echo '
';
if (is_array($node_info)) {
echo '
Sync status: '.$node_info['last']['status'].'
- Node: '.$node_info['name'].'
- IP: '.$node_info['ip'].'
- Model: '.$node_info['model'].'
- Last Sync: '.$node_info['last']['end'].'
';
}
if ($config_total > 1) {
echo '
';
}
echo '
';
} else {
echo '
';
print_error("We couldn't retrieve the device information from Oxidized");
$text = '';
}
}//end if
if (!empty($author)) {
echo '
Author: '.$author.'
';
if (!empty($msg)) {
echo '
';
}
echo '
';
}
if (!empty($text)) {
if (isset($previous_config)) {
$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 '
';
echo '';
echo htmlspecialchars_decode($geshi->parse_code());
echo '
';
}
}//end if
$pagetitle[] = 'Config';