Todd Eddy 83d739b5ae apc discovery: Get a count of banks before pulling info
* On my device (AP7901 / AOS v3.9.0 / App v3.7.4) discovery would keep
  clobbering the bank and current sensor.  Looking in to it the oid
  should be used for current and not bank.  To fix this now it pulls
  a count of banks using the `rPDULoadDevNumBanks.0` oid. Per MIB that
  will return 0 if no banks are found.  In which case skip the bank
  detection.

* Also update PowerNet-MIB to v4.1.7 released 2015-08-05
2016-02-20 19:37:59 -05:00

256 lines
10 KiB
PHP

<?php
// APC
if ($device['os'] == 'apc') {
// PDU - Phase
$oids = snmp_walk($device, 'rPDUStatusPhaseIndex', '-OsqnU', 'PowerNet-MIB');
if (empty($oids)) {
$oids = snmp_walk($device, 'rPDULoadPhaseConfigIndex', '-OsqnU', 'PowerNet-MIB');
}
if ($oids) {
d_echo($oids."\n");
$oids = trim($oids);
if ($oids) {
echo 'APC PowerNet-MIB Phase ';
}
$type = 'apc';
$precision = '10';
foreach (explode("\n", $oids) as $data) {
$data = trim($data);
if ($data) {
list($oid,$kind) = explode(' ', $data);
$split_oid = explode('.', $oid);
$index = $split_oid[(count($split_oid) - 1)];
$current_oid = '1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.'.$index;
// rPDULoadStatusLoad
$phase_oid = '1.3.6.1.4.1.318.1.1.12.2.3.1.1.4.'.$index;
// rPDULoadStatusPhaseNumber
$limit_oid = '1.3.6.1.4.1.318.1.1.12.2.2.1.1.4.'.$index;
// rPDULoadPhaseConfigOverloadThreshold
$lowlimit_oid = '1.3.6.1.4.1.318.1.1.12.2.2.1.1.2.'.$index;
// rPDULoadPhaseConfigLowLoadThreshold
$warnlimit_oid = '1.3.6.1.4.1.318.1.1.12.2.2.1.1.3.'.$index;
// rPDULoadPhaseConfigNearOverloadThreshold
$phase = snmp_get($device, $phase_oid, '-Oqv', '');
$current = (snmp_get($device, $current_oid, '-Oqv', '') / $precision);
$limit = snmp_get($device, $limit_oid, '-Oqv', '');
// No / $precision here! Nice, APC!
$lowlimit = snmp_get($device, $lowlimit_oid, '-Oqv', '');
// No / $precision here! Nice, APC!
$warnlimit = snmp_get($device, $warnlimit_oid, '-Oqv', '');
// No / $precision here! Nice, APC!
if (count(explode("\n", $oids)) != 1) {
$descr = "Phase $phase";
}
else {
$descr = 'Output';
}
discover_sensor($valid['sensor'], 'current', $device, $current_oid, $index, $type, $descr, '10', '1', $lowlimit, null, $warnlimit, $limit, $current);
}
}
}
unset($oids);
// v2 firmware- first bank is total, v3 firmware, 3rd bank is total
$bank_count = snmp_get($device, 'rPDULoadDevNumBanks.0', '-Oqv', 'PowerNet-MIB');
if ($bank_count > 0) {
$oids = snmp_walk($device, 'rPDULoadStatusIndex', '-OsqnU', 'PowerNet-MIB');
}
// should work with firmware v2 and v3
if ($oids) {
echo 'APC PowerNet-MIB Banks ';
d_echo($oids."\n");
$oids = trim($oids);
$type = 'apc';
$precision = '10';
// version 2 does some stuff differently- total power is first oid in index instead of the last.
// will look something like "AOS v2.6.4 / App v2.6.5"
$baseversion = '3';
if (stristr($device['version'], 'AOS v2') == true) {
$baseversion = '2';
}
foreach (explode("\n", $oids) as $data) {
$data = trim($data);
if ($data) {
list($oid,$kind) = explode(' ', $data);
$split_oid = explode('.', $oid);
$index = $split_oid[(count($split_oid) - 1)];
$banknum = ($index - 1);
$descr = 'Bank '.$banknum;
if ($baseversion == '3') {
if ($index == '1') {
$descr = 'Bank Total';
}
}
if ($baseversion == '2') {
if ($index == '1') {
$descr = 'Bank Total';
}
}
$current_oid = '1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.'.$index;
// rPDULoadStatusLoad
$bank_oid = '1.3.6.1.4.1.318.1.1.12.2.3.1.1.5.'.$index;
// rPDULoadStatusBankNumber
$limit_oid = '1.3.6.1.4.1.318.1.1.12.2.4.1.1.4.'.$index;
// rPDULoadBankConfigOverloadThreshold
$lowlimit_oid = '1.3.6.1.4.1.318.1.1.12.2.4.1.1.2.'.$index;
// rPDULoadBankConfigLowLoadThreshold
$warnlimit_oid = '1.3.6.1.4.1.318.1.1.12.2.4.1.1.3.'.$index;
// rPDULoadBankConfigNearOverloadThreshold
$bank = snmp_get($device, $bank_oid, '-Oqv', '');
$current = (snmp_get($device, $current_oid, '-Oqv', '') / $precision);
$limit = snmp_get($device, $limit_oid, '-Oqv', '');
$lowlimit = snmp_get($device, $lowlimit_oid, '-Oqv', '');
$warnlimit = snmp_get($device, $warnlimit_oid, '-Oqv', '');
if ($limit != -1 && $lowlimit != -1 && $warnlimit != -1) {
discover_sensor($valid['sensor'], 'current', $device, $current_oid, $index, $type, $descr, '10', '1', $lowlimit, null, $warnlimit, $limit, $current);
}
}
}
unset($baseversion);
}
unset($oids);
// Per Outlet Power Bar
$oids = snmp_walk($device, '1.3.6.1.4.1.318.1.1.26.9.4.3.1.1', '-t 30 -OsqnU', 'PowerNet-MIB');
if ($oids) {
echo 'APC PowerNet-MIB Outlets ';
d_echo($oids."\n");
$oids = trim($oids);
$type = 'apc';
$precision = '10';
foreach (explode("\n", $oids) as $data) {
$data = trim($data);
if ($data) {
list($oid,$kind) = explode(' ', $data);
$split_oid = explode('.', $oid);
$index = $split_oid[(count($split_oid) - 1)];
$voltage_oid = '1.3.6.1.4.1.318.1.1.26.6.3.1.6';
// rPDU2PhaseStatusVoltage
$current_oid = '1.3.6.1.4.1.318.1.1.26.9.4.3.1.6.'.$index;
// rPDU2OutletMeteredStatusCurrent
$limit_oid = '1.3.6.1.4.1.318.1.1.26.9.4.1.1.7.'.$index;
// rPDU2OutletMeteredConfigOverloadCurrentThreshold
$lowlimit_oid = '1.3.6.1.4.1.318.1.1.26.9.4.1.1.7.'.$index;
// rPDU2OutletMeteredConfigLowLoadCurrentThreshold
$warnlimit_oid = '1.3.6.1.4.1.318.1.1.26.9.4.1.1.6.'.$index;
// rPDU2OutletMeteredConfigNearOverloadCurrentThreshold
$name_oid = '1.3.6.1.4.1.318.1.1.26.9.4.3.1.3.'.$index;
// rPDU2OutletMeteredStatusName
$voltage = snmp_get($device, $voltage_oid, '-Oqv', '');
$current = (snmp_get($device, $current_oid, '-Oqv', '') / $precision);
$limit = (snmp_get($device, $limit_oid, '-Oqv', '') / $voltage);
$lowlimit = (snmp_get($device, $lowlimit_oid, '-Oqv', '') / $voltage);
$warnlimit = (snmp_get($device, $warnlimit_oid, '-Oqv', '') / $voltage);
$descr = 'Outlet '.$index.' - '.snmp_get($device, $name_oid, '-Oqv', '');
discover_sensor($valid['sensor'], 'current', $device, $current_oid, $index, $type, $descr, '10', '1', $lowlimit, null, $warnlimit, $limit, $current);
}
}
}
unset($oids);
// ATS
$oids = snmp_walk($device, 'atsConfigPhaseTableIndex', '-OsqnU', 'PowerNet-MIB');
if ($oids) {
$type = 'apc';
d_echo($oids."\n");
$oids = trim($oids);
if ($oids) {
echo 'APC PowerNet-MIB ATS ';
}
$current_oid = '1.3.6.1.4.1.318.1.1.8.5.4.3.1.4.1.1.1';
// atsOutputCurrent
$limit_oid = '1.3.6.1.4.1.318.1.1.8.4.16.1.5.1';
// atsConfigPhaseOverLoadThreshold
$lowlimit_oid = '1.3.6.1.4.1.318.1.1.8.4.16.1.3.1';
// atsConfigPhaseLowLoadThreshold
$warnlimit_oid = '1.3.6.1.4.1.318.1.1.8.4.16.1.4.1';
// atsConfigPhaseNearOverLoadThreshold
$index = 1;
$current = (snmp_get($device, $current_oid, '-Oqv', '') / $precision);
$limit = snmp_get($device, $limit_oid, '-Oqv', '');
// No / $precision here! Nice, APC!
$lowlimit = snmp_get($device, $lowlimit_oid, '-Oqv', '');
// No / $precision here! Nice, APC!
$warnlimit = snmp_get($device, $warnlimit_oid, '-Oqv', '');
// No / $precision here! Nice, APC!
$descr = 'Output Feed';
discover_sensor($valid['sensor'], 'current', $device, $current_oid, $index, $type, $descr, '10', '1', $lowlimit, null, $warnlimit, $limit, $current);
}
unset($oids);
// UPS
$oid_array = array(
array(
'HighPrecOid' => 'upsHighPrecOutputCurrent',
'AdvOid' => 'upsAdvOutputCurrent',
'type' => 'apc',
'index' => 0,
'descr' => 'Current Drawn',
'divisor' => 10,
'mib' => '+PowerNet-MIB',
),
);
foreach ($oid_array as $item) {
$low_limit = null;
$low_limit_warn = null;
$warn_limit = null;
$high_limit = null;
$oids = snmp_get($device, $item['HighPrecOid'].'.'.$item['index'], '-OsqnU', $item['mib']);
if (empty($oids)) {
$oids = snmp_get($device, $item['AdvOid'].'.'.$item['index'], '-OsqnU', $item['mib']);
$current_oid = $item['AdvOid'];
}
else {
$current_oid = $item['HighPrecOid'];
}
if (!empty($oids)) {
d_echo($oids."\n");
$oids = trim($oids);
if ($oids) {
echo $item['type'].' '.$item['mib'].' UPS';
}
if (stristr($current_oid, 'HighPrec')) {
$current = ($oids / $item['divisor']);
}
else {
$current = $oids;
$item['divisor'] = 1;
}
discover_sensor($valid['sensor'], 'current', $device, $current_oid.'.'.$item['index'], $current_oid.'.'.$item['index'], $item['type'], $item['descr'], $item['divisor'], 1, $low_limit, $low_limit_warn, $warn_limit, $high_limit, $current);
}
}
}