163 lines
5.5 KiB
PHP
163 lines
5.5 KiB
PHP
<?php
|
|
/**
|
|
* Observium
|
|
*
|
|
* This file is part of Observium.
|
|
*
|
|
* @package observium
|
|
* @subpackage discovery
|
|
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2021 Observium Limited
|
|
*
|
|
*/
|
|
|
|
// Include all discovery modules
|
|
|
|
$include_dir = "includes/discovery/storage";
|
|
include("includes/include-dir-mib.inc.php");
|
|
|
|
foreach (get_device_mibs_permitted($device) as $mib) {
|
|
|
|
if (!is_array($config['mibs'][$mib]['storage'])) { continue; }
|
|
|
|
echo("$mib ");
|
|
foreach ($config['mibs'][$mib]['storage'] as $entry_name => $entry) {
|
|
$entry['found'] = FALSE;
|
|
|
|
$entry['mib'] = $mib;
|
|
if (discovery_check_requires_pre($device, $entry, 'storage')) {
|
|
continue;
|
|
}
|
|
|
|
// Init Precision (scale)/total/used/free
|
|
$used = NULL;
|
|
$total = NULL;
|
|
$free = NULL;
|
|
$perc = NULL;
|
|
$options = [];
|
|
if (isset($entry['scale']) && is_numeric($entry['scale']) && $entry['scale']) {
|
|
$scale = $entry['scale'];
|
|
} else {
|
|
$scale = 1;
|
|
}
|
|
|
|
/////////////////////
|
|
// Table Discovery //
|
|
/////////////////////
|
|
|
|
/* FIXME. Partially changed, need rewrite to common style
|
|
// If the type is table, walk the table!
|
|
if ($entry['type'] == "table")
|
|
{
|
|
$entry['oids'][$entry_name] = $entry_name;
|
|
}
|
|
else
|
|
{
|
|
// Type is not table, so we have to walk each OID individually
|
|
foreach (array('oid_total', 'oid_total', 'oid_free', 'oid_perc', 'oid_descr') as $oid)
|
|
{
|
|
if (isset($entry[$oid]))
|
|
{
|
|
$entry['oids'][$oid] = $entry[$oid];
|
|
}
|
|
}
|
|
}
|
|
// FIXME - cache this outside the storage array and then just array_merge it in. Descr OIDs are probably shared a lot
|
|
// FIXME - Allow different MIBs for OIDs. Best done by prefixing with MIB and parsing it out?
|
|
|
|
if (isset($entry['extra_oids']))
|
|
{
|
|
foreach ((array)$entry['extra_oids'] as $oid)
|
|
{
|
|
$entry['oids'][$oid] = $oid;
|
|
}
|
|
}
|
|
|
|
foreach ($entry['oids'] as $oid)
|
|
{
|
|
$storage_array = snmpwalk_cache_oid($device, $oid, $storage_array, $mib);
|
|
}
|
|
*/
|
|
|
|
$table_oids = [ 'oid_total', 'oid_used', 'oid_free', 'oid_perc', 'oid_descr',
|
|
'oid_scale', 'oid_unit', 'oid_extra',
|
|
//'oid_limit_low', 'oid_limit_low_warn', 'oid_limit_high_warn', 'oid_limit_high',
|
|
//'oid_limit_nominal', 'oid_limit_delta_warn', 'oid_limit_delta', 'oid_limit_scale'
|
|
];
|
|
$storage_array = discover_fetch_oids($device, $mib, $entry, $table_oids);
|
|
|
|
// FIXME - generify description generation code and just pass it template and OID array.
|
|
|
|
$i = 1; // Used in descr as %i%
|
|
$storage_count = count($storage_array);
|
|
foreach ($storage_array as $index => $storage_entry) {
|
|
$oid_num = $entry['oid_num'] . '.' . $index;
|
|
|
|
// Generate storage description
|
|
$storage_entry['i'] = $i;
|
|
$storage_entry['index'] = $index;
|
|
$descr = entity_descr_definition('storage', $entry, $storage_entry, $storage_count);
|
|
|
|
// Convert strings '3.40 TB' to value
|
|
// See QNAP NAS-MIB or HIK-DEVICE-MIB
|
|
$unit = isset($entry['unit']) ? $entry['unit'] : NULL;
|
|
|
|
// Fetch used, total, free and percentage values, if OIDs are defined for them
|
|
if (!safe_empty($entry['oid_used'])) {
|
|
$used = snmp_fix_numeric($storage_entry[$entry['oid_used']], $unit);
|
|
}
|
|
if (!safe_empty($entry['oid_free'])) {
|
|
$free = snmp_fix_numeric($storage_entry[$entry['oid_free']], $unit);
|
|
}
|
|
if (!safe_empty($entry['oid_perc'])) {
|
|
$perc = snmp_fix_numeric($storage_entry[$entry['oid_perc']]);
|
|
}
|
|
|
|
// Prefer hardcoded total over SNMP OIDs
|
|
if (!safe_empty($entry['total'])) {
|
|
$total = $entry['total'];
|
|
} elseif (!safe_empty($entry['oid_total'])) {
|
|
$total = snmp_fix_numeric($storage_entry[$entry['oid_total']], $unit);
|
|
}
|
|
|
|
// Extrapolate all values from the ones we have.
|
|
$storage = calculate_mempool_properties($scale, $used, $total, $free, $perc, $options);
|
|
|
|
print_debug_vars(array($scale, $used, $total, $free, $perc, $options));
|
|
print_debug_vars($storage_entry);
|
|
print_debug_vars($storage);
|
|
|
|
print_debug_vars(array(is_numeric($storage['used']), is_numeric($storage['total'])));
|
|
|
|
// If we have valid used and total, discover the storage
|
|
if (is_numeric($storage['used']) && is_numeric($storage['total'])) {
|
|
discover_storage($valid['storage'], $device, $index, $entry_name, $mib, $descr, $scale, $storage['total'], $storage['used']); // FIXME storage_hc = ??
|
|
$entry['found'] = TRUE;
|
|
}
|
|
$i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
print_debug_vars($valid['storage']);
|
|
|
|
// Remove storage which weren't redetected here
|
|
$query = 'SELECT * FROM `storage` WHERE `device_id` = ?';
|
|
|
|
foreach (dbFetchRows($query, array($device['device_id'])) as $test_storage) {
|
|
$storage_index = $test_storage['storage_index'];
|
|
$storage_mib = $test_storage['storage_mib'];
|
|
$storage_descr = $test_storage['storage_descr'];
|
|
print_debug($storage_index . " -> " . $storage_mib);
|
|
|
|
if (!$valid['storage'][$storage_mib][$storage_index]) {
|
|
$GLOBALS['module_stats']['storage']['deleted']++; //echo('-');
|
|
dbDelete('storage', 'storage_id = ?', array($test_storage['storage_id']));
|
|
log_event("Storage removed: index $storage_index, mib $storage_mib, descr $storage_descr", $device, 'storage', $test_storage['storage_id']);
|
|
}
|
|
}
|
|
|
|
$GLOBALS['module_stats'][$module]['status'] = safe_count($valid[$module]);
|
|
if (OBS_DEBUG && $GLOBALS['module_stats'][$module]['status']) { print_vars($valid[$module]); }
|
|
|
|
// EOF
|