2011-04-13 14:00:12 +00:00
< ? php
function poll_sensor ( $device , $class , $unit )
{
2012-05-20 18:23:40 +00:00
global $config , $memcache , $agent_sensors ;
2011-04-13 14:00:12 +00:00
2012-05-20 18:23:40 +00:00
foreach ( dbFetchRows ( " SELECT * FROM `sensors` WHERE `sensor_class` = ? AND `device_id` = ? " , array ( $class , $device [ 'device_id' ])) as $sensor )
2011-04-13 14:00:12 +00:00
{
2012-05-20 18:23:40 +00:00
echo ( " Checking ( " . $sensor [ 'poller_type' ] . " ) $class " . $sensor [ 'sensor_descr' ] . " ... " );
2011-04-13 14:00:12 +00:00
2012-05-20 18:23:40 +00:00
if ( $sensor [ 'poller_type' ] == " snmp " )
2011-09-20 09:55:11 +00:00
{
2012-05-20 18:23:40 +00:00
if ( $class == " temperature " )
2011-05-16 20:33:51 +00:00
{
2012-05-20 18:23:40 +00:00
for ( $i = 0 ; $i < 5 ; $i ++ ) # Try 5 times to get a valid temp reading
{
if ( $debug ) echo ( " Attempt $i " );
$sensor_value = trim ( str_replace ( " \" " , " " , snmp_get ( $device , $sensor [ 'sensor_oid' ], " -OUqnv " , " SNMPv2-MIB " )));
2012-05-25 18:35:17 +00:00
if ( is_numeric ( $sensor_value ) && $sensor_value != 9999 ) break ; # TME sometimes sends 999.9 when it is right in the middle of an update;
2012-05-20 18:23:40 +00:00
sleep ( 1 ); # Give the TME some time to reset
}
} else {
2012-05-03 13:52:34 +00:00
$sensor_value = trim ( str_replace ( " \" " , " " , snmp_get ( $device , $sensor [ 'sensor_oid' ], " -OUqnv " , " SNMPv2-MIB " )));
2011-05-16 20:33:51 +00:00
}
2012-05-20 18:23:40 +00:00
} else if ( $sensor [ 'poller_type' ] == " agent " )
{
if ( isset ( $agent_sensors ))
{
$sensor_value = $agent_sensors [ $class ][ $sensor [ 'sensor_type' ]][ $sensor [ 'sensor_index' ]][ 'current' ];
}
else
{
echo " no agent data! \n " ;
2012-05-21 10:15:00 +00:00
continue ;
2012-05-20 18:23:40 +00:00
}
2012-05-21 10:15:00 +00:00
} else if ( $sensor [ 'poller_type' ] == " ipmi " )
{
echo " already polled. \n " ; # ipmi should probably move here from the ipmi poller file (FIXME)
continue ;
2012-05-20 18:23:40 +00:00
}
else
{
echo " unknown poller type! \n " ;
2012-05-21 10:15:00 +00:00
continue ;
2011-05-16 20:33:51 +00:00
}
2011-04-13 14:00:12 +00:00
2011-09-20 14:22:34 +00:00
if ( $sensor_value == - 32768 ) { echo ( " Invalid (-32768) " ); $sensor_value = 0 ; }
2011-09-18 15:38:05 +00:00
2011-04-13 14:00:12 +00:00
if ( $sensor [ 'sensor_divisor' ]) { $sensor_value = $sensor_value / $sensor [ 'sensor_divisor' ]; }
if ( $sensor [ 'sensor_multiplier' ]) { $sensor_value = $sensor_value * $sensor [ 'sensor_multiplier' ]; }
2011-04-26 15:07:52 +00:00
$rrd_file = get_sensor_rrd ( $device , $sensor );
2011-04-13 14:00:12 +00:00
if ( ! is_file ( $rrd_file ))
{
rrdtool_create ( $rrd_file , " --step 300 \
2012-04-20 17:37:58 +00:00
DS : sensor : GAUGE : 600 :- 20000 : 20000 " . $config['rrd_rra'] );
2011-04-13 14:00:12 +00:00
}
echo ( " $sensor_value $unit\n " );
rrdtool_update ( $rrd_file , " N: $sensor_value " );
2012-05-25 12:24:34 +00:00
// FIXME also warn when crossing WARN level!!
2014-06-14 23:05:31 +01:00
if ( $sensor [ 'sensor_limit_low' ] != " " && $sensor [ 'sensor_current' ] > $sensor [ 'sensor_limit_low' ] && $sensor_value <= $sensor [ 'sensor_limit_low' ] && $sensor [ 'sensor_alert' ] == 1 )
2011-04-13 14:00:12 +00:00
{
2012-04-26 12:11:03 +00:00
$msg = ucfirst ( $class ) . " Alarm: " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ] . " is under threshold: " . $sensor_value . " $unit (< " . $sensor [ 'sensor_limit' ] . " $unit ) " ;
2011-04-13 14:00:12 +00:00
notify ( $device , ucfirst ( $class ) . " Alarm: " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ], $msg );
echo ( " Alerting for " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ] . " \n " );
log_event ( ucfirst ( $class ) . ' ' . $sensor [ 'sensor_descr' ] . " under threshold: " . $sensor_value . " $unit (< " . $sensor [ 'sensor_limit_low' ] . " $unit ) " , $device , $class , $sensor [ 'sensor_id' ]);
}
2014-06-14 23:05:31 +01:00
else if ( $sensor [ 'sensor_limit' ] != " " && $sensor [ 'sensor_current' ] < $sensor [ 'sensor_limit' ] && $sensor_value >= $sensor [ 'sensor_limit' ] && $sensor [ 'sensor_alert' ] == 1 )
2011-04-13 14:00:12 +00:00
{
2012-04-26 12:11:03 +00:00
$msg = ucfirst ( $class ) . " Alarm: " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ] . " is over threshold: " . $sensor_value . " $unit (> " . $sensor [ 'sensor_limit' ] . " $unit ) " ;
2011-04-13 14:00:12 +00:00
notify ( $device , ucfirst ( $class ) . " Alarm: " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ], $msg );
echo ( " Alerting for " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ] . " \n " );
log_event ( ucfirst ( $class ) . ' ' . $sensor [ 'sensor_descr' ] . " above threshold: " . $sensor_value . " $unit (> " . $sensor [ 'sensor_limit' ] . " $unit ) " , $device , $class , $sensor [ 'sensor_id' ]);
}
2012-05-02 15:06:12 +00:00
if ( $config [ 'memcached' ][ 'enable' ])
{
$memcache -> set ( 'sensor-' . $sensor [ 'sensor_id' ] . '-value' , $sensor_value );
} else {
dbUpdate ( array ( 'sensor_current' => $sensor_value ), 'sensors' , '`sensor_class` = ? AND `sensor_id` = ?' , array ( $class , $sensor [ 'sensor_id' ]));
}
2011-04-13 14:00:12 +00:00
}
}
2011-09-20 14:29:04 +00:00
function poll_device ( $device , $options )
{
2014-04-28 20:14:06 +10:00
global $config , $device , $polled_devices , $db_stats , $memcache ;
2011-09-20 14:29:04 +00:00
$attribs = get_dev_attribs ( $device [ 'device_id' ]);
$status = 0 ; unset ( $array );
$device_start = utime (); // Start counting device poll time
echo ( $device [ 'hostname' ] . " " . $device [ 'device_id' ] . " " . $device [ 'os' ] . " " );
if ( $config [ 'os' ][ $device [ 'os' ]][ 'group' ])
{
$device [ 'os_group' ] = $config [ 'os' ][ $device [ 'os' ]][ 'group' ];
echo ( " ( " . $device [ 'os_group' ] . " ) " );
}
echo ( " \n " );
unset ( $poll_update ); unset ( $poll_update_query ); unset ( $poll_separator );
$poll_update_array = array ();
$host_rrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ];
if ( ! is_dir ( $host_rrd )) { mkdir ( $host_rrd ); echo ( " Created directory : $host_rrd\n " ); }
2014-09-29 23:03:59 +01:00
$ping_response = isPingable ( $device [ 'hostname' ], $device [ 'device_id' ]);
$device [ 'pingable' ] = $ping_response [ 'result' ];
$ping_time = $ping_response [ 'last_ping_timetaken' ];
2014-10-16 23:03:58 +01:00
$response = array ();
2011-09-20 14:29:04 +00:00
if ( $device [ 'pingable' ])
{
$device [ 'snmpable' ] = isSNMPable ( $device );
if ( $device [ 'snmpable' ])
{
$status = " 1 " ;
} else {
echo ( " SNMP Unreachable " );
$status = " 0 " ;
2014-10-16 23:03:58 +01:00
$response [ 'status' ] = 'snmp' ;
2011-09-20 14:29:04 +00:00
}
} else {
echo ( " Unpingable " );
$status = " 0 " ;
2014-10-16 23:03:58 +01:00
$response [ 'status' ] = 'icmp' ;
2011-09-20 14:29:04 +00:00
}
if ( $device [ 'status' ] != $status )
{
$poll_update .= $poll_separator . " `status` = ' $status ' " ;
$poll_separator = " , " ;
dbUpdate ( array ( 'status' => $status ), 'devices' , 'device_id=?' , array ( $device [ 'device_id' ]));
dbInsert ( array ( 'importance' => '0' , 'device_id' => $device [ 'device_id' ], 'message' => " Device is " . ( $status == '1' ? 'up' : 'down' )), 'alerts' );
log_event ( 'Device status changed to ' . ( $status == '1' ? 'Up' : 'Down' ), $device , ( $status == '1' ? 'up' : 'down' ));
2014-10-16 23:03:58 +01:00
notify ( $device , " Device " . ( $status == '1' ? 'Up' : 'Down' ) . " : " . $device [ 'hostname' ], " Device " . ( $status == '1' ? 'up' : 'down' ) . " : " . $device [ 'hostname' ] . " " . $response [ 'status' ]);
2011-09-20 14:29:04 +00:00
}
if ( $status == " 1 " )
{
$graphs = array ();
$oldgraphs = array ();
if ( $options [ 'm' ])
{
2012-05-02 22:02:30 +00:00
foreach ( explode ( " , " , $options [ 'm' ]) as $module )
2011-09-20 14:29:04 +00:00
{
2012-04-27 17:18:26 +00:00
if ( is_file ( " includes/polling/ " . $module . " .inc.php " ))
{
include ( " includes/polling/ " . $module . " .inc.php " );
}
2011-09-20 14:29:04 +00:00
}
} else {
2011-10-04 09:10:21 +00:00
foreach ( $config [ 'poller_modules' ] as $module => $module_status )
2011-09-20 14:29:04 +00:00
{
if ( $attribs [ 'poll_' . $module ] || ( $module_status && ! isset ( $attribs [ 'poll_' . $module ])))
{
include ( 'includes/polling/' . $module . '.inc.php' );
} elseif ( isset ( $attribs [ 'poll_' . $module ]) && $attribs [ 'poll_' . $module ] == " 0 " ) {
echo ( " Module [ $module ] disabled on host. \n " );
} else {
echo ( " Module [ $module ] disabled globally. \n " );
}
}
}
if ( ! $options [ 'm' ])
{
2012-05-25 12:24:34 +00: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.
2011-09-20 14:29:04 +00:00
foreach ( dbFetch ( " SELECT `graph` FROM `device_graphs` WHERE `device_id` = ? " , array ( $device [ 'device_id' ])) as $graph )
{
if ( ! isset ( $graphs [ $graph [ " graph " ]]))
{
dbDelete ( 'device_graphs' , " `device_id` = ? AND `graph` = ? " , array ( $device [ 'device_id' ], $graph [ " graph " ]));
} else {
$oldgraphs [ $graph [ " graph " ]] = TRUE ;
}
}
foreach ( $graphs as $graph => $value )
{
if ( ! isset ( $oldgraphs [ $graph ]))
{
2012-04-09 17:19:59 +00:00
echo ( " + " );
2011-09-20 14:29:04 +00:00
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'graph' => $graph ), 'device_graphs' );
}
2012-04-09 17:19:59 +00:00
echo ( $graph . " " );
2011-09-20 14:29:04 +00:00
}
}
$device_end = utime (); $device_run = $device_end - $device_start ; $device_time = substr ( $device_run , 0 , 5 );
2014-09-29 23:03:59 +01:00
// Poller performance rrd
2014-09-21 20:47:32 +01:00
$poller_rrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " /poller-perf.rrd " ;
if ( ! is_file ( $poller_rrd ))
2014-08-20 16:22:21 +01:00
{
2014-09-21 20:47:32 +01:00
rrdtool_create ( $poller_rrd , " DS:poller:GAUGE:600:0:U " . $config [ 'rrd_rra' ]);
2014-08-20 16:22:21 +01:00
}
if ( ! empty ( $device_time ))
{
2014-09-29 23:03:59 +01:00
rrdtool_update ( $poller_rrd , " N: $device_time " );
}
// Ping response rrd
$ping_rrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " /ping-perf.rrd " ;
if ( ! is_file ( $ping_rrd ))
{
rrdtool_create ( $ping_rrd , " DS:ping:GAUGE:600:0:65535 " . $config [ 'rrd_rra' ]);
}
if ( ! empty ( $ping_time ))
{
rrdtool_update ( $ping_rrd , " N: $ping_time " );
2014-08-20 16:22:21 +01:00
}
2011-09-20 14:29:04 +00:00
$update_array [ 'last_polled' ] = array ( 'NOW()' );
$update_array [ 'last_polled_timetaken' ] = $device_time ;
2014-09-29 23:03:59 +01:00
$update_array [ 'last_ping' ] = array ( 'NOW()' );
$update_array [ 'last_ping_timetaken' ] = $ping_time ;
2011-09-20 14:29:04 +00:00
#echo("$device_end - $device_start; $device_time $device_run");
echo ( " Polled in $device_time seconds \n " );
if ( $debug ) { echo ( " Updating " . $device [ 'hostname' ] . " - " . print_r ( $update_array ) . " \n " ); }
$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?)
}
}
2011-04-13 14:00:12 +00:00
?>