| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * LibreNMS module to capture statistics from the CISCO-NTP-MIB | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2016 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 22:45:50 +00:00
										 |  |  | use LibreNMS\RRD\RrdDefinition; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 04:54:30 +00:00
										 |  |  | $tmp_module = 'ntp'; | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 08:07:14 -05:00
										 |  |  | $component = new LibreNMS\Component(); | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | $options = array(); | 
					
						
							| 
									
										
										
										
											2017-02-08 04:54:30 +00:00
										 |  |  | $options['filter']['type'] = array('=',$tmp_module); | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | $options['filter']['disabled'] = array('=',0); | 
					
						
							|  |  |  | $options['filter']['ignore'] = array('=',0); | 
					
						
							| 
									
										
										
										
											2016-08-28 12:32:58 -05:00
										 |  |  | $components = $component->getComponents($device['device_id'], $options); | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | // 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..
 | 
					
						
							|  |  |  |     $cntpPeersVarEntry = snmpwalk_array_num($device, '.1.3.6.1.4.1.9.9.168.1.2.1.1', 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 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); | 
					
						
							| 
									
										
										
										
											2017-02-23 22:45:50 +00:00
										 |  |  |         $rrd_def = RrdDefinition::make() | 
					
						
							|  |  |  |             ->addDataset('stratum', 'GAUGE', 0) | 
					
						
							|  |  |  |             ->addDataset('offset', 'GAUGE', 0) | 
					
						
							|  |  |  |             ->addDataset('delay', 'GAUGE', 0) | 
					
						
							|  |  |  |             ->addDataset('dispersion', 'GAUGE', 0); | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $array['stratum'] = $cntpPeersVarEntry['1.3.6.1.4.1.9.9.168.1.2.1.1'][9][$array['UID']]; | 
					
						
							|  |  |  |         // Set the status, 16 = Bad
 | 
					
						
							|  |  |  |         if ($array['stratum'] == 16) { | 
					
						
							|  |  |  |             $array['status'] = 2; | 
					
						
							| 
									
										
										
										
											2017-01-14 16:52:06 +00:00
										 |  |  |             $array['error'] = 'NTP is not in sync'; | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $array['status'] = 0; | 
					
						
							|  |  |  |             $array['error'] = ''; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Extract the statistics and update rrd
 | 
					
						
							|  |  |  |         $rrd['stratum'] = $array['stratum']; | 
					
						
							|  |  |  |         $rrd['offset'] = hexdec($cntpPeersVarEntry['1.3.6.1.4.1.9.9.168.1.2.1.1'][23][$array['UID']]); | 
					
						
							|  |  |  |         $rrd['delay'] = hexdec($cntpPeersVarEntry['1.3.6.1.4.1.9.9.168.1.2.1.1'][24][$array['UID']]); | 
					
						
							|  |  |  |         $rrd['dispersion'] = hexdec($cntpPeersVarEntry['1.3.6.1.4.1.9.9.168.1.2.1.1'][25][$array['UID']]); | 
					
						
							|  |  |  |         $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:    1.3.6.1.4.1.9.9.168.1.2.1.1.9.".$array['UID']."  = ".$rrd['stratum']."\n"); | 
					
						
							|  |  |  |         d_echo("    Offset:     1.3.6.1.4.1.9.9.168.1.2.1.1.23.".$array['UID']." = ".$rrd['offset']."\n"); | 
					
						
							|  |  |  |         d_echo("    Delay:      1.3.6.1.4.1.9.9.168.1.2.1.1.24.".$array['UID']." = ".$rrd['delay']."\n"); | 
					
						
							|  |  |  |         d_echo("    Dispersion: 1.3.6.1.4.1.9.9.168.1.2.1.1.25.".$array['UID']." = ".$rrd['dispersion']."\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Clean-up after yourself!
 | 
					
						
							|  |  |  |         unset($filename, $rrd_filename, $rrd); | 
					
						
							|  |  |  |     } // End foreach components
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Write the Components back to the DB.
 | 
					
						
							| 
									
										
										
										
											2016-08-28 12:32:58 -05:00
										 |  |  |     $component->setComponentPrefs($device['device_id'], $components); | 
					
						
							| 
									
										
										
										
											2016-08-12 17:21:55 +10:00
										 |  |  | } // end if count components
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Clean-up after yourself!
 | 
					
						
							| 
									
										
										
										
											2017-02-08 04:54:30 +00:00
										 |  |  | unset($type, $components, $component, $options, $tmp_module); |