-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
device: Add NTP support for Allied Telesis AWPlus products (#8580)
* Add support for Allied Telesis AlliedWare Plus products - Uses mibs from 5.4.7-2.1 for AlliedWare Plus products - Updates Legacy AlliedWare mibs - Added Allied Telesis svg * Remove unnecessary "trim" from snmpget * Add new line to end of file * Minor fixes for commit * awplus: initial ntp commit This isn't completely working, however initial patch of it partially working * awplus: Add NTP support - Fixed polling issues for awplus. Now offset and delay graphs work. - html/includes/graphs/device/ntp_*.inc.php -- Removed extra "\" from MAX count which showed up in Graph legend - html/includes/graphs/device/ntp_delay.inc.php -- Present legend in either seconds, or milliseconds (depending on vendor) - html/includes/graphs/device/ntp_dispersion.inc.php -- Present legend in either seconds, or milliseconds (depending on vendor) - html/includes/graphs/device/ntp_offset.inc.php -- Removed rrd minimum (-l 0). This is because offset can be below 0. --- It's better for the graph to auto scale than set a fixed minimum to display here. - html/includes/graphs/device/ntp_stratum.inc.php -- Changed graph to go from 0 to max of 16. NTP Stratum can only be 0 to 16. * awplus: Add NTP test data * updated awplus ntp poller * device: awplus convert NTP poller into seconds * device: fix NTP graph formatting * device: Improve NTP formatting * device: unset awplus NTP variable * fix formatting * device: awplus change NTP from numerical OIDs to named * device: update awplus ntp json tests * device: fix cisco and awplus ntp database creation * device: update awplus json
- Loading branch information
Showing
11 changed files
with
425 additions
and
199 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
<?php | ||
/* | ||
* LibreNMS module to capture statistics from the AT-NTP-MIB | ||
* | ||
* Copyright (c) 2018 Matt Read <matt.read@alliedtelesis.co.nz> | ||
* | ||
* 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. | ||
*/ | ||
|
||
use LibreNMS\Util\IP; | ||
|
||
$module = 'ntp'; | ||
|
||
$component = new LibreNMS\Component(); | ||
$components = $component->getComponents($device['device_id'], array('type'=>$module)); | ||
|
||
// We only care about our device id. | ||
$components = $components[$device['device_id']]; | ||
|
||
// Begin our master array, all other values will be processed into this array. | ||
$tblComponents = array(); | ||
|
||
// Let's gather some data.. | ||
// For Reference: | ||
// https://github.com/librenms/librenms/blob/master/mibs/awplus/AT-NTP-MIB | ||
// https://www.alliedtelesis.com/documents/network-time-protocol-ntp-feature-overview-and-configuration-guide | ||
$atNtpAssociationEntry = snmpwalk_group($device, 'atNtpAssociationEntry', 'AT-NTP-MIB'); | ||
|
||
/* | ||
* False == no object found - this is not an error, no objects exist | ||
* null == timeout or something else that caused an error, there may be objects but we couldn't get it. | ||
*/ | ||
if (is_null($atNtpAssociationEntry)) { | ||
// We have to error here or we will end up deleting all our components. | ||
echo "Error\n"; | ||
} else { | ||
// No Error, lets process things. | ||
d_echo("Objects Found:\n"); | ||
|
||
// Let's grab the index for each NTP peer | ||
foreach ($atNtpAssociationEntry as $index => $value) { | ||
$result = array(); | ||
$result['UID'] = (string)$index; // This is cast as a string so it can be compared with the database value. | ||
$result['peer'] = $atNtpAssociationEntry[$index]['atNtpAssociationPeerAddr']; | ||
$result['port'] = '123'; // awplus only supports default NTP Port. | ||
$result['stratum'] = $atNtpAssociationEntry[$index]['atNtpAssociationStratum']; | ||
$result['peerref'] = $atNtpAssociationEntry[$index]['atNtpAssociationRefClkAddr']; | ||
$result['label'] = $result['peer'].":".$result['port']; | ||
|
||
// Set the status, 16 = Bad | ||
if ($result['stratum'] == 16) { | ||
$result['status'] = 2; | ||
$result['error'] = 'NTP is not in sync'; | ||
} else { | ||
$result['status'] = 0; | ||
$result['error'] = ''; | ||
} | ||
|
||
d_echo("NTP Peer found: "); | ||
d_echo($result); | ||
$tblComponents[] = $result; | ||
} | ||
|
||
/* | ||
* Ok, we have our 2 array's (Components and SNMP) now we need | ||
* to compare and see what needs to be added/updated. | ||
* | ||
* Let's loop over the SNMP data to see if we need to ADD or UPDATE any components. | ||
*/ | ||
foreach ($tblComponents as $key => $array) { | ||
$component_key = false; | ||
|
||
// Loop over our components to determine if the component exists, or we need to add it. | ||
foreach ($components as $compid => $child) { | ||
if ($child['UID'] === $array['UID']) { | ||
$component_key = $compid; | ||
} | ||
} | ||
|
||
if (!$component_key) { | ||
// The component doesn't exist, we need to ADD it - ADD. | ||
$new_component = $component->createComponent($device['device_id'], $module); | ||
$component_key = key($new_component); | ||
$components[$component_key] = array_merge($new_component[$component_key], $array); | ||
echo "+"; | ||
} else { | ||
// The component does exist, merge the details in - UPDATE. | ||
$components[$component_key] = array_merge($components[$component_key], $array); | ||
echo "."; | ||
} | ||
} | ||
|
||
/* | ||
* Loop over the Component data to see if we need to DELETE any components. | ||
*/ | ||
foreach ($components as $key => $array) { | ||
// Guilty until proven innocent | ||
$found = false; | ||
|
||
foreach ($tblComponents as $k => $v) { | ||
if ($array['UID'] == $v['UID']) { | ||
// Yay, we found it... | ||
$found = true; | ||
} | ||
} | ||
|
||
if ($found === false) { | ||
// The component has not been found. we should delete it. | ||
echo "-"; | ||
$component->deleteComponent($key); | ||
} | ||
} | ||
|
||
// Write the Components back to the DB. | ||
$component->setComponentPrefs($device['device_id'], $components); | ||
echo "\n"; | ||
} // End if not error | ||
|
||
$module = strtolower($module); | ||
if (count($components) > 0) { | ||
if (dbFetchCell('SELECT COUNT(*) FROM `applications` WHERE `device_id` = ? AND `app_type` = ?', array($device['device_id'], $module)) == '0') { | ||
dbInsert(array('device_id' => $device['device_id'], 'app_type' => $module, 'app_status' => '', 'app_instance' => ''), 'applications'); | ||
} | ||
} else { | ||
dbDelete('applications', '`device_id` = ? AND `app_type` = ?', array($device['device_id'], $module)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
<?php | ||
/* | ||
* LibreNMS module to capture statistics from the AT-NTP-MIB | ||
* | ||
* Copyright (c) 2018 Matt Read <matt.read@alliedtelesis.co.nz> | ||
* | ||
* 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. | ||
*/ | ||
|
||
use LibreNMS\RRD\RrdDefinition; | ||
|
||
$tmp_module = 'ntp'; | ||
|
||
$component = new LibreNMS\Component(); | ||
$options = array(); | ||
$options['filter']['type'] = array('=',$tmp_module); | ||
$options['filter']['disabled'] = array('=',0); | ||
$options['filter']['ignore'] = 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.. | ||
$atNtpAssociationEntry = snmpwalk_group($device, 'atNtpAssociationEntry', 'AT-NTP-MIB'); | ||
|
||
// Loop through the components and extract the data. | ||
foreach ($components as $key => &$array) { | ||
$peer = $array['peer']; | ||
|
||
// Let's make sure the rrd is setup for this class. | ||
$rrd_name = array('ntp', $peer); | ||
$rrd_def = RrdDefinition::make() | ||
->addDataset('stratum', 'GAUGE', 0, 16) | ||
->addDataset('offset', 'GAUGE', -1000) | ||
->addDataset('delay', 'GAUGE', -1000) | ||
->addDataset('dispersion', 'GAUGE', -1000); | ||
|
||
$array['stratum'] = $atNtpAssociationEntry[$array['UID']]['atNtpAssociationStratum']; | ||
// Set the status, 16 = Bad | ||
if ($array['stratum'] == 16) { | ||
$array['status'] = 2; | ||
$array['error'] = 'NTP is not in sync'; | ||
} else { | ||
$array['status'] = 0; | ||
$array['error'] = ''; | ||
} | ||
|
||
// Extract the statistics and update rrd | ||
$rrd['stratum'] = $array['stratum']; | ||
$rrd['offset'] = $atNtpAssociationEntry[$array['UID']]['atNtpAssociationOffset']; | ||
$rrd['offset'] = str_replace(' milliseconds', '', $rrd['offset']); | ||
$rrd['offset'] = $rrd['offset'] / 1000; // Convert to seconds | ||
$rrd['delay'] = $atNtpAssociationEntry[$array['UID']]['atNtpAssociationDelay']; | ||
$rrd['delay'] = str_replace(' milliseconds', '', $rrd['delay']); | ||
$rrd['delay'] = $rrd['delay'] / 1000; // Convert to seconds | ||
$rrd['dispersion'] = $atNtpAssociationEntry[$array['UID']]['atNtpAssociationDisp']; | ||
$tags = compact('ntp', 'rrd_name', 'rrd_def', 'peer'); | ||
data_update($device, 'ntp', $tags, $rrd); | ||
|
||
// Let's print some debugging info. | ||
d_echo("\n\nComponent: ".$key."\n"); | ||
d_echo(" Index: ".$array['UID']."\n"); | ||
d_echo(" Peer: ".$array['peer'].":".$array['port']."\n"); | ||
d_echo(" Stratum: atNtpAssociationStratum.".$array['UID']." = ".$rrd['stratum']."\n"); | ||
d_echo(" Offset: atNtpAssociationOffset.".$array['UID']." = ".$rrd['offset']."\n"); | ||
d_echo(" Delay: atNtpAssociationDelay.".$array['UID']." = ".$rrd['delay']."\n"); | ||
d_echo(" Dispersion: atNtpAssociationDisp.".$array['UID']." = ".$rrd['dispersion']."\n"); | ||
|
||
// Clean-up after yourself! | ||
unset($filename, $rrd_filename, $rrd); | ||
} // 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($type, $components, $component, $options, $tmp_module); |
Oops, something went wrong.