$states = array(array($state_index_id, 'unknown', 0, 0, 3), array($state_index_id, 'ready', 1, 1, 0), array($state_index_id, 'failed', 1, 2, 2), array($state_index_id, 'online', 1, 3, 1), array($state_index_id, 'offline', 1, 4, 2), array($state_index_id, 'degraded', 1, 6, 2), array($state_index_id, 'verifying', 1, 7, 1), array($state_index_id, 'resynching', 1, 15, 1), array($state_index_id, 'regenerating', 1, 16, 1), array($state_index_id, 'failedRedundancy', 1, 18, 2), array($state_index_id, 'rebuilding', 1, 24, 1), array($state_index_id, 'formatting', 1, 26, 1), array($state_index_id, 'reconstructing', 1, 32, 1), array($state_index_id, 'initializing', 1, 35, 1), array($state_index_id, 'backgroundInit', 1, 36, 1), array($state_index_id, 'permanentlyDegraded', 1, 52, 2)); } elseif ($state_name == 'batteryState') { $states = array(array($state_index_id, 'ready', 0, 1, 0), array($state_index_id, 'failed', 1, 2, 2), array($state_index_id, 'degraded', 1, 6, 2), array($state_index_id, 'reconditioning', 1, 7, 1), array($state_index_id, 'high', 1, 9, 1), array($state_index_id, 'low', 1, 10, 1), array($state_index_id, 'charging', 1, 12, 1), array($state_index_id, 'missing', 1, 21, 2), array($state_index_id, 'learning', 1, 36, 1)); } foreach ($states as $value) { $insert = array('state_index_id' => $value[0], 'state_descr' => $value[1], 'state_draw_graph' => $value[2], 'state_value' => $value[3], 'state_generic_value' => $value[4]); dbInsert($insert, 'state_translations'); } } foreach ($temp as $index => $entry) { if (strpos($index, '54.') === false) { //Because Dell is buggy if ($state_name == 'intrusionStatus') { $descr = $tablevalue[3]; } elseif ($state_name == 'batteryState') { $descr = str_replace('"', "", snmp_get($device, "batteryConnectionControllerName." . $index . "", "-Ovqn", $tablevalue[4])) . ' - ' . $temp[$index][$tablevalue[3]]; } elseif ($state_name == 'arrayDiskState') { $descr = str_replace('"', "", snmp_get($device, "arrayDiskEnclosureConnectionEnclosureName." . $index . "", "-Ovqn", $tablevalue[4])) . ' - ' . $temp[$index][$tablevalue[3]]; } else { $descr = clean($temp[$index][$tablevalue[3]]); // Use clean as virtualDiskDeviceName is user defined } //Discover Sensors discover_sensor($valid['sensor'], 'state', $device, $cur_oid . $index, $index, $state_name, $descr, '1', '1', null, null, null, null, $temp[$index][$tablevalue[2]], 'snmp', $index); //Create Sensor To State Index create_sensor_to_state_index($device, $state_name, $index); } } } } }
/** * Helper function to improve readability * Can't use mib based polling, because the snmp implentation and mibs are terrible * * @param (device) array - device array * @param (sensor) array(id, oid, type, descr, descr_oid, min, max, divisor) */ function avtech_add_sensor($device, $sensor) { global $valid; // set the id, must be unique if (isset($sensor['id'])) { $id = $sensor['id']; } else { d_echo('Error: No id set for this sensor' . "\n"); return false; } d_echo('Sensor id: ' . $id . "\n"); // set the sensor oid if ($sensor['oid']) { $oid = $sensor['oid']; } else { d_echo('Error: No oid set for this sensor' . "\n"); return false; } d_echo('Sensor oid: ' . $oid . "\n"); // get the sensor value $value = snmp_get($device, $oid, '-OvQ'); // if the sensor doesn't exist abort if ($value === false || $type == 'temperature' && $value == 0) { //issue unfortunately some non-existant sensors return 0 d_echo('Error: sensor returned no data, skipping' . "\n"); return false; } d_echo('Sensor value: ' . $value . "\n"); // get the type $type = $sensor['type'] ? $sensor['type'] : 'temperature'; d_echo('Sensor type: ' . $type . "\n"); $type_name = $device['os']; if ($type == 'switch') { // set up state sensor $type_name .= ucfirst($type); $type = 'state'; $state_index_id = create_state_index($type_name); //Create State Translation if (isset($state_index_id)) { $states = array(array($state_index_id, 'Off', 1, 0, -1), array($state_index_id, 'On', 1, 1, 0)); foreach ($states as $value) { $insert = array('state_index_id' => $value[0], 'state_descr' => $value[1], 'state_draw_graph' => $value[2], 'state_value' => $value[3], 'state_generic_value' => $value[4]); dbInsert($insert, 'state_translations'); } } } // set the description if ($sensor['descr_oid']) { $descr = trim(snmp_get($device, $sensor['descr_oid'], '-OvQ'), '"'); } elseif ($sensor['descr']) { $descr = $sensor['descr']; } else { d_echo('Error: No description set for this sensor' . "\n"); return false; } d_echo('Sensor description: ' . $descr . "\n"); // set divisor if ($sensor['divisor']) { $divisor = $sensor['divisor']; } elseif ($type == 'temperature') { $divisor = 100; } else { $divisor = 1; } d_echo('Sensor divisor: ' . $divisor . "\n"); // set min for alarm if ($sensor['min_oid']) { $min = snmp_get($device, $sensor['min_oid'], '-OvQ') / $divisor; } else { $min = null; } d_echo('Sensor alarm min: ' . $min . "\n"); // set max for alarm if ($sensor['max_oid']) { $max = snmp_get($device, $sensor['max_oid'], '-OvQ') / $divisor; } else { $max = null; } d_echo('Sensor alarm max: ' . $max . "\n"); // add the sensor discover_sensor($valid['sensor'], $type, $device, $oid, $id, $type_name, $descr, $divisor, '1', $min, null, null, $max, $value / $divisor); if ($type == 'state') { create_sensor_to_state_index($device, $type_name, $id); } return true; }
case "9": $descr = "MPG2 codec"; break; case "10": $descr = "WVC1 codec"; break; case "11": $descr = "MPG4 codec"; break; case "12": $descr = "MJPG codec"; break; case "13": $descr = "WMV9 codec"; break; } $value = snmp_get($device, $oid . $codec, '-Oqv'); if (!empty($value)) { $state_index_id = create_state_index($state); if ($state_index_id) { $states = array(array($state_index_id, 'enabled', 1, 2, 0), array($state_index_id, 'disabled', 1, 3, 2)); } foreach ($states as $value) { $insert = array('state_index_id' => $value[0], 'state_descr' => $value[1], 'state_draw_graph' => $value[2], 'state_value' => $value[3], 'state_generic_value' => $value[4]); dbInsert($insert, 'state_translations'); } } discover_sensor($valid['sensor'], 'state', $device, $oid . $codec, $codec, $state, $descr, '1', '1', null, null, null, null, $value, 'snmp', $codec); create_sensor_to_state_index($device, $state, $codec); } }
$psu_oid = '.1.3.6.1.4.1.232.22.2.5.1.1.1.16'; $psu_state_name = 'hpblmos_psustate'; $psu_state_descr = 'PSU '; $psu_state_oid = '.1.3.6.1.4.1.232.22.2.5.1.1.1.17.'; $psus = trim(snmp_walk($device, $psu_oid, '-Osqn')); foreach (explode("\n", $psus) as $psu) { $psu = trim($psu); if ($psu) { list($oid, $presence) = explode(' ', $psu, 2); if ($presence != 2) { $split_oid = explode('.', $oid); $current_id = $split_oid[count($split_oid) - 1]; $current_oid = $psu_state_oid . $current_id; $descr = $psu_state_descr . $current_id; $state = snmp_get($device, $current_oid, '-Oqv'); if (!empty($state)) { $state_index_id = create_state_index($psu_state_name); if ($state_index_id) { $states = array(array($state_index_id, 'other', 0, 1, 3), array($state_index_id, 'ok', 1, 2, 0), array($state_index_id, 'degraded', 1, 3, 1), array($state_index_id, 'failed', 1, 4, 2)); foreach ($states as $value) { $insert = array('state_index_id' => $value[0], 'state_descr' => $value[1], 'state_draw_graph' => $value[2], 'state_value' => $value[3], 'state_generic_value' => $value[4]); dbInsert($insert, 'state_translations'); } } } discover_sensor($valid['sensor'], 'state', $device, $current_oid, $current_id, $psu_state_name, $descr, '1', '1', null, null, null, null, $state, 'snmp', $current_id); create_sensor_to_state_index($device, $psu_state_name, $current_id); } } } }
} d_echo("QNAP HDD SMART\n"); for ($i = 1; $i <= $total_disks; $i++) { $state = str_replace('"', '', snmp_get($device, $smart_oid . $i, '-Oqv')); $smart_name = 'qnap_hdd_smart_' . $i; $smart_descr = 'HDD ' . $i . ' SMART'; switch ($state) { case 'Normal': $state = 1; break; case '--': $state = 0; break; case 'Warning': $state = 2; break; } if (is_numeric($state)) { $state_index_id = create_state_index($smart_name); if ($state_index_id !== null) { $states = array(array($state_index_id, 'normal', 1, 1, 0), array($state_index_id, 'no disk', 0, 0, 1), array($state_index_id, 'warning', 2, 2, 2)); foreach ($states as $value) { $insert = array('state_index_id' => $value[0], 'state_descr' => $value[1], 'state_draw_graph' => $value[2], 'state_value' => $value[3], 'state_generic_value' => $value[4]); dbInsert($insert, 'state_translations'); } } discover_sensor($valid['sensor'], 'state', $device, $smart_oid . $i, 1, $smart_name, $smart_descr, '1', '1', null, null, null, null, $state, 'snmp', 1); create_sensor_to_state_index($device, $smart_name, 1); } } }