[ 'model' => 'upsBasicIdentModel', 'hwrev' => 'upsAdvIdentFirmwareRevision', 'fwrev' => 'upsAdvIdentFirmwareRevision', 'serial' => 'upsAdvIdentSerialNumber' ], # ATS // PowerNet-Discovery-MIB::apcDiscoveryModel.1 = STRING: ATS // PowerNet-Discovery-MIB::apcDiscoverySerialNumber.1 = STRING: 5A1910TXXXXX // PowerNet-Discovery-MIB::apcDiscoveryStatus.1 = INTEGER: deviceNormal(2) // PowerNet-Discovery-MIB::apcDiscoveryLabelString.1 = STRING: Automatic Transfer Switch 'ats' => [ 'model' => 'atsIdentModelNumber', 'hwrev' => 'atsIdentHardwareRev', 'fwrev' => 'atsIdentFirmwareRev', 'serial' => 'atsIdentSerialNumber' ], # PDU 'rPDU' => [ 'model' => 'rPDUIdentModelNumber', 'hwrev' => 'rPDUIdentHardwareRev', 'fwrev' => 'rPDUIdentFirmwareRev', 'serial' => 'rPDUIdentSerialNumber' ], # PDU2 'rPDU2' => [ 'model' => 'rPDU2IdentModelNumber', 'hwrev' => 'rPDU2IdentHardwareRev', 'fwrev' => 'rPDU2IdentFirmwareRev', 'serial' => 'rPDU2IdentSerialNumber' ], # Masterswitch/AP9606 'sPDU' => [ 'model' => 'sPDUIdentModelNumber', 'hwrev' => 'sPDUIdentHardwareRev', 'fwrev' => 'sPDUIdentFirmwareRev', 'serial' => 'sPDUIdentSerialNumber' ], # NetBotz 200/250 'ems' => [ 'model' => 'emsIdentProductNumber', 'hwrev' => 'emsIdentHardwareRev', 'fwrev' => 'emsIdentFirmwareRev', 'serial' => 'emsIdentSerialNumber' ], # In-Row Chiller 'airIRRC' => [ 'model' => 'airIRRCUnitIdentModelNumber', 'hwrev' => 'airIRRCUnitIdentHardwareRevision', 'fwrev' => 'airIRRCUnitIdentFirmwareRevision', 'serial' => 'airIRRCUnitIdentSerialNumber' ], # A/C 'airPA' => [ 'model' => 'airPAModelNumber', 'hwrev' => 'airPAHardwareRevision', 'fwrev' => 'airPAFirmwareRevision', 'serial' => 'airPASerialNumber' ], # PDU, moved to definitions // 'xPDU' => [ // 'model' => 'xPDUIdentModelNumber', // 'hwrev' => 'xPDUIdentHardwareRev', // 'fwrev' => 'xPDUIdentFirmwareAppRev', // 'serial' => 'xPDUIdentSerialNumber' // ], # ATS 'xATS' => [ 'model' => 'xATSIdentModelNumber', 'hwrev' => 'xATSIdentHardwareRev', 'fwrev' => 'xATSIdentFirmwareAppRev', 'serial' => 'xATSIdentSerialNumber' ], # Modular PDU 'isx' => [ 'model' => 'isxModularPduIdentModelNumber', 'hwrev' => 'isxModularPduIdentMonitorCardHardwareRev', 'fwrev' => 'isxModularPduIdentMonitorCardFirmwareAppRev', 'serial' => 'isxModularPduIdentSerialNumber' ], ]; $apc_keys = array_keys($apc_oids); // all keys // These oids are in APC's "experimental" tree, but there is no "real" UPS equivalent for the firmware versions. if (empty($version) && $AOSrev = snmp_get_oid($device, 'apcDiscoveryFirmwareRevision.1', 'PowerNet-Discovery-MIB')) { $version = $AOSrev; $serial = snmp_get_oid($device, 'apcDiscoveryDeviceSerialNumber.1', 'PowerNet-Discovery-MIB'); $features = snmp_get_oid($device, 'apcDiscoveryModel.1', 'PowerNet-Discovery-MIB'); if (preg_match('/^AP\d/', $features) && $label = snmp_get_oid($device, 'apcDiscoveryLabelString.1', 'PowerNet-Discovery-MIB')) { // PowerNet-Discovery-MIB::apcDiscoveryModel.1 = STRING: AP8953 // PowerNet-Discovery-MIB::apcDiscoverySerialNumber.1 = STRING: ZA10470XXXXX // PowerNet-Discovery-MIB::apcDiscoveryStatus.1 = INTEGER: deviceSevere(4) // PowerNet-Discovery-MIB::apcDiscoveryLabelString.1 = STRING: Switched Rack PDU $features = $label; } // Force known oids by model/features switch (TRUE) { case str_contains_array($features, [ 'Smart-UPS', 'Symmetra', 'GVSUPS', 'Galaxy' ]): $apc_keys = [ 'ups' ]; break; case str_starts_with($features, 'ATS'): $apc_keys = [ 'ats' ]; break; case str_starts_with($features, 'NetBotz Rack Monitor'): $apc_keys = [ 'ems' ]; break; case str_starts_with($features, 'rd3xx'): $apc_keys = [ 'airIRRC' ]; break; case str_contains($features, 'Rack PDU'): case match_oid_num($device['sysObjectID'], '.1.3.6.1.4.1.318.1.3.4'): $apc_keys = [ 'rPDU2', 'rPDU' ]; break; case str_contains($features, 'InfraStruXure PDU'): case match_oid_num($device['sysObjectID'], '.1.3.6.1.4.1.318.1.3.15'): $apc_keys = [ 'xPDU' ]; break; } } foreach ($apc_keys as $key) { if (!safe_empty($hardware)) { break; } $oids = $apc_oids[$key]; $model = snmp_getnext_oid($device, $oids['model'], 'PowerNet-MIB'); if (empty($model)) { continue; } $hardware = trim($model . ' ' . snmp_getnext_oid($device, $oids['hwrev'], 'PowerNet-MIB')); if (empty($version)) { $version = snmp_getnext_oid($device, $oids['fwrev'], 'PowerNet-MIB'); } if (empty($serial)) { $serial = snmp_getnext_oid($device, $oids['serial'], 'PowerNet-MIB'); } } } // v3.7.4 -> 3.7.4 if (strlen($version)) { $version = ltrim($version, 'vV'); } if (strlen($features) && preg_match('/^v?\d/', $features)) { $features = 'App ' . ltrim($features, 'v'); } // EOF