mirror of
https://github.com/librenms/librenms.git
synced 2024-09-22 10:58:42 +00:00
b8e9b2d917
* Implement an autoloader When cleaning up classes for psr2, things got a bit unwieldy, so I implemented a class autoloader. I created a PSR-0 compliant LibreNMS directory and moved all classes there that made sense. Implemented LibreNMS\ClassLoader which supports adding manual class mappings This reduces the file includes needed and only loads classes when needed. * Add teh autoloader to graph.php * Add a small bit of docs Fix incomplete class in includes/discovery/functions.inc.php
204 lines
8.6 KiB
PHP
204 lines
8.6 KiB
PHP
<?php
|
|
/*
|
|
* LibreNMS module to capture Cisco Class-Based QoS Details
|
|
*
|
|
* Copyright (c) 2015 Aaron Daniels <aaron@daniels.id.au>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or (at your
|
|
* option) any later version. Please see LICENSE.txt at the top level of
|
|
* the source code distribution for details.
|
|
*/
|
|
|
|
if ($device['os_group'] == "cisco") {
|
|
|
|
// Define some error messages
|
|
$error_vpn = array();
|
|
$error_vpn[0] = "Other";
|
|
$error_vpn[1] = "Configuration changed";
|
|
$error_vpn[2] = "Control Group information is unavailable";
|
|
$error_vpn[3] = "Data Group range information is unavailable";
|
|
$error_vpn[4] = "Join or Source interface information is unavailable";
|
|
$error_vpn[5] = "VPN name is unavailable";
|
|
$error_vpn[6] = "IP address is missing for Join Interface";
|
|
$error_vpn[7] = "Join Interface is down";
|
|
$error_vpn[8] = "Overlay is administratively shutdown";
|
|
$error_vpn[9] = "Overlay is in delete hold down phase";
|
|
$error_vpn[10] = "VPN is reinitializing";
|
|
$error_vpn[11] = "Site ID information is unavailable";
|
|
$error_vpn[12] = "Site ID mismatch has occurred";
|
|
$error_vpn[13] = "IP address is missing for Source Interface";
|
|
$error_vpn[14] = "Source interface is down";
|
|
$error_vpn[15] = "Changing site identifier";
|
|
$error_vpn[16] = "Changing control group";
|
|
$error_vpn[17] = "Device ID information is unavailable";
|
|
$error_vpn[18] = "Changing device ID";
|
|
$error_vpn[19] = "Cleanup in progress";
|
|
|
|
$error_aed = array();
|
|
$error_aed[0] = "Other";
|
|
$error_aed[1] = "Overlay is Down";
|
|
$error_aed[2] = "Site ID is not configured";
|
|
$error_aed[3] = "Site ID mismatch";
|
|
$error_aed[4] = "Version mismatch";
|
|
$error_aed[5] = "Site VLAN is Down";
|
|
$error_aed[6] = "No extended VLAN is operationally up";
|
|
$error_aed[7] = "No Overlay Adjacency is up";
|
|
$error_aed[8] = "LSPDB sync incomplete";
|
|
$error_aed[9] = "Overlay state down event in progress";
|
|
$error_aed[10] = "ISIS control group sync pending";
|
|
|
|
$error_overlay = array();
|
|
$error_overlay[1] = "active";
|
|
$error_overlay[2] = "notInService";
|
|
$error_overlay[3] = "notReady";
|
|
$error_overlay[4] = "createAndGo";
|
|
$error_overlay[5] = "createAndWait";
|
|
$error_overlay[6] = "destroy";
|
|
|
|
$module = 'Cisco-OTV';
|
|
|
|
$component = new LibreNMS\Component();
|
|
$options['filter']['type'] = array('=',$module);
|
|
$options['filter']['disabled'] = array('=',0);
|
|
$components = $component->getComponents($device['device_id'],$options);
|
|
|
|
// We only care about our device id.
|
|
$components = $components[$device['device_id']];
|
|
|
|
// Only collect SNMP data if we have enabled components
|
|
if (count($components > 0)) {
|
|
// Let's gather the stats..
|
|
$tblOverlayEntry = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.810.1.2.1.1');
|
|
$tblAdjacencyDatabaseEntry = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.810.1.3.1.1', 0);
|
|
$tblRouteNextHopAddr = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.810.1.5.1.1.8', 0);
|
|
$tblVlanEdgeDevIsAed = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.810.1.2.2.1.6', 2);
|
|
|
|
// Let's create an array of each remote OTV endpoint and the count of MAC addresses that are reachable via.
|
|
$count_mac = array();
|
|
foreach ($tblRouteNextHopAddr as $k => $v) {
|
|
$count_mac[$v]++;
|
|
}
|
|
// Let's log some debugging
|
|
d_echo("\n\nMAC Addresses: ".print_r($count_mac,TRUE));
|
|
|
|
// Loop through the components and extract the data.
|
|
foreach ($components as $key => &$array) {
|
|
|
|
if ($array['otvtype'] == 'overlay') {
|
|
// Let's check the various status' of the overlay
|
|
$message = false;
|
|
$vpn_state = $tblOverlayEntry['1.3.6.1.4.1.9.9.810.1.2.1.1.3'][$array['index']];
|
|
if ($vpn_state != 2) {
|
|
$message .= "VPN Down: ".$error_vpn[$tblOverlayEntry['1.3.6.1.4.1.9.9.810.1.2.1.1.4'][$array['index']]];
|
|
}
|
|
$aed_state = $tblOverlayEntry['1.3.6.1.4.1.9.9.810.1.2.1.1.13'][$array['index']];
|
|
if ($aed_state == 2) {
|
|
$message .= "AED Down: ".$error_aed[$tblOverlayEntry['1.3.6.1.4.1.9.9.810.1.2.1.1.14'][$array['index']]];
|
|
}
|
|
$overlay_state = $tblOverlayEntry['1.3.6.1.4.1.9.9.810.1.2.1.1.23'][$array['index']];
|
|
if ($overlay_state == 2) {
|
|
$message .= "Overlay Down: ".$error_overlay[$tblOverlayEntry['1.3.6.1.4.1.9.9.810.1.2.1.1.24'][$array['index']]];
|
|
}
|
|
|
|
// If we have set a message, we have an error, activate alert.
|
|
if ($message !== false) {
|
|
$array['error'] = $message;
|
|
$array['status'] = 2;
|
|
}
|
|
else {
|
|
$array['error'] = "";
|
|
$array['status'] = 0;
|
|
}
|
|
|
|
// Time to graph the count of the active VLAN's on this overlay.
|
|
$count_vlan = 0;
|
|
foreach ($tblVlanEdgeDevIsAed['1.3.6.1.4.1.9.9.810.1.2.2.1.6'][$array['index']] as $v) {
|
|
if ($v == 1) {
|
|
$count_vlan++;
|
|
}
|
|
}
|
|
|
|
// Let's log some debugging
|
|
d_echo("\n\nOverlay Component: ".$key."\n");
|
|
d_echo(" Label: ".$array['label']."\n");
|
|
d_echo(" Index: ".$array['index']."\n");
|
|
d_echo(" Status: ".$array['status']."\n");
|
|
d_echo(" Message: ".$array['error']."\n");
|
|
d_echo(" VLAN Count: ".$count_vlan."\n");
|
|
|
|
$label = $array['label'];
|
|
$rrd_name = array('cisco', 'otv', $label, 'vlan');
|
|
$rrd_def = 'DS:count:GAUGE:600:0:U';
|
|
|
|
$fields = array(
|
|
'count' => $count_vlan
|
|
);
|
|
|
|
$tags = compact('label', 'rrd_name', 'rrd_def');
|
|
data_update($device, 'cisco-otv-vlan', $tags, $fields);
|
|
|
|
}
|
|
elseif ($array['otvtype'] == 'adjacency') {
|
|
$array['uptime'] = $tblAdjacencyDatabaseEntry['1.3.6.1.4.1.9.9.810.1.3.1.1.6.'.$array['index'].'.1.4.'.$array['endpoint']];
|
|
$message = false;
|
|
if ($tblAdjacencyDatabaseEntry['1.3.6.1.4.1.9.9.810.1.3.1.1.5.'.$array['index'].'.1.4.'.$array['endpoint']] != 1) {
|
|
$message .= "Adjacency is Down\n";
|
|
}
|
|
if ($tblAdjacencyDatabaseEntry['1.3.6.1.4.1.9.9.810.1.3.1.1.6.'.$array['index'].'.1.4.'.$array['endpoint']] < $array['uptime']) {
|
|
$message .= "Adjacency has been reset\n";
|
|
}
|
|
|
|
// If we have set a message, we have an error, activate alert.
|
|
if ($message !== false) {
|
|
$array['error'] = $message;
|
|
$array['status'] = 1;
|
|
}
|
|
else {
|
|
$array['error'] = "";
|
|
$array['status'] = 0;
|
|
}
|
|
|
|
// Let's log some debugging
|
|
d_echo("\n\nAdjacency Component: ".$key."\n");
|
|
d_echo(" Label: ".$array['label']."\n");
|
|
d_echo(" Index: ".$array['index']."\n");
|
|
d_echo(" Status: ".$array['status']."\n");
|
|
d_echo(" Message: ".$array['error']."\n");
|
|
}
|
|
elseif ($array['otvtype'] == 'endpoint') {
|
|
$count = 0;
|
|
$endpoint = $array['endpoint'];
|
|
|
|
if (isset($count_mac[$endpoint])) {
|
|
$count = $count_mac[$endpoint];
|
|
}
|
|
|
|
// Let's log some debugging
|
|
d_echo("\n\nEndpoint Component: ".$key."\n");
|
|
d_echo(" Label: ".$array['label']."\n");
|
|
d_echo(" MAC Count: ".$count."\n");
|
|
|
|
$rrd_name = array('cisco', 'otv', $endpoint, 'mac');
|
|
$rrd_def = 'DS:count:GAUGE:600:0:U';
|
|
$fields = array(
|
|
'count' => $count
|
|
);
|
|
|
|
$tags = compact('endpoint', 'rrd_name', 'rrd_def');
|
|
data_update($device, 'cisco-otv-mac', $tags, $fields);
|
|
|
|
} // End If
|
|
|
|
} // End foreach components
|
|
|
|
// Write the Components back to the DB.
|
|
$component->setComponentPrefs($device['device_id'],$components);
|
|
|
|
} // end if count components
|
|
|
|
// Clean-up after yourself!
|
|
unset($components, $component, $module);
|
|
}
|