From 8e9f47f2b98f6f2d75f9638f575105be8813aa23 Mon Sep 17 00:00:00 2001 From: Adam Amstrong Date: Sat, 30 Apr 2011 22:20:11 +0000 Subject: [PATCH] fixes to many little things. collection of ospf neighbours (but we can't definitely work out what interface they're on, fucking mib is lame!) git-svn-id: http://www.observium.org/svn/observer/trunk@2210 61d68cd4-352d-0410-923a-c4978735b2b8 --- database-update.sql | 1 + .../graphs/macaccounting/auth.inc.php | 2 +- html/includes/print-menubar.php | 26 ++++- html/pages/device/graphs.inc.php | 2 + html/pages/device/health.inc.php | 4 +- html/pages/device/routing.inc.php | 20 ++-- html/pages/device/routing/ospf.inc.php | 4 +- html/pages/device/vlans.inc.php | 7 +- html/pages/routing.inc.php | 12 +-- html/pages/routing/ospf.inc.php | 2 +- includes/polling/ospf.inc.php | 95 ++++++++++++++++++- includes/static-config.php | 2 + 12 files changed, 146 insertions(+), 31 deletions(-) diff --git a/database-update.sql b/database-update.sql index efa3daa9f8..b8a50da48a 100644 --- a/database-update.sql +++ b/database-update.sql @@ -44,6 +44,7 @@ ALTER TABLE `ports` DROP INDEX `snmpid`; CREATE TABLE IF NOT EXISTS `ospf_areas` ( `device_id` int(11) NOT NULL, `ospfAreaId` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfAuthType` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `ospfImportAsExtern` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `ospfSpfRuns` int(11) NOT NULL, `ospfAreaBdrRtrCount` int(11) NOT NULL, `ospfAsBdrRtrCount` int(11) NOT NULL, `ospfAreaLsaCount` int(11) NOT NULL, `ospfAreaLsaCksumSum` int(11) NOT NULL, `ospfAreaSummary` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `ospfAreaStatus` varchar(64) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY `device_area` (`device_id`,`ospfAreaId`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `ospf_instances` ( `device_id` int(11) NOT NULL, `ospf_instance_id` int(11) NOT NULL, `ospfRouterId` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfAdminStat` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfVersionNumber` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfAreaBdrRtrStatus` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfASBdrRtrStatus` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfExternLsaCount` int(11) NOT NULL, `ospfExternLsaCksumSum` int(11) NOT NULL, `ospfTOSSupport` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfOriginateNewLsas` int(11) NOT NULL, `ospfRxNewLsas` int(11) NOT NULL, `ospfExtLsdbLimit` int(11) DEFAULT NULL, `ospfMulticastExtensions` int(11) DEFAULT NULL, `ospfExitOverflowInterval` int(11) DEFAULT NULL, `ospfDemandExtensions` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, UNIQUE KEY `device_id` (`device_id`,`ospf_instance_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `ospf_ports` ( `device_id` int(11) NOT NULL, `interface_id` int(11) NOT NULL, `ospf_port_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfIfIpAddress` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfAddressLessIf` int(11) NOT NULL, `ospfIfAreaId` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfIfType` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfAdminStat` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfRtrPriority` int(11) DEFAULT NULL, `ospfIfTransitDelay` int(11) DEFAULT NULL, `ospfIfRetransInterval` int(11) DEFAULT NULL, `ospfIfHelloInterval` int(11) DEFAULT NULL, `ospfIfRtrDeadInterval` int(11) DEFAULT NULL, `ospfIfPollInterval` int(11) DEFAULT NULL, `ospfIfState` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfDesignatedRouter` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfBackupDesignatedRouter` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfEvents` int(11) DEFAULT NULL, `ospfIfAuthKey` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfStatus` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfMulticastForwarding` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfDemand` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, `ospfIfAuthType` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, UNIQUE KEY `device_id` (`device_id`,`interface_id`,`ospf_port_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +CREATE TABLE IF NOT EXISTS `ospf_nbrs` ( `device_id` int(11) NOT NULL, `interface_id` int(11) NOT NULL, `ospf_nbr_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfNbrIpAddr` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfNbrAddressLessIndex` int(11) NOT NULL, `ospfNbrRtrId` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfNbrOptions` int(11) NOT NULL, `ospfNbrPriority` int(11) NOT NULL, `ospfNbrState` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfNbrEvents` int(11) NOT NULL, `ospfNbrLsRetransQLen` int(11) NOT NULL, `ospfNbmaNbrStatus` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfNbmaNbrPermanence` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `ospfNbrHelloSuppressed` varchar(32) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY `device_id` (`device_id`,`ospf_nbr_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `ports_stack` (`interface_id_high` INT NOT NULL ,`interface_id_low` INT NOT NULL) ENGINE = INNODB; ALTER TABLE `ports_stack` ADD `device_id` INT NOT NULL; ALTER TABLE `ports_stack` ADD `ifStackStatus` VARCHAR(32); diff --git a/html/includes/graphs/macaccounting/auth.inc.php b/html/includes/graphs/macaccounting/auth.inc.php index d21dde9b11..7aa3ece809 100644 --- a/html/includes/graphs/macaccounting/auth.inc.php +++ b/html/includes/graphs/macaccounting/auth.inc.php @@ -17,7 +17,7 @@ if (is_numeric($id)) $device = device_by_id_cache($port['device_id']); $title = generate_device_link($device); $title .= " :: Port ".generate_port_link($port); - $title .= " :: " . $acc['mac']; + $title .= " :: " . formatMac($acc['mac']); $auth = TRUE; } diff --git a/html/includes/print-menubar.php b/html/includes/print-menubar.php index 743c465b02..569a84a5ba 100644 --- a/html/includes/print-menubar.php +++ b/html/includes/print-menubar.php @@ -272,6 +272,19 @@ foreach (array_keys($menu_sensors) as $item) = '5') { echo(' @@ -279,10 +292,19 @@ if ($_SESSION['userlevel'] >= '5') '); echo(' '); echo(' '); - echo(' '); + echo(' '); echo(''); echo(''); diff --git a/html/pages/device/vlans.inc.php b/html/pages/device/vlans.inc.php index 7f60924cad..fb2f18bbe1 100644 --- a/html/pages/device/vlans.inc.php +++ b/html/pages/device/vlans.inc.php @@ -2,12 +2,15 @@ print_optionbar_start(); -echo("
+echo("VLANs » "); + +echo(" Basic | Graphs : Bits | Packets | NU Packets | - Errors "); + Errors + "); print_optionbar_end(); diff --git a/html/pages/routing.inc.php b/html/pages/routing.inc.php index 4c93563fba..d0e19ca3a9 100644 --- a/html/pages/routing.inc.php +++ b/html/pages/routing.inc.php @@ -4,17 +4,7 @@ if ($_GET['optb'] == "graphs" || $_GET['optc'] == "graphs") { $graphs = "graphs" #$datas[] = 'overview'; -$routing_count['bgp'] = mysql_result(mysql_query("SELECT COUNT(*) from `bgpPeers`"), 0); -if ($routing_count['bgp']) { $datas[] = 'bgp'; } - -$routing_count['ospf'] = mysql_result(mysql_query("SELECT COUNT(*) FROM `ospf_instances` WHERE `ospfAdminStat` = 'enabled'"), 0); -if ($routing_count['ospf']) { $datas[] = 'ospf'; } - -$routing_count['cef'] = mysql_result(mysql_query("SELECT COUNT(*) from `cef_switching`"), 0); -if ($routing_count['cef']) { $datas[] = 'cef'; } - -$routing_count['vrf'] = @mysql_result(mysql_query("SELECT COUNT(*) from `vrfs`"), 0); -if($routing_count['vrf']) { $datas[] = 'vrf'; } +### $routing_count is populated by print-menubar.inc.php #$type_text['overview'] = "Overview"; $type_text['bgp'] = "BGP"; diff --git a/html/pages/routing/ospf.inc.php b/html/pages/routing/ospf.inc.php index 3bab28b1a8..74a6eb8af6 100644 --- a/html/pages/routing/ospf.inc.php +++ b/html/pages/routing/ospf.inc.php @@ -31,7 +31,7 @@ while($instance = mysql_fetch_assoc($query)) if($instance['ospfASBdrRtrStatus'] == "true") { $asbr = 'yes'; } else { $asbr = 'no'; } echo('
'); - echo(' '); + echo(' '); echo(' '); echo(' '); echo(' '); diff --git a/includes/polling/ospf.inc.php b/includes/polling/ospf.inc.php index b6ab293fdc..2fe53576dc 100644 --- a/includes/polling/ospf.inc.php +++ b/includes/polling/ospf.inc.php @@ -185,7 +185,7 @@ if($debug) { ### Loop array of entries and update if (is_array($ospf_ports_db)){ - foreach($ospf_ports_db as $ospf_port_db) + foreach($ospf_ports_db as $ospf_port_id => $ospf_port_db) { if(is_array($ospf_ports_poll[$ospf_port_db['ospf_port_id']])) { $ospf_port_poll = $ospf_ports_poll[$ospf_port_db['ospf_port_id']]; @@ -205,7 +205,7 @@ if (is_array($ospf_ports_db)){ #log_event("$oid -> ".$this_port[$oid], $device, 'ospf', $port['interface_id']); ## FIXME } } - if($update) + if($ospf_port_update) { $query = "UPDATE `ospf_ports` SET `ospf_port_id` = '".$ospf_port_db['ospf_port_id']."'".$ospf_port_update." WHERE `device_id` = '".$device['device_id']."' AND `ospf_port_id` = '".$ospf_port_id."'"; mysql_query($query); @@ -225,6 +225,97 @@ if (is_array($ospf_ports_db)){ } } +#OSPF-MIB::ospfNbrIpAddr.172.22.203.98.0 172.22.203.98 +#OSPF-MIB::ospfNbrAddressLessIndex.172.22.203.98.0 0 +#OSPF-MIB::ospfNbrRtrId.172.22.203.98.0 172.22.203.128 +#OSPF-MIB::ospfNbrOptions.172.22.203.98.0 2 +#OSPF-MIB::ospfNbrPriority.172.22.203.98.0 0 +#OSPF-MIB::ospfNbrState.172.22.203.98.0 full +#OSPF-MIB::ospfNbrEvents.172.22.203.98.0 6 +#OSPF-MIB::ospfNbrLsRetransQLen.172.22.203.98.0 1 +#OSPF-MIB::ospfNbmaNbrStatus.172.22.203.98.0 active +#OSPF-MIB::ospfNbmaNbrPermanence.172.22.203.98.0 dynamic +#OSPF-MIB::ospfNbrHelloSuppressed.172.22.203.98.0 false + +echo(' Neighbours: '); + +$ospf_nbr_oids_db = array('ospfNbrIpAddr', 'ospfNbrAddressLessIndex', 'ospfNbrRtrId', 'ospfNbrOptions', 'ospfNbrPriority', 'ospfNbrState', 'ospfNbrEvents', 'ospfNbrLsRetransQLen', 'ospfNbmaNbrStatus', 'ospfNbmaNbrPermanence', 'ospfNbrHelloSuppressed'); +$ospf_nbr_oids_rrd = array(); +$ospf_nbr_oids = array_merge($ospf_nbr_oids_db, $ospf_nbr_oids_rrd); + +### Build array of existing entries +$nbr_query = mysql_query("SELECT * FROM `ospf_nbrs` WHERE `device_id` = '".$device['device_id']."'"); +while($nbr_entry = mysql_fetch_assoc($nbr_query)) +{ + $ospf_nbrs_db[$nbr_entry['ospf_nbr_id']] = $nbr_entry; +} + +### Pull data from device +$ospf_nbrs_poll = snmpwalk_cache_oid($device, "OSPF-MIB::ospfNbrEntry", array(), "OSPF-MIB"); + +foreach($ospf_nbrs_poll as $ospf_nbr_id => $ospf_nbr) +{ + ### If the entry doesn't already exist in the prebuilt array, insert into the database and put into the array + if(!isset($ospf_nbrs_db[$ospf_nbr_id])) + { + mysql_query("INSERT INTO `ospf_nbrs` (`device_id`, `ospf_nbr_id`) VALUES ('".$device['device_id']."','".$ospf_nbr_id."') "); + echo("+"); + $entry = mysql_fetch_assoc(mysql_query("SELECT * FROM `ospf_nbrs` WHERE `device_id` = '".$device['device_id']."' AND `ospf_nbr_id` = '".$ospf_nbr_id."'")); + $ospf_nbrs_db[$entry['ospf_nbr_id']] = $entry; + } +} + +if($debug) { + echo("\nPolled: "); + print_r($ospf_nbrs_poll); + echo("Database: "); + print_r($ospf_nbrs_db); + echo("\n"); +} + +### Loop array of entries and update +if (is_array($ospf_nbrs_db)){ + foreach($ospf_nbrs_db as $ospf_nbr_id => $ospf_nbr_db) + { + if(is_array($ospf_nbrs_poll[$ospf_nbr_db['ospf_nbr_id']])) { + $ospf_nbr_poll = $ospf_nbrs_poll[$ospf_nbr_db['ospf_nbr_id']]; + + $ospf_nbr_poll['interface_id'] = @mysql_result(mysql_query("SELECT A.`interface_id` FROM ipv4_addresses AS A, nbrs AS I WHERE A.ipv4_address = '".$ospf_nbr_poll['ospfNbrIpAddr']."' AND I.interface_id = A.interface_id AND I.device_id = '".$device['device_id']."'"),0); + + if ($ospf_nbr_db['interface_id'] != $ospf_nbr_poll['interface_id']) + { + $ospf_nbr_update = " "; + } + + foreach ($ospf_nbr_oids as $oid) + { // Loop the OIDs + echo($ospf_nbr_db[$oid]."|".$ospf_nbr_poll[$oid]."\n"); + if ($ospf_nbr_db[$oid] != $ospf_nbr_poll[$oid]) + { // If data has changed, build a query + $ospf_nbr_update .= ", `$oid` = '".mres($ospf_nbr_poll[$oid])."'"; + #log_event("$oid -> ".$this_nbr[$oid], $device, 'ospf', $nbr['interface_id']); ## FIXME + } + } + if($ospf_nbr_update) + { + $query = "UPDATE `ospf_nbrs` SET `interface_id` = '".$ospf_nbr_poll['interface_id']."'".$ospf_nbr_update." WHERE `device_id` = '".$device['device_id']."' AND `ospf_nbr_id` = '".$ospf_nbr_id."'"; + mysql_query($query); + if($debug) { echo("$query"); } + echo("U"); + unset($ospf_nbr_update); + } else { + echo("."); + } + unset($ospf_nbr_poll); + unset($ospf_nbr_db); + $ospf_nbr_count++; + } else { + mysql_query("DELETE FROM `ospf_nbrs` WHERE `device_id` = '".$device['device_id']."' AND `ospf_nbr_id` = '".$ospf_nbr_db['ospf_nbr_id']."'"); + echo("-"); + } + } +} + ## Create device-wide statistics RRD $filename = $config['rrd_dir'] . "/" . $device['hostname'] . "/" . safename("ospf-statistics.rrd"); diff --git a/includes/static-config.php b/includes/static-config.php index 76b7d647df..b797d6b6eb 100644 --- a/includes/static-config.php +++ b/includes/static-config.php @@ -848,6 +848,8 @@ $config['graph_types']['device']['uptime']['section'] = 'system'; $config['graph_types']['device']['uptime']['order'] = '0'; $config['graph_types']['device']['uptime']['descr'] = 'System Uptime'; +#$config['graph_types']['macaccounting']['bits']['descr'] = "MAC Accounting (Bits/sec)"; +#$config['graph_types']['macaccounting']['bits']['descr'] = "MAC Accounting (Packets/sec)"; ### Device Types
    '); - if ($config['enable_vrfs']) { echo('
  • VRFs

  • '); } + if ($_SESSION['userlevel'] >= '5' && $routing_count['vrf']) { echo('
  • VRFs

  • '); } + + if ($_SESSION['userlevel'] >= '5' && $routing_count['ospf']) + { + echo(' +
  • OSPF Devices
  • +

  • + '); + } + ## BGP Sessions - if ($_SESSION['userlevel'] >= '5' && (isset($config['enable_bgp']) && $config['enable_bgp'])) + if ($_SESSION['userlevel'] >= '5' && $routing_count['bgp']) { echo('
  • BGP All Sessions
  • diff --git a/html/pages/device/graphs.inc.php b/html/pages/device/graphs.inc.php index 75c55dcab0..2bd9089fac 100644 --- a/html/pages/device/graphs.inc.php +++ b/html/pages/device/graphs.inc.php @@ -9,6 +9,8 @@ echo('
    '); print_optionbar_start('', ''); +echo("Graphs » "); + $sep = ""; $query = mysql_query("SELECT * FROM device_graphs WHERE device_id = '".$device['device_id']."'"); diff --git a/html/pages/device/health.inc.php b/html/pages/device/health.inc.php index b2bc605042..326b13f18b 100644 --- a/html/pages/device/health.inc.php +++ b/html/pages/device/health.inc.php @@ -13,7 +13,7 @@ $current = mysql_result(mysql_query("select count(*) from sensors WHERE sensor_c $freqs = mysql_result(mysql_query("select count(*) from sensors WHERE sensor_class='frequency' AND device_id = '" . $device['device_id'] . "'"), 0); $power = mysql_result(mysql_query("select count(*) from sensors WHERE sensor_class='power' AND device_id = '" . $device['device_id'] . "'"), 0); - +unset($datas); $datas[] = 'overview'; if ($processor) { $datas[] = 'processor'; } if ($mempools) { $datas[] = 'mempool'; } @@ -42,6 +42,8 @@ $type_text['power'] = "Power"; print_optionbar_start(); +echo("Health » "); + if (!$_GET['opta']) { $_GET['opta'] = "overview"; } unset($sep); diff --git a/html/pages/device/routing.inc.php b/html/pages/device/routing.inc.php index 1493e4e3ba..7c62c2638d 100644 --- a/html/pages/device/routing.inc.php +++ b/html/pages/device/routing.inc.php @@ -1,19 +1,19 @@ '); } - echo(" " . $type_text[$type] ." (".$routing_count[$type].")"); + echo(" " . $type_text[$type] ." (".$device_routing_count[$type].")"); if ($_GET['opta'] == $type) { echo(""); } $sep = " | "; } diff --git a/html/pages/device/routing/ospf.inc.php b/html/pages/device/routing/ospf.inc.php index debb248d66..d9b9684740 100644 --- a/html/pages/device/routing/ospf.inc.php +++ b/html/pages/device/routing/ospf.inc.php @@ -17,6 +17,8 @@ while($instance = mysql_fetch_assoc($query)) $area_count = mysql_result(mysql_query("SELECT COUNT(*) FROM `ospf_areas` WHERE `device_id` = '".$device['device_id']."'"),0); $port_count = mysql_result(mysql_query("SELECT COUNT(*) FROM `ospf_ports` WHERE `device_id` = '".$device['device_id']."'"),0); $port_count_enabled = mysql_result(mysql_query("SELECT COUNT(*) FROM `ospf_ports` WHERE `ospfIfAdminStat` = 'enabled' AND `device_id` = '".$device['device_id']."'"),0); + $nbr_count = mysql_result(mysql_query("SELECT COUNT(*) FROM `ospf_nbrs` WHERE `device_id` = '".$device['device_id']."'"),0); + $query = "SELECT * FROM ipv4_addresses AS A, ports AS I WHERE "; $query .= "(A.ipv4_address = '".$peer['bgpPeerIdentifier']."' AND I.interface_id = A.interface_id)"; @@ -35,7 +37,7 @@ while($instance = mysql_fetch_assoc($query)) echo('
' . $asbr . '' . $area_count . '' . $port_count . '('.$port_count_enabled.')' . ($neighbour_count+0) . '' . $nbr_count . '
'.generate_device_link($device). ''.generate_device_link($device, 0, "routing/ospf/"). ''.$instance['ospfRouterId'] . '' . $enabled . '' . $abr . '