1#!/usr/local/bin/php
2<?php
3
4/**
5 * Observium
6 *
7 *   This file is part of Observium.
8 *
9 * @package    observium
10 * @subpackage scripts
11 * @copyright  (C) 2006-2013 Adam Armstrong, (C) 2013-2019 Observium Limited
12 *
13 */
14
15chdir(dirname($argv[0]).'/..');
16$scriptname = basename($argv[0]);
17
18$options = getopt("d");
19if (isset($options['d'])) { array_shift($argv); } // for compatibility
20
21include_once("includes/sql-config.inc.php");
22
23//$config['rancid_version'] = '3.7.1';
24
25// Detect configured version
26if (isset($config['rancid_version']))
27{
28  // Rancid version set manually
29  $rancid_config_version = ltrim($config['rancid_version'], 'vV');
30  list($rancid_config_base) = explode('.', $rancid_config_version);
31  // $rancid_message = "Used RANCID version configured manually in \$config['rancid_version']: $rancid_version";
32  // // v3 delimiter
33  // $rancid_version_base = '3';
34  // $delimiter = ';';
35} else {
36  // Dummy version for compare
37  $rancid_config_version = 0;
38  $rancid_config_base = 0;
39}
40
41// Detect locally installed version
42if ($rancid_cmd = external_exec('which rancid-run'))
43{
44  list(, $rancid_cmd_version) = explode(' ', external_exec($rancid_cmd . ' -V'));
45  list($rancid_cmd_base) = explode('.', $rancid_cmd_version);
46} else {
47  // Dummy version for compare
48  $rancid_cmd_version = 0;
49  $rancid_cmd_version = 0;
50}
51
52if ($rancid_config_base > 0 && $rancid_cmd_base > 0 && $rancid_config_base != $rancid_cmd_base)
53{
54  // If configured version base different from detected, than prefer configured (ie, for force v2 delimiter
55  $rancid_version_base = $rancid_config_base;
56  $rancid_version = $rancid_config_version;
57  $rancid_message = "Used RANCID version configured manually in \$config['rancid_version']: $rancid_version";
58}
59elseif (version_compare($rancid_cmd_version, $rancid_config_version, '>'))
60{
61  // RANCID locally detected, use maximum version
62  $rancid_version_base = $rancid_cmd_version;
63  $rancid_version = $rancid_cmd_version;
64  $rancid_message = "Used RANCID version detected on system: $rancid_version";
65}
66elseif (version_compare($rancid_config_version, '0', '>'))
67{
68  // RANCID not detected, but version configured
69  $rancid_version_base = $rancid_config_base;
70  $rancid_version = $rancid_config_version;
71  $rancid_message = "Used RANCID version configured manually in \$config['rancid_version']: $rancid_version";
72} else {
73  // Last compat version
74  $rancid_version_base = '2';
75  $rancid_version = '2';
76  $rancid_message = "Used default RANCID version: $rancid_version";
77}
78
79// Set delimiter
80if ($rancid_version_base < 3)
81{
82  $delimiter = ':';
83} else {
84  $delimiter = ';';
85}
86
87print_debug($rancid_message);
88
89?>
90# RANCID router.db autogenerated by <?php echo realpath($_SERVER['SCRIPT_FILENAME']) . PHP_EOL; ?>
91# <?php echo $rancid_message . PHP_EOL; ?>
92# Do not edit this file directly!
93
94<?php
95
96foreach (dbFetchRows("SELECT `hostname`, `os`, `disabled`, `status` FROM `devices` ORDER BY `hostname`") as $device)
97{
98  if ($device['disabled'] || !$device['status'])
99  {
100    $status = "down";
101  } else {
102    $status = "up";
103  }
104
105  if (isset($config['rancid']['os_map'][$device['os']]))
106  {
107    // Common os map for both v2/v3
108    echo($device['hostname'] . $delimiter . $config['rancid']['os_map'][$device['os']] . $delimiter . $status . PHP_EOL);
109  }
110
111  if ($rancid_version_base > 2)
112  {
113    $rancid_version = rtrim($rancid_version, '.0');
114    // Rancid v3.x
115    foreach (array_keys($config['rancid']) as $key)
116    {
117      if (!str_starts($key, 'os_map_')) { continue; }
118
119      $version = str_replace('os_map_', '', $key); // os_map_3.3 -> 3.3
120      $version = rtrim($version, '.0');
121      // Compare used rancid version with os map
122      if (version_compare($version, $rancid_version, '<=') && isset($config['rancid'][$key][$device['os']]))
123      {
124        // Version specific os maps
125        //echo($device['hostname'] . $delimiter . $config['rancid'][$key][$device['os']] . $delimiter . $status . " $version <= $rancid_version" . PHP_EOL);
126        echo($device['hostname'] . $delimiter . $config['rancid'][$key][$device['os']] . $delimiter . $status . PHP_EOL);
127      }
128    }
129
130  }
131}
132
133// EOF
134