495 lines
20 KiB
PHP

<?php
/**
* Observium
*
* This file is part of Observium.
*
* @package observium
* @subpackage discovery
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2020 Observium Limited
*
*/
echo(" PDU2-MIB ");
$mib = 'PDU2-MIB';
$pduId = '1'; // PX2/3 and transfer switch: pduiId = 1
// SensorTypeEnumeration
$oid_types = array(
'rmsCurrent' => array('type' => 'current', 'index' => 1),
'peakCurrent' => array('type' => 'current', 'index' => 2),
'unbalancedCurrent' => array('type' => 'current', 'index' => 3),
'rmsVoltage' => array('type' => 'voltage', 'index' => 4),
'activePower' => array('type' => 'power', 'index' => 5),
'apparentPower' => array('type' => 'apower', 'index' => 6),
'powerFactor' => array('type' => 'powerfactor', 'index' => 7),
'activeEnergy' => array('type' => 'energy', 'index' => 8),
'apparentEnergy' => array('type' => 'aenergy', 'index' => 9),
'temperature' => array('type' => 'temperature', 'index' => 10),
'humidity' => array('type' => 'humidity', 'index' => 11),
'airFlow' => array('type' => '', 'index' => 12),
'airPressure' => array('type' => '', 'index' => 13),
'onOff' => array('type' => '', 'index' => 14),
'trip' => array('type' => '', 'index' => 15),
'vibration' => array('type' => '', 'index' => 16),
'waterDetection' => array('type' => '', 'index' => 17),
'smokeDetection' => array('type' => '', 'index' => 18),
'binary' => array('type' => '', 'index' => 19),
//'contact' => array('type' => '', 'index' => 20),
'fanSpeed' => array('type' => 'fanspeed', 'index' => 21),
'surgeProtectorStatus' => array('type' => '', 'index' => 22),
'frequency' => array('type' => 'frequency', 'index' => 23),
//'phaseAngle' => array('type' => '', 'index' => 24),
'rmsVoltageLN' => array('type' => 'voltage', 'index' => 25),
'residualCurrent' => array('type' => 'current', 'index' => 26),
'rcmState' => array('type' => '', 'index' => 27),
'absoluteHumidity' => array('type' => 'humidity', 'index' => 28),
'reactivePower' => array('type' => 'rpower', 'index' => 29),
'other' => array('type' => '', 'index' => 30),
'none' => array('type' => '', 'index' => 31),
'powerQuality' => array('type' => '', 'index' => 32),
'overloadStatus' => array('type' => '', 'index' => 33),
'overheatStatus' => array('type' => '', 'index' => 34),
'displacementPowerFactor' => array('type' => '', 'index' => 35),
'fanStatus' => array('type' => '', 'index' => 37),
//'inletPhaseSyncAngle' => array('type' => '', 'index' => 38),
//'inletPhaseSync' => array('type' => '', 'index' => 39),
'operatingState' => array('type' => '', 'index' => 40),
'activeInlet' => array('type' => '', 'index' => 41),
'illuminance' => array('type' => 'illuminance', 'index' => 42),
'doorContact' => array('type' => '', 'index' => 43),
'tamperDetection' => array('type' => '', 'index' => 44),
'motionDetection' => array('type' => '', 'index' => 45),
'i1smpsStatus' => array('type' => '', 'index' => 46),
'i2smpsStatus' => array('type' => '', 'index' => 47),
'switchStatus' => array('type' => '', 'index' => 48),
);
// SensorUnitsEnumeration
$oid_units = array(
//none(-1),
//other(0),
'volt' => array('type' => 'voltage'),
'amp' => array('type' => 'current'),
'watt' => array('type' => 'power'),
'voltamp' => array('type' => 'apower'),
'wattHour' => array('type' => 'energy'),
'voltampHour' => array('type' => 'aenergy'),
'degreeC' => array('type' => 'temperature', 'unit' => 'C'),
'hertz' => array('type' => 'frequency'),
'percent' => array('type' => 'humidity'),
'meterpersec' => array('type' => 'velocity'),
'pascal' => array('type' => 'pressure'),
'psi' => array('type' => 'pressure', 'unit' => 'psi'),
//g(13),
'degreeF' => array('type' => 'temperature', 'unit' => 'F'),
//feet(15),
//inches(16),
//cm(17),
//meters(18),
'rpm' => array('type' => 'fanspeed'),
//degrees(20),
'lux' => array('type' => 'illuminance'),
//grampercubicmeter(22),
'var' => array('type' => 'rpower'),
);
// Inlets
$names = snmpwalk_cache_oid($device, "inletName", array(), $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorUnits", array(), $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorDecimalDigits", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorEnabledThresholds", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorLowerCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorLowerWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorUpperWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "inletSensorUpperCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsInletSensorIsAvailable", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsInletSensorState", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsInletSensorValue", $oids, $mib);
print_debug_vars($names);
print_debug_vars($oids);
foreach ($oids as $index => $entry)
{
list($pduId, $id, $sensorType) = explode('.', $index);
//list(, $id, $sensorType) = explode('.', $index);
$index_id = $pduId . '.' . $id;
$index = $index_id . '.' . $oid_types[$sensorType]['index']; // Convert to numeric index
if (!isset($oid_types[$sensorType]) || $entry['measurementsInletSensorIsAvailable'] === 'false')
{
continue;
}
if ($names[$index_id]['inletName'] != '')
{
$descr = "Inlet $index_id: " . $names[$index_id]['inletName'];
} else {
$descr = "Inlet $index_id";
}
$scale = si_to_scale($entry['inletSensorDecimalDigits'] * -1);
$oid_name = 'measurementsInletSensorValue';
$oid_num = '.1.3.6.1.4.1.13742.6.5.2.3.1.4.' . $index;
$type = $mib . '-' . $oid_name;
$value = $entry[$oid_name];
// Limits (based on enabled thresholds)
// SYNTAX BITS {
// lowerCritical(0),
// lowerWarning(1),
// upperWarning(2),
// upperCritical(3),
// }
$options = array();
$limits_flags = base_convert(str_replace(' ', '', $entry['inletSensorEnabledThresholds']), 16, 10);
if (is_flag_set(bindec(10000000), $limits_flags)) // 0b 1000 0000
{
$options['limit_low'] = $entry['inletSensorLowerCriticalThreshold'] * $scale;
}
if (is_flag_set(bindec(1000000), $limits_flags)) // 0b 0100 0000
{
$options['limit_low_warn'] = $entry['inletSensorLowerWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(100000), $limits_flags)) // 0b 0010 0000
{
$options['limit_high_warn'] = $entry['inletSensorUpperWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(10000), $limits_flags)) // 0b 0001 0000
{
$options['limit_high'] = $entry['inletSensorUpperCriticalThreshold'] * $scale;
}
// Detect type & unit
$unit = array();
if (isset($oid_units[$entry['inletSensorUnits']]))
{
$unit = $oid_units[$entry['inletSensorUnits']];
}
elseif (!empty($oid_types[$sensorType]['type']))
{
// Other sensors based on SensorTypeEnumeration
$unit = $oid_types[$sensorType];
} else {
$oid_name = 'measurementsInletSensorState';
$oid_num = '.1.3.6.1.4.1.13742.6.5.2.3.1.3.'.$index;
$type = 'pdu2-sensorstate';
$value = $entry[$oid_name];
discover_status($device, $oid_num, $oid_name.'.'.$index, $type, $descr, $value, array('entPhysicalClass' => 'other'));
continue;
}
if (isset($unit['type']))
{
if (isset($unit['unit']))
{
$options['sensor_unit'] = $unit['unit'];
}
if (isset($config['counter_types'][$unit['type']]))
{
// Counters
discover_counter($device, $unit['type'], $mib, $oid_name, $oid_num, $index, $descr, $scale, $value, $options);
} else {
// FIXME convert to discover_sensor_ng()
discover_sensor($unit['type'], $device, $oid_num, $index, $type, $descr, $scale, $value, $options);
}
}
}
// Outlets
$names = snmpwalk_cache_oid($device, "outletName", array(), $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorUnits", array(), $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorDecimalDigits", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorEnabledThresholds", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorLowerCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorLowerWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorUpperWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "outletSensorUpperCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsOutletSensorIsAvailable", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsOutletSensorState", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsOutletSensorValue", $oids, $mib);
print_debug_vars($names);
print_debug_vars($oids);
foreach ($oids as $index => $entry)
{
list($pduId, $id, $sensorType) = explode('.', $index);
//list(, $id, $sensorType) = explode('.', $index);
$index_id = $pduId . '.' . $id;
$index = $index_id . '.' . $oid_types[$sensorType]['index']; // Convert to numeric index
if (!isset($oid_types[$sensorType]) || $entry['measurementsOutletSensorIsAvailable'] === 'false')
{
continue;
}
if ($names[$index_id]['outletName'] != '')
{
$descr = "Outlet $index_id: " . $names[$index_id]['outletName'];
} else {
$descr = "Outlet $index_id";
}
$scale = si_to_scale($entry['outletSensorDecimalDigits'] * -1);
$oid_name = 'measurementsOutletSensorValue';
$oid_num = '.1.3.6.1.4.1.13742.6.5.4.3.1.4.' . $index;
$type = $mib . '-' . $oid_name;
$value = $entry[$oid_name];
// Limits (based on enabled thresholds)
// SYNTAX BITS {
// lowerCritical(0),
// lowerWarning(1),
// upperWarning(2),
// upperCritical(3),
// }
$options = array();
$limits_flags = base_convert(str_replace(' ', '', $entry['outletSensorEnabledThresholds']), 16, 10);
if (is_flag_set(bindec(10000000), $limits_flags)) // 0b 1000 0000
{
$options['limit_low'] = $entry['outletSensorLowerCriticalThreshold'] * $scale;
}
if (is_flag_set(bindec(1000000), $limits_flags)) // 0b 0100 0000
{
$options['limit_low_warn'] = $entry['outletSensorLowerWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(100000), $limits_flags)) // 0b 0010 0000
{
$options['limit_high_warn'] = $entry['outletSensorUpperWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(10000), $limits_flags)) // 0b 0001 0000
{
$options['limit_high'] = $entry['outletSensorUpperCriticalThreshold'] * $scale;
}
// Detect type & unit
$unit = array();
if (isset($oid_units[$entry['outletSensorUnits']]))
{
$unit = $oid_units[$entry['outletSensorUnits']];
}
else if (!empty($oid_types[$sensorType]['type']))
{
// Other sensors based on SensorTypeEnumeration
$unit = $oid_types[$sensorType];
} else {
$oid_name = 'measurementsOutletSensorState';
$oid_num = '.1.3.6.1.4.1.13742.6.5.4.3.1.3.'.$index;
$type = 'pdu2-sensorstate';
$value = $entry[$oid_name];
discover_status($device, $oid_num, $oid_name.'.'.$index, $type, $descr, $value, array('entPhysicalClass' => 'other'));
continue;
}
if (isset($unit['type']))
{
if (isset($unit['unit']))
{
$options['sensor_unit'] = $unit['unit'];
}
discover_sensor($unit['type'], $device, $oid_num, $index, $type, $descr, $scale, $value, $options);
}
}
// Over Current Protectors
$names = snmpwalk_cache_oid($device, "overCurrentProtectorName", array(), $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorUnits", array(), $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorDecimalDigits", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorEnabledThresholds", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorLowerCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorLowerWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorUpperWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "overCurrentProtectorSensorUpperCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsOverCurrentProtectorSensorIsAvailable", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsOverCurrentProtectorSensorState", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsOverCurrentProtectorSensorValue", $oids, $mib);
print_debug_vars($names);
print_debug_vars($oids);
foreach ($oids as $index => $entry)
{
list($pduId, $id, $sensorType) = explode('.', $index);
//list(, $id, $sensorType) = explode('.', $index);
$index_id = $pduId . '.' . $id;
$index = $index_id . '.' . $oid_types[$sensorType]['index']; // Convert to numeric index
if (!isset($oid_types[$sensorType]) || $entry['measurementsOverCurrentProtectorSensorIsAvailable'] === 'false')
{
continue;
}
if ($names[$index_id]['overCurrentProtectorName'] != '')
{
$descr = "Over Current Protector $index_id: " . $names[$index_id]['overCurrentProtectorName'];
} else {
$descr = "Over Current Protector $index_id";
}
$scale = si_to_scale($entry['overCurrentProtectorSensorDecimalDigits'] * -1);
$oid_name = 'measurementsOverCurrentProtectorSensorValue';
$oid_num = '.1.3.6.1.4.1.13742.6.5.3.3.1.4.' . $index;
$type = $mib . '-' . $oid_name;
$value = $entry[$oid_name];
// Limits (based on enabled thresholds)
// SYNTAX BITS {
// lowerCritical(0),
// lowerWarning(1),
// upperWarning(2),
// upperCritical(3),
// }
$options = array();
$limits_flags = base_convert(str_replace(' ', '', $entry['overCurrentProtectorSensorEnabledThresholds']), 16, 10);
if (is_flag_set(bindec(10000000), $limits_flags)) // 0b 1000 0000
{
$options['limit_low'] = $entry['overCurrentProtectorSensorLowerCriticalThreshold'] * $scale;
}
if (is_flag_set(bindec(1000000), $limits_flags)) // 0b 0100 0000
{
$options['limit_low_warn'] = $entry['overCurrentProtectorSensorLowerWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(100000), $limits_flags)) // 0b 0010 0000
{
$options['limit_high_warn'] = $entry['overCurrentProtectorSensorUpperWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(10000), $limits_flags)) // 0b 0001 0000
{
$options['limit_high'] = $entry['overCurrentProtectorSensorUpperCriticalThreshold'] * $scale;
}
// Detect type & unit
$unit = array();
if (isset($oid_units[$entry['overCurrentProtectorSensorUnits']]))
{
$unit = $oid_units[$entry['overCurrentProtectorSensorUnits']];
}
else if (!empty($oid_types[$sensorType]['type']))
{
// Other sensors based on SensorTypeEnumeration
$unit = $oid_types[$sensorType];
} else {
$oid_name = 'measurementsOverCurrentProtectorSensorState';
$oid_num = '.1.3.6.1.4.1.13742.6.5.3.3.1.3.'.$index;
$type = 'pdu2-sensorstate';
$value = $entry[$oid_name];
discover_status($device, $oid_num, $oid_name.'.'.$index, $type, $descr, $value, array('entPhysicalClass' => 'other'));
continue;
}
if (isset($unit['type']))
{
if (isset($unit['unit']))
{
$options['sensor_unit'] = $unit['unit'];
}
discover_sensor($unit['type'], $device, $oid_num, $index, $type, $descr, $scale, $value, $options);
}
}
// External Sensors
$oids = snmpwalk_cache_oid($device, "externalSensorName", array(), $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorDescription", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorType", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorUnits", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorDecimalDigits", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorEnabledThresholds", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorLowerCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorLowerWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorUpperWarningThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "externalSensorUpperCriticalThreshold", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsExternalSensorIsAvailable", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsExternalSensorState", $oids, $mib);
$oids = snmpwalk_cache_oid($device, "measurementsExternalSensorValue", $oids, $mib);
print_debug_vars($oids);
foreach ($oids as $index => $entry)
{
$sensorType = $entry['externalSensorType'];
if (!isset($oid_types[$sensorType]) || $entry['measurementsExternalSensorIsAvailable'] === 'false')
{
continue;
}
$descr = "Sensor $index";
if ($entry['externalSensorName'] != '')
{
$descr .= ": " . $entry['externalSensorName'];
}
else if ($entry['externalSensorDescription'] != '')
{
$descr .= ": " . $entry['externalSensorDescription'];
}
$scale = si_to_scale($entry['externalSensorDecimalDigits'] * -1);
$oid_name = 'measurementsExternalSensorValue';
$oid_num = '.1.3.6.1.4.1.13742.6.5.5.3.1.4.' . $index;
$type = $mib . '-' . $oid_name;
$value = $entry[$oid_name];
// Limits (based on enabled thresholds)
// SYNTAX BITS {
// lowerCritical(0),
// lowerWarning(1),
// upperWarning(2),
// upperCritical(3),
// }
$options = array();
$limits_flags = base_convert(str_replace(' ', '', $entry['externalSensorEnabledThresholds']), 16, 10);
if (is_flag_set(bindec(10000000), $limits_flags)) // 0b 1000 0000
{
$options['limit_low'] = $entry['externalSensorLowerCriticalThreshold'] * $scale;
}
if (is_flag_set(bindec(1000000), $limits_flags)) // 0b 0100 0000
{
$options['limit_low_warn'] = $entry['externalSensorLowerWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(100000), $limits_flags)) // 0b 0010 0000
{
$options['limit_high_warn'] = $entry['externalSensorUpperWarningThreshold'] * $scale;
}
if (is_flag_set(bindec(10000), $limits_flags)) // 0b 0001 0000
{
$options['limit_high'] = $entry['externalSensorUpperCriticalThreshold'] * $scale;
}
// Detect type & unit
$unit = array();
if (isset($oid_units[$entry['externalSensorUnits']]))
{
$unit = $oid_units[$entry['externalSensorUnits']];
}
else if (!empty($oid_types[$sensorType]['type']))
{
// Other sensors based on SensorTypeEnumeration
$unit = $oid_types[$sensorType];
} else {
$oid_name = 'measurementsExternalSensorState';
$oid_num = '.1.3.6.1.4.1.13742.6.5.5.3.1.3.'.$index;
$type = 'pdu2-sensorstate';
$value = $entry[$oid_name];
discover_status($device, $oid_num, $oid_name.'.'.$index, $type, $descr, $value, array('entPhysicalClass' => 'other'));
continue;
}
if (isset($unit['type']))
{
if (isset($unit['unit']))
{
$options['sensor_unit'] = $unit['unit'];
}
discover_sensor($unit['type'], $device, $oid_num, $index, $type, $descr, $scale, $value, $options);
}
}
// EOF