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 \
2011-04-20 09:59:48 +00:00
DS:sensor:GAUGE:600:-20000:20000 \
RRA:AVERAGE:0.5:1:1200 \
RRA:AVERAGE:0.5:12:2400 \
2011-04-26 15:07:52 +00:00
RRA:AVERAGE:0.5:288:1200 \
2011-04-20 09:59:48 +00:00
RRA:MAX:0.5:12:2400 \
2011-04-26 15:07:52 +00:00
RRA:MAX:0.5:288:1200 \
2011-04-20 09:59:48 +00:00
RRA:MIN:0.5:12:2400 \
2011-04-26 15:07:52 +00:00
RRA:MIN:0.5:288:1200" );
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' ])
{
$msg = ucfirst ( $class ) . " Alarm: " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ] . " is under threshold: " . $sensor_value . " $unit (< " . $sensor [ 'sensor_limit' ];
$msg .= " $unit ) at " . date ( $config [ 'timestamp_format' ]);
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' ])
{
$msg = ucfirst ( $class ) . " Alarm: " . $device [ 'hostname' ] . " " . $sensor [ 'sensor_descr' ] . " is over threshold: " . $sensor_value . " $unit (> " . $sensor [ 'sensor_limit' ];
$msg .= " $unit ) at " . date ( $config [ 'timestamp_format' ]);
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 )
{
global $config , $device , $polled_devices , $db_stats ;
$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' ));
notify ( $device , "Device " . ( $status == '1' ? 'Up' : 'Down' ) . ": " . $device [ 'hostname' ], "Device " . ( $status == '1' ? 'up' : 'down' ) . ": " . $device [ 'hostname' ] . " at " . date ( $config [ 'timestamp_format' ]));
}
if ( $status == "1" )
{
$graphs = array ();
$oldgraphs = array ();
if ( $options [ 'm' ])
{
if ( is_file ( "includes/polling/" . $options [ 'm' ] . ".inc.php" ))
{
include ( "includes/polling/" . $options [ 'm' ] . ".inc.php" );
}
} else {
foreach ( $config [ 'poller_modules' ] as $module => $module_status )
{
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 ]))
{
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'graph' => $graph ), 'device_graphs' );
}
}
}
$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?)
}
$polled_devices ++ ;
}
2011-04-13 14:00:12 +00:00
?>