2015-06-18 22:20:50 +01:00
< ? php
2011-04-13 14:00:12 +00:00
2017-02-23 22:45:50 +00:00
use LibreNMS\RRD\RrdDefinition ;
2016-10-11 17:34:09 +01:00
function bulk_sensor_snmpget ( $device , $sensors )
{
$oid_per_pdu = get_device_oid_limit ( $device );
$sensors = array_chunk ( $sensors , $oid_per_pdu );
$cache = array ();
foreach ( $sensors as $chunk ) {
$oids = array_map ( function ( $data ) {
return $data [ 'sensor_oid' ];
}, $chunk );
$oids = implode ( ' ' , $oids );
2016-10-13 19:03:46 +03:00
$multi_response = snmp_get_multi_oid ( $device , $oids , '-OUQnt' );
2016-10-11 17:34:09 +01:00
$cache = array_merge ( $cache , $multi_response );
}
return $cache ;
}
2017-01-18 08:48:33 +00:00
/**
* @ param $device
* @ return array
*/
function sensor_precache ( $device )
{
$sensor_config = array ();
if ( file_exists ( 'includes/polling/sensors/pre-cache/' . $device [ 'os' ] . '.inc.php' )) {
include 'includes/polling/sensors/pre-cache/' . $device [ 'os' ] . '.inc.php' ;
}
return $sensor_config ;
}
2017-02-08 04:54:30 +00:00
function poll_sensor ( $device , $class )
2016-08-28 12:32:58 -05:00
{
2015-07-13 20:10:26 +02:00
global $config , $memcache , $agent_sensors ;
2016-10-11 17:34:09 +01:00
$sensors = array ();
$misc_sensors = array ();
$all_sensors = array ();
2017-01-18 08:48:33 +00:00
2017-02-17 09:51:48 +01:00
foreach ( dbFetchRows ( " SELECT * FROM `sensors` WHERE `sensor_class` = ? AND `device_id` = ? " , array ( $class , $device [ 'device_id' ])) as $sensor ) {
2016-10-11 17:34:09 +01:00
if ( $sensor [ 'poller_type' ] == 'agent' ) {
2017-02-24 01:25:05 +00:00
// Agent sensors are polled in the unix-agent
2016-10-11 17:34:09 +01:00
} elseif ( $sensor [ 'poller_type' ] == 'ipmi' ) {
$misc_sensors [] = $sensor ;
} else {
$sensors [] = $sensor ;
}
}
$snmp_data = bulk_sensor_snmpget ( $device , $sensors );
2017-01-18 08:48:33 +00:00
$sensor_cache = sensor_precache ( $device );
2016-10-11 17:34:09 +01:00
foreach ( $sensors as $sensor ) {
echo 'Checking (' . $sensor [ 'poller_type' ] . " ) $class " . $sensor [ 'sensor_descr' ] . '... ' . PHP_EOL ;
2015-07-13 20:10:26 +02:00
if ( $sensor [ 'poller_type' ] == 'snmp' ) {
2016-09-28 08:19:28 -05:00
$mibdir = null ;
2016-08-07 11:40:37 +02:00
2016-12-07 00:30:56 +00:00
$sensor_value = trim ( str_replace ( '"' , '' , $snmp_data [ $sensor [ 'sensor_oid' ]]));
2016-10-11 17:34:09 +01:00
if ( file_exists ( 'includes/polling/sensors/' . $class . '/' . $device [ 'os' ] . '.inc.php' )) {
2017-01-18 08:48:33 +00:00
require 'includes/polling/sensors/' . $class . '/' . $device [ 'os' ] . '.inc.php' ;
2015-05-11 22:01:26 +01:00
}
2012-05-20 18:23:40 +00:00
2017-05-17 22:41:53 +01:00
if ( isset ( $sensor [ 'user_func' ]) && function_exists ( $sensor [ 'user_func' ])) {
$sensor_value = $sensor [ 'user_func' ]( $sensor_value );
}
2016-10-11 17:34:09 +01:00
2015-07-13 20:10:26 +02:00
if ( $class == 'temperature' ) {
2016-10-11 17:34:09 +01:00
preg_match ( '/[\d\.\-]+/' , $sensor_value , $temp_response );
if ( ! empty ( $temp_response [ 0 ])) {
$sensor_value = $temp_response [ 0 ];
}
2016-08-23 20:44:45 +02:00
} elseif ( $class == 'state' ) {
2016-04-23 20:14:22 -05:00
if ( ! is_numeric ( $sensor_value )) {
2016-10-11 17:34:09 +01:00
$state_value = dbFetchCell (
' SELECT `state_value`
FROM `state_translations` LEFT JOIN `sensors_to_state_indexes`
ON `state_translations` . `state_index_id` = `sensors_to_state_indexes` . `state_index_id`
WHERE `sensors_to_state_indexes` . `sensor_id` = ?
AND `state_translations` . `state_descr` LIKE ? ' ,
array ( $sensor [ 'sensor_id' ], $sensor_value )
);
2016-04-23 20:14:22 -05:00
d_echo ( 'State value of ' . $sensor_value . ' is ' . $state_value . " \n " );
if ( is_numeric ( $state_value )) {
$sensor_value = $state_value ;
}
}
2015-07-13 20:10:26 +02:00
} //end if
unset ( $mib );
2016-08-07 11:40:37 +02:00
unset ( $mibdir );
2016-10-11 17:34:09 +01:00
$sensor [ 'new_value' ] = $sensor_value ;
$all_sensors [] = $sensor ;
}
}
foreach ( $misc_sensors as $sensor ) {
if ( $sensor [ 'poller_type' ] == 'agent' ) {
2015-07-13 20:10:26 +02:00
if ( isset ( $agent_sensors )) {
$sensor_value = $agent_sensors [ $class ][ $sensor [ 'sensor_type' ]][ $sensor [ 'sensor_index' ]][ 'current' ];
2016-10-11 17:34:09 +01:00
$sensor [ 'new_value' ] = $sensor_value ;
$all_sensors [] = $sensor ;
2016-08-28 12:32:58 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo " no agent data! \n " ;
continue ;
}
2016-08-28 12:32:58 -05:00
} elseif ( $sensor [ 'poller_type' ] == 'ipmi' ) {
2015-07-13 20:10:26 +02:00
echo " already polled. \n " ;
// ipmi should probably move here from the ipmi poller file (FIXME)
continue ;
2016-08-28 12:32:58 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo " unknown poller type! \n " ;
continue ;
} //end if
2016-10-11 17:34:09 +01:00
}
2017-02-24 01:25:05 +00:00
record_sensor_data ( $device , $all_sensors );
} //end poll_sensor()
/**
* @ param $device
* @ param $all_sensors
*/
function record_sensor_data ( $device , $all_sensors )
{
$supported_sensors = array (
'current' => 'A' ,
'frequency' => 'Hz' ,
'runtime' => 'Min' ,
'humidity' => '%' ,
'fanspeed' => 'rpm' ,
'power' => 'W' ,
'voltage' => 'V' ,
'temperature' => 'C' ,
'dbm' => 'dBm' ,
'charge' => '%' ,
'load' => '%' ,
'state' => '#' ,
'signal' => 'dBm' ,
'airflow' => 'cfm' ,
2017-05-23 16:28:45 +01:00
'snr' => 'SNR' ,
2017-02-24 01:25:05 +00:00
);
2015-07-13 20:10:26 +02:00
2016-10-11 17:34:09 +01:00
foreach ( $all_sensors as $sensor ) {
2017-07-06 02:27:02 -05:00
$class = ucfirst ( $sensor [ 'sensor_class' ]);
$unit = $supported_sensors [ $class ];
$sensor_value = $sensor [ 'new_value' ];
$prev_sensor_value = $sensor [ 'sensor_current' ];
2015-07-13 20:10:26 +02:00
if ( $sensor_value == - 32768 ) {
echo 'Invalid (-32768) ' ;
$sensor_value = 0 ;
2015-04-11 19:47:56 +01:00
}
2011-04-13 14:00:12 +00:00
2016-02-09 14:20:36 -06:00
if ( $sensor [ 'sensor_divisor' ] && $sensor_value !== 0 ) {
2015-07-13 20:10:26 +02:00
$sensor_value = ( $sensor_value / $sensor [ 'sensor_divisor' ]);
}
2011-09-18 15:38:05 +00:00
2015-07-13 20:10:26 +02:00
if ( $sensor [ 'sensor_multiplier' ]) {
$sensor_value = ( $sensor_value * $sensor [ 'sensor_multiplier' ]);
}
2011-04-13 14:00:12 +00:00
2016-07-08 22:58:36 -05:00
$rrd_name = get_sensor_rrd_name ( $device , $sensor );
2017-02-23 22:45:50 +00:00
$rrd_def = RrdDefinition :: make () -> addDataset ( 'sensor' , 'GAUGE' , - 20000 , 20000 );
2011-04-13 14:00:12 +00:00
2015-07-13 20:10:26 +02:00
echo " $sensor_value $unit\n " ;
2011-04-13 14:00:12 +00:00
2015-08-18 16:26:55 +00:00
$fields = array (
'sensor' => $sensor_value ,
);
2016-07-07 01:33:43 -05:00
$tags = array (
'sensor_class' => $sensor [ 'sensor_class' ],
'sensor_type' => $sensor [ 'sensor_type' ],
'sensor_descr' => $sensor [ 'sensor_descr' ],
'sensor_index' => $sensor [ 'sensor_index' ],
'rrd_name' => $rrd_name ,
'rrd_def' => $rrd_def
);
2016-08-28 12:32:58 -05:00
data_update ( $device , 'sensor' , $tags , $fields );
2015-08-19 20:58:02 +00:00
2017-02-24 01:25:05 +00:00
// FIXME also warn when crossing WARN level!
2017-07-06 02:27:02 -05:00
if ( $sensor [ 'sensor_limit_low' ] != '' && $prev_sensor_value > $sensor [ 'sensor_limit_low' ] && $sensor_value < $sensor [ 'sensor_limit_low' ] && $sensor [ 'sensor_alert' ] == 1 ) {
2015-07-13 20:10:26 +02:00
echo 'Alerting for ' . $device [ 'hostname' ] . ' ' . $sensor [ 'sensor_descr' ] . " \n " ;
2017-07-06 02:27:02 -05:00
log_event ( " $class { $sensor [ 'sensor_descr' ] } under threshold: $sensor_value $unit (< { $sensor [ 'sensor_limit_low' ] } $unit ) " , $device , $class , 4 , $sensor [ 'sensor_id' ]);
} elseif ( $sensor [ 'sensor_limit' ] != '' && $prev_sensor_value < $sensor [ 'sensor_limit' ] && $sensor_value > $sensor [ 'sensor_limit' ] && $sensor [ 'sensor_alert' ] == 1 ) {
2015-07-13 20:10:26 +02:00
echo 'Alerting for ' . $device [ 'hostname' ] . ' ' . $sensor [ 'sensor_descr' ] . " \n " ;
2017-07-06 02:27:02 -05:00
log_event ( " $class { $sensor [ 'sensor_descr' ] } above threshold: $sensor_value $unit (> { $sensor [ 'sensor_limit' ] } $unit ) " , $device , $class , 4 , $sensor [ 'sensor_id' ]);
2015-07-13 20:10:26 +02:00
}
2017-07-06 02:27:02 -05:00
if ( $sensor [ 'sensor_class' ] == 'state' && $prev_sensor_value != $sensor_value ) {
$trans = array_column (
dbFetchRows (
" SELECT `state_translations`.`state_value`, `state_translations`.`state_descr` FROM `sensors_to_state_indexes` LEFT JOIN `state_translations` USING (`state_index_id`) WHERE `sensors_to_state_indexes`.`sensor_id`=? AND `state_translations`.`state_value` IN ( $sensor_value , $prev_sensor_value ) " ,
array ( $sensor [ 'sensor_id' ])
),
'state_descr' ,
'state_value'
);
2017-07-07 12:15:53 -05:00
log_event ( " $class sensor { $sensor [ 'sensor_descr' ] } has changed from { $trans [ $prev_sensor_value ] } ( $prev_sensor_value ) to { $trans [ $sensor_value ] } ( $sensor_value ) " , $device , $class , 3 , $sensor [ 'sensor_id' ]);
2016-02-27 15:29:11 +01:00
}
2017-07-06 02:27:02 -05:00
dbUpdate ( array ( 'sensor_current' => $sensor_value , 'sensor_prev' => $prev_sensor_value , 'lastupdate' => array ( 'NOW()' )), 'sensors' , " `sensor_class` = ? AND `sensor_id` = ? " , array ( $class , $sensor [ 'sensor_id' ]));
2016-10-11 17:34:09 +01:00
}
2017-02-24 01:25:05 +00:00
}
2011-04-13 14:00:12 +00:00
2016-08-28 12:32:58 -05:00
function poll_device ( $device , $options )
{
2017-07-21 17:01:59 -05:00
global $config , $device ;
2011-09-20 14:29:04 +00:00
2017-01-22 09:49:13 +00:00
$attribs = get_dev_attribs ( $device [ 'device_id' ]);
$device [ 'attribs' ] = $attribs ;
2017-01-09 02:16:09 -06:00
load_os ( $device );
2016-12-23 17:53:19 +00:00
2016-07-30 15:11:29 +01:00
$device [ 'snmp_max_repeaters' ] = $attribs [ 'snmp_max_repeaters' ];
2016-10-11 17:34:09 +01:00
$device [ 'snmp_max_oid' ] = $attribs [ 'snmp_max_oid' ];
2011-09-20 14:29:04 +00:00
2015-07-13 20:10:26 +02:00
unset ( $array );
2016-01-08 13:33:32 +01:00
$device_start = microtime ( true );
2015-07-13 20:10:26 +02:00
// Start counting device poll time
2016-10-14 02:41:53 +01:00
echo 'Hostname: ' . $device [ 'hostname' ] . PHP_EOL ;
echo 'Device ID: ' . $device [ 'device_id' ] . PHP_EOL ;
echo 'OS: ' . $device [ 'os' ];
2016-01-17 23:59:51 +00:00
$ip = dnslookup ( $device );
2017-04-01 22:17:32 +01:00
$db_ip = inet_pton ( $ip );
2016-01-17 23:59:51 +00:00
2017-04-01 22:17:32 +01:00
if ( ! empty ( $db_ip ) && inet6_ntop ( $db_ip ) != inet6_ntop ( $device [ 'ip' ])) {
2017-02-14 00:32:02 +02:00
log_event ( 'Device IP changed to ' . $ip , $device , 'system' , 3 );
2016-01-17 23:59:51 +00:00
dbUpdate ( array ( 'ip' => $db_ip ), 'devices' , 'device_id=?' , array ( $device [ 'device_id' ]));
}
2015-07-13 20:10:26 +02:00
if ( $config [ 'os' ][ $device [ 'os' ]][ 'group' ]) {
$device [ 'os_group' ] = $config [ 'os' ][ $device [ 'os' ]][ 'group' ];
2016-10-14 02:41:53 +01:00
echo ' (' . $device [ 'os_group' ] . ')' ;
2015-07-13 20:10:26 +02:00
}
2016-10-14 02:41:53 +01:00
echo PHP_EOL . PHP_EOL ;
2011-09-20 14:29:04 +00:00
2015-07-13 20:10:26 +02:00
unset ( $poll_update );
unset ( $poll_update_query );
unset ( $poll_separator );
$poll_update_array = array ();
2015-10-17 21:00:53 +00:00
$update_array = array ();
2011-09-20 14:29:04 +00:00
2017-01-24 15:48:03 -06:00
$host_rrd = rrd_name ( $device [ 'hostname' ], '' , '' );
2016-10-17 03:45:39 +01:00
if ( $config [ 'norrd' ] !== true && ! is_dir ( $host_rrd )) {
2015-07-13 20:10:26 +02:00
mkdir ( $host_rrd );
echo " Created directory : $host_rrd\n " ;
}
2011-09-20 14:29:04 +00:00
2017-02-15 15:22:09 +00:00
$response = device_is_up ( $device , true );
2015-09-22 02:25:35 +02:00
2017-02-15 15:22:09 +00:00
if ( $response [ 'status' ] == '1' ) {
2015-07-13 20:10:26 +02:00
$graphs = array ();
$oldgraphs = array ();
2015-12-16 20:56:58 +00:00
// we always want the core module to be included
include 'includes/polling/core.inc.php' ;
2016-07-11 12:28:54 +01:00
$force_module = false ;
2015-07-13 20:10:26 +02:00
if ( $options [ 'm' ]) {
2016-06-24 15:32:19 +01:00
$config [ 'poller_modules' ] = array ();
2015-07-13 20:10:26 +02:00
foreach ( explode ( ',' , $options [ 'm' ]) as $module ) {
if ( is_file ( 'includes/polling/' . $module . '.inc.php' )) {
2016-06-24 15:32:19 +01:00
$config [ 'poller_modules' ][ $module ] = 1 ;
2016-07-11 12:28:54 +01:00
$force_module = true ;
2015-07-13 20:10:26 +02:00
}
}
}
2016-06-24 15:32:19 +01:00
foreach ( $config [ 'poller_modules' ] as $module => $module_status ) {
2016-11-13 20:46:05 +01:00
$os_module_status = $config [ 'os' ][ $device [ 'os' ]][ 'poller_modules' ][ $module ];
d_echo ( " Modules status: Global " . ( isset ( $module_status ) ? ( $module_status ? '+ ' : '- ' ) : ' ' ));
d_echo ( " OS " . ( isset ( $os_module_status ) ? ( $os_module_status ? '+ ' : '- ' ) : ' ' ));
d_echo ( " Device " . ( isset ( $attribs [ 'poll_' . $module ]) ? ( $attribs [ 'poll_' . $module ] ? '+ ' : '- ' ) : ' ' ));
if ( $force_module === true ||
$attribs [ 'poll_' . $module ] ||
( $os_module_status && ! isset ( $attribs [ 'poll_' . $module ])) ||
( $module_status && ! isset ( $os_module_status ) && ! isset ( $attribs [ 'poll_' . $module ]))) {
2017-02-08 04:54:30 +00:00
$start_memory = memory_get_usage ();
2016-06-24 15:32:19 +01:00
$module_start = microtime ( true );
echo " \n #### Load poller module $module #### \n " ;
include " includes/polling/ $module .inc.php " ;
$module_time = microtime ( true ) - $module_start ;
2017-02-08 04:54:30 +00:00
$module_mem = ( memory_get_usage () - $start_memory );
printf ( " \n >> Runtime for poller module '%s': %.4f seconds with %s bytes \n " , $module , $module_time , $module_mem );
2016-06-24 15:32:19 +01:00
echo " #### Unload poller module $module #### \n \n " ;
// save per-module poller stats
$tags = array (
'module' => $module ,
2017-02-23 22:45:50 +00:00
'rrd_def' => RrdDefinition :: make () -> addDataset ( 'poller' , 'GAUGE' , 0 ),
2016-06-24 15:32:19 +01:00
'rrd_name' => array ( 'poller-perf' , $module ),
);
$fields = array (
'poller' => $module_time ,
);
data_update ( $device , 'poller-perf' , $tags , $fields );
// remove old rrd
$oldrrd = rrd_name ( $device [ 'hostname' ], array ( 'poller' , $module , 'perf' ));
if ( is_file ( $oldrrd )) {
unlink ( $oldrrd );
2016-08-28 12:32:58 -05:00
}
2017-02-08 04:54:30 +00:00
unset ( $tags , $fields , $oldrrd );
2016-08-28 12:32:58 -05:00
} elseif ( isset ( $attribs [ 'poll_' . $module ]) && $attribs [ 'poll_' . $module ] == '0' ) {
2016-11-13 20:46:05 +01:00
echo " Module [ $module ] disabled on host. \n \n " ;
} elseif ( isset ( $os_module_status ) && $os_module_status == '0' ) {
echo " Module [ $module ] disabled on os. \n \n " ;
2016-08-28 12:32:58 -05:00
} else {
2016-11-13 20:46:05 +01:00
echo " Module [ $module ] disabled globally. \n \n " ;
2016-06-24 15:32:19 +01:00
}
}
2015-07-13 20:10:26 +02:00
2016-06-02 12:37:03 -05:00
// Update device_groups
UpdateGroupsForDevice ( $device [ 'device_id' ]);
2016-08-31 15:23:35 +01:00
if ( ! isset ( $options [ 'm' ])) {
2015-07-13 20:10:26 +02:00
// FIXME EVENTLOGGING -- MAKE IT SO WE DO THIS PER-MODULE?
// This code cycles through the graphs already known in the database and the ones we've defined as being polled here
// If there any don't match, they're added/deleted from the database.
// Ideally we should hold graphs for xx days/weeks/polls so that we don't needlessly hide information.
foreach ( dbFetch ( 'SELECT `graph` FROM `device_graphs` WHERE `device_id` = ?' , array ( $device [ 'device_id' ])) as $graph ) {
if ( isset ( $graphs [ $graph [ 'graph' ]])) {
$oldgraphs [ $graph [ 'graph' ]] = true ;
2016-08-28 12:32:58 -05:00
} else {
2015-07-13 20:10:26 +02:00
dbDelete ( 'device_graphs' , '`device_id` = ? AND `graph` = ?' , array ( $device [ 'device_id' ], $graph [ 'graph' ]));
}
}
foreach ( $graphs as $graph => $value ) {
if ( ! isset ( $oldgraphs [ $graph ])) {
echo '+' ;
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'graph' => $graph ), 'device_graphs' );
}
echo $graph . ' ' ;
}
} //end if
2016-01-10 19:31:39 +10:00
// Ping response
2017-02-15 15:22:09 +00:00
if ( can_ping_device ( $attribs ) === true && ! empty ( $response [ 'ping_time' ])) {
2016-01-10 19:31:39 +10:00
$tags = array (
2017-02-23 22:45:50 +00:00
'rrd_def' => RrdDefinition :: make () -> addDataset ( 'ping' , 'GAUGE' , 0 , 65535 ),
2016-01-10 19:31:39 +10:00
);
$fields = array (
2017-02-15 15:22:09 +00:00
'ping' => $response [ 'ping_time' ],
2016-01-10 19:31:39 +10:00
);
2015-10-17 18:49:01 +00:00
$update_array [ 'last_ping' ] = array ( 'NOW()' );
2017-02-15 15:22:09 +00:00
$update_array [ 'last_ping_timetaken' ] = $response [ 'ping_time' ];
2015-08-18 16:26:55 +00:00
2016-01-10 19:31:39 +10:00
data_update ( $device , 'ping-perf' , $tags , $fields );
2011-09-20 14:29:04 +00:00
}
2017-07-21 17:01:59 -05:00
$device_time = round ( microtime ( true ) - $device_start , 3 );
// Poller performance
if ( ! empty ( $device_time )) {
$tags = array (
'rrd_def' => RrdDefinition :: make () -> addDataset ( 'poller' , 'GAUGE' , 0 ),
'module' => 'ALL' ,
);
$fields = array (
'poller' => $device_time ,
);
data_update ( $device , 'poller-perf' , $tags , $fields );
}
2015-08-06 10:43:17 +02:00
$update_array [ 'last_polled' ] = array ( 'NOW()' );
$update_array [ 'last_polled_timetaken' ] = $device_time ;
2011-09-20 14:29:04 +00:00
2015-07-13 20:10:26 +02:00
// echo("$device_end - $device_start; $device_time $device_run");
echo " Polled in $device_time seconds \n " ;
2017-07-21 17:01:59 -05:00
// check if the poll took to long and log an event
if ( $device_time > $config [ 'rrd' ][ 'step' ]) {
log_event ( " Polling took longer than " . round ( $config [ 'rrd' ][ 'step' ] / 60 , 2 ) .
' minutes! This will cause gaps in graphs.' , $device , 'system' , 5 );
}
2015-08-24 20:54:19 +00:00
d_echo ( 'Updating ' . $device [ 'hostname' ] . " \n " );
2015-07-13 20:10:26 +02:00
$updated = dbUpdate ( $update_array , 'devices' , '`device_id` = ?' , array ( $device [ 'device_id' ]));
if ( $updated ) {
echo " UPDATED! \n " ;
}
unset ( $storage_cache );
// Clear cache of hrStorage ** MAYBE FIXME? **
unset ( $cache );
// Clear cache (unify all things here?)
} //end if
} //end poll_device()
2011-09-20 14:29:04 +00:00
2017-02-24 18:42:17 +00:00
/**
* if no rrd_name parameter is passed , the MIB name is used as the rrd_file_name
*/
function poll_mib_def ( $device , $mib_name_table , $mib_subdir , $mib_oids , $mib_graphs , & $graphs , $rrd_name = null )
2016-08-28 12:32:58 -05:00
{
2015-07-13 20:10:26 +02:00
echo " This is poll_mib_def Processing \n " ;
$mib = null ;
2011-09-20 14:29:04 +00:00
2017-03-11 14:42:57 +00:00
list ( $mib , $file ) = explode ( ':' , $mib_name_table , 2 );
2017-02-24 18:42:17 +00:00
if ( is_null ( $rrd_name )) {
2017-03-11 14:42:57 +00:00
if ( str_contains ( $mib_name_table , 'UBNT' , true )) {
$rrd_name = strtolower ( $mib );
2017-02-24 18:42:17 +00:00
} else {
2017-03-11 14:42:57 +00:00
$rrd_name = strtolower ( $file );
2017-02-24 18:42:17 +00:00
}
2017-03-01 19:35:48 +00:00
}
2011-09-20 14:29:04 +00:00
2017-02-23 22:45:50 +00:00
$rrd_def = new RrdDefinition ();
2015-07-13 20:10:26 +02:00
$oidglist = array ();
2015-08-18 16:26:55 +00:00
$oidnamelist = array ();
2015-07-13 20:10:26 +02:00
foreach ( $mib_oids as $oid => $param ) {
$oidindex = $param [ 0 ];
$oiddsname = $param [ 1 ];
$oiddsdesc = $param [ 2 ];
$oiddstype = $param [ 3 ];
$oiddsopts = $param [ 4 ];
if ( empty ( $oiddsopts )) {
2017-02-23 22:45:50 +00:00
$rrd_def -> addDataset ( $oiddsname , $oiddstype , null , 100000000000 );
} else {
$min = array_key_exists ( 'min' , $oiddsopts ) ? $oiddsopts [ 'min' ] : null ;
$max = array_key_exists ( 'max' , $oiddsopts ) ? $oiddsopts [ 'max' ] : null ;
$heartbeat = array_key_exists ( 'heartbeat' , $oiddsopts ) ? $oiddsopts [ 'heartbeat' ] : null ;
$rrd_def -> addDataset ( $oiddsname , $oiddstype , $min , $max , $heartbeat );
2015-07-13 20:10:26 +02:00
}
2015-04-03 18:59:58 +01:00
2015-07-13 20:10:26 +02:00
if ( $oidindex != '' ) {
$fulloid = $oid . '.' . $oidindex ;
2016-08-28 12:32:58 -05:00
} else {
2015-07-13 20:10:26 +02:00
$fulloid = $oid ;
}
2015-04-03 18:59:58 +01:00
2015-07-13 20:10:26 +02:00
// Add to oid GET list
$oidglist [] = $fulloid ;
2015-08-18 16:26:55 +00:00
$oidnamelist [] = $oiddsname ;
2015-07-13 20:10:26 +02:00
} //end foreach
2015-05-16 20:39:24 -03:00
2015-07-13 20:10:26 +02:00
// Implde for LibreNMS Version
$oidilist = implode ( ' ' , $oidglist );
2015-04-21 16:02:17 +01:00
2015-07-13 20:10:26 +02:00
$snmpdata = snmp_get_multi ( $device , $oidilist , '-OQUs' , $mib );
if ( isset ( $GLOBALS [ 'exec_status' ][ 'exitcode' ]) && $GLOBALS [ 'exec_status' ][ 'exitcode' ] !== 0 ) {
print_debug ( ' ERROR, bad snmp response' );
return false ;
2015-04-21 16:02:17 +01:00
}
2015-08-18 16:26:55 +00:00
$oid_count = 0 ;
2015-08-24 18:39:49 +00:00
$fields = array ();
2015-07-13 20:10:26 +02:00
foreach ( $oidglist as $fulloid ) {
list ( $splitoid , $splitindex ) = explode ( '.' , $fulloid , 2 );
2015-09-11 18:40:51 +01:00
$val = $snmpdata [ $splitindex ][ $splitoid ];
if ( is_numeric ( $val )) {
2016-01-10 16:46:31 +00:00
$fields [ $oidnamelist [ $oid_count ]] = $val ;
2016-08-28 12:32:58 -05:00
} elseif ( preg_match ( " /^ \" (.*) \" $ / " , $val , $number ) && is_numeric ( $number [ 1 ])) {
2016-01-10 16:46:31 +00:00
$fields [ $oidnamelist [ $oid_count ]] = $number [ 1 ];
2016-08-28 12:32:58 -05:00
} else {
2015-08-18 16:26:55 +00:00
$fields [ $oidnamelist [ $oid_count ]] = 'U' ;
2015-07-13 20:10:26 +02:00
}
2015-08-18 16:26:55 +00:00
$oid_count ++ ;
2015-04-03 18:59:58 +01:00
}
2015-05-16 20:39:24 -03:00
2016-07-07 01:33:43 -05:00
$tags = compact ( 'rrd_def' );
2017-03-01 19:35:48 +00:00
data_update ( $device , $rrd_name , $tags , $fields );
2015-08-19 20:58:02 +00:00
2015-07-13 20:10:26 +02:00
foreach ( $mib_graphs as $graphtoenable ) {
$graphs [ $graphtoenable ] = true ;
}
2015-04-03 18:59:58 +01:00
2015-07-13 20:10:26 +02:00
return true ;
} //end poll_mib_def()
2015-05-16 20:39:24 -03:00
2015-04-03 18:59:58 +01:00
2016-08-28 12:32:58 -05:00
function get_main_serial ( $device )
{
2015-06-18 22:20:50 +01:00
if ( $device [ 'os_group' ] == 'cisco' ) {
2015-07-13 20:10:26 +02:00
$serial_output = snmp_get_multi ( $device , 'entPhysicalSerialNum.1 entPhysicalSerialNum.1001' , '-OQUs' , 'ENTITY-MIB:OLD-CISCO-CHASSIS-MIB' );
2015-06-18 22:20:50 +01:00
if ( ! empty ( $serial_output [ 1 ][ 'entPhysicalSerialNum' ])) {
return $serial_output [ 1 ][ 'entPhysicalSerialNum' ];
2017-03-21 16:11:42 +02:00
} elseif ( ! empty ( $serial_output [ 1000 ][ 'entPhysicalSerialNum' ])) {
return $serial_output [ 1000 ][ 'entPhysicalSerialNum' ];
2016-08-28 12:32:58 -05:00
} elseif ( ! empty ( $serial_output [ 1001 ][ 'entPhysicalSerialNum' ])) {
2015-06-18 22:20:50 +01:00
return $serial_output [ 1001 ][ 'entPhysicalSerialNum' ];
}
}
2015-07-13 20:10:26 +02:00
} //end get_main_serial()
2015-07-20 15:10:56 +01:00
2016-08-28 12:32:58 -05:00
function location_to_latlng ( $device )
{
2015-07-20 16:53:06 +01:00
global $config ;
2015-07-20 15:10:56 +01:00
if ( function_check ( 'curl_version' ) !== true ) {
d_echo ( " Curl support for PHP not enabled \n " );
return false ;
}
$bad_loc = false ;
$device_location = $device [ 'location' ];
if ( ! empty ( $device_location )) {
2016-08-28 12:32:58 -05:00
$new_device_location = preg_replace ( " / / " , " + " , $device_location );
2017-02-03 11:26:04 +02:00
$new_device_location = preg_replace ( '/[^A-Za-z0-9\-\+]/' , '' , $new_device_location ); // Removes special chars.
2015-07-20 15:10:56 +01:00
// We have a location string for the device.
2015-11-16 18:50:52 -08:00
$loc = parse_location ( $device_location );
if ( ! is_array ( $loc )) {
$loc = dbFetchRow ( " SELECT `lat`,`lng` FROM `locations` WHERE `location`=? LIMIT 1 " , array ( $device_location ));
}
2015-07-20 15:10:56 +01:00
if ( is_array ( $loc ) === false ) {
// Grab data from which ever Geocode service we use.
switch ( $config [ 'geoloc' ][ 'engine' ]) {
case " google " :
default :
2015-08-03 10:29:08 +02:00
d_echo ( " Google geocode engine being used \n " );
2015-08-03 16:56:57 +02:00
$api_key = ( $config [ 'geoloc' ][ 'api_key' ]);
if ( ! empty ( $api_key )) {
2015-08-03 10:29:08 +02:00
d_echo ( " Use Google API key: $api_key\n " );
$api_url = " https://maps.googleapis.com/maps/api/geocode/json?address= $new_device_location &key= $api_key " ;
} else {
$api_url = " https://maps.googleapis.com/maps/api/geocode/json?address= $new_device_location " ;
}
2016-08-28 12:32:58 -05:00
break ;
2015-07-20 15:10:56 +01:00
}
$curl_init = curl_init ( $api_url );
set_curl_proxy ( $curl_init );
curl_setopt ( $curl_init , CURLOPT_RETURNTRANSFER , true );
2017-02-03 14:12:42 +00:00
curl_setopt ( $curl_init , CURLOPT_TIMEOUT , 2 );
curl_setopt ( $curl_init , CURLOPT_TIMEOUT_MS , 2000 );
curl_setopt ( $curl_init , CURLOPT_CONNECTTIMEOUT , 5 );
2016-08-28 12:32:58 -05:00
$data = json_decode ( curl_exec ( $curl_init ), true );
2015-07-20 15:10:56 +01:00
// Parse the data from the specific Geocode services.
switch ( $config [ 'geoloc' ][ 'engine' ]) {
case " google " :
default :
if ( $data [ 'status' ] == 'OK' ) {
$loc = $data [ 'results' ][ 0 ][ 'geometry' ][ 'location' ];
} else {
$bad_loc = true ;
}
2016-08-28 12:32:58 -05:00
break ;
2015-07-20 15:10:56 +01:00
}
if ( $bad_loc === true ) {
d_echo ( " Bad lat / lng received \n " );
2016-08-28 12:32:58 -05:00
} else {
2015-07-20 15:10:56 +01:00
$loc [ 'timestamp' ] = array ( 'NOW()' );
$loc [ 'location' ] = $device_location ;
2015-07-23 18:41:41 +01:00
if ( dbInsert ( $loc , 'locations' )) {
2015-07-20 15:10:56 +01:00
d_echo ( " Device lat/lng created \n " );
2016-08-28 12:32:58 -05:00
} else {
2015-07-20 15:10:56 +01:00
d_echo ( " Device lat/lng could not be created \n " );
}
}
2016-08-28 12:32:58 -05:00
} else {
2015-07-20 15:10:56 +01:00
d_echo ( " Using cached lat/lng from other device \n " );
}
}
} // end location_to_latlng()
2016-10-11 17:34:09 +01:00
2017-03-11 14:39:32 +00:00
/**
* Update the application status and output in the database .
*
* @ param array $app app from the db , including app_id
* @ param string $response This should be the full output
2017-05-13 12:55:38 +01:00
* @ param string $current This is the current value we store in rrd for graphing
2017-03-11 14:39:32 +00:00
*/
2017-05-13 12:55:38 +01:00
function update_application ( $app , $response , $current = '' )
2017-03-11 14:39:32 +00:00
{
if ( ! is_numeric ( $app [ 'app_id' ])) {
d_echo ( '$app does not contain app_id, could not update' );
return ;
}
$data = array (
2017-05-13 12:55:38 +01:00
'app_state' => 'UNKNOWN' ,
'app_status' => $current ,
'timestamp' => array ( 'NOW()' ),
2017-03-11 14:39:32 +00:00
);
if ( $response != '' && $response !== false ) {
if ( str_contains ( $response , array (
'Traceback (most recent call last):' ,
))) {
$data [ 'app_state' ] = 'ERROR' ;
} else {
$data [ 'app_state' ] = 'OK' ;
}
}
if ( $data [ 'app_state' ] != $app [ 'app_state' ]) {
$data [ 'app_state_prev' ] = $app [ 'app_state' ];
}
dbUpdate ( $data , 'applications' , '`app_id` = ?' , array ( $app [ 'app_id' ]));
}
2017-05-17 22:41:53 +01:00
function convert_to_celsius ( $value )
{
$value = ( $value - 32 ) / 1.8 ;
return sprintf ( '%.02f' , $value );
}