2011-04-13 14:00:12 +00:00
< ? php
function poll_sensor ( $device , $class , $unit )
{
global $config ;
2011-05-16 21:56:01 +00:00
foreach ( dbFetchRows ( " SELECT * FROM `sensors` WHERE `sensor_class` = ? AND `device_id` = ? AND `poller_type` = 'snmp' " , array ( $class , $device [ 'device_id' ])) as $sensor )
2011-04-13 14:00:12 +00:00
{
echo ( " Checking $class " . $sensor [ 'sensor_descr' ] . " ... " );
2011-09-20 14:22:34 +00:00
if ( $class == " temperature " )
2011-09-20 09:55:11 +00:00
{
2011-05-16 20:33:51 +00:00
for ( $i = 0 ; $i < 5 ; $i ++ ) # Try 5 times to get a valid temp reading
{
if ( $debug ) echo ( " Attempt $i " );
$sensor_value = snmp_get ( $device , $sensor [ 'sensor_oid' ], " -OUqnv " , " SNMPv2-MIB " );
$sensor_value = trim ( str_replace ( " \" " , " " , $sensor_value ));
if ( $sensor_value != 9999 ) break ; # TME sometimes sends 999.9 when it is right in the middle of an update;
sleep ( 1 ); # Give the TME some time to reset
}
} else {
$sensor_value = snmp_get ( $device , $sensor [ 'sensor_oid' ], " -OUqnv " , " SNMPv2-MIB " );
}
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 );
#$rrd_file = $config['rrd_dir']."/".$device['hostname']."/".safename("sensor-".$sensor['sensor_class']."-".$sensor['sensor_type']."-".$sensor['sensor_index'] . ".rrd");
2011-09-20 09:55:11 +00:00
## FIXME - sensor name format change 2011/04/26 - remove this in $amount_of_time.
2011-04-26 15:07:52 +00:00
## We don't want to reduce performance forever because douchebags don't svn up!
$old_rrd_file = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " / " . safename ( " $class - " . $sensor [ 'sensor_descr' ] . " .rrd " );
$old_rrd_file_b = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " / " . safename ( " $class - " . $sensor [ 'sensor_index' ] . " .rrd " );
2011-09-20 09:55:11 +00:00
if ( is_file ( $old_rrd_file ) && is_file ( $old_rrd_file_b ))
{
rename ( $old_rrd_file , $rrd_file );
2011-04-26 15:07:52 +00:00
unlink ( $old_rrd_file_b );
} elseif ( is_file ( $old_rrd_file )) {
rename ( $old_rrd_file , $rrd_file );
} elseif ( is_file ( $old_rrd_file_b )) {
rename ( $old_rrd_file_b , $rrd_file );
}
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 " );
# FIXME also warn when crossing WARN level!!
if ( $sensor [ 'sensor_limit_low' ] != " " && $sensor [ 'sensor_current' ] > $sensor [ 'sensor_limit_low' ] && $sensor_value <= $sensor [ 'sensor_limit_low' ])
{
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' ]);
}
else if ( $sensor [ 'sensor_limit' ] != " " && $sensor [ 'sensor_current' ] < $sensor [ 'sensor_limit' ] && $sensor_value >= $sensor [ 'sensor_limit' ])
{
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' ]);
}
2011-05-16 21:56:01 +00:00
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 )
{
2012-04-04 18:10:45 +00: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 " ); }
$device [ 'pingable' ] = isPingable ( $device [ 'hostname' ]);
if ( $device [ 'pingable' ])
{
$device [ 'snmpable' ] = isSNMPable ( $device );
if ( $device [ 'snmpable' ])
{
$status = " 1 " ;
} else {
echo ( " SNMP Unreachable " );
$status = " 0 " ;
}
} else {
echo ( " Unpingable " );
$status = " 0 " ;
}
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' ));
2012-04-26 12:11:03 +00:00
notify ( $device , " Device " . ( $status == '1' ? 'Up' : 'Down' ) . " : " . $device [ 'hostname' ], " Device " . ( $status == '1' ? 'up' : 'down' ) . " : " . $device [ 'hostname' ]);
2011-09-20 14:29:04 +00:00
}
if ( $status == " 1 " )
{
$graphs = array ();
$oldgraphs = array ();
if ( $options [ 'm' ])
{
2012-04-27 17:18:26 +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' ])
{
## 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 " ]]))
{
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 );
$update_array [ 'last_polled' ] = array ( 'NOW()' );
$update_array [ 'last_polled_timetaken' ] = $device_time ;
#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
?>