2015-06-18 22:20:50 +01:00
|
|
|
<?php
|
2011-04-13 14:00:12 +00:00
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2016-08-28 12:32:58 -05:00
|
|
|
function poll_sensor($device, $class, $unit)
|
|
|
|
{
|
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
|
|
|
|
2015-07-13 20:10:26 +02: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') {
|
|
|
|
$misc_sensors[] = $sensor;
|
|
|
|
} 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
|
|
|
|
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
|
|
|
}
|
2015-07-13 20:10:26 +02:00
|
|
|
|
2016-10-11 17:34:09 +01:00
|
|
|
foreach ($all_sensors as $sensor) {
|
|
|
|
$sensor_value = $sensor['new_value'];
|
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);
|
2016-07-07 01:33:43 -05:00
|
|
|
$rrd_def = 'DS:sensor:GAUGE:600:-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
|
|
|
|
2015-07-13 20:10:26 +02:00
|
|
|
// FIXME also warn when crossing WARN level!!
|
2016-05-06 10:45:49 -05:00
|
|
|
if ($sensor['sensor_limit_low'] != '' && $sensor['sensor_current'] > $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";
|
|
|
|
log_event(ucfirst($class).' '.$sensor['sensor_descr'].' under threshold: '.$sensor_value." $unit (< ".$sensor['sensor_limit_low']." $unit)", $device, $class, $sensor['sensor_id']);
|
2016-08-28 12:32:58 -05:00
|
|
|
} elseif ($sensor['sensor_limit'] != '' && $sensor['sensor_current'] < $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";
|
|
|
|
log_event(ucfirst($class).' '.$sensor['sensor_descr'].' above threshold: '.$sensor_value." $unit (> ".$sensor['sensor_limit']." $unit)", $device, $class, $sensor['sensor_id']);
|
|
|
|
}
|
2016-02-27 15:29:11 +01:00
|
|
|
if ($sensor['sensor_class'] == 'state' && $sensor['sensor_current'] != $sensor_value) {
|
|
|
|
log_event($class . ' sensor has changed from ' . $sensor['sensor_current'] . ' to ' . $sensor_value, $device, $class, $sensor['sensor_id']);
|
|
|
|
}
|
|
|
|
dbUpdate(array('sensor_current' => $sensor_value, 'sensor_prev' => $sensor['sensor_current'], 'lastupdate' => array('NOW()')), 'sensors', '`sensor_class` = ? AND `sensor_id` = ?', array($class,$sensor['sensor_id']));
|
2016-10-11 17:34:09 +01:00
|
|
|
}
|
2015-07-13 20:10:26 +02:00
|
|
|
}//end poll_sensor()
|
2011-04-13 14:00:12 +00:00
|
|
|
|
2016-08-28 12:32:58 -05:00
|
|
|
function poll_device($device, $options)
|
|
|
|
{
|
2016-11-23 00:57:19 -06:00
|
|
|
global $config, $device, $polled_devices, $memcache;
|
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
|
|
|
$status = 0;
|
|
|
|
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);
|
|
|
|
|
|
|
|
if (!empty($ip) && $ip != inet6_ntop($device['ip'])) {
|
|
|
|
log_event('Device IP changed to '.$ip, $device, 'system');
|
|
|
|
$db_ip = inet_pton($ip);
|
|
|
|
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
|
|
|
|
2015-09-22 02:25:35 +02:00
|
|
|
$address_family = snmpTransportToAddressFamily($device['transport']);
|
|
|
|
|
2015-10-17 19:11:21 +00:00
|
|
|
$ping_response = isPingable($device['hostname'], $address_family, $attribs);
|
2015-06-22 21:55:31 +01:00
|
|
|
|
2015-07-13 20:10:26 +02:00
|
|
|
$device_perf = $ping_response['db'];
|
2015-06-22 21:55:31 +01:00
|
|
|
$device_perf['device_id'] = $device['device_id'];
|
|
|
|
$device_perf['timestamp'] = array('NOW()');
|
2015-10-17 18:51:14 +00:00
|
|
|
if (can_ping_device($attribs) === true && is_array($device_perf)) {
|
2015-06-22 21:55:31 +01:00
|
|
|
dbInsert($device_perf, 'device_perf');
|
|
|
|
}
|
|
|
|
|
2015-07-13 20:10:26 +02:00
|
|
|
$device['pingable'] = $ping_response['result'];
|
|
|
|
$ping_time = $ping_response['last_ping_timetaken'];
|
|
|
|
$response = array();
|
|
|
|
$status_reason = '';
|
|
|
|
if ($device['pingable']) {
|
|
|
|
$device['snmpable'] = isSNMPable($device);
|
|
|
|
if ($device['snmpable']) {
|
|
|
|
$status = '1';
|
|
|
|
$response['status_reason'] = '';
|
2016-08-28 12:32:58 -05:00
|
|
|
} else {
|
2015-07-13 20:10:26 +02:00
|
|
|
echo 'SNMP Unreachable';
|
|
|
|
$status = '0';
|
|
|
|
$response['status_reason'] = 'snmp';
|
|
|
|
}
|
2016-08-28 12:32:58 -05:00
|
|
|
} else {
|
2015-07-13 20:10:26 +02:00
|
|
|
echo 'Unpingable';
|
|
|
|
$status = '0';
|
|
|
|
$response['status_reason'] = 'icmp';
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($device['status'] != $status) {
|
|
|
|
$poll_update .= $poll_separator."`status` = '$status'";
|
|
|
|
$poll_separator = ', ';
|
2015-06-22 21:55:31 +01:00
|
|
|
|
2015-07-13 20:10:26 +02:00
|
|
|
dbUpdate(array('status' => $status, 'status_reason' => $response['status_reason']), 'devices', 'device_id=?', array($device['device_id']));
|
|
|
|
|
2016-02-20 16:09:37 +00:00
|
|
|
log_event('Device status changed to '.($status == '1' ? 'Up' : 'Down'). ' from ' . $response['status_reason'] . ' check.', $device, ($status == '1' ? 'up' : 'down'));
|
2011-09-20 14:29:04 +00:00
|
|
|
}
|
2015-07-13 20:10:26 +02:00
|
|
|
|
|
|
|
if ($status == '1') {
|
|
|
|
$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]))) {
|
2016-06-26 14:38:33 +01:00
|
|
|
$module_start = 0;
|
|
|
|
$module_time = 0;
|
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;
|
2016-11-23 00:57:19 -06:00
|
|
|
printf("\n>> Runtime for poller module '%s': %.4f seconds\n", $module, $module_time);
|
2016-06-24 15:32:19 +01:00
|
|
|
echo "#### Unload poller module $module ####\n\n";
|
|
|
|
|
|
|
|
// save per-module poller stats
|
|
|
|
$tags = array(
|
|
|
|
'module' => $module,
|
|
|
|
'rrd_def' => 'DS:poller:GAUGE:600:0:U',
|
|
|
|
'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
|
|
|
}
|
|
|
|
} 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-08 13:33:32 +01:00
|
|
|
$device_end = microtime(true);
|
2015-07-13 20:10:26 +02:00
|
|
|
$device_run = ($device_end - $device_start);
|
|
|
|
$device_time = substr($device_run, 0, 5);
|
|
|
|
|
2016-01-10 19:31:39 +10:00
|
|
|
// Poller performance
|
2015-07-13 20:10:26 +02:00
|
|
|
if (!empty($device_time)) {
|
2016-01-10 19:31:39 +10:00
|
|
|
$tags = array(
|
|
|
|
'rrd_def' => 'DS:poller:GAUGE:600:0:U',
|
2016-01-26 20:20:42 +10:00
|
|
|
'module' => 'ALL',
|
2016-01-10 19:31:39 +10:00
|
|
|
);
|
2015-08-18 16:26:55 +00:00
|
|
|
$fields = array(
|
|
|
|
'poller' => $device_time,
|
|
|
|
);
|
2016-07-07 01:33:43 -05:00
|
|
|
|
2016-01-10 19:31:39 +10:00
|
|
|
data_update($device, 'poller-perf', $tags, $fields);
|
2011-09-20 14:29:04 +00:00
|
|
|
}
|
|
|
|
|
2016-01-10 19:31:39 +10:00
|
|
|
// Ping response
|
|
|
|
if (can_ping_device($attribs) === true && !empty($ping_time)) {
|
|
|
|
$tags = array(
|
|
|
|
'rrd_def' => 'DS:ping:GAUGE:600:0:65535',
|
|
|
|
);
|
|
|
|
$fields = array(
|
|
|
|
'ping' => $ping_time,
|
|
|
|
);
|
2015-10-17 18:49:01 +00:00
|
|
|
|
|
|
|
$update_array['last_ping'] = array('NOW()');
|
|
|
|
$update_array['last_ping_timetaken'] = $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
|
|
|
}
|
|
|
|
|
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";
|
|
|
|
|
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
|
|
|
|
|
|
|
|
2016-08-28 12:32:58 -05:00
|
|
|
function poll_mib_def($device, $mib_name_table, $mib_subdir, $mib_oids, $mib_graphs, &$graphs)
|
|
|
|
{
|
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
|
|
|
|
2015-07-13 20:10:26 +02:00
|
|
|
if (stristr($mib_name_table, 'UBNT')) {
|
|
|
|
list($mib,) = explode(':', $mib_name_table, 2);
|
2016-07-07 01:33:43 -05:00
|
|
|
$measurement_name = strtolower($mib);
|
2016-08-28 12:32:58 -05:00
|
|
|
} else {
|
2015-07-13 20:10:26 +02:00
|
|
|
list($mib,$file) = explode(':', $mib_name_table, 2);
|
2016-07-07 01:33:43 -05:00
|
|
|
$measurement_name = strtolower($file);
|
2015-07-13 20:10:26 +02:00
|
|
|
}
|
2011-09-20 14:29:04 +00:00
|
|
|
|
2016-07-07 01:33:43 -05:00
|
|
|
$rrd_def = array();
|
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 (strlen($oiddsname) > 19) {
|
2016-11-20 05:12:25 -06:00
|
|
|
$oiddsname = substr($oiddsname, 0, 19);
|
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 (empty($oiddsopts)) {
|
|
|
|
$oiddsopts = '600:U:100000000000';
|
|
|
|
}
|
2015-04-03 18:59:58 +01:00
|
|
|
|
2016-07-07 01:33:43 -05:00
|
|
|
$rrd_def[] = 'DS:'.$oiddsname.':'.$oiddstype.':'.$oiddsopts;
|
2015-05-16 20:39:24 -03: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');
|
2016-08-28 12:32:58 -05:00
|
|
|
data_update($device, $measurement_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'];
|
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
|
|
|
|
|
|
|
/**
|
|
|
|
* @param $device
|
|
|
|
* @return int|null
|
|
|
|
*/
|
|
|
|
function get_device_oid_limit($device)
|
|
|
|
{
|
|
|
|
global $config;
|
|
|
|
|
|
|
|
$max_oid = $device['snmp_max_oid'];
|
|
|
|
|
|
|
|
if (isset($max_oid) && $max_oid > 0) {
|
|
|
|
return $max_oid;
|
|
|
|
} elseif (isset($config['snmp']['max_oid']) && $config['snmp']['max_oid'] > 0) {
|
|
|
|
return $config['snmp']['max_oid'];
|
|
|
|
} else {
|
|
|
|
return 10;
|
|
|
|
}
|
|
|
|
}
|