improved fallabck detection

This commit is contained in:
Graham McIntire 2026-01-22 13:43:56 -06:00
parent 17f4558702
commit 2856a0ccda
No known key found for this signature in database
3 changed files with 478 additions and 21 deletions

View file

@ -90,11 +90,266 @@ defmodule Towerops.Snmp.MibTranslator do
# Ubiquiti (enterprise 41112)
"UBNT-UniFi-MIB::unifiApSystemModel" => "1.3.6.1.4.1.41112.1.6.3.3.0",
"UBNT-UniFi-MIB::unifiApSystemVersion" => "1.3.6.1.4.1.41112.1.6.3.6.0",
# UBNT-AirMAX-MIB GPS Info (ubntAirMAX.9 = 1.3.6.1.4.1.41112.1.4.9)
"UBNT-AirMAX-MIB::ubntGpsStatus" => "1.3.6.1.4.1.41112.1.4.9.1",
"UBNT-AirMAX-MIB::ubntGpsStatus.0" => "1.3.6.1.4.1.41112.1.4.9.1.0",
"UBNT-AirMAX-MIB::ubntGpsFix" => "1.3.6.1.4.1.41112.1.4.9.2",
"UBNT-AirMAX-MIB::ubntGpsFix.0" => "1.3.6.1.4.1.41112.1.4.9.2.0",
"UBNT-AirMAX-MIB::ubntGpsLat" => "1.3.6.1.4.1.41112.1.4.9.3",
"UBNT-AirMAX-MIB::ubntGpsLat.0" => "1.3.6.1.4.1.41112.1.4.9.3.0",
"UBNT-AirMAX-MIB::ubntGpsLon" => "1.3.6.1.4.1.41112.1.4.9.4",
"UBNT-AirMAX-MIB::ubntGpsLon.0" => "1.3.6.1.4.1.41112.1.4.9.4.0",
"UBNT-AirMAX-MIB::ubntGpsAltMeters" => "1.3.6.1.4.1.41112.1.4.9.5",
"UBNT-AirMAX-MIB::ubntGpsAltMeters.0" => "1.3.6.1.4.1.41112.1.4.9.5.0",
"UBNT-AirMAX-MIB::ubntGpsAltFeet" => "1.3.6.1.4.1.41112.1.4.9.6",
"UBNT-AirMAX-MIB::ubntGpsAltFeet.0" => "1.3.6.1.4.1.41112.1.4.9.6.0",
"UBNT-AirMAX-MIB::ubntGpsSatsVisible" => "1.3.6.1.4.1.41112.1.4.9.7",
"UBNT-AirMAX-MIB::ubntGpsSatsVisible.0" => "1.3.6.1.4.1.41112.1.4.9.7.0",
"UBNT-AirMAX-MIB::ubntGpsSatsTracked" => "1.3.6.1.4.1.41112.1.4.9.8",
"UBNT-AirMAX-MIB::ubntGpsSatsTracked.0" => "1.3.6.1.4.1.41112.1.4.9.8.0",
"UBNT-AirMAX-MIB::ubntGpsHDOP" => "1.3.6.1.4.1.41112.1.4.9.9",
"UBNT-AirMAX-MIB::ubntGpsHDOP.0" => "1.3.6.1.4.1.41112.1.4.9.9.0",
# UBNT-AirMAX-MIB Host Info (ubntAirMAX.8 = 1.3.6.1.4.1.41112.1.4.8)
"UBNT-AirMAX-MIB::ubntHostLocaltime" => "1.3.6.1.4.1.41112.1.4.8.1",
"UBNT-AirMAX-MIB::ubntHostLocaltime.0" => "1.3.6.1.4.1.41112.1.4.8.1.0",
"UBNT-AirMAX-MIB::ubntHostNetrole" => "1.3.6.1.4.1.41112.1.4.8.2",
"UBNT-AirMAX-MIB::ubntHostNetrole.0" => "1.3.6.1.4.1.41112.1.4.8.2.0",
"UBNT-AirMAX-MIB::ubntHostCpuLoad" => "1.3.6.1.4.1.41112.1.4.8.3",
"UBNT-AirMAX-MIB::ubntHostCpuLoad.0" => "1.3.6.1.4.1.41112.1.4.8.3.0",
"UBNT-AirMAX-MIB::ubntHostTemperature" => "1.3.6.1.4.1.41112.1.4.8.4",
"UBNT-AirMAX-MIB::ubntHostTemperature.0" => "1.3.6.1.4.1.41112.1.4.8.4.0",
# Cambium ePMP (enterprise 17713.21)
"CAMBIUM-PMP80211-MIB::cambiumCurrentuImageVersion" => "1.3.6.1.4.1.17713.21.1.1.17",
"CAMBIUM-PMP80211-MIB::cambiumCurrentuImageVersion.0" => "1.3.6.1.4.1.17713.21.1.1.17.0",
"CAMBIUM-PMP80211-MIB::cambiumEPMPMSN" => "1.3.6.1.4.1.17713.21.1.1.31",
"CAMBIUM-PMP80211-MIB::cambiumEPMPMSN.0" => "1.3.6.1.4.1.17713.21.1.1.31.0",
"CAMBIUM-PMP80211-MIB::cambiumDeviceLatitude" => "1.3.6.1.4.1.17713.21.1.1.18",
"CAMBIUM-PMP80211-MIB::cambiumDeviceLatitude.0" => "1.3.6.1.4.1.17713.21.1.1.18.0",
"CAMBIUM-PMP80211-MIB::cambiumDeviceLongitude.0" => "1.3.6.1.4.1.17713.21.1.1.19.0"
"CAMBIUM-PMP80211-MIB::cambiumDeviceLongitude" => "1.3.6.1.4.1.17713.21.1.1.19",
"CAMBIUM-PMP80211-MIB::cambiumDeviceLongitude.0" => "1.3.6.1.4.1.17713.21.1.1.19.0",
# Cambium ePMP status and sensor OIDs (tables, base OIDs without index)
"CAMBIUM-PMP80211-MIB::cambiumEffectiveSyncSource" => "1.3.6.1.4.1.17713.21.1.1.7",
"CAMBIUM-PMP80211-MIB::cambiumDFSStatus" => "1.3.6.1.4.1.17713.21.1.1.6",
"CAMBIUM-PMP80211-MIB::ePMP2000SmartAntennaStatus" => "1.3.6.1.4.1.17713.21.1.1.41",
"CAMBIUM-PMP80211-MIB::sysDFSDetectedCount" => "1.3.6.1.4.1.17713.21.2.1.36",
"CAMBIUM-PMP80211-MIB::sysCPUUsage" => "1.3.6.1.4.1.17713.21.2.1.64",
# Mimosa (enterprise 43356)
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaSerialNumber" => "1.3.6.1.4.1.43356.2.1.2.1.2",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaSerialNumber.0" => "1.3.6.1.4.1.43356.2.1.2.1.2.0",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaFirmwareVersion" => "1.3.6.1.4.1.43356.2.1.2.1.3",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaFirmwareVersion.0" => "1.3.6.1.4.1.43356.2.1.2.1.3.0",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaSatelliteStrength" => "1.3.6.1.4.1.43356.2.1.2.2.5",
# UBNT-AirMAX-MIB Radio Table (ubntAirMAX.1 = 1.3.6.1.4.1.41112.1.4.1)
"UBNT-AirMAX-MIB::ubntRadioMode" => "1.3.6.1.4.1.41112.1.4.1.1.2",
"UBNT-AirMAX-MIB::ubntRadioFreq" => "1.3.6.1.4.1.41112.1.4.1.1.4",
"UBNT-AirMAX-MIB::ubntRadioDfsEnabled" => "1.3.6.1.4.1.41112.1.4.1.1.5",
"UBNT-AirMAX-MIB::ubntRadioTxPower" => "1.3.6.1.4.1.41112.1.4.1.1.6",
"UBNT-AirMAX-MIB::ubntRadioDistance" => "1.3.6.1.4.1.41112.1.4.1.1.7",
# UBNT-AirMAX-MIB Wireless Stats Table (ubntAirMAX.5 = 1.3.6.1.4.1.41112.1.4.5)
"UBNT-AirMAX-MIB::ubntWlStatSsid" => "1.3.6.1.4.1.41112.1.4.5.1.2",
"UBNT-AirMAX-MIB::ubntWlStatSignal" => "1.3.6.1.4.1.41112.1.4.5.1.5",
"UBNT-AirMAX-MIB::ubntWlStatRssi" => "1.3.6.1.4.1.41112.1.4.5.1.6",
"UBNT-AirMAX-MIB::ubntWlStatCcq" => "1.3.6.1.4.1.41112.1.4.5.1.7",
"UBNT-AirMAX-MIB::ubntWlStatNoiseFloor" => "1.3.6.1.4.1.41112.1.4.5.1.8",
"UBNT-AirMAX-MIB::ubntWlStatTxRate" => "1.3.6.1.4.1.41112.1.4.5.1.9",
"UBNT-AirMAX-MIB::ubntWlStatRxRate" => "1.3.6.1.4.1.41112.1.4.5.1.10",
"UBNT-AirMAX-MIB::ubntWlStatChanWidth" => "1.3.6.1.4.1.41112.1.4.5.1.14",
"UBNT-AirMAX-MIB::ubntWlStatStaCount" => "1.3.6.1.4.1.41112.1.4.5.1.15",
# UBNT-AirMAX-MIB AirMax Table (ubntAirMAX.6 = 1.3.6.1.4.1.41112.1.4.6)
"UBNT-AirMAX-MIB::ubntAirMaxEnabled" => "1.3.6.1.4.1.41112.1.4.6.1.2",
"UBNT-AirMAX-MIB::ubntAirMaxQuality" => "1.3.6.1.4.1.41112.1.4.6.1.3",
"UBNT-AirMAX-MIB::ubntAirMaxCapacity" => "1.3.6.1.4.1.41112.1.4.6.1.4",
# UBNT-AirMAX-MIB Station Table (ubntAirMAX.7 = 1.3.6.1.4.1.41112.1.4.7)
"UBNT-AirMAX-MIB::ubntStaName" => "1.3.6.1.4.1.41112.1.4.7.1.2",
"UBNT-AirMAX-MIB::ubntStaSignal" => "1.3.6.1.4.1.41112.1.4.7.1.3",
"UBNT-AirMAX-MIB::ubntStaNoiseFloor" => "1.3.6.1.4.1.41112.1.4.7.1.4",
"UBNT-AirMAX-MIB::ubntStaDistance" => "1.3.6.1.4.1.41112.1.4.7.1.5",
"UBNT-AirMAX-MIB::ubntStaCcq" => "1.3.6.1.4.1.41112.1.4.7.1.6",
"UBNT-AirMAX-MIB::ubntStaTxRate" => "1.3.6.1.4.1.41112.1.4.7.1.11",
"UBNT-AirMAX-MIB::ubntStaRxRate" => "1.3.6.1.4.1.41112.1.4.7.1.12",
# UBNT-AirFiber-MIB (enterprise 41112.1.3)
"UBNT-AirFiber-MIB::txFrequency" => "1.3.6.1.4.1.41112.1.3.2.1.1",
"UBNT-AirFiber-MIB::rxFrequency" => "1.3.6.1.4.1.41112.1.3.2.1.2",
"UBNT-AirFiber-MIB::txPower" => "1.3.6.1.4.1.41112.1.3.2.1.5",
"UBNT-AirFiber-MIB::rxPower0" => "1.3.6.1.4.1.41112.1.3.2.1.6",
"UBNT-AirFiber-MIB::rxPower1" => "1.3.6.1.4.1.41112.1.3.2.1.7",
"UBNT-AirFiber-MIB::txCapacity" => "1.3.6.1.4.1.41112.1.3.2.1.8",
"UBNT-AirFiber-MIB::rxCapacity" => "1.3.6.1.4.1.41112.1.3.2.1.9",
"UBNT-AirFiber-MIB::radioLinkDistM" => "1.3.6.1.4.1.41112.1.3.2.1.10",
"UBNT-AirFiber-MIB::radioTemp" => "1.3.6.1.4.1.41112.1.3.2.1.14",
# Cambium PTP 650 (enterprise 17713.7)
"CAMBIUM-PTP650-MIB::transmitPower" => "1.3.6.1.4.1.17713.7.12.4",
"CAMBIUM-PTP650-MIB::transmitPower.0" => "1.3.6.1.4.1.17713.7.12.4.0",
"CAMBIUM-PTP650-MIB::signalStrengthRatio" => "1.3.6.1.4.1.17713.7.12.9",
"CAMBIUM-PTP650-MIB::signalStrengthRatio.0" => "1.3.6.1.4.1.17713.7.12.9.0",
"CAMBIUM-PTP650-MIB::rawReceivePower" => "1.3.6.1.4.1.17713.7.12.12",
"CAMBIUM-PTP650-MIB::rawReceivePower.0" => "1.3.6.1.4.1.17713.7.12.12.0",
"CAMBIUM-PTP650-MIB::rxModulation" => "1.3.6.1.4.1.17713.7.12.14",
"CAMBIUM-PTP650-MIB::rxModulation.0" => "1.3.6.1.4.1.17713.7.12.14.0",
"CAMBIUM-PTP650-MIB::txModulation" => "1.3.6.1.4.1.17713.7.12.15",
"CAMBIUM-PTP650-MIB::txModulation.0" => "1.3.6.1.4.1.17713.7.12.15.0",
"CAMBIUM-PTP650-MIB::receiveDataRate" => "1.3.6.1.4.1.17713.7.20.1",
"CAMBIUM-PTP650-MIB::receiveDataRate.0" => "1.3.6.1.4.1.17713.7.20.1.0",
"CAMBIUM-PTP650-MIB::transmitDataRate" => "1.3.6.1.4.1.17713.7.20.2",
"CAMBIUM-PTP650-MIB::transmitDataRate.0" => "1.3.6.1.4.1.17713.7.20.2.0",
"CAMBIUM-PTP650-MIB::aggregateDataRate" => "1.3.6.1.4.1.17713.7.20.3",
"CAMBIUM-PTP650-MIB::aggregateDataRate.0" => "1.3.6.1.4.1.17713.7.20.3.0",
"CAMBIUM-PTP650-MIB::masterSlaveMode" => "1.3.6.1.4.1.17713.7.5.1",
"CAMBIUM-PTP650-MIB::masterSlaveMode.0" => "1.3.6.1.4.1.17713.7.5.1.0",
# Cambium PTP 670 (enterprise 17713.11)
"CAMBIUM-PTP670-MIB::transmitPower" => "1.3.6.1.4.1.17713.11.12.4",
"CAMBIUM-PTP670-MIB::transmitPower.0" => "1.3.6.1.4.1.17713.11.12.4.0",
"CAMBIUM-PTP670-MIB::signalStrengthRatio" => "1.3.6.1.4.1.17713.11.12.9",
"CAMBIUM-PTP670-MIB::signalStrengthRatio.0" => "1.3.6.1.4.1.17713.11.12.9.0",
"CAMBIUM-PTP670-MIB::rawReceivePower" => "1.3.6.1.4.1.17713.11.12.12",
"CAMBIUM-PTP670-MIB::rawReceivePower.0" => "1.3.6.1.4.1.17713.11.12.12.0",
"CAMBIUM-PTP670-MIB::rxModulation" => "1.3.6.1.4.1.17713.11.12.14",
"CAMBIUM-PTP670-MIB::rxModulation.0" => "1.3.6.1.4.1.17713.11.12.14.0",
"CAMBIUM-PTP670-MIB::txModulation" => "1.3.6.1.4.1.17713.11.12.15",
"CAMBIUM-PTP670-MIB::txModulation.0" => "1.3.6.1.4.1.17713.11.12.15.0",
"CAMBIUM-PTP670-MIB::receiveDataRate" => "1.3.6.1.4.1.17713.11.20.1",
"CAMBIUM-PTP670-MIB::receiveDataRate.0" => "1.3.6.1.4.1.17713.11.20.1.0",
"CAMBIUM-PTP670-MIB::transmitDataRate" => "1.3.6.1.4.1.17713.11.20.2",
"CAMBIUM-PTP670-MIB::transmitDataRate.0" => "1.3.6.1.4.1.17713.11.20.2.0",
"CAMBIUM-PTP670-MIB::aggregateDataRate" => "1.3.6.1.4.1.17713.11.20.3",
"CAMBIUM-PTP670-MIB::aggregateDataRate.0" => "1.3.6.1.4.1.17713.11.20.3.0",
"CAMBIUM-PTP670-MIB::masterSlaveMode" => "1.3.6.1.4.1.17713.11.5.1",
"CAMBIUM-PTP670-MIB::masterSlaveMode.0" => "1.3.6.1.4.1.17713.11.5.1.0",
"CAMBIUM-PTP670-MIB::hardwareVersion" => "1.3.6.1.4.1.17713.11.1.10",
"CAMBIUM-PTP670-MIB::hardwareVersion.0" => "1.3.6.1.4.1.17713.11.1.10.0",
# Cambium PTP 250 (enterprise 17713.250)
"CAMBIUM-PTP250-MIB::receivePower" => "1.3.6.1.4.1.17713.250.5.1",
"CAMBIUM-PTP250-MIB::receivePower.0" => "1.3.6.1.4.1.17713.250.5.1.0",
"CAMBIUM-PTP250-MIB::transmitPower" => "1.3.6.1.4.1.17713.250.5.3",
"CAMBIUM-PTP250-MIB::transmitPower.0" => "1.3.6.1.4.1.17713.250.5.3.0",
"CAMBIUM-PTP250-MIB::rxModulation" => "1.3.6.1.4.1.17713.250.5.8",
"CAMBIUM-PTP250-MIB::rxModulation.0" => "1.3.6.1.4.1.17713.250.5.8.0",
"CAMBIUM-PTP250-MIB::txModulation" => "1.3.6.1.4.1.17713.250.5.9",
"CAMBIUM-PTP250-MIB::txModulation.0" => "1.3.6.1.4.1.17713.250.5.9.0",
"CAMBIUM-PTP250-MIB::signalStrengthRatio" => "1.3.6.1.4.1.17713.250.5.13",
"CAMBIUM-PTP250-MIB::signalStrengthRatio.0" => "1.3.6.1.4.1.17713.250.5.13.0",
"CAMBIUM-PTP250-MIB::noiseFloor" => "1.3.6.1.4.1.17713.250.5.15",
"CAMBIUM-PTP250-MIB::noiseFloor.0" => "1.3.6.1.4.1.17713.250.5.15.0",
"CAMBIUM-PTP250-MIB::receiveDataRate" => "1.3.6.1.4.1.17713.250.11.1",
"CAMBIUM-PTP250-MIB::receiveDataRate.0" => "1.3.6.1.4.1.17713.250.11.1.0",
"CAMBIUM-PTP250-MIB::transmitDataRate" => "1.3.6.1.4.1.17713.250.11.2",
"CAMBIUM-PTP250-MIB::transmitDataRate.0" => "1.3.6.1.4.1.17713.250.11.2.0",
"CAMBIUM-PTP250-MIB::aggregateDataRate" => "1.3.6.1.4.1.17713.250.11.3",
"CAMBIUM-PTP250-MIB::aggregateDataRate.0" => "1.3.6.1.4.1.17713.250.11.3.0",
"CAMBIUM-PTP250-MIB::masterSlaveMode" => "1.3.6.1.4.1.17713.250.4.1",
"CAMBIUM-PTP250-MIB::masterSlaveMode.0" => "1.3.6.1.4.1.17713.250.4.1.0",
# Cambium PTP 500 (enterprise 17713.5)
"CAMBIUM-PTP500-V2-MIB::receivePower" => "1.3.6.1.4.1.17713.5.12.1",
"CAMBIUM-PTP500-V2-MIB::receivePower.0" => "1.3.6.1.4.1.17713.5.12.1.0",
"CAMBIUM-PTP500-V2-MIB::transmitPower" => "1.3.6.1.4.1.17713.5.12.3",
"CAMBIUM-PTP500-V2-MIB::transmitPower.0" => "1.3.6.1.4.1.17713.5.12.3.0",
"CAMBIUM-PTP500-V2-MIB::signalStrengthRatio" => "1.3.6.1.4.1.17713.5.12.13",
"CAMBIUM-PTP500-V2-MIB::signalStrengthRatio.0" => "1.3.6.1.4.1.17713.5.12.13.0",
"CAMBIUM-PTP500-V2-MIB::receiveDataRate" => "1.3.6.1.4.1.17713.5.20.1",
"CAMBIUM-PTP500-V2-MIB::receiveDataRate.0" => "1.3.6.1.4.1.17713.5.20.1.0",
"CAMBIUM-PTP500-V2-MIB::transmitDataRate" => "1.3.6.1.4.1.17713.5.20.2",
"CAMBIUM-PTP500-V2-MIB::transmitDataRate.0" => "1.3.6.1.4.1.17713.5.20.2.0",
"CAMBIUM-PTP500-V2-MIB::aggregateDataRate" => "1.3.6.1.4.1.17713.5.20.3",
"CAMBIUM-PTP500-V2-MIB::aggregateDataRate.0" => "1.3.6.1.4.1.17713.5.20.3.0",
"CAMBIUM-PTP500-V2-MIB::masterSlaveMode" => "1.3.6.1.4.1.17713.5.5.1",
"CAMBIUM-PTP500-V2-MIB::masterSlaveMode.0" => "1.3.6.1.4.1.17713.5.5.1.0",
# Cambium PTP 600 (enterprise 17713.6)
"CAMBIUM-PTP600-MIB::receivePower" => "1.3.6.1.4.1.17713.6.12.1",
"CAMBIUM-PTP600-MIB::receivePower.0" => "1.3.6.1.4.1.17713.6.12.1.0",
"CAMBIUM-PTP600-MIB::transmitPower" => "1.3.6.1.4.1.17713.6.12.3",
"CAMBIUM-PTP600-MIB::transmitPower.0" => "1.3.6.1.4.1.17713.6.12.3.0",
"CAMBIUM-PTP600-MIB::signalStrengthRatio" => "1.3.6.1.4.1.17713.6.12.13",
"CAMBIUM-PTP600-MIB::signalStrengthRatio.0" => "1.3.6.1.4.1.17713.6.12.13.0",
"CAMBIUM-PTP600-MIB::receiveDataRate" => "1.3.6.1.4.1.17713.6.20.1",
"CAMBIUM-PTP600-MIB::receiveDataRate.0" => "1.3.6.1.4.1.17713.6.20.1.0",
"CAMBIUM-PTP600-MIB::transmitDataRate" => "1.3.6.1.4.1.17713.6.20.2",
"CAMBIUM-PTP600-MIB::transmitDataRate.0" => "1.3.6.1.4.1.17713.6.20.2.0",
"CAMBIUM-PTP600-MIB::aggregateDataRate" => "1.3.6.1.4.1.17713.6.20.3",
"CAMBIUM-PTP600-MIB::aggregateDataRate.0" => "1.3.6.1.4.1.17713.6.20.3.0",
"CAMBIUM-PTP600-MIB::masterSlaveMode" => "1.3.6.1.4.1.17713.6.5.1",
"CAMBIUM-PTP600-MIB::masterSlaveMode.0" => "1.3.6.1.4.1.17713.6.5.1.0",
# Cambium PTP 800 (enterprise 17713.8)
"CAMBIUM-PTP800-MIB::receivePower" => "1.3.6.1.4.1.17713.8.12.1",
"CAMBIUM-PTP800-MIB::receivePower.0" => "1.3.6.1.4.1.17713.8.12.1.0",
"CAMBIUM-PTP800-MIB::transmitPower" => "1.3.6.1.4.1.17713.8.12.3",
"CAMBIUM-PTP800-MIB::transmitPower.0" => "1.3.6.1.4.1.17713.8.12.3.0",
"CAMBIUM-PTP800-MIB::receiveDataRate" => "1.3.6.1.4.1.17713.8.20.1",
"CAMBIUM-PTP800-MIB::receiveDataRate.0" => "1.3.6.1.4.1.17713.8.20.1.0",
"CAMBIUM-PTP800-MIB::transmitDataRate" => "1.3.6.1.4.1.17713.8.20.2",
"CAMBIUM-PTP800-MIB::transmitDataRate.0" => "1.3.6.1.4.1.17713.8.20.2.0",
"CAMBIUM-PTP800-MIB::aggregateDataRate" => "1.3.6.1.4.1.17713.8.20.3",
"CAMBIUM-PTP800-MIB::aggregateDataRate.0" => "1.3.6.1.4.1.17713.8.20.3.0",
# Cambium ePMP additional wireless stats (enterprise 17713.21.1.2)
"CAMBIUM-PMP80211-MIB::cambiumSTAConnectedRFFrequency" => "1.3.6.1.4.1.17713.21.1.2.1",
"CAMBIUM-PMP80211-MIB::cambiumSTAConnectedRFFrequency.0" => "1.3.6.1.4.1.17713.21.1.2.1.0",
"CAMBIUM-PMP80211-MIB::cambiumSTADLRSSI" => "1.3.6.1.4.1.17713.21.1.2.3",
"CAMBIUM-PMP80211-MIB::cambiumSTADLRSSI.0" => "1.3.6.1.4.1.17713.21.1.2.3.0",
"CAMBIUM-PMP80211-MIB::cambiumAPNumberOfConnectedSTA" => "1.3.6.1.4.1.17713.21.1.2.10",
"CAMBIUM-PMP80211-MIB::cambiumAPNumberOfConnectedSTA.0" => "1.3.6.1.4.1.17713.21.1.2.10.0",
"CAMBIUM-PMP80211-MIB::cambiumSTADLSNR" => "1.3.6.1.4.1.17713.21.1.2.18",
"CAMBIUM-PMP80211-MIB::cambiumSTADLSNR.0" => "1.3.6.1.4.1.17713.21.1.2.18.0",
# Cambium cnPilot (enterprise 17713.22)
"CAMBIUM-MIB::cambiumAPTotalClients" => "1.3.6.1.4.1.17713.22.1.1.1.14",
"CAMBIUM-MIB::cambiumAPTotalClients.0" => "1.3.6.1.4.1.17713.22.1.1.1.14.0",
"CAMBIUM-MIB::cambiumRadioTransmitPower" => "1.3.6.1.4.1.17713.22.1.2.1.8",
"CAMBIUM-MIB::cambiumRadioTransmitPower.0" => "1.3.6.1.4.1.17713.22.1.2.1.8.0",
"CAMBIUM-MIB::cambiumRadioNoiseFloor" => "1.3.6.1.4.1.17713.22.1.2.1.16",
"CAMBIUM-MIB::cambiumRadioNoiseFloor.0" => "1.3.6.1.4.1.17713.22.1.2.1.16.0",
"CAMBIUM-MIB::cambiumClientSNR" => "1.3.6.1.4.1.17713.22.1.3.1.11",
"CAMBIUM-MIB::cambiumClientSNR.0" => "1.3.6.1.4.1.17713.22.1.3.1.11.0",
"CAMBIUM-MIB::productName" => "1.3.6.1.4.1.17713.22.1.1.1.1",
"CAMBIUM-MIB::productName.0" => "1.3.6.1.4.1.17713.22.1.1.1.1.0",
"CAMBIUM-MIB::serialNumber" => "1.3.6.1.4.1.17713.22.1.1.1.2",
"CAMBIUM-MIB::serialNumber.0" => "1.3.6.1.4.1.17713.22.1.1.1.2.0",
"CAMBIUM-MIB::hardwareVersion" => "1.3.6.1.4.1.17713.22.1.1.1.3",
"CAMBIUM-MIB::hardwareVersion.0" => "1.3.6.1.4.1.17713.22.1.1.1.3.0",
"CAMBIUM-MIB::cambiumAPHWType" => "1.3.6.1.4.1.17713.22.1.1.1.4",
"CAMBIUM-MIB::cambiumAPHWType.0" => "1.3.6.1.4.1.17713.22.1.1.1.4.0",
"CAMBIUM-MIB::cambiumAPSerialNum" => "1.3.6.1.4.1.17713.22.1.1.1.5",
"CAMBIUM-MIB::cambiumAPSerialNum.0" => "1.3.6.1.4.1.17713.22.1.1.1.5.0",
# Cambium cnMatrix (enterprise 17713.24) - uses LLDP-EXT-MED
"LLDP-EXT-MED-CAMBIUM-MIB::lldpXMedLocModelName" => "1.0.8802.1.1.2.1.5.4795.1.2.2",
"LLDP-EXT-MED-CAMBIUM-MIB::lldpXMedLocModelName.0" => "1.0.8802.1.1.2.1.5.4795.1.2.2.0",
"LLDP-EXT-MED-CAMBIUM-MIB::lldpXMedLocSoftwareRev" => "1.0.8802.1.1.2.1.5.4795.1.2.4",
"LLDP-EXT-MED-CAMBIUM-MIB::lldpXMedLocSoftwareRev.0" => "1.0.8802.1.1.2.1.5.4795.1.2.4.0",
"LLDP-EXT-MED-CAMBIUM-MIB::lldpXMedLocSerialNum" => "1.0.8802.1.1.2.1.5.4795.1.2.5",
"LLDP-EXT-MED-CAMBIUM-MIB::lldpXMedLocSerialNum.0" => "1.0.8802.1.1.2.1.5.4795.1.2.5.0",
# Mimosa B5/PTP Radios - wireless stats (enterprise 43356.2.1.2.6)
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaTxPower" => "1.3.6.1.4.1.43356.2.1.2.6.1.1.2",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaRxPower" => "1.3.6.1.4.1.43356.2.1.2.6.1.1.3",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaRxNoise" => "1.3.6.1.4.1.43356.2.1.2.6.1.1.4",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaSNR" => "1.3.6.1.4.1.43356.2.1.2.6.1.1.5",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaCenterFreq" => "1.3.6.1.4.1.43356.2.1.2.6.1.1.6",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaTxPhy" => "1.3.6.1.4.1.43356.2.1.2.6.2.1.2",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaRxPhy" => "1.3.6.1.4.1.43356.2.1.2.6.2.1.5",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaPerTxRate" => "1.3.6.1.4.1.43356.2.1.2.7.3",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaPerTxRate.0" => "1.3.6.1.4.1.43356.2.1.2.7.3.0",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaPerRxRate" => "1.3.6.1.4.1.43356.2.1.2.7.4",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaPerRxRate.0" => "1.3.6.1.4.1.43356.2.1.2.7.4.0",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaInternalTemp" => "1.3.6.1.4.1.43356.2.1.2.1.8",
"MIMOSA-NETWORKS-BFIVE-MIB::mimosaInternalTemp.0" => "1.3.6.1.4.1.43356.2.1.2.1.8.0",
# Mimosa PTMP (enterprise 43356.2.1.2.9)
"MIMOSA-NETWORKS-PTMP-MIB::mimosaPtmpChPwrCntrFreqCur" => "1.3.6.1.4.1.43356.2.1.2.9.3.3.1.7",
"MIMOSA-NETWORKS-PTMP-MIB::mimosaPtmpChPwrTxPowerCur" => "1.3.6.1.4.1.43356.2.1.2.9.3.3.1.10",
"MIMOSA-NETWORKS-PTMP-MIB::mimosaPtmpChPwrMinRxPower" => "1.3.6.1.4.1.43356.2.1.2.9.3.3.1.12",
# Netonix Switch (enterprise 46242)
"NETONIX-SWITCH-MIB::firmwareVersion" => "1.3.6.1.4.1.46242.1",
"NETONIX-SWITCH-MIB::firmwareVersion.0" => "1.3.6.1.4.1.46242.1.0",
"NETONIX-SWITCH-MIB::fanTable" => "1.3.6.1.4.1.46242.2",
"NETONIX-SWITCH-MIB::tempTable" => "1.3.6.1.4.1.46242.3",
"NETONIX-SWITCH-MIB::voltageTable" => "1.3.6.1.4.1.46242.4",
"NETONIX-SWITCH-MIB::poeTable" => "1.3.6.1.4.1.46242.5",
"NETONIX-SWITCH-MIB::totalPowerConsumption" => "1.3.6.1.4.1.46242.6",
"NETONIX-SWITCH-MIB::totalPowerConsumption.0" => "1.3.6.1.4.1.46242.6.0",
"NETONIX-SWITCH-MIB::dcdcInputCurrent" => "1.3.6.1.4.1.46242.7",
"NETONIX-SWITCH-MIB::dcdcInputCurrent.0" => "1.3.6.1.4.1.46242.7.0",
"NETONIX-SWITCH-MIB::dcdcEfficiency" => "1.3.6.1.4.1.46242.8",
"NETONIX-SWITCH-MIB::dcdcEfficiency.0" => "1.3.6.1.4.1.46242.8.0",
# WHISP legacy OIDs (Cambium/Motorola Canopy - enterprise 161.19.3)
"WHISP-BOX-MIBV2-MIB::whispBoxRssi" => "1.3.6.1.4.1.161.19.3.2.2.21",
"WHISP-BOX-MIBV2-MIB::whispBoxRssi.0" => "1.3.6.1.4.1.161.19.3.2.2.21.0",
"WHISP-BOX-MIBV2-MIB::whispBoxEsn" => "1.3.6.1.4.1.161.19.3.3.1.3",
"WHISP-BOX-MIBV2-MIB::whispBoxEsn.0" => "1.3.6.1.4.1.161.19.3.3.1.3.0"
}
@doc """

View file

@ -117,7 +117,7 @@ defmodule ToweropsWeb.Layouts do
<div class="flex items-center justify-between">
<div class="flex items-center gap-2">
<.icon name="hero-exclamation-triangle" class="w-5 h-5" />
<span class="font-medium">
<span class="font-medium text-sm sm:text-base">
Impersonating: {@current_scope.user.email}
</span>
</div>
@ -126,7 +126,7 @@ defmodule ToweropsWeb.Layouts do
method="delete"
class="px-3 py-1 bg-white text-yellow-900 hover:bg-yellow-50 rounded font-medium text-sm"
>
Exit Impersonation
Exit
</.link>
</div>
</div>
@ -135,14 +135,39 @@ defmodule ToweropsWeb.Layouts do
<nav class="border-b border-gray-200 bg-white dark:border-white/10 dark:bg-gray-900">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<div class="flex h-16 justify-between">
<div class="flex">
<div class="flex flex-shrink-0 items-center">
<.link navigate={~p"/orgs"} class="text-xl font-bold text-gray-900 dark:text-white">
<div class="flex h-14 sm:h-16 justify-between">
<div class="flex items-center">
<!-- Mobile menu button -->
<button
:if={@current_organization}
type="button"
id="mobile-menu-button"
phx-click={
JS.toggle(to: "#mobile-menu")
|> JS.toggle(to: "#mobile-menu-icon-open")
|> JS.toggle(to: "#mobile-menu-icon-close")
}
class="inline-flex items-center justify-center rounded-md p-2 text-gray-500 hover:bg-gray-100 hover:text-gray-700 focus:outline-none dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200 md:hidden"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<span id="mobile-menu-icon-open"><.icon name="hero-bars-3" class="size-6" /></span>
<span id="mobile-menu-icon-close" class="hidden">
<.icon name="hero-x-mark" class="size-6" />
</span>
</button>
<div class="flex flex-shrink-0 items-center ml-2 md:ml-0">
<.link
navigate={~p"/orgs"}
class="text-lg sm:text-xl font-bold text-gray-900 dark:text-white"
>
Towerops
</.link>
</div>
<div :if={@current_organization} class="ml-10 flex space-x-8">
<!-- Desktop navigation -->
<div :if={@current_organization} class="hidden md:ml-8 md:flex md:space-x-6">
<.nav_link
navigate={~p"/orgs/#{@current_organization.slug}"}
active={@active_page == "dashboard"}
@ -175,21 +200,29 @@ defmodule ToweropsWeb.Layouts do
</.nav_link>
</div>
</div>
<div class="relative flex items-center gap-2">
<div class="relative flex items-center gap-1 sm:gap-2">
<.theme_toggle />
<button
type="button"
id="org-menu-button"
phx-click={JS.toggle(to: "#org-menu")}
class="inline-flex items-center justify-center gap-x-1.5 rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-xs inset-ring-1 inset-ring-gray-300 hover:bg-gray-50 dark:bg-white/10 dark:text-white dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20"
class="inline-flex items-center justify-center gap-x-1 rounded-md bg-white px-2 py-1.5 sm:px-3 sm:py-2 text-xs sm:text-sm font-semibold text-gray-900 shadow-xs inset-ring-1 inset-ring-gray-300 hover:bg-gray-50 dark:bg-white/10 dark:text-white dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20"
>
{if @current_organization, do: @current_organization.name, else: "Menu"}
<span class="hidden sm:inline">
{if @current_organization, do: @current_organization.name, else: "Menu"}
</span>
<span class="sm:hidden">
{if @current_organization,
do: String.slice(@current_organization.name, 0..10),
else: "Menu"}
</span>
<svg
viewBox="0 0 20 20"
fill="currentColor"
data-slot="icon"
aria-hidden="true"
class="-mr-1 size-5 text-gray-400"
class="-mr-0.5 size-4 sm:size-5 text-gray-400"
>
<path
d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z"
@ -249,9 +282,45 @@ defmodule ToweropsWeb.Layouts do
</div>
</div>
</div>
<!-- Mobile menu -->
<div :if={@current_organization} class="hidden md:hidden" id="mobile-menu">
<div class="space-y-1 px-2 pb-3 pt-2 border-t border-gray-200 dark:border-white/10">
<.mobile_nav_link
navigate={~p"/orgs/#{@current_organization.slug}"}
active={@active_page == "dashboard"}
>
<.icon name="hero-home" class="size-5" /> Dashboard
</.mobile_nav_link>
<.mobile_nav_link
navigate={~p"/sites"}
active={@active_page == "sites"}
>
<.icon name="hero-building-office" class="size-5" /> Sites
</.mobile_nav_link>
<.mobile_nav_link
navigate={~p"/devices"}
active={@active_page == "devices"}
>
<.icon name="hero-server" class="size-5" /> Devices
</.mobile_nav_link>
<.mobile_nav_link
navigate={~p"/orgs/#{@current_organization.slug}/alerts"}
active={@active_page == "alerts"}
>
<.icon name="hero-bell" class="size-5" /> Alerts
</.mobile_nav_link>
<.mobile_nav_link
navigate={~p"/orgs/#{@current_organization.slug}/agents"}
active={@active_page == "agents"}
>
<.icon name="hero-cpu-chip" class="size-5" /> Agents
</.mobile_nav_link>
</div>
</div>
</nav>
<main class="flex-1 py-10">
<main class="flex-1 py-6 sm:py-10">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
{render_slot(@inner_block)}
</div>
@ -286,6 +355,28 @@ defmodule ToweropsWeb.Layouts do
"""
end
attr :navigate, :string, required: true
attr :active, :boolean, default: false
slot :inner_block, required: true
defp mobile_nav_link(assigns) do
~H"""
<.link
navigate={@navigate}
class={[
"flex items-center gap-3 rounded-md px-3 py-2 text-base font-medium",
if(@active,
do: "bg-gray-100 text-gray-900 dark:bg-gray-800 dark:text-white",
else:
"text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-white"
)
]}
>
{render_slot(@inner_block)}
</.link>
"""
end
@doc """
Shows the flash group with standard titles and content.
@ -407,14 +498,35 @@ defmodule ToweropsWeb.Layouts do
<div class="flex min-h-screen flex-col bg-gray-50 dark:bg-gray-950">
<nav class="bg-white border-b border-gray-200 dark:border-white/10 dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex">
<div class="flex justify-between h-14 sm:h-16">
<div class="flex items-center">
<!-- Mobile menu button -->
<button
type="button"
id="admin-mobile-menu-button"
phx-click={
JS.toggle(to: "#admin-mobile-menu")
|> JS.toggle(to: "#admin-menu-icon-open")
|> JS.toggle(to: "#admin-menu-icon-close")
}
class="inline-flex items-center justify-center rounded-md p-2 text-gray-500 hover:bg-gray-100 hover:text-gray-700 focus:outline-none dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200 sm:hidden"
>
<span class="sr-only">Open admin menu</span>
<span id="admin-menu-icon-open"><.icon name="hero-bars-3" class="size-6" /></span>
<span id="admin-menu-icon-close" class="hidden">
<.icon name="hero-x-mark" class="size-6" />
</span>
</button>
<.link
navigate={~p"/admin"}
class="flex items-center text-xl font-bold text-gray-900 dark:text-white"
class="flex items-center text-lg sm:text-xl font-bold text-gray-900 dark:text-white ml-2 sm:ml-0"
>
Towerops Admin
<span class="hidden sm:inline">Towerops Admin</span>
<span class="sm:hidden">Admin</span>
</.link>
<!-- Desktop navigation -->
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
<.link
navigate={~p"/admin/users"}
@ -430,21 +542,34 @@ defmodule ToweropsWeb.Layouts do
</.link>
</div>
</div>
<div class="flex items-center gap-2">
<div class="flex items-center gap-1 sm:gap-2">
<.theme_toggle />
<.link
navigate={~p"/orgs"}
class="text-sm text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white"
class="text-xs sm:text-sm text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white"
>
Back to App
<span class="hidden sm:inline">Back to App</span>
<span class="sm:hidden">App</span>
</.link>
</div>
</div>
</div>
<!-- Mobile menu -->
<div class="hidden sm:hidden" id="admin-mobile-menu">
<div class="space-y-1 px-2 pb-3 pt-2 border-t border-gray-200 dark:border-white/10">
<.mobile_nav_link navigate={~p"/admin/users"} active={false}>
<.icon name="hero-users" class="size-5" /> Users
</.mobile_nav_link>
<.mobile_nav_link navigate={~p"/admin/organizations"} active={false}>
<.icon name="hero-building-office-2" class="size-5" /> Organizations
</.mobile_nav_link>
</div>
</div>
</nav>
<main class="flex-1">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6 sm:py-8">
{render_slot(@inner_block)}
</div>
</main>

View file

@ -298,5 +298,82 @@ defmodule Towerops.Snmp.MibTranslatorTest do
assert String.contains?(oid, "1.3.6.1.2.1.47.1.1.1.1.2")
assert String.ends_with?(oid, ".123")
end
test "uses fallback for Ubiquiti AirMAX GPS OIDs" do
ubnt_gps_oids = [
{"UBNT-AirMAX-MIB::ubntGpsLat.0", "1.3.6.1.4.1.41112.1.4.9.3.0"},
{"UBNT-AirMAX-MIB::ubntGpsLon.0", "1.3.6.1.4.1.41112.1.4.9.4.0"},
{"UBNT-AirMAX-MIB::ubntGpsFix.0", "1.3.6.1.4.1.41112.1.4.9.2.0"},
{"UBNT-AirMAX-MIB::ubntGpsStatus.0", "1.3.6.1.4.1.41112.1.4.9.1.0"}
]
Enum.each(ubnt_gps_oids, fn {mib_name, expected_oid} ->
result = MibTranslator.translate(mib_name)
assert {:ok, oid} = result
assert String.contains?(oid, expected_oid)
end)
end
test "uses fallback for Ubiquiti AirMAX host OIDs" do
ubnt_host_oids = [
{"UBNT-AirMAX-MIB::ubntHostCpuLoad.0", "1.3.6.1.4.1.41112.1.4.8.3.0"},
{"UBNT-AirMAX-MIB::ubntHostTemperature.0", "1.3.6.1.4.1.41112.1.4.8.4.0"},
{"UBNT-AirMAX-MIB::ubntHostNetrole.0", "1.3.6.1.4.1.41112.1.4.8.2.0"}
]
Enum.each(ubnt_host_oids, fn {mib_name, expected_oid} ->
result = MibTranslator.translate(mib_name)
assert {:ok, oid} = result
assert String.contains?(oid, expected_oid)
end)
end
test "uses fallback for Cambium ePMP OIDs" do
cambium_oids = [
{"CAMBIUM-PMP80211-MIB::cambiumCurrentuImageVersion.0", "1.3.6.1.4.1.17713.21.1.1.17.0"},
{"CAMBIUM-PMP80211-MIB::cambiumEPMPMSN.0", "1.3.6.1.4.1.17713.21.1.1.31.0"},
{"CAMBIUM-PMP80211-MIB::cambiumDeviceLatitude.0", "1.3.6.1.4.1.17713.21.1.1.18.0"},
{"CAMBIUM-PMP80211-MIB::cambiumDeviceLongitude.0", "1.3.6.1.4.1.17713.21.1.1.19.0"},
{"CAMBIUM-PMP80211-MIB::cambiumEffectiveSyncSource", "1.3.6.1.4.1.17713.21.1.1.7"},
{"CAMBIUM-PMP80211-MIB::cambiumDFSStatus", "1.3.6.1.4.1.17713.21.1.1.6"},
{"CAMBIUM-PMP80211-MIB::sysCPUUsage", "1.3.6.1.4.1.17713.21.2.1.64"}
]
Enum.each(cambium_oids, fn {mib_name, expected_oid} ->
result = MibTranslator.translate(mib_name)
assert {:ok, oid} = result
assert String.contains?(oid, expected_oid)
end)
end
test "uses fallback for Mimosa OIDs" do
mimosa_oids = [
{"MIMOSA-NETWORKS-BFIVE-MIB::mimosaSerialNumber.0", "1.3.6.1.4.1.43356.2.1.2.1.2.0"},
{"MIMOSA-NETWORKS-BFIVE-MIB::mimosaFirmwareVersion.0", "1.3.6.1.4.1.43356.2.1.2.1.3.0"},
{"MIMOSA-NETWORKS-BFIVE-MIB::mimosaSatelliteStrength", "1.3.6.1.4.1.43356.2.1.2.2.5"}
]
Enum.each(mimosa_oids, fn {mib_name, expected_oid} ->
result = MibTranslator.translate(mib_name)
assert {:ok, oid} = result
assert String.contains?(oid, expected_oid)
end)
end
test "uses fallback for Ubiquiti AirMAX wireless stats OIDs" do
ubnt_wireless_oids = [
{"UBNT-AirMAX-MIB::ubntWlStatSignal", "1.3.6.1.4.1.41112.1.4.5.1.5"},
{"UBNT-AirMAX-MIB::ubntWlStatRssi", "1.3.6.1.4.1.41112.1.4.5.1.6"},
{"UBNT-AirMAX-MIB::ubntWlStatCcq", "1.3.6.1.4.1.41112.1.4.5.1.7"},
{"UBNT-AirMAX-MIB::ubntWlStatNoiseFloor", "1.3.6.1.4.1.41112.1.4.5.1.8"},
{"UBNT-AirMAX-MIB::ubntWlStatStaCount", "1.3.6.1.4.1.41112.1.4.5.1.15"}
]
Enum.each(ubnt_wireless_oids, fn {mib_name, expected_oid} ->
result = MibTranslator.translate(mib_name)
assert {:ok, oid} = result
assert String.contains?(oid, expected_oid)
end)
end
end
end