From 5e5da89f3aee230bc1266078bc80a4b1875a810a Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 10 Mar 2026 17:07:43 -0500 Subject: [PATCH] fix: correct SNMP OIDs for 7 vendor modules to match MIB definitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cambium PTP: Rx Power .12.6→.12.12 (rawReceivePower), Tx Power .12.3→.12.4, data rates from .12 subtree→.20 subtree, renamed Link Loss→Signal Strength Ratio, added aggregate rate Ceragon: TX/RX power OIDs from .10.4.1.11→.10.5.1.1 subtree (genEquipRfuStatusTxLevel/RxLevel), removed SNR and link status Aviat: RSL→.9.15 (RXPERFORMANCE-MIB), Tx Power/SNR→.9.33 (RXPERFORMANCE-EX-MIB), capacity→.9.3 (MODEM-MIB), removed temperature DragonWave: SNR column .2.3→.2.8, RSL column .2.2→.2.4, removed temperature Exalt: frequencies .1.7/.1.8→.57.4/.57.5 (ExtendAirG2), Tx Power .1.9→.57.1, RSL .2.1→.2.4.3.1.3 (locCurrentRSL), removed SNR Teltonika: RSSI column 7→12, RSRP 8→20, SINR 9→19, RSRQ 10→21, Connection Type 3→16, SIM Status 2→9, temperature .1.7→.2.2.1.17 SIAE: Tx Power/RSSI/Frequency→.39.2.1 subtree (Alfo80hd MIB), added Tx/Rx rate from .15.4.1.17/.18, removed SNR --- lib/towerops/snmp/profiles/vendors/aviat.ex | 44 +++++---- .../snmp/profiles/vendors/cambium_ptp.ex | 54 +++++------ lib/towerops/snmp/profiles/vendors/ceragon.ex | 29 ++---- .../snmp/profiles/vendors/dragonwave.ex | 25 +++-- lib/towerops/snmp/profiles/vendors/exalt.ex | 35 +++---- lib/towerops/snmp/profiles/vendors/siae.ex | 48 ++++++---- .../snmp/profiles/vendors/teltonika.ex | 35 +++---- .../snmp/profiles/vendors/aviat_test.exs | 67 ++++++++----- .../profiles/vendors/cambium_ptp_test.exs | 96 ++++++++++++------- .../snmp/profiles/vendors/ceragon_test.exs | 41 ++++---- .../snmp/profiles/vendors/dragonwave_test.exs | 50 ++++++---- .../snmp/profiles/vendors/exalt_test.exs | 60 +++++++----- .../snmp/profiles/vendors/siae_test.exs | 73 +++++++++----- .../snmp/profiles/vendors/teltonika_test.exs | 68 +++++++++---- 14 files changed, 426 insertions(+), 299 deletions(-) diff --git a/lib/towerops/snmp/profiles/vendors/aviat.ex b/lib/towerops/snmp/profiles/vendors/aviat.ex index f1c72650..7375129e 100644 --- a/lib/towerops/snmp/profiles/vendors/aviat.ex +++ b/lib/towerops/snmp/profiles/vendors/aviat.ex @@ -13,6 +13,12 @@ defmodule Towerops.Snmp.Profiles.Vendors.Aviat do - WTM 4500 - WTM 4800 - CTR 8540 + + OIDs sourced from Aviat MIBs: + - RSL: AVIAT-RXPERFORMANCE-MIB - aviatRxPerformRslReadingCurrent (.9.15.2.2.1.4) + - Tx Power: AVIAT-RXPERFORMANCE-EX-MIB - aviatRxPerformTxpowReadingCurrent (.9.33.2.2.1.7) + - SNR: AVIAT-RXPERFORMANCE-EX-MIB - aviatRxPerformCinrReadingCurrent (.9.33.2.2.1.3) + - Capacity: AVIAT-MODEM-MIB - aviatModemCurCapacity Tx/Rx (.9.3.2.1.1.11/.12) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -45,44 +51,44 @@ defmodule Towerops.Snmp.Profiles.Vendors.Aviat do @impl true def wireless_oid_defs do [ - # Radio Temperature + # RSL (Receive Signal Level) - aviatRxPerformRslReadingCurrent (divide by 10) %{ - oid: "1.3.6.1.4.1.2509.9.6.2.3.1.1.5.1", - sensor_type: "temperature", - sensor_descr: "ODU Temperature", - sensor_unit: "C", - sensor_divisor: 1 - }, - # RSL (Receive Signal Level) - %{ - oid: "1.3.6.1.4.1.2509.9.6.2.2.1.1.7.1", + oid: "1.3.6.1.4.1.2509.9.15.2.2.1.4.1", sensor_type: "rssi", sensor_descr: "RSL", sensor_unit: "dBm", sensor_divisor: 10 }, - # Transmit Power + # Transmit Power - aviatRxPerformTxpowReadingCurrent (divide by 10) %{ - oid: "1.3.6.1.4.1.2509.9.6.2.2.1.1.5.1", + oid: "1.3.6.1.4.1.2509.9.33.2.2.1.7.1", sensor_type: "power", sensor_descr: "Tx Power", sensor_unit: "dBm", sensor_divisor: 10 }, - # Modem SNR + # Modem SNR - aviatRxPerformCinrReadingCurrent (divide by 10) %{ - oid: "1.3.6.1.4.1.2509.9.6.2.2.1.1.12.1", + oid: "1.3.6.1.4.1.2509.9.33.2.2.1.3.1", sensor_type: "snr", sensor_descr: "SNR", sensor_unit: "dB", sensor_divisor: 10 }, - # Link Capacity (Mbps) + # TX Capacity - aviatModemCurCapacityTx (kbps, multiplied by 1000 in LibreNMS) %{ - oid: "1.3.6.1.4.1.2509.9.6.2.2.1.1.15.1", - sensor_type: "capacity", - sensor_descr: "Link Capacity", - sensor_unit: "Mbps", + oid: "1.3.6.1.4.1.2509.9.3.2.1.1.11.1", + sensor_type: "rate", + sensor_descr: "Tx Capacity", + sensor_unit: "kbps", + sensor_divisor: 1 + }, + # RX Capacity - aviatModemCurCapacityRx (kbps, multiplied by 1000 in LibreNMS) + %{ + oid: "1.3.6.1.4.1.2509.9.3.2.1.1.12.1", + sensor_type: "rate", + sensor_descr: "Rx Capacity", + sensor_unit: "kbps", sensor_divisor: 1 } ] diff --git a/lib/towerops/snmp/profiles/vendors/cambium_ptp.ex b/lib/towerops/snmp/profiles/vendors/cambium_ptp.ex index d1ffb8f9..96f31895 100644 --- a/lib/towerops/snmp/profiles/vendors/cambium_ptp.ex +++ b/lib/towerops/snmp/profiles/vendors/cambium_ptp.ex @@ -13,6 +13,10 @@ defmodule Towerops.Snmp.Profiles.Vendors.CambiumPtp do - PTP 670 - PTP 700 - PTP 800 + + OIDs sourced from CAMBIUM-PTP650-MIB: + - Radio status: 1.3.6.1.4.1.17713.7.12 (transmitPower, rawReceivePower, signalStrengthRatio) + - Data rates: 1.3.6.1.4.1.17713.7.20 (receiveDataRate, transmitDataRate, aggregateDataRate) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -45,60 +49,52 @@ defmodule Towerops.Snmp.Profiles.Vendors.CambiumPtp do @impl true def wireless_oid_defs do [ - # Receive Power (RSL) + # Transmit Power - transmitPower.0 (entry 4, divide by 10 for dBm) %{ - oid: "1.3.6.1.4.1.17713.7.12.6.0", - sensor_type: "rssi", - sensor_descr: "Receive Power", - sensor_unit: "dBm", - sensor_divisor: 10 - }, - # Transmit Power - %{ - oid: "1.3.6.1.4.1.17713.7.12.3.0", + oid: "1.3.6.1.4.1.17713.7.12.4.0", sensor_type: "power", sensor_descr: "Transmit Power", sensor_unit: "dBm", sensor_divisor: 10 }, - # Vector Error + # Receive Power (RSL) - rawReceivePower.0 (entry 12, divide by 10 for dBm) %{ - oid: "1.3.6.1.4.1.17713.7.12.8.0", - sensor_type: "snr", - sensor_descr: "Vector Error", - sensor_unit: "dB", + oid: "1.3.6.1.4.1.17713.7.12.12.0", + sensor_type: "rssi", + sensor_descr: "Receive Power", + sensor_unit: "dBm", sensor_divisor: 10 }, - # Link Loss + # Signal Strength Ratio - signalStrengthRatio.0 (entry 9, divide by 10) %{ oid: "1.3.6.1.4.1.17713.7.12.9.0", - sensor_type: "quality", - sensor_descr: "Link Loss", + sensor_type: "ssr", + sensor_descr: "Signal Strength Ratio", sensor_unit: "dB", sensor_divisor: 10 }, - # Receive Data Rate + # Receive Data Rate - receiveDataRate.0 (kbps) %{ - oid: "1.3.6.1.4.1.17713.7.12.14.0", - sensor_type: "capacity", + oid: "1.3.6.1.4.1.17713.7.20.1.0", + sensor_type: "rate", sensor_descr: "Rx Data Rate", sensor_unit: "kbps", sensor_divisor: 1 }, - # Transmit Data Rate + # Transmit Data Rate - transmitDataRate.0 (kbps) %{ - oid: "1.3.6.1.4.1.17713.7.12.15.0", - sensor_type: "capacity", + oid: "1.3.6.1.4.1.17713.7.20.2.0", + sensor_type: "rate", sensor_descr: "Tx Data Rate", sensor_unit: "kbps", sensor_divisor: 1 }, - # Radio Temperature + # Aggregate Data Rate - aggregateDataRate.0 (kbps) %{ - oid: "1.3.6.1.4.1.17713.7.13.1.0", - sensor_type: "temperature", - sensor_descr: "Radio Temperature", - sensor_unit: "C", + oid: "1.3.6.1.4.1.17713.7.20.3.0", + sensor_type: "rate", + sensor_descr: "Aggregate Data Rate", + sensor_unit: "kbps", sensor_divisor: 1 } ] diff --git a/lib/towerops/snmp/profiles/vendors/ceragon.ex b/lib/towerops/snmp/profiles/vendors/ceragon.ex index 26dfd441..1b1318cb 100644 --- a/lib/towerops/snmp/profiles/vendors/ceragon.ex +++ b/lib/towerops/snmp/profiles/vendors/ceragon.ex @@ -8,6 +8,9 @@ defmodule Towerops.Snmp.Profiles.Vendors.Ceragon do - FibeAir IP-10 series - FibeAir IP-20 series - FibeAir RFU-C/H series + + OIDs sourced from MWRM-RADIO-MIB: + - RFU status table: 1.3.6.1.4.1.2281.10.5.1 (genEquipRfuStatusTxLevel, genEquipRfuStatusRxLevel) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -37,36 +40,20 @@ defmodule Towerops.Snmp.Profiles.Vendors.Ceragon do @impl true def wireless_oid_defs do [ - # TX Power + # TX Power - genEquipRfuStatusTxLevel (MWRM-RADIO-MIB) %{ - oid: "1.3.6.1.4.1.2281.10.4.1.11.1.1.1", + oid: "1.3.6.1.4.1.2281.10.5.1.1.3.1", sensor_type: "power", sensor_descr: "TX Power", sensor_unit: "dBm", - sensor_divisor: 10 + sensor_divisor: 1 }, - # RX Level + # RX Level - genEquipRfuStatusRxLevel (MWRM-RADIO-MIB) %{ - oid: "1.3.6.1.4.1.2281.10.4.1.11.1.2.1", + oid: "1.3.6.1.4.1.2281.10.5.1.1.2.1", sensor_type: "rssi", sensor_descr: "RX Level", sensor_unit: "dBm", - sensor_divisor: 10 - }, - # SNR - %{ - oid: "1.3.6.1.4.1.2281.10.4.1.11.1.3.1", - sensor_type: "snr", - sensor_descr: "Signal to Noise Ratio", - sensor_unit: "dB", - sensor_divisor: 10 - }, - # Link Status (1=up, 2=down) - %{ - oid: "1.3.6.1.4.1.2281.10.4.1.11.1.4.1", - sensor_type: "state", - sensor_descr: "Link Status", - sensor_unit: "", sensor_divisor: 1 } ] diff --git a/lib/towerops/snmp/profiles/vendors/dragonwave.ex b/lib/towerops/snmp/profiles/vendors/dragonwave.ex index ce6b25ec..7e22c654 100644 --- a/lib/towerops/snmp/profiles/vendors/dragonwave.ex +++ b/lib/towerops/snmp/profiles/vendors/dragonwave.ex @@ -9,6 +9,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.Dragonwave do - Horizon Compact Plus - Horizon Duo - Horizon Quantum + + OIDs sourced from Horizon ODU MIB: + - SNR: .7262.2.2.5.1.2.8 (column 8, divide by 10) + - RSL: .7262.2.2.5.1.2.4 (column 4, divide by 10) + - Tx Power: .7262.2.2.5.1.3.2 (column 2, divide by 10) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -40,31 +45,23 @@ defmodule Towerops.Snmp.Profiles.Vendors.Dragonwave do @impl true def wireless_oid_defs do [ - # Radio Temperature (divide by 10) + # Modem SNR (column 8, divide by 10) %{ - oid: "1.3.6.1.4.1.7262.2.2.5.1.3.6.0", - sensor_type: "temperature", - sensor_descr: "Radio Temperature", - sensor_unit: "C", - sensor_divisor: 10 - }, - # Modem SNR (divide by 10) - %{ - oid: "1.3.6.1.4.1.7262.2.2.5.1.2.3.0", + oid: "1.3.6.1.4.1.7262.2.2.5.1.2.8.0", sensor_type: "snr", - sensor_descr: "Modem SNR", + sensor_descr: "SNR", sensor_unit: "dB", sensor_divisor: 10 }, - # RSL (Receive Signal Level) + # RSL (Receive Signal Level, column 4, divide by 10) %{ - oid: "1.3.6.1.4.1.7262.2.2.5.1.2.2.0", + oid: "1.3.6.1.4.1.7262.2.2.5.1.2.4.0", sensor_type: "rssi", sensor_descr: "RSL", sensor_unit: "dBm", sensor_divisor: 10 }, - # Transmit Power + # Transmit Power (column 2, divide by 10) %{ oid: "1.3.6.1.4.1.7262.2.2.5.1.3.2.0", sensor_type: "power", diff --git a/lib/towerops/snmp/profiles/vendors/exalt.ex b/lib/towerops/snmp/profiles/vendors/exalt.ex index 7ff06a68..d705407b 100644 --- a/lib/towerops/snmp/profiles/vendors/exalt.ex +++ b/lib/towerops/snmp/profiles/vendors/exalt.ex @@ -7,6 +7,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.Exalt do Supported devices: - ExtendAir series - ExploreAir series + + OIDs sourced from ExtendAirG2 and ExaltComProducts MIBs: + - Frequency: ExtendAirG2::extendAirG2TXfrequency (.57.4), extendAirG2RXfrequency (.57.5) + - Tx Power: ExtendAirG2::extendAirG2TxPower (.57.1) + - RSL: ExaltComProducts::locCurrentRSL (.2.4.3.1.3) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -31,48 +36,38 @@ defmodule Towerops.Snmp.Profiles.Vendors.Exalt do @impl true def wireless_oid_defs do - # EXALT-MIB OIDs - # Enterprise OID: 1.3.6.1.4.1.25651 [ - # Tx Frequency (kHz, divide by 1000 for MHz) + # Tx Frequency - extendAirG2TXfrequency (kHz, divide by 1000 for MHz) %{ - oid: "1.3.6.1.4.1.25651.1.2.3.1.1.7.0", + oid: "1.3.6.1.4.1.25651.1.2.3.1.57.4.0", sensor_type: "frequency", sensor_descr: "Tx Frequency", sensor_unit: "MHz", sensor_divisor: 1000 }, - # Rx Frequency (kHz, divide by 1000 for MHz) + # Rx Frequency - extendAirG2RXfrequency (kHz, divide by 1000 for MHz) %{ - oid: "1.3.6.1.4.1.25651.1.2.3.1.1.8.0", + oid: "1.3.6.1.4.1.25651.1.2.3.1.57.5.0", sensor_type: "frequency", sensor_descr: "Rx Frequency", sensor_unit: "MHz", sensor_divisor: 1000 }, - # Tx Power (dBm * 10) + # Tx Power - extendAirG2TxPower (dBm * 10) %{ - oid: "1.3.6.1.4.1.25651.1.2.3.1.1.9.0", + oid: "1.3.6.1.4.1.25651.1.2.3.1.57.1.0", sensor_type: "power", sensor_descr: "Tx Power", sensor_unit: "dBm", sensor_divisor: 10 }, - # RSL (Receive Signal Level, dBm * 10) + # Signal Level (RSL) - locCurrentRSL %{ - oid: "1.3.6.1.4.1.25651.1.2.3.1.2.1.0", + oid: "1.3.6.1.4.1.25651.1.2.4.3.1.3.0", sensor_type: "rssi", - sensor_descr: "RSL", + sensor_descr: "Signal Level", sensor_unit: "dBm", - sensor_divisor: 10 - }, - # SNR (dB * 10) - %{ - oid: "1.3.6.1.4.1.25651.1.2.3.1.2.3.0", - sensor_type: "snr", - sensor_descr: "SNR", - sensor_unit: "dB", - sensor_divisor: 10 + sensor_divisor: 1 } ] end diff --git a/lib/towerops/snmp/profiles/vendors/siae.ex b/lib/towerops/snmp/profiles/vendors/siae.ex index 9df38459..2154dd4d 100644 --- a/lib/towerops/snmp/profiles/vendors/siae.ex +++ b/lib/towerops/snmp/profiles/vendors/siae.ex @@ -7,6 +7,10 @@ defmodule Towerops.Snmp.Profiles.Vendors.Siae do Supported devices: - ALFO 80HD series - ALFOplus series + + OIDs sourced from SIAE MIBs (Alfo80hd/SmOs): + - Radio config: 1.3.6.1.4.1.3373.1103.39.2.1 (Tx Power, RSSI, Frequency) + - Link capacity: 1.3.6.1.4.1.3373.1103.15.4.1 (Tx/Rx Rate) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -31,40 +35,46 @@ defmodule Towerops.Snmp.Profiles.Vendors.Siae do @impl true def wireless_oid_defs do - # SIAE ALFO MIB OIDs - # Enterprise OID: 1.3.6.1.4.1.3373 [ - # Tx Power + # Tx Power (dBm) %{ - oid: "1.3.6.1.4.1.3373.1103.80.1.1.11.1", + oid: "1.3.6.1.4.1.3373.1103.39.2.1.13.1", sensor_type: "power", sensor_descr: "Tx Power", sensor_unit: "dBm", - sensor_divisor: 10 + sensor_divisor: 1 }, - # Rx Power (RSL) + # RSSI (Rx Power) %{ - oid: "1.3.6.1.4.1.3373.1103.80.1.1.12.1", + oid: "1.3.6.1.4.1.3373.1103.39.2.1.12.1", sensor_type: "rssi", - sensor_descr: "Rx Power", + sensor_descr: "RSSI", sensor_unit: "dBm", - sensor_divisor: 10 + sensor_divisor: 1 }, - # SNR + # Tx Frequency (kHz, divide by 1000 for MHz) %{ - oid: "1.3.6.1.4.1.3373.1103.80.1.1.14.1", - sensor_type: "snr", - sensor_descr: "SNR", - sensor_unit: "dB", - sensor_divisor: 10 - }, - # Frequency - %{ - oid: "1.3.6.1.4.1.3373.1103.80.1.1.3.1", + oid: "1.3.6.1.4.1.3373.1103.39.2.1.2.1", sensor_type: "frequency", sensor_descr: "Tx Frequency", sensor_unit: "MHz", sensor_divisor: 1000 + }, + # Tx Rate (kbps, multiplied by 1000 in display) + %{ + oid: "1.3.6.1.4.1.3373.1103.15.4.1.17.1", + sensor_type: "rate", + sensor_descr: "Tx Rate", + sensor_unit: "kbps", + sensor_divisor: 1 + }, + # Rx Rate (kbps, multiplied by 1000 in display) + %{ + oid: "1.3.6.1.4.1.3373.1103.15.4.1.18.1", + sensor_type: "rate", + sensor_descr: "Rx Rate", + sensor_unit: "kbps", + sensor_divisor: 1 } ] end diff --git a/lib/towerops/snmp/profiles/vendors/teltonika.ex b/lib/towerops/snmp/profiles/vendors/teltonika.ex index 37919d31..68a026b5 100644 --- a/lib/towerops/snmp/profiles/vendors/teltonika.ex +++ b/lib/towerops/snmp/profiles/vendors/teltonika.ex @@ -9,6 +9,9 @@ defmodule Towerops.Snmp.Profiles.Vendors.Teltonika do - RUT200, RUT240, RUT241, RUT360 - RUT950, RUT955, RUT956 - TRB140, TRB145, TRB255, TRB500 + + OIDs sourced from TELTONIKA-RUTX-MIB: + - Modem table: 1.3.6.1.4.1.48690.2.2.1 (mSignal, mRSRP, mRSRQ, mSINR, etc.) """ @behaviour Towerops.Snmp.Profiles.Vendors.Vendor @@ -40,49 +43,49 @@ defmodule Towerops.Snmp.Profiles.Vendors.Teltonika do @impl true def wireless_oid_defs do [ - # Mobile Signal Strength (RSSI) + # Mobile Signal Strength (RSSI) - mSignal (column 12) %{ - oid: "1.3.6.1.4.1.48690.2.2.1.7.1", + oid: "1.3.6.1.4.1.48690.2.2.1.12.1", sensor_type: "rssi", sensor_descr: "Mobile Signal (RSSI)", sensor_unit: "dBm", sensor_divisor: 1 }, - # Mobile RSRP (Reference Signal Received Power) + # Mobile RSRP (Reference Signal Received Power) - mRSRP (column 20) %{ - oid: "1.3.6.1.4.1.48690.2.2.1.8.1", + oid: "1.3.6.1.4.1.48690.2.2.1.20.1", sensor_type: "rssi", sensor_descr: "RSRP", sensor_unit: "dBm", sensor_divisor: 1 }, - # Mobile RSRQ (Reference Signal Received Quality) + # Mobile RSRQ (Reference Signal Received Quality) - mRSRQ (column 21) %{ - oid: "1.3.6.1.4.1.48690.2.2.1.10.1", + oid: "1.3.6.1.4.1.48690.2.2.1.21.1", sensor_type: "quality", sensor_descr: "RSRQ", sensor_unit: "dB", sensor_divisor: 1 }, - # Mobile SINR (Signal to Interference plus Noise Ratio) + # Mobile SINR (Signal to Interference plus Noise Ratio) - mSINR (column 19) %{ - oid: "1.3.6.1.4.1.48690.2.2.1.9.1", + oid: "1.3.6.1.4.1.48690.2.2.1.19.1", sensor_type: "snr", sensor_descr: "SINR", sensor_unit: "dB", sensor_divisor: 1 }, - # Connection Type (LTE/3G/2G) + # Connection Type (LTE/3G/2G) - mConnectionType (column 16) %{ - oid: "1.3.6.1.4.1.48690.2.2.1.3.1", + oid: "1.3.6.1.4.1.48690.2.2.1.16.1", sensor_type: "state", sensor_descr: "Connection Type", sensor_unit: "", sensor_divisor: 1 }, - # SIM Card Status + # SIM Card Status - mSimState (column 9) %{ - oid: "1.3.6.1.4.1.48690.2.2.1.2.1", + oid: "1.3.6.1.4.1.48690.2.2.1.9.1", sensor_type: "state", sensor_descr: "SIM Status", sensor_unit: "", @@ -96,13 +99,13 @@ defmodule Towerops.Snmp.Profiles.Vendors.Teltonika do sensor_unit: "", sensor_divisor: 1 }, - # Device Temperature + # Modem Temperature - mTemperature (column 17) %{ - oid: "1.3.6.1.4.1.48690.1.7.0", + oid: "1.3.6.1.4.1.48690.2.2.1.17.1", sensor_type: "temperature", - sensor_descr: "Device Temperature", + sensor_descr: "Modem Temperature", sensor_unit: "C", - sensor_divisor: 10 + sensor_divisor: 1 } ] end diff --git a/test/towerops/snmp/profiles/vendors/aviat_test.exs b/test/towerops/snmp/profiles/vendors/aviat_test.exs index 9f2fc374..259a9997 100644 --- a/test/towerops/snmp/profiles/vendors/aviat_test.exs +++ b/test/towerops/snmp/profiles/vendors/aviat_test.exs @@ -45,40 +45,63 @@ defmodule Towerops.Snmp.Profiles.Vendors.AviatTest do defs = Aviat.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 5 end - test "includes temperature sensor" do - defs = Aviat.wireless_oid_defs() - temp = Enum.find(defs, &(&1.sensor_type == "temperature")) - - assert temp - assert temp.sensor_descr == "ODU Temperature" - end - - test "includes RSL sensor" do + test "RSL uses aviatRxPerformRslReadingCurrent OID (.9.15.2.2.1.4)" do defs = Aviat.wireless_oid_defs() rssi = Enum.find(defs, &(&1.sensor_type == "rssi")) - assert rssi + assert rssi.oid == "1.3.6.1.4.1.2509.9.15.2.2.1.4.1" assert rssi.sensor_descr == "RSL" assert rssi.sensor_unit == "dBm" + assert rssi.sensor_divisor == 10 end - test "includes SNR sensor" do + test "Tx Power uses aviatRxPerformTxpowReadingCurrent OID (.9.33.2.2.1.7)" do + defs = Aviat.wireless_oid_defs() + tx = Enum.find(defs, &(&1.sensor_type == "power")) + + assert tx.oid == "1.3.6.1.4.1.2509.9.33.2.2.1.7.1" + assert tx.sensor_descr == "Tx Power" + assert tx.sensor_unit == "dBm" + assert tx.sensor_divisor == 10 + end + + test "SNR uses aviatRxPerformCinrReadingCurrent OID (.9.33.2.2.1.3)" do defs = Aviat.wireless_oid_defs() snr = Enum.find(defs, &(&1.sensor_type == "snr")) - assert snr + assert snr.oid == "1.3.6.1.4.1.2509.9.33.2.2.1.3.1" + assert snr.sensor_descr == "SNR" assert snr.sensor_unit == "dB" + assert snr.sensor_divisor == 10 end - test "includes capacity sensor" do + test "Tx capacity uses aviatModemCurCapacityTx OID (.9.3.2.1.1.11)" do defs = Aviat.wireless_oid_defs() - capacity = Enum.find(defs, &(&1.sensor_type == "capacity")) + tx_rate = Enum.find(defs, &(&1.sensor_descr == "Tx Capacity")) - assert capacity - assert capacity.sensor_unit == "Mbps" + assert tx_rate.oid == "1.3.6.1.4.1.2509.9.3.2.1.1.11.1" + assert tx_rate.sensor_type == "rate" + assert tx_rate.sensor_unit == "kbps" + end + + test "Rx capacity uses aviatModemCurCapacityRx OID (.9.3.2.1.1.12)" do + defs = Aviat.wireless_oid_defs() + rx_rate = Enum.find(defs, &(&1.sensor_descr == "Rx Capacity")) + + assert rx_rate.oid == "1.3.6.1.4.1.2509.9.3.2.1.1.12.1" + assert rx_rate.sensor_type == "rate" + assert rx_rate.sensor_unit == "kbps" + end + + test "no duplicate OIDs" do + defs = Aviat.wireless_oid_defs() + oids = Enum.map(defs, & &1.oid) + + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" end end @@ -86,11 +109,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.AviatTest do test "discovers sensors when SNMP responds" do expect(SnmpMock, :get, 5, fn _, oid, _ -> cond do - String.contains?(oid, "2509.9.6.2.3.1.1.5.1") -> {:ok, 45} - String.contains?(oid, "2509.9.6.2.2.1.1.7.1") -> {:ok, -550} - String.contains?(oid, "2509.9.6.2.2.1.1.5.1") -> {:ok, 200} - String.contains?(oid, "2509.9.6.2.2.1.1.12.1") -> {:ok, 280} - String.contains?(oid, "2509.9.6.2.2.1.1.15.1") -> {:ok, 400} + String.contains?(oid, "2509.9.15.2.2.1.4.1") -> {:ok, -550} + String.contains?(oid, "2509.9.33.2.2.1.7.1") -> {:ok, 200} + String.contains?(oid, "2509.9.33.2.2.1.3.1") -> {:ok, 280} + String.contains?(oid, "2509.9.3.2.1.1.11.1") -> {:ok, 350_000} + String.contains?(oid, "2509.9.3.2.1.1.12.1") -> {:ok, 350_000} true -> {:error, :no_such_object} end end) diff --git a/test/towerops/snmp/profiles/vendors/cambium_ptp_test.exs b/test/towerops/snmp/profiles/vendors/cambium_ptp_test.exs index b3c54fb3..cde5176d 100644 --- a/test/towerops/snmp/profiles/vendors/cambium_ptp_test.exs +++ b/test/towerops/snmp/profiles/vendors/cambium_ptp_test.exs @@ -51,67 +51,85 @@ defmodule Towerops.Snmp.Profiles.Vendors.CambiumPtpTest do defs = CambiumPtp.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 6 end - test "includes receive power (RSL) sensor" do - defs = CambiumPtp.wireless_oid_defs() - rsl = Enum.find(defs, &(&1.sensor_descr == "Receive Power")) - - assert rsl - assert rsl.sensor_type == "rssi" - assert rsl.sensor_unit == "dBm" - assert rsl.sensor_divisor == 10 - end - - test "includes transmit power sensor" do + test "transmit power uses correct OID (.12.4)" do defs = CambiumPtp.wireless_oid_defs() tx = Enum.find(defs, &(&1.sensor_descr == "Transmit Power")) - assert tx + assert tx.oid == "1.3.6.1.4.1.17713.7.12.4.0" assert tx.sensor_type == "power" assert tx.sensor_divisor == 10 end - test "includes vector error sensor" do + test "receive power uses rawReceivePower OID (.12.12)" do defs = CambiumPtp.wireless_oid_defs() - ve = Enum.find(defs, &(&1.sensor_descr == "Vector Error")) + rx = Enum.find(defs, &(&1.sensor_descr == "Receive Power")) - assert ve - assert ve.sensor_type == "snr" + assert rx.oid == "1.3.6.1.4.1.17713.7.12.12.0" + assert rx.sensor_type == "rssi" + assert rx.sensor_divisor == 10 end - test "includes data rate sensors" do + test "signal strength ratio uses correct OID (.12.9)" do + defs = CambiumPtp.wireless_oid_defs() + ssr = Enum.find(defs, &(&1.sensor_descr == "Signal Strength Ratio")) + + assert ssr.oid == "1.3.6.1.4.1.17713.7.12.9.0" + assert ssr.sensor_type == "ssr" + assert ssr.sensor_divisor == 10 + end + + test "receive data rate uses correct OID from subtree .20 (.20.1)" do defs = CambiumPtp.wireless_oid_defs() rx_rate = Enum.find(defs, &(&1.sensor_descr == "Rx Data Rate")) - tx_rate = Enum.find(defs, &(&1.sensor_descr == "Tx Data Rate")) - assert rx_rate - assert rx_rate.sensor_type == "capacity" - assert tx_rate - assert tx_rate.sensor_type == "capacity" + assert rx_rate.oid == "1.3.6.1.4.1.17713.7.20.1.0" + assert rx_rate.sensor_type == "rate" + assert rx_rate.sensor_unit == "kbps" + assert rx_rate.sensor_divisor == 1 end - test "includes temperature sensor" do + test "transmit data rate uses correct OID from subtree .20 (.20.2)" do defs = CambiumPtp.wireless_oid_defs() - temp = Enum.find(defs, &(&1.sensor_type == "temperature")) + tx_rate = Enum.find(defs, &(&1.sensor_descr == "Tx Data Rate")) - assert temp - assert temp.sensor_descr == "Radio Temperature" + assert tx_rate.oid == "1.3.6.1.4.1.17713.7.20.2.0" + assert tx_rate.sensor_type == "rate" + assert tx_rate.sensor_unit == "kbps" + assert tx_rate.sensor_divisor == 1 + end + + test "aggregate data rate uses correct OID (.20.3)" do + defs = CambiumPtp.wireless_oid_defs() + agg = Enum.find(defs, &(&1.sensor_descr == "Aggregate Data Rate")) + + assert agg.oid == "1.3.6.1.4.1.17713.7.20.3.0" + assert agg.sensor_type == "rate" + assert agg.sensor_unit == "kbps" + assert agg.sensor_divisor == 1 + end + + test "no duplicate OIDs" do + defs = CambiumPtp.wireless_oid_defs() + oids = Enum.map(defs, & &1.oid) + + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" end end describe "discover_wireless_sensors/1" do test "discovers sensors when SNMP responds" do - expect(SnmpMock, :get, 7, fn _, oid, _ -> + expect(SnmpMock, :get, 6, fn _, oid, _ -> cond do - String.contains?(oid, "17713.7.12.6.0") -> {:ok, -550} - String.contains?(oid, "17713.7.12.3.0") -> {:ok, 230} - String.contains?(oid, "17713.7.12.8.0") -> {:ok, 350} - String.contains?(oid, "17713.7.12.9.0") -> {:ok, 15} - String.contains?(oid, "17713.7.12.14.0") -> {:ok, 350_000} - String.contains?(oid, "17713.7.12.15.0") -> {:ok, 350_000} - String.contains?(oid, "17713.7.13.1.0") -> {:ok, 42} + String.contains?(oid, "17713.7.12.12.0") -> {:ok, -550} + String.contains?(oid, "17713.7.12.4.0") -> {:ok, 230} + String.contains?(oid, "17713.7.12.9.0") -> {:ok, 150} + String.contains?(oid, "17713.7.20.1.0") -> {:ok, 350_000} + String.contains?(oid, "17713.7.20.2.0") -> {:ok, 350_000} + String.contains?(oid, "17713.7.20.3.0") -> {:ok, 700_000} true -> {:error, :no_such_object} end end) @@ -119,11 +137,15 @@ defmodule Towerops.Snmp.Profiles.Vendors.CambiumPtpTest do sensors = CambiumPtp.discover_wireless_sensors(@client_opts) assert is_list(sensors) - assert length(sensors) == 7 + assert length(sensors) == 6 + + rx = Enum.find(sensors, &(&1.sensor_type == "rssi")) + assert rx.sensor_oid == "1.3.6.1.4.1.17713.7.12.12.0" + assert rx.last_value == -550.0 end test "returns empty list when no sensors respond" do - expect(SnmpMock, :get, 7, fn _, _, _ -> + expect(SnmpMock, :get, 6, fn _, _, _ -> {:error, :no_such_object} end) diff --git a/test/towerops/snmp/profiles/vendors/ceragon_test.exs b/test/towerops/snmp/profiles/vendors/ceragon_test.exs index a3f143f4..b1a44927 100644 --- a/test/towerops/snmp/profiles/vendors/ceragon_test.exs +++ b/test/towerops/snmp/profiles/vendors/ceragon_test.exs @@ -45,37 +45,44 @@ defmodule Towerops.Snmp.Profiles.Vendors.CeragonTest do defs = Ceragon.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 2 end - test "includes TX and RX power sensors" do + test "TX power uses genEquipRfuStatusTxLevel OID (.10.5.1.1.3)" do defs = Ceragon.wireless_oid_defs() tx = Enum.find(defs, &(&1.sensor_descr == "TX Power")) - rx = Enum.find(defs, &(&1.sensor_descr == "RX Level")) - assert tx + assert tx.oid == "1.3.6.1.4.1.2281.10.5.1.1.3.1" assert tx.sensor_type == "power" - assert rx - assert rx.sensor_type == "rssi" + assert tx.sensor_unit == "dBm" + assert tx.sensor_divisor == 1 end - test "includes SNR sensor" do + test "RX level uses genEquipRfuStatusRxLevel OID (.10.5.1.1.2)" do defs = Ceragon.wireless_oid_defs() - snr = Enum.find(defs, &(&1.sensor_descr == "Signal to Noise Ratio")) + rx = Enum.find(defs, &(&1.sensor_descr == "RX Level")) - assert snr - assert snr.sensor_type == "snr" + assert rx.oid == "1.3.6.1.4.1.2281.10.5.1.1.2.1" + assert rx.sensor_type == "rssi" + assert rx.sensor_unit == "dBm" + assert rx.sensor_divisor == 1 + end + + test "no duplicate OIDs" do + defs = Ceragon.wireless_oid_defs() + oids = Enum.map(defs, & &1.oid) + + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" end end describe "discover_wireless_sensors/1" do test "discovers sensors when SNMP responds" do - expect(SnmpMock, :get, 4, fn _, oid, _ -> + expect(SnmpMock, :get, 2, fn _, oid, _ -> cond do - String.contains?(oid, "2281.10.4.1.11.1.1.1") -> {:ok, 200} - String.contains?(oid, "2281.10.4.1.11.1.2.1") -> {:ok, -450} - String.contains?(oid, "2281.10.4.1.11.1.3.1") -> {:ok, 320} - String.contains?(oid, "2281.10.4.1.11.1.4.1") -> {:ok, 1} + String.contains?(oid, "2281.10.5.1.1.3.1") -> {:ok, 20} + String.contains?(oid, "2281.10.5.1.1.2.1") -> {:ok, -45} true -> {:error, :no_such_object} end end) @@ -83,11 +90,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.CeragonTest do sensors = Ceragon.discover_wireless_sensors(@client_opts) assert is_list(sensors) - assert length(sensors) == 4 + assert length(sensors) == 2 end test "returns empty list when no sensors respond" do - expect(SnmpMock, :get, 4, fn _, _, _ -> + expect(SnmpMock, :get, 2, fn _, _, _ -> {:error, :no_such_object} end) diff --git a/test/towerops/snmp/profiles/vendors/dragonwave_test.exs b/test/towerops/snmp/profiles/vendors/dragonwave_test.exs index 0d2209b4..c1e13e67 100644 --- a/test/towerops/snmp/profiles/vendors/dragonwave_test.exs +++ b/test/towerops/snmp/profiles/vendors/dragonwave_test.exs @@ -50,41 +50,53 @@ defmodule Towerops.Snmp.Profiles.Vendors.DragonwaveTest do defs = Dragonwave.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 3 end - test "includes temperature sensor with divisor" do - defs = Dragonwave.wireless_oid_defs() - temp = Enum.find(defs, &(&1.sensor_type == "temperature")) - - assert temp - assert temp.sensor_divisor == 10 - end - - test "includes SNR sensor" do + test "SNR uses correct OID column 8 (.2.8)" do defs = Dragonwave.wireless_oid_defs() snr = Enum.find(defs, &(&1.sensor_type == "snr")) - assert snr + assert snr.oid == "1.3.6.1.4.1.7262.2.2.5.1.2.8.0" + assert snr.sensor_descr == "SNR" assert snr.sensor_unit == "dB" + assert snr.sensor_divisor == 10 end - test "includes RSSI sensor" do + test "RSL uses correct OID column 4 (.2.4)" do defs = Dragonwave.wireless_oid_defs() rssi = Enum.find(defs, &(&1.sensor_type == "rssi")) - assert rssi + assert rssi.oid == "1.3.6.1.4.1.7262.2.2.5.1.2.4.0" assert rssi.sensor_descr == "RSL" + assert rssi.sensor_unit == "dBm" + assert rssi.sensor_divisor == 10 + end + + test "Tx Power uses correct OID (.3.2) - unchanged" do + defs = Dragonwave.wireless_oid_defs() + tx = Enum.find(defs, &(&1.sensor_type == "power")) + + assert tx.oid == "1.3.6.1.4.1.7262.2.2.5.1.3.2.0" + assert tx.sensor_descr == "Tx Power" + assert tx.sensor_divisor == 10 + end + + test "no duplicate OIDs" do + defs = Dragonwave.wireless_oid_defs() + oids = Enum.map(defs, & &1.oid) + + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" end end describe "discover_wireless_sensors/1" do test "discovers sensors when SNMP responds" do - expect(SnmpMock, :get, 4, fn _, oid, _ -> + expect(SnmpMock, :get, 3, fn _, oid, _ -> cond do - String.contains?(oid, "7262.2.2.5.1.3.6.0") -> {:ok, 450} - String.contains?(oid, "7262.2.2.5.1.2.3.0") -> {:ok, 280} - String.contains?(oid, "7262.2.2.5.1.2.2.0") -> {:ok, -550} + String.contains?(oid, "7262.2.2.5.1.2.8.0") -> {:ok, 280} + String.contains?(oid, "7262.2.2.5.1.2.4.0") -> {:ok, -550} String.contains?(oid, "7262.2.2.5.1.3.2.0") -> {:ok, 180} true -> {:error, :no_such_object} end @@ -93,11 +105,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.DragonwaveTest do sensors = Dragonwave.discover_wireless_sensors(@client_opts) assert is_list(sensors) - assert length(sensors) == 4 + assert length(sensors) == 3 end test "returns empty list when no sensors respond" do - expect(SnmpMock, :get, 4, fn _, _, _ -> + expect(SnmpMock, :get, 3, fn _, _, _ -> {:error, :no_such_object} end) diff --git a/test/towerops/snmp/profiles/vendors/exalt_test.exs b/test/towerops/snmp/profiles/vendors/exalt_test.exs index 29ed233f..c8de9d68 100644 --- a/test/towerops/snmp/profiles/vendors/exalt_test.exs +++ b/test/towerops/snmp/profiles/vendors/exalt_test.exs @@ -33,52 +33,66 @@ defmodule Towerops.Snmp.Profiles.Vendors.ExaltTest do defs = Exalt.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 4 end - test "includes frequency sensors with kHz divisor" do + test "Tx frequency uses ExtendAirG2 OID (.57.4.0)" do defs = Exalt.wireless_oid_defs() - freq_sensors = Enum.filter(defs, &(&1.sensor_type == "frequency")) + tx_freq = Enum.find(defs, &(&1.sensor_descr == "Tx Frequency")) - assert length(freq_sensors) == 2 - # Exalt returns frequency in kHz - assert Enum.all?(freq_sensors, &(&1.sensor_divisor == 1000)) + assert tx_freq.oid == "1.3.6.1.4.1.25651.1.2.3.1.57.4.0" + assert tx_freq.sensor_type == "frequency" + assert tx_freq.sensor_unit == "MHz" + assert tx_freq.sensor_divisor == 1000 end - test "includes power sensor" do + test "Rx frequency uses ExtendAirG2 OID (.57.5.0)" do + defs = Exalt.wireless_oid_defs() + rx_freq = Enum.find(defs, &(&1.sensor_descr == "Rx Frequency")) + + assert rx_freq.oid == "1.3.6.1.4.1.25651.1.2.3.1.57.5.0" + assert rx_freq.sensor_type == "frequency" + assert rx_freq.sensor_unit == "MHz" + assert rx_freq.sensor_divisor == 1000 + end + + test "Tx power uses ExtendAirG2 OID (.57.1.0)" do defs = Exalt.wireless_oid_defs() power = Enum.find(defs, &(&1.sensor_type == "power")) - assert power + assert power.oid == "1.3.6.1.4.1.25651.1.2.3.1.57.1.0" assert power.sensor_descr == "Tx Power" + assert power.sensor_unit == "dBm" + assert power.sensor_divisor == 10 end - test "includes RSSI sensor" do + test "RSL uses locCurrentRSL OID (.2.4.3.1.3.0)" do defs = Exalt.wireless_oid_defs() rssi = Enum.find(defs, &(&1.sensor_type == "rssi")) - assert rssi - assert rssi.sensor_descr == "RSL" + assert rssi.oid == "1.3.6.1.4.1.25651.1.2.4.3.1.3.0" + assert rssi.sensor_descr == "Signal Level" + assert rssi.sensor_unit == "dBm" + assert rssi.sensor_divisor == 1 end - test "includes SNR sensor" do + test "no duplicate OIDs" do defs = Exalt.wireless_oid_defs() - snr = Enum.find(defs, &(&1.sensor_type == "snr")) + oids = Enum.map(defs, & &1.oid) - assert snr - assert snr.sensor_unit == "dB" + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" end end describe "discover_wireless_sensors/1" do test "discovers sensors when SNMP responds" do - expect(SnmpMock, :get, 5, fn _, oid, _ -> + expect(SnmpMock, :get, 4, fn _, oid, _ -> cond do - String.contains?(oid, "25651.1.2.3.1.1.7.0") -> {:ok, 71_000_000} - String.contains?(oid, "25651.1.2.3.1.1.8.0") -> {:ok, 81_000_000} - String.contains?(oid, "25651.1.2.3.1.1.9.0") -> {:ok, 200} - String.contains?(oid, "25651.1.2.3.1.2.1.0") -> {:ok, -550} - String.contains?(oid, "25651.1.2.3.1.2.3.0") -> {:ok, 280} + String.contains?(oid, "25651.1.2.3.1.57.4.0") -> {:ok, 71_000_000} + String.contains?(oid, "25651.1.2.3.1.57.5.0") -> {:ok, 81_000_000} + String.contains?(oid, "25651.1.2.3.1.57.1.0") -> {:ok, 200} + String.contains?(oid, "25651.1.2.4.3.1.3.0") -> {:ok, -55} true -> {:error, :no_such_object} end end) @@ -86,11 +100,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.ExaltTest do sensors = Exalt.discover_wireless_sensors(@client_opts) assert is_list(sensors) - assert length(sensors) == 5 + assert length(sensors) == 4 end test "returns empty list when no sensors respond" do - expect(SnmpMock, :get, 5, fn _, _, _ -> + expect(SnmpMock, :get, 4, fn _, _, _ -> {:error, :no_such_object} end) diff --git a/test/towerops/snmp/profiles/vendors/siae_test.exs b/test/towerops/snmp/profiles/vendors/siae_test.exs index eaf9f186..2edf7b5f 100644 --- a/test/towerops/snmp/profiles/vendors/siae_test.exs +++ b/test/towerops/snmp/profiles/vendors/siae_test.exs @@ -33,52 +33,75 @@ defmodule Towerops.Snmp.Profiles.Vendors.SiaeTest do defs = Siae.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 5 end - test "includes power sensor" do + test "Tx Power uses correct ALFO80HD OID (.39.2.1.13)" do defs = Siae.wireless_oid_defs() power = Enum.find(defs, &(&1.sensor_type == "power")) - assert power + assert power.oid == "1.3.6.1.4.1.3373.1103.39.2.1.13.1" assert power.sensor_descr == "Tx Power" - assert power.sensor_divisor == 10 + assert power.sensor_unit == "dBm" + assert power.sensor_divisor == 1 end - test "includes RSSI sensor" do + test "RSSI uses correct ALFO80HD OID (.39.2.1.12)" do defs = Siae.wireless_oid_defs() rssi = Enum.find(defs, &(&1.sensor_type == "rssi")) - assert rssi - assert rssi.sensor_descr == "Rx Power" + assert rssi.oid == "1.3.6.1.4.1.3373.1103.39.2.1.12.1" + assert rssi.sensor_descr == "RSSI" + assert rssi.sensor_unit == "dBm" + assert rssi.sensor_divisor == 1 end - test "includes SNR sensor" do - defs = Siae.wireless_oid_defs() - snr = Enum.find(defs, &(&1.sensor_type == "snr")) - - assert snr - assert snr.sensor_unit == "dB" - end - - test "includes frequency sensor" do + test "Frequency uses correct ALFO80HD OID (.39.2.1.2)" do defs = Siae.wireless_oid_defs() freq = Enum.find(defs, &(&1.sensor_type == "frequency")) - assert freq - # SIAE frequency in kHz + assert freq.oid == "1.3.6.1.4.1.3373.1103.39.2.1.2.1" + assert freq.sensor_descr == "Tx Frequency" + assert freq.sensor_unit == "MHz" assert freq.sensor_divisor == 1000 end + + test "Tx Rate uses correct OID (.15.4.1.17)" do + defs = Siae.wireless_oid_defs() + tx_rate = Enum.find(defs, &(&1.sensor_descr == "Tx Rate")) + + assert tx_rate.oid == "1.3.6.1.4.1.3373.1103.15.4.1.17.1" + assert tx_rate.sensor_type == "rate" + assert tx_rate.sensor_unit == "kbps" + end + + test "Rx Rate uses correct OID (.15.4.1.18)" do + defs = Siae.wireless_oid_defs() + rx_rate = Enum.find(defs, &(&1.sensor_descr == "Rx Rate")) + + assert rx_rate.oid == "1.3.6.1.4.1.3373.1103.15.4.1.18.1" + assert rx_rate.sensor_type == "rate" + assert rx_rate.sensor_unit == "kbps" + end + + test "no duplicate OIDs" do + defs = Siae.wireless_oid_defs() + oids = Enum.map(defs, & &1.oid) + + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" + end end describe "discover_wireless_sensors/1" do test "discovers sensors when SNMP responds" do - expect(SnmpMock, :get, 4, fn _, oid, _ -> + expect(SnmpMock, :get, 5, fn _, oid, _ -> cond do - String.contains?(oid, "3373.1103.80.1.1.11.1") -> {:ok, 180} - String.contains?(oid, "3373.1103.80.1.1.12.1") -> {:ok, -450} - String.contains?(oid, "3373.1103.80.1.1.14.1") -> {:ok, 250} - String.contains?(oid, "3373.1103.80.1.1.3.1") -> {:ok, 71_000_000} + String.contains?(oid, "3373.1103.39.2.1.13.1") -> {:ok, 18} + String.contains?(oid, "3373.1103.39.2.1.12.1") -> {:ok, -45} + String.contains?(oid, "3373.1103.39.2.1.2.1") -> {:ok, 71_000_000} + String.contains?(oid, "3373.1103.15.4.1.17.1") -> {:ok, 350_000} + String.contains?(oid, "3373.1103.15.4.1.18.1") -> {:ok, 350_000} true -> {:error, :no_such_object} end end) @@ -86,11 +109,11 @@ defmodule Towerops.Snmp.Profiles.Vendors.SiaeTest do sensors = Siae.discover_wireless_sensors(@client_opts) assert is_list(sensors) - assert length(sensors) == 4 + assert length(sensors) == 5 end test "returns empty list when no sensors respond" do - expect(SnmpMock, :get, 4, fn _, _, _ -> + expect(SnmpMock, :get, 5, fn _, _, _ -> {:error, :no_such_object} end) diff --git a/test/towerops/snmp/profiles/vendors/teltonika_test.exs b/test/towerops/snmp/profiles/vendors/teltonika_test.exs index 466564f9..20a6abee 100644 --- a/test/towerops/snmp/profiles/vendors/teltonika_test.exs +++ b/test/towerops/snmp/profiles/vendors/teltonika_test.exs @@ -45,42 +45,74 @@ defmodule Towerops.Snmp.Profiles.Vendors.TeltonikaTest do defs = Teltonika.wireless_oid_defs() assert is_list(defs) - assert [_ | _] = defs + assert length(defs) == 8 end - test "includes RSSI sensor" do + test "RSSI uses mSignal OID column 12" do defs = Teltonika.wireless_oid_defs() rssi = Enum.find(defs, &(&1.sensor_descr == "Mobile Signal (RSSI)")) - assert rssi + assert rssi.oid == "1.3.6.1.4.1.48690.2.2.1.12.1" assert rssi.sensor_type == "rssi" assert rssi.sensor_unit == "dBm" end - test "includes RSRP sensor" do + test "RSRP uses mRSRP OID column 20" do defs = Teltonika.wireless_oid_defs() rsrp = Enum.find(defs, &(&1.sensor_descr == "RSRP")) - assert rsrp + assert rsrp.oid == "1.3.6.1.4.1.48690.2.2.1.20.1" assert rsrp.sensor_type == "rssi" end - test "includes SINR sensor" do + test "RSRQ uses mRSRQ OID column 21" do + defs = Teltonika.wireless_oid_defs() + rsrq = Enum.find(defs, &(&1.sensor_descr == "RSRQ")) + + assert rsrq.oid == "1.3.6.1.4.1.48690.2.2.1.21.1" + assert rsrq.sensor_type == "quality" + end + + test "SINR uses mSINR OID column 19" do defs = Teltonika.wireless_oid_defs() sinr = Enum.find(defs, &(&1.sensor_descr == "SINR")) - assert sinr + assert sinr.oid == "1.3.6.1.4.1.48690.2.2.1.19.1" assert sinr.sensor_type == "snr" assert sinr.sensor_unit == "dB" end - test "includes temperature sensor" do + test "Connection Type uses mConnectionType OID column 16" do + defs = Teltonika.wireless_oid_defs() + conn = Enum.find(defs, &(&1.sensor_descr == "Connection Type")) + + assert conn.oid == "1.3.6.1.4.1.48690.2.2.1.16.1" + assert conn.sensor_type == "state" + end + + test "SIM Status uses mSimState OID column 9" do + defs = Teltonika.wireless_oid_defs() + sim = Enum.find(defs, &(&1.sensor_descr == "SIM Status")) + + assert sim.oid == "1.3.6.1.4.1.48690.2.2.1.9.1" + assert sim.sensor_type == "state" + end + + test "Temperature uses mTemperature OID column 17" do defs = Teltonika.wireless_oid_defs() temp = Enum.find(defs, &(&1.sensor_type == "temperature")) - assert temp - assert temp.sensor_descr == "Device Temperature" - assert temp.sensor_divisor == 10 + assert temp.oid == "1.3.6.1.4.1.48690.2.2.1.17.1" + assert temp.sensor_descr == "Modem Temperature" + assert temp.sensor_divisor == 1 + end + + test "no duplicate OIDs" do + defs = Teltonika.wireless_oid_defs() + oids = Enum.map(defs, & &1.oid) + + assert length(oids) == length(Enum.uniq(oids)), + "Found duplicate OIDs: #{inspect(oids -- Enum.uniq(oids))}" end end @@ -90,14 +122,14 @@ defmodule Towerops.Snmp.Profiles.Vendors.TeltonikaTest do # (Connection Type, SIM Status, Network Operator) that return strings won't be collected expect(SnmpMock, :get, 8, fn _, oid, _ -> cond do - String.contains?(oid, "48690.2.2.1.7.1") -> {:ok, -65} - String.contains?(oid, "48690.2.2.1.8.1") -> {:ok, -85} - String.contains?(oid, "48690.2.2.1.10.1") -> {:ok, -10} - String.contains?(oid, "48690.2.2.1.9.1") -> {:ok, 15} - String.contains?(oid, "48690.2.2.1.3.1") -> {:ok, "LTE"} - String.contains?(oid, "48690.2.2.1.2.1") -> {:ok, "inserted"} + String.contains?(oid, "48690.2.2.1.12.1") -> {:ok, -65} + String.contains?(oid, "48690.2.2.1.20.1") -> {:ok, -85} + String.contains?(oid, "48690.2.2.1.21.1") -> {:ok, -10} + String.contains?(oid, "48690.2.2.1.19.1") -> {:ok, 15} + String.contains?(oid, "48690.2.2.1.16.1") -> {:ok, "LTE"} + String.contains?(oid, "48690.2.2.1.9.1") -> {:ok, "inserted"} String.contains?(oid, "48690.2.2.1.4.1") -> {:ok, "T-Mobile"} - String.contains?(oid, "48690.1.7.0") -> {:ok, 450} + String.contains?(oid, "48690.2.2.1.17.1") -> {:ok, 45} true -> {:error, :no_such_object} end end)