mirror of
				https://github.com/librenms/librenms.git
				synced 2024-10-07 16:52:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * entity-state.inc.php
 | |
|  *
 | |
|  * ENTITY-STATE-MIB polling module
 | |
|  *
 | |
|  * 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.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  * @package    LibreNMS
 | |
|  * @link       http://librenms.org
 | |
|  * @copyright  2017 Tony Murray
 | |
|  * @author     Tony Murray <murraytony@gmail.com>
 | |
|  */
 | |
| 
 | |
| $entityStatesIndexes = dbFetchRows(
 | |
|     'SELECT S.entity_state_id, S.entStateLastChanged, P.entPhysicalIndex FROM entityState AS S ' .
 | |
|     'LEFT JOIN entPhysical AS P USING (entPhysical_id) WHERE S.device_id=?',
 | |
|     array($device['device_id'])
 | |
| );
 | |
| 
 | |
| if (!empty($entityStatesIndexes)) {
 | |
|     echo "\nEntity States: ";
 | |
| 
 | |
|     // index by entPhysicalIndex
 | |
|     $entityStatesIndexes = array_by_column($entityStatesIndexes, 'entPhysicalIndex');
 | |
| 
 | |
|     $entLC = snmpwalk_group($device, 'entStateLastChanged', 'ENTITY-STATE-MIB', 0);
 | |
| 
 | |
|     foreach (current($entLC) as $index => $changed) {
 | |
|         if ($changed) { // skip empty entries
 | |
|             try {
 | |
|                 list($date, $time, $tz) = explode(',', $changed);
 | |
|                 $lastChanged = new DateTime("$date $time", new DateTimeZone($tz));
 | |
|                 $dbLastChanged = new DateTime($entityStatesIndexes[$index]['entStateLastChanged']);
 | |
|                 if ($lastChanged != $dbLastChanged) {
 | |
|                     // data has changed, fetch it
 | |
|                     $new_states = snmp_get_multi(
 | |
|                         $device,
 | |
|                         array(
 | |
|                             "entStateAdmin.$index",
 | |
|                             "entStateOper.$index",
 | |
|                             "entStateUsage.$index",
 | |
|                             "entStateAlarm.$index",
 | |
|                             "entStateStandby.$index"
 | |
|                         ),
 | |
|                         '-OQUse',
 | |
|                         'ENTITY-STATE-MIB'
 | |
|                     );
 | |
|                     $new_states = $new_states[$index]; // just get values
 | |
| 
 | |
|                     // add entStateLastChanged and update
 | |
|                     $new_states['entStateLastChanged'] = $lastChanged
 | |
|                         ->setTimezone(new DateTimeZone(date_default_timezone_get()))
 | |
|                         ->format('Y-m-d H:i:s');
 | |
| 
 | |
|                     // check if anything has changed
 | |
|                     $update = array_diff(
 | |
|                         $new_states,
 | |
|                         dbFetchRow(
 | |
|                             'SELECT * FROM entityState WHERE entity_state_id=?',
 | |
|                             array($entityStatesIndexes[$index]['entity_state_id'])
 | |
|                         )
 | |
|                     );
 | |
| 
 | |
|                     if (!empty($update)) {
 | |
|                         dbUpdate(
 | |
|                             $update,
 | |
|                             'entityState',
 | |
|                             'entity_state_id=?',
 | |
|                             array($entityStatesIndexes[$index]['entity_state_id'])
 | |
|                         );
 | |
|                         d_echo("Updating $index: ", 'U');
 | |
|                         d_echo($new_states[$index]);
 | |
|                         continue;
 | |
|                     }
 | |
|                 }
 | |
|             } catch (Exception $e) {
 | |
|                 // no update
 | |
|                 d_echo("Error: " . $e->getMessage() . PHP_EOL);
 | |
|             }
 | |
|         }
 | |
|         echo '.';
 | |
|     }
 | |
| 
 | |
|     echo PHP_EOL;
 | |
| }
 | |
| 
 | |
| unset($entityStatesIndexes, $entLC, $lastChanged, $dbLastChanged, $new_states, $update);
 |