mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
More mibs needed from http://www.ieee802.org/1/files/public/MIBs/ Updated mib names Updated poller function and siklu call Updates for Siklu detection Removed one graph not supported Added rfOperationalFrequency graph Removed modulation graph Work on siklu support Siklu packets supports Last updates for Siklu support Updated more siklu support
334 lines
11 KiB
PHP
334 lines
11 KiB
PHP
<?php
|
|
|
|
function poll_sensor($device, $class, $unit)
|
|
{
|
|
global $config, $memcache, $agent_sensors;
|
|
|
|
foreach (dbFetchRows("SELECT * FROM `sensors` WHERE `sensor_class` = ? AND `device_id` = ?", array($class, $device['device_id'])) as $sensor)
|
|
{
|
|
echo("Checking (" . $sensor['poller_type'] . ") $class " . $sensor['sensor_descr'] . "... ");
|
|
$sensor_value = '';
|
|
|
|
if ($sensor['poller_type'] == "snmp")
|
|
{
|
|
if ($device['os'] == 'siklu') {
|
|
$mib = ":RADIO-BRIDGE-MIB";
|
|
}
|
|
if ($class == "temperature")
|
|
{
|
|
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$mib")));
|
|
|
|
if (is_numeric($sensor_value) && $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 = trim(str_replace("\"", "", snmp_get($device, $sensor['sensor_oid'], "-OUqnv", "SNMPv2-MIB$mib")));
|
|
}
|
|
unset($mib);
|
|
} 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";
|
|
continue;
|
|
}
|
|
} else if ($sensor['poller_type'] == "ipmi")
|
|
{
|
|
echo " already polled.\n"; # ipmi should probably move here from the ipmi poller file (FIXME)
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
echo "unknown poller type!\n";
|
|
continue;
|
|
}
|
|
|
|
if ($sensor_value == -32768) { echo("Invalid (-32768) "); $sensor_value = 0; }
|
|
|
|
if ($sensor['sensor_divisor']) { $sensor_value = $sensor_value / $sensor['sensor_divisor']; }
|
|
if ($sensor['sensor_multiplier']) { $sensor_value = $sensor_value * $sensor['sensor_multiplier']; }
|
|
|
|
$rrd_file = get_sensor_rrd($device, $sensor);
|
|
|
|
if (!is_file($rrd_file))
|
|
{
|
|
rrdtool_create($rrd_file,"--step 300 \
|
|
DS:sensor:GAUGE:600:-20000:20000 ".$config['rrd_rra']);
|
|
}
|
|
|
|
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'] && $sensor['sensor_alert'] == 1)
|
|
{
|
|
$msg = ucfirst($class) . " Alarm: " . $device['hostname'] . " " . $sensor['sensor_descr'] . " is under threshold: " . $sensor_value . "$unit (< " . $sensor['sensor_limit'] . "$unit)";
|
|
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'] && $sensor['sensor_alert'] == 1)
|
|
{
|
|
$msg = ucfirst($class) . " Alarm: " . $device['hostname'] . " " . $sensor['sensor_descr'] . " is over threshold: " . $sensor_value . "$unit (> " . $sensor['sensor_limit'] . "$unit)";
|
|
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']);
|
|
}
|
|
|
|
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']));
|
|
}
|
|
}
|
|
}
|
|
|
|
function poll_device($device, $options)
|
|
{
|
|
global $config, $device, $polled_devices, $db_stats, $memcache;
|
|
|
|
$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"); }
|
|
|
|
$ping_response = isPingable($device['hostname'],$device['device_id']);
|
|
$device['pingable'] = $ping_response['result'];
|
|
$ping_time = $ping_response['last_ping_timetaken'];
|
|
$response = array();
|
|
if ($device['pingable'])
|
|
{
|
|
$device['snmpable'] = isSNMPable($device);
|
|
if ($device['snmpable'])
|
|
{
|
|
$status = "1";
|
|
} else {
|
|
echo("SNMP Unreachable");
|
|
$status = "0";
|
|
$response['status'] = 'snmp';
|
|
}
|
|
} else {
|
|
echo("Unpingable");
|
|
$status = "0";
|
|
$response['status'] = 'icmp';
|
|
}
|
|
|
|
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'] . " " . $response['status']);
|
|
}
|
|
|
|
if ($status == "1")
|
|
{
|
|
$graphs = array();
|
|
$oldgraphs = array();
|
|
|
|
if ($options['m'])
|
|
{
|
|
foreach (explode(",", $options['m']) as $module)
|
|
{
|
|
if (is_file("includes/polling/".$module.".inc.php"))
|
|
{
|
|
include("includes/polling/".$module.".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]))
|
|
{
|
|
echo("+");
|
|
dbInsert(array('device_id' => $device['device_id'], 'graph' => $graph), 'device_graphs');
|
|
}
|
|
echo($graph." ");
|
|
}
|
|
}
|
|
|
|
$device_end = utime(); $device_run = $device_end - $device_start; $device_time = substr($device_run, 0, 5);
|
|
|
|
// Poller performance rrd
|
|
$poller_rrd = $config['rrd_dir'] . "/" . $device['hostname'] . "/poller-perf.rrd";
|
|
if (!is_file($poller_rrd))
|
|
{
|
|
rrdtool_create ($poller_rrd, "DS:poller:GAUGE:600:0:U ".$config['rrd_rra']);
|
|
}
|
|
if(!empty($device_time))
|
|
{
|
|
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");
|
|
}
|
|
|
|
$update_array['last_polled'] = array('NOW()');
|
|
$update_array['last_polled_timetaken'] = $device_time;
|
|
$update_array['last_ping'] = array('NOW()');
|
|
$update_array['last_ping_timetaken'] = $ping_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?)
|
|
}
|
|
}
|
|
|
|
function poll_mib_def($device, $mib_name_table, $mib_subdir, $mib_oids, $mib_graphs, &$graphs, $rrd_options)
|
|
{
|
|
|
|
global $config;
|
|
|
|
echo("This is mag_poll_mib_def Processing\n");
|
|
$mib = NULL;
|
|
|
|
if (stristr($mib_name_table, "UBNT")) {
|
|
list($mib,) = explode(":", $mib_name_table, 2);
|
|
//$mib_dirs = mib_dirs($mib_subdir);
|
|
$rrd_file = strtolower(safename($mib)).'.rrd';
|
|
} else {
|
|
list($mib,$file) = explode(":", $mib_name_table, 2);
|
|
$rrd_file = strtolower(safename($file)).'.rrd';
|
|
}
|
|
|
|
$rrdcreate = '--step 300 ';
|
|
$oidglist = array();
|
|
foreach ($mib_oids as $oid => $param)
|
|
{
|
|
$oidindex = $param[0];
|
|
$oiddsname = $param[1];
|
|
$oiddsdesc = $param[2];
|
|
$oiddstype = $param[3];
|
|
$oiddsopts = $param[4];
|
|
|
|
if (strlen($oiddsname) > 19) { $oiddsname = truncate($oiddsname, 19, ''); }
|
|
|
|
if (empty($oiddsopts)) {
|
|
$rrd_options = "600:U:100000000000";
|
|
}
|
|
|
|
$rrdcreate .= ' DS:'.$oiddsname.':'.$oiddstype.':'.$oiddsopts;
|
|
|
|
if ($oidindex != '')
|
|
{
|
|
$fulloid = $oid.'.'.$oidindex;
|
|
} else {
|
|
$fulloid = $oid;
|
|
}
|
|
|
|
// Add to oid GET list
|
|
$oidglist[] = $fulloid;
|
|
|
|
}
|
|
|
|
// Implde for LibreNMS Version
|
|
$oidilist = implode(" ",$oidglist);
|
|
|
|
$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;
|
|
}
|
|
|
|
$rrdupdate = 'N';
|
|
foreach ($oidglist as $fulloid)
|
|
{
|
|
list($splitoid, $splitindex) = explode(".", $fulloid, 2);
|
|
if (is_numeric($snmpdata[$splitindex][$splitoid]))
|
|
{
|
|
$rrdupdate .= ':'.$snmpdata[$splitindex][$splitoid];
|
|
} else {
|
|
$rrdupdate .= ':U';
|
|
}
|
|
}
|
|
|
|
$rrdfilename = $config['rrd_dir']."/".$device['hostname']."/".$rrd_file;
|
|
|
|
if (!is_file($rrdfilename))
|
|
{
|
|
rrdtool_create($rrdfilename, $rrdcreate." ".$config['rrd_rra']);
|
|
}
|
|
rrdtool_update($rrdfilename, $rrdupdate);
|
|
|
|
foreach ($mib_graphs as $graphtoenable)
|
|
{
|
|
$graphs[$graphtoenable] = TRUE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
?>
|