From 218b99972e404e7384eb33c40b302dc9ce284b12 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 22 Jan 2026 11:51:35 -0600 Subject: [PATCH] more tests --- lib/mix/tasks/gen_vendor_modules.ex | 374 ++++++++++++++++++ lib/mix/tasks/gen_vendor_tests.ex | 209 ++++++++++ lib/towerops/snmp/deferred_discovery.ex | 15 +- lib/towerops/snmp/profiles/vendors/a10.ex | 58 +++ lib/towerops/snmp/profiles/vendors/adva.ex | 58 +++ .../snmp/profiles/vendors/advantech.ex | 58 +++ .../snmp/profiles/vendors/airconsole.ex | 58 +++ lib/towerops/snmp/profiles/vendors/alcatel.ex | 58 +++ lib/towerops/snmp/profiles/vendors/allied.ex | 58 +++ .../snmp/profiles/vendors/allied_telesis.ex | 2 +- lib/towerops/snmp/profiles/vendors/alpha.ex | 58 +++ lib/towerops/snmp/profiles/vendors/arbor.ex | 58 +++ lib/towerops/snmp/profiles/vendors/arris.ex | 58 +++ .../snmp/profiles/vendors/asentria.ex | 58 +++ .../snmp/profiles/vendors/audiocodes.ex | 58 +++ lib/towerops/snmp/profiles/vendors/avaya.ex | 58 +++ lib/towerops/snmp/profiles/vendors/axis.ex | 58 +++ lib/towerops/snmp/profiles/vendors/barco.ex | 58 +++ .../snmp/profiles/vendors/barracuda.ex | 58 +++ .../snmp/profiles/vendors/bistream.ex | 58 +++ lib/towerops/snmp/profiles/vendors/bke.ex | 58 +++ lib/towerops/snmp/profiles/vendors/brocade.ex | 58 +++ lib/towerops/snmp/profiles/vendors/bti.ex | 58 +++ lib/towerops/snmp/profiles/vendors/cambium.ex | 59 +++ lib/towerops/snmp/profiles/vendors/cdata.ex | 58 +++ .../snmp/profiles/vendors/christie.ex | 58 +++ lib/towerops/snmp/profiles/vendors/ciena.ex | 58 +++ lib/towerops/snmp/profiles/vendors/cirpack.ex | 58 +++ lib/towerops/snmp/profiles/vendors/cisco.ex | 87 ++++ lib/towerops/snmp/profiles/vendors/citrix.ex | 58 +++ lib/towerops/snmp/profiles/vendors/corero.ex | 58 +++ lib/towerops/snmp/profiles/vendors/cts.ex | 58 +++ .../snmp/profiles/vendors/cyberpower.ex | 58 +++ lib/towerops/snmp/profiles/vendors/dahua.ex | 58 +++ .../snmp/profiles/vendors/dantherm.ex | 58 +++ lib/towerops/snmp/profiles/vendors/dell.ex | 58 +++ lib/towerops/snmp/profiles/vendors/delta.ex | 58 +++ .../snmp/profiles/vendors/deltanet.ex | 58 +++ lib/towerops/snmp/profiles/vendors/deva.ex | 58 +++ lib/towerops/snmp/profiles/vendors/dkt.ex | 58 +++ lib/towerops/snmp/profiles/vendors/dlink.ex | 59 +++ .../snmp/profiles/vendors/dpstelecom.ex | 58 +++ lib/towerops/snmp/profiles/vendors/eaton.ex | 58 +++ lib/towerops/snmp/profiles/vendors/edfa.ex | 58 +++ lib/towerops/snmp/profiles/vendors/eds.ex | 58 +++ lib/towerops/snmp/profiles/vendors/ekinops.ex | 58 +++ lib/towerops/snmp/profiles/vendors/epson.ex | 58 +++ .../snmp/profiles/vendors/ericsson.ex | 58 +++ lib/towerops/snmp/profiles/vendors/extreme.ex | 58 +++ lib/towerops/snmp/profiles/vendors/f5.ex | 58 +++ .../snmp/profiles/vendors/fibrolan.ex | 58 +++ .../snmp/profiles/vendors/firebrick.ex | 58 +++ .../snmp/profiles/vendors/fortinet.ex | 71 ++++ lib/towerops/snmp/profiles/vendors/fs.ex | 58 +++ lib/towerops/snmp/profiles/vendors/geist.ex | 58 +++ lib/towerops/snmp/profiles/vendors/gigamon.ex | 58 +++ .../snmp/profiles/vendors/greenbone.ex | 58 +++ lib/towerops/snmp/profiles/vendors/gude.ex | 58 +++ lib/towerops/snmp/profiles/vendors/gwd.ex | 58 +++ .../snmp/profiles/vendors/hikvision.ex | 58 +++ .../snmp/profiles/vendors/hillstone.ex | 58 +++ .../snmp/profiles/vendors/himoinsa.ex | 58 +++ lib/towerops/snmp/profiles/vendors/hp.ex | 58 +++ lib/towerops/snmp/profiles/vendors/hpe.ex | 58 +++ lib/towerops/snmp/profiles/vendors/huawei.ex | 58 +++ lib/towerops/snmp/profiles/vendors/ibm.ex | 58 +++ lib/towerops/snmp/profiles/vendors/ibmc.ex | 58 +++ .../snmp/profiles/vendors/ignitenet.ex | 58 +++ .../snmp/profiles/vendors/illustra.ex | 58 +++ .../snmp/profiles/vendors/imco_power.ex | 58 +++ .../snmp/profiles/vendors/infortrend.ex | 58 +++ .../snmp/profiles/vendors/inovonics.ex | 58 +++ lib/towerops/snmp/profiles/vendors/jacarta.ex | 58 +++ lib/towerops/snmp/profiles/vendors/juniper.ex | 58 +++ .../snmp/profiles/vendors/keenetic.ex | 58 +++ lib/towerops/snmp/profiles/vendors/lenovo.ex | 58 +++ lib/towerops/snmp/profiles/vendors/liebert.ex | 58 +++ lib/towerops/snmp/profiles/vendors/linux.ex | 58 +++ .../snmp/profiles/vendors/luminato.ex | 58 +++ .../snmp/profiles/vendors/meinberg.ex | 58 +++ .../snmp/profiles/vendors/microsoft.ex | 58 +++ .../snmp/profiles/vendors/mikrotik.ex | 59 +++ lib/towerops/snmp/profiles/vendors/moxa.ex | 58 +++ lib/towerops/snmp/profiles/vendors/mrv.ex | 58 +++ lib/towerops/snmp/profiles/vendors/n4rf.ex | 58 +++ lib/towerops/snmp/profiles/vendors/netapp.ex | 58 +++ lib/towerops/snmp/profiles/vendors/netgear.ex | 58 +++ lib/towerops/snmp/profiles/vendors/netping.ex | 58 +++ lib/towerops/snmp/profiles/vendors/nokia.ex | 59 +++ .../snmp/profiles/vendors/opengear.ex | 58 +++ lib/towerops/snmp/profiles/vendors/orolia.ex | 58 +++ .../snmp/profiles/vendors/packetlight.ex | 58 +++ .../snmp/profiles/vendors/paloalto.ex | 58 +++ lib/towerops/snmp/profiles/vendors/patton.ex | 58 +++ lib/towerops/snmp/profiles/vendors/pbi.ex | 58 +++ lib/towerops/snmp/profiles/vendors/pegasus.ex | 58 +++ lib/towerops/snmp/profiles/vendors/polycom.ex | 58 +++ .../snmp/profiles/vendors/primekey.ex | 58 +++ lib/towerops/snmp/profiles/vendors/printer.ex | 81 ++++ .../snmp/profiles/vendors/profline.ex | 58 +++ .../snmp/profiles/vendors/protelevision.ex | 58 +++ lib/towerops/snmp/profiles/vendors/qtech.ex | 58 +++ lib/towerops/snmp/profiles/vendors/rad.ex | 58 +++ lib/towerops/snmp/profiles/vendors/radlan.ex | 58 +++ lib/towerops/snmp/profiles/vendors/radware.ex | 58 +++ lib/towerops/snmp/profiles/vendors/rajant.ex | 58 +++ lib/towerops/snmp/profiles/vendors/raritan.ex | 58 +++ lib/towerops/snmp/profiles/vendors/red.ex | 58 +++ .../snmp/profiles/vendors/registry.ex | 48 +++ lib/towerops/snmp/profiles/vendors/riedo.ex | 58 +++ .../snmp/profiles/vendors/riverbed.ex | 58 +++ .../snmp/profiles/vendors/sagemcom.ex | 58 +++ .../snmp/profiles/vendors/schleifenbauer.ex | 58 +++ lib/towerops/snmp/profiles/vendors/siemens.ex | 58 +++ .../snmp/profiles/vendors/silverpeak.ex | 58 +++ .../snmp/profiles/vendors/smartbyte.ex | 58 +++ .../snmp/profiles/vendors/smartoptics.ex | 58 +++ lib/towerops/snmp/profiles/vendors/snr.ex | 58 +++ lib/towerops/snmp/profiles/vendors/snr_erd.ex | 58 +++ .../snmp/profiles/vendors/sonicwall.ex | 58 +++ lib/towerops/snmp/profiles/vendors/sophos.ex | 58 +++ lib/towerops/snmp/profiles/vendors/storage.ex | 58 +++ .../snmp/profiles/vendors/supermicro.ex | 58 +++ lib/towerops/snmp/profiles/vendors/terra.ex | 58 +++ lib/towerops/snmp/profiles/vendors/tplink.ex | 58 +++ lib/towerops/snmp/profiles/vendors/tredess.ex | 58 +++ lib/towerops/snmp/profiles/vendors/trellix.ex | 58 +++ .../snmp/profiles/vendors/tripplite.ex | 58 +++ lib/towerops/snmp/profiles/vendors/unix.ex | 99 +++++ lib/towerops/snmp/profiles/vendors/ups.ex | 73 ++++ lib/towerops/snmp/profiles/vendors/vertiv.ex | 58 +++ .../snmp/profiles/vendors/vigintos.ex | 58 +++ .../snmp/profiles/vendors/viprinet.ex | 58 +++ lib/towerops/snmp/profiles/vendors/vrp.ex | 58 +++ .../snmp/profiles/vendors/watchguard.ex | 58 +++ .../snmp/profiles/vendors/waystream.ex | 58 +++ .../snmp/profiles/vendors/westermo.ex | 58 +++ .../snmp/profiles/vendors/worldcastsystems.ex | 58 +++ lib/towerops/snmp/profiles/vendors/wti.ex | 58 +++ lib/towerops/snmp/profiles/vendors/zte.ex | 58 +++ lib/towerops/snmp/profiles/vendors/zyxel.ex | 60 +++ test/towerops/devices_test.exs | 17 +- .../monitoring/device_monitor_test.exs | 14 +- test/towerops/monitoring/ping_test.exs | 309 +++++---------- test/towerops/redis_health_check_test.exs | 19 +- .../towerops/snmp/deferred_discovery_test.exs | 8 +- .../snmp/profiles/vendors/a10_test.exs | 103 +++++ .../snmp/profiles/vendors/adva_test.exs | 110 ++++++ .../snmp/profiles/vendors/advantech_test.exs | 103 +++++ .../snmp/profiles/vendors/airconsole_test.exs | 103 +++++ .../snmp/profiles/vendors/airos_test.exs | 118 ++++++ .../snmp/profiles/vendors/alcatel_test.exs | 103 +++++ .../profiles/vendors/allied_telesis_test.exs | 2 +- .../snmp/profiles/vendors/allied_test.exs | 103 +++++ .../snmp/profiles/vendors/alpha_test.exs | 103 +++++ .../snmp/profiles/vendors/apc_test.exs | 2 +- .../snmp/profiles/vendors/arbor_test.exs | 103 +++++ .../snmp/profiles/vendors/arista_test.exs | 2 +- .../snmp/profiles/vendors/arris_test.exs | 103 +++++ .../snmp/profiles/vendors/asentria_test.exs | 103 +++++ .../snmp/profiles/vendors/audiocodes_test.exs | 103 +++++ .../snmp/profiles/vendors/avaya_test.exs | 103 +++++ .../snmp/profiles/vendors/axis_test.exs | 103 +++++ .../snmp/profiles/vendors/barco_test.exs | 103 +++++ .../snmp/profiles/vendors/barracuda_test.exs | 108 +++++ .../snmp/profiles/vendors/bistream_test.exs | 103 +++++ .../snmp/profiles/vendors/bke_test.exs | 103 +++++ .../snmp/profiles/vendors/brocade_test.exs | 103 +++++ .../snmp/profiles/vendors/bti_test.exs | 103 +++++ .../snmp/profiles/vendors/calix_test.exs | 2 +- .../snmp/profiles/vendors/cambium_test.exs | 116 ++++++ .../snmp/profiles/vendors/cdata_test.exs | 103 +++++ .../snmp/profiles/vendors/christie_test.exs | 103 +++++ .../snmp/profiles/vendors/ciena_test.exs | 103 +++++ .../snmp/profiles/vendors/cirpack_test.exs | 103 +++++ .../snmp/profiles/vendors/cisco_test.exs | 131 ++++++ .../snmp/profiles/vendors/citrix_test.exs | 103 +++++ .../snmp/profiles/vendors/corero_test.exs | 103 +++++ .../snmp/profiles/vendors/cts_test.exs | 103 +++++ .../snmp/profiles/vendors/cyberpower_test.exs | 103 +++++ .../snmp/profiles/vendors/dahua_test.exs | 103 +++++ .../snmp/profiles/vendors/dantherm_test.exs | 103 +++++ .../snmp/profiles/vendors/dell_test.exs | 111 ++++++ .../snmp/profiles/vendors/delta_test.exs | 103 +++++ .../snmp/profiles/vendors/deltanet_test.exs | 103 +++++ .../snmp/profiles/vendors/deva_test.exs | 103 +++++ .../snmp/profiles/vendors/dkt_test.exs | 103 +++++ .../snmp/profiles/vendors/dlink_test.exs | 103 +++++ .../snmp/profiles/vendors/dpstelecom_test.exs | 103 +++++ .../snmp/profiles/vendors/eaton_test.exs | 103 +++++ .../snmp/profiles/vendors/edfa_test.exs | 103 +++++ .../snmp/profiles/vendors/eds_test.exs | 103 +++++ .../snmp/profiles/vendors/ekinops_test.exs | 103 +++++ .../snmp/profiles/vendors/epmp_test.exs | 128 ++++++ .../snmp/profiles/vendors/epson_test.exs | 103 +++++ .../snmp/profiles/vendors/ericsson_test.exs | 103 +++++ .../snmp/profiles/vendors/extreme_test.exs | 103 +++++ .../snmp/profiles/vendors/f5_test.exs | 103 +++++ .../snmp/profiles/vendors/fibrolan_test.exs | 103 +++++ .../snmp/profiles/vendors/firebrick_test.exs | 103 +++++ .../snmp/profiles/vendors/fortinet_test.exs | 114 ++++++ .../snmp/profiles/vendors/fs_test.exs | 111 ++++++ .../snmp/profiles/vendors/geist_test.exs | 103 +++++ .../snmp/profiles/vendors/gigamon_test.exs | 103 +++++ .../snmp/profiles/vendors/greenbone_test.exs | 103 +++++ .../snmp/profiles/vendors/gude_test.exs | 103 +++++ .../snmp/profiles/vendors/gwd_test.exs | 103 +++++ .../snmp/profiles/vendors/hikvision_test.exs | 103 +++++ .../snmp/profiles/vendors/hillstone_test.exs | 103 +++++ .../snmp/profiles/vendors/himoinsa_test.exs | 103 +++++ .../snmp/profiles/vendors/hp_test.exs | 113 ++++++ .../snmp/profiles/vendors/hpe_test.exs | 103 +++++ .../snmp/profiles/vendors/huawei_test.exs | 103 +++++ .../snmp/profiles/vendors/ibm_test.exs | 103 +++++ .../snmp/profiles/vendors/ibmc_test.exs | 103 +++++ .../snmp/profiles/vendors/ignitenet_test.exs | 103 +++++ .../snmp/profiles/vendors/illustra_test.exs | 103 +++++ .../snmp/profiles/vendors/imco_power_test.exs | 103 +++++ .../snmp/profiles/vendors/infortrend_test.exs | 103 +++++ .../snmp/profiles/vendors/inovonics_test.exs | 103 +++++ .../snmp/profiles/vendors/jacarta_test.exs | 103 +++++ .../snmp/profiles/vendors/juniper_test.exs | 103 +++++ .../snmp/profiles/vendors/keenetic_test.exs | 103 +++++ .../snmp/profiles/vendors/lenovo_test.exs | 103 +++++ .../snmp/profiles/vendors/liebert_test.exs | 103 +++++ .../snmp/profiles/vendors/linux_test.exs | 103 +++++ .../snmp/profiles/vendors/luminato_test.exs | 103 +++++ .../snmp/profiles/vendors/meinberg_test.exs | 103 +++++ .../snmp/profiles/vendors/microsoft_test.exs | 103 +++++ .../snmp/profiles/vendors/mikrotik_test.exs | 103 +++++ .../snmp/profiles/vendors/moxa_test.exs | 103 +++++ .../snmp/profiles/vendors/mrv_test.exs | 103 +++++ .../snmp/profiles/vendors/n4rf_test.exs | 103 +++++ .../snmp/profiles/vendors/netapp_test.exs | 103 +++++ .../snmp/profiles/vendors/netgear_test.exs | 103 +++++ .../snmp/profiles/vendors/netping_test.exs | 103 +++++ .../snmp/profiles/vendors/nokia_test.exs | 103 +++++ .../snmp/profiles/vendors/opengear_test.exs | 103 +++++ .../snmp/profiles/vendors/orolia_test.exs | 103 +++++ .../profiles/vendors/packetlight_test.exs | 103 +++++ .../snmp/profiles/vendors/paloalto_test.exs | 103 +++++ .../snmp/profiles/vendors/patton_test.exs | 103 +++++ .../snmp/profiles/vendors/pbi_test.exs | 103 +++++ .../snmp/profiles/vendors/pegasus_test.exs | 103 +++++ .../snmp/profiles/vendors/polycom_test.exs | 103 +++++ .../snmp/profiles/vendors/primekey_test.exs | 103 +++++ .../snmp/profiles/vendors/printer_test.exs | 125 ++++++ .../snmp/profiles/vendors/profline_test.exs | 103 +++++ .../profiles/vendors/protelevision_test.exs | 103 +++++ .../snmp/profiles/vendors/qtech_test.exs | 103 +++++ .../snmp/profiles/vendors/rad_test.exs | 103 +++++ .../snmp/profiles/vendors/radlan_test.exs | 103 +++++ .../snmp/profiles/vendors/radware_test.exs | 103 +++++ .../snmp/profiles/vendors/rajant_test.exs | 103 +++++ .../snmp/profiles/vendors/raritan_test.exs | 103 +++++ .../snmp/profiles/vendors/red_test.exs | 103 +++++ .../snmp/profiles/vendors/registry_test.exs | 51 ++- .../snmp/profiles/vendors/riedo_test.exs | 103 +++++ .../snmp/profiles/vendors/riverbed_test.exs | 103 +++++ .../snmp/profiles/vendors/routeros_test.exs | 257 ++++++++++++ .../snmp/profiles/vendors/sagemcom_test.exs | 103 +++++ .../profiles/vendors/schleifenbauer_test.exs | 103 +++++ .../snmp/profiles/vendors/siemens_test.exs | 103 +++++ .../snmp/profiles/vendors/silverpeak_test.exs | 103 +++++ .../snmp/profiles/vendors/smartbyte_test.exs | 103 +++++ .../profiles/vendors/smartoptics_test.exs | 103 +++++ .../snmp/profiles/vendors/snr_erd_test.exs | 103 +++++ .../snmp/profiles/vendors/snr_test.exs | 103 +++++ .../snmp/profiles/vendors/sonicwall_test.exs | 103 +++++ .../snmp/profiles/vendors/sophos_test.exs | 103 +++++ .../snmp/profiles/vendors/storage_test.exs | 103 +++++ .../snmp/profiles/vendors/supermicro_test.exs | 103 +++++ .../snmp/profiles/vendors/terra_test.exs | 103 +++++ .../snmp/profiles/vendors/tplink_test.exs | 103 +++++ .../snmp/profiles/vendors/tredess_test.exs | 103 +++++ .../snmp/profiles/vendors/trellix_test.exs | 103 +++++ .../snmp/profiles/vendors/tripplite_test.exs | 103 +++++ .../snmp/profiles/vendors/unix_test.exs | 143 +++++++ .../snmp/profiles/vendors/ups_test.exs | 117 ++++++ .../snmp/profiles/vendors/vertiv_test.exs | 103 +++++ .../snmp/profiles/vendors/vigintos_test.exs | 103 +++++ .../snmp/profiles/vendors/viprinet_test.exs | 103 +++++ .../snmp/profiles/vendors/vrp_test.exs | 103 +++++ .../snmp/profiles/vendors/watchguard_test.exs | 103 +++++ .../snmp/profiles/vendors/waystream_test.exs | 103 +++++ .../snmp/profiles/vendors/westermo_test.exs | 103 +++++ .../vendors/worldcastsystems_test.exs | 103 +++++ .../snmp/profiles/vendors/wti_test.exs | 103 +++++ .../snmp/profiles/vendors/zte_test.exs | 103 +++++ .../snmp/profiles/vendors/zyxel_test.exs | 114 ++++++ 290 files changed, 23528 insertions(+), 249 deletions(-) create mode 100644 lib/mix/tasks/gen_vendor_modules.ex create mode 100644 lib/mix/tasks/gen_vendor_tests.ex create mode 100644 lib/towerops/snmp/profiles/vendors/a10.ex create mode 100644 lib/towerops/snmp/profiles/vendors/adva.ex create mode 100644 lib/towerops/snmp/profiles/vendors/advantech.ex create mode 100644 lib/towerops/snmp/profiles/vendors/airconsole.ex create mode 100644 lib/towerops/snmp/profiles/vendors/alcatel.ex create mode 100644 lib/towerops/snmp/profiles/vendors/allied.ex create mode 100644 lib/towerops/snmp/profiles/vendors/alpha.ex create mode 100644 lib/towerops/snmp/profiles/vendors/arbor.ex create mode 100644 lib/towerops/snmp/profiles/vendors/arris.ex create mode 100644 lib/towerops/snmp/profiles/vendors/asentria.ex create mode 100644 lib/towerops/snmp/profiles/vendors/audiocodes.ex create mode 100644 lib/towerops/snmp/profiles/vendors/avaya.ex create mode 100644 lib/towerops/snmp/profiles/vendors/axis.ex create mode 100644 lib/towerops/snmp/profiles/vendors/barco.ex create mode 100644 lib/towerops/snmp/profiles/vendors/barracuda.ex create mode 100644 lib/towerops/snmp/profiles/vendors/bistream.ex create mode 100644 lib/towerops/snmp/profiles/vendors/bke.ex create mode 100644 lib/towerops/snmp/profiles/vendors/brocade.ex create mode 100644 lib/towerops/snmp/profiles/vendors/bti.ex create mode 100644 lib/towerops/snmp/profiles/vendors/cambium.ex create mode 100644 lib/towerops/snmp/profiles/vendors/cdata.ex create mode 100644 lib/towerops/snmp/profiles/vendors/christie.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ciena.ex create mode 100644 lib/towerops/snmp/profiles/vendors/cirpack.ex create mode 100644 lib/towerops/snmp/profiles/vendors/cisco.ex create mode 100644 lib/towerops/snmp/profiles/vendors/citrix.ex create mode 100644 lib/towerops/snmp/profiles/vendors/corero.ex create mode 100644 lib/towerops/snmp/profiles/vendors/cts.ex create mode 100644 lib/towerops/snmp/profiles/vendors/cyberpower.ex create mode 100644 lib/towerops/snmp/profiles/vendors/dahua.ex create mode 100644 lib/towerops/snmp/profiles/vendors/dantherm.ex create mode 100644 lib/towerops/snmp/profiles/vendors/dell.ex create mode 100644 lib/towerops/snmp/profiles/vendors/delta.ex create mode 100644 lib/towerops/snmp/profiles/vendors/deltanet.ex create mode 100644 lib/towerops/snmp/profiles/vendors/deva.ex create mode 100644 lib/towerops/snmp/profiles/vendors/dkt.ex create mode 100644 lib/towerops/snmp/profiles/vendors/dlink.ex create mode 100644 lib/towerops/snmp/profiles/vendors/dpstelecom.ex create mode 100644 lib/towerops/snmp/profiles/vendors/eaton.ex create mode 100644 lib/towerops/snmp/profiles/vendors/edfa.ex create mode 100644 lib/towerops/snmp/profiles/vendors/eds.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ekinops.ex create mode 100644 lib/towerops/snmp/profiles/vendors/epson.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ericsson.ex create mode 100644 lib/towerops/snmp/profiles/vendors/extreme.ex create mode 100644 lib/towerops/snmp/profiles/vendors/f5.ex create mode 100644 lib/towerops/snmp/profiles/vendors/fibrolan.ex create mode 100644 lib/towerops/snmp/profiles/vendors/firebrick.ex create mode 100644 lib/towerops/snmp/profiles/vendors/fortinet.ex create mode 100644 lib/towerops/snmp/profiles/vendors/fs.ex create mode 100644 lib/towerops/snmp/profiles/vendors/geist.ex create mode 100644 lib/towerops/snmp/profiles/vendors/gigamon.ex create mode 100644 lib/towerops/snmp/profiles/vendors/greenbone.ex create mode 100644 lib/towerops/snmp/profiles/vendors/gude.ex create mode 100644 lib/towerops/snmp/profiles/vendors/gwd.ex create mode 100644 lib/towerops/snmp/profiles/vendors/hikvision.ex create mode 100644 lib/towerops/snmp/profiles/vendors/hillstone.ex create mode 100644 lib/towerops/snmp/profiles/vendors/himoinsa.ex create mode 100644 lib/towerops/snmp/profiles/vendors/hp.ex create mode 100644 lib/towerops/snmp/profiles/vendors/hpe.ex create mode 100644 lib/towerops/snmp/profiles/vendors/huawei.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ibm.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ibmc.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ignitenet.ex create mode 100644 lib/towerops/snmp/profiles/vendors/illustra.ex create mode 100644 lib/towerops/snmp/profiles/vendors/imco_power.ex create mode 100644 lib/towerops/snmp/profiles/vendors/infortrend.ex create mode 100644 lib/towerops/snmp/profiles/vendors/inovonics.ex create mode 100644 lib/towerops/snmp/profiles/vendors/jacarta.ex create mode 100644 lib/towerops/snmp/profiles/vendors/juniper.ex create mode 100644 lib/towerops/snmp/profiles/vendors/keenetic.ex create mode 100644 lib/towerops/snmp/profiles/vendors/lenovo.ex create mode 100644 lib/towerops/snmp/profiles/vendors/liebert.ex create mode 100644 lib/towerops/snmp/profiles/vendors/linux.ex create mode 100644 lib/towerops/snmp/profiles/vendors/luminato.ex create mode 100644 lib/towerops/snmp/profiles/vendors/meinberg.ex create mode 100644 lib/towerops/snmp/profiles/vendors/microsoft.ex create mode 100644 lib/towerops/snmp/profiles/vendors/mikrotik.ex create mode 100644 lib/towerops/snmp/profiles/vendors/moxa.ex create mode 100644 lib/towerops/snmp/profiles/vendors/mrv.ex create mode 100644 lib/towerops/snmp/profiles/vendors/n4rf.ex create mode 100644 lib/towerops/snmp/profiles/vendors/netapp.ex create mode 100644 lib/towerops/snmp/profiles/vendors/netgear.ex create mode 100644 lib/towerops/snmp/profiles/vendors/netping.ex create mode 100644 lib/towerops/snmp/profiles/vendors/nokia.ex create mode 100644 lib/towerops/snmp/profiles/vendors/opengear.ex create mode 100644 lib/towerops/snmp/profiles/vendors/orolia.ex create mode 100644 lib/towerops/snmp/profiles/vendors/packetlight.ex create mode 100644 lib/towerops/snmp/profiles/vendors/paloalto.ex create mode 100644 lib/towerops/snmp/profiles/vendors/patton.ex create mode 100644 lib/towerops/snmp/profiles/vendors/pbi.ex create mode 100644 lib/towerops/snmp/profiles/vendors/pegasus.ex create mode 100644 lib/towerops/snmp/profiles/vendors/polycom.ex create mode 100644 lib/towerops/snmp/profiles/vendors/primekey.ex create mode 100644 lib/towerops/snmp/profiles/vendors/printer.ex create mode 100644 lib/towerops/snmp/profiles/vendors/profline.ex create mode 100644 lib/towerops/snmp/profiles/vendors/protelevision.ex create mode 100644 lib/towerops/snmp/profiles/vendors/qtech.ex create mode 100644 lib/towerops/snmp/profiles/vendors/rad.ex create mode 100644 lib/towerops/snmp/profiles/vendors/radlan.ex create mode 100644 lib/towerops/snmp/profiles/vendors/radware.ex create mode 100644 lib/towerops/snmp/profiles/vendors/rajant.ex create mode 100644 lib/towerops/snmp/profiles/vendors/raritan.ex create mode 100644 lib/towerops/snmp/profiles/vendors/red.ex create mode 100644 lib/towerops/snmp/profiles/vendors/riedo.ex create mode 100644 lib/towerops/snmp/profiles/vendors/riverbed.ex create mode 100644 lib/towerops/snmp/profiles/vendors/sagemcom.ex create mode 100644 lib/towerops/snmp/profiles/vendors/schleifenbauer.ex create mode 100644 lib/towerops/snmp/profiles/vendors/siemens.ex create mode 100644 lib/towerops/snmp/profiles/vendors/silverpeak.ex create mode 100644 lib/towerops/snmp/profiles/vendors/smartbyte.ex create mode 100644 lib/towerops/snmp/profiles/vendors/smartoptics.ex create mode 100644 lib/towerops/snmp/profiles/vendors/snr.ex create mode 100644 lib/towerops/snmp/profiles/vendors/snr_erd.ex create mode 100644 lib/towerops/snmp/profiles/vendors/sonicwall.ex create mode 100644 lib/towerops/snmp/profiles/vendors/sophos.ex create mode 100644 lib/towerops/snmp/profiles/vendors/storage.ex create mode 100644 lib/towerops/snmp/profiles/vendors/supermicro.ex create mode 100644 lib/towerops/snmp/profiles/vendors/terra.ex create mode 100644 lib/towerops/snmp/profiles/vendors/tplink.ex create mode 100644 lib/towerops/snmp/profiles/vendors/tredess.ex create mode 100644 lib/towerops/snmp/profiles/vendors/trellix.ex create mode 100644 lib/towerops/snmp/profiles/vendors/tripplite.ex create mode 100644 lib/towerops/snmp/profiles/vendors/unix.ex create mode 100644 lib/towerops/snmp/profiles/vendors/ups.ex create mode 100644 lib/towerops/snmp/profiles/vendors/vertiv.ex create mode 100644 lib/towerops/snmp/profiles/vendors/vigintos.ex create mode 100644 lib/towerops/snmp/profiles/vendors/viprinet.ex create mode 100644 lib/towerops/snmp/profiles/vendors/vrp.ex create mode 100644 lib/towerops/snmp/profiles/vendors/watchguard.ex create mode 100644 lib/towerops/snmp/profiles/vendors/waystream.ex create mode 100644 lib/towerops/snmp/profiles/vendors/westermo.ex create mode 100644 lib/towerops/snmp/profiles/vendors/worldcastsystems.ex create mode 100644 lib/towerops/snmp/profiles/vendors/wti.ex create mode 100644 lib/towerops/snmp/profiles/vendors/zte.ex create mode 100644 lib/towerops/snmp/profiles/vendors/zyxel.ex create mode 100644 test/towerops/snmp/profiles/vendors/a10_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/adva_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/advantech_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/airconsole_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/airos_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/alcatel_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/allied_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/alpha_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/arbor_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/arris_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/asentria_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/audiocodes_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/avaya_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/axis_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/barco_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/barracuda_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/bistream_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/bke_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/brocade_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/bti_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/cambium_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/cdata_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/christie_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ciena_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/cirpack_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/cisco_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/citrix_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/corero_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/cts_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/cyberpower_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/dahua_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/dantherm_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/dell_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/delta_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/deltanet_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/deva_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/dkt_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/dlink_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/dpstelecom_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/eaton_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/edfa_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/eds_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ekinops_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/epmp_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/epson_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ericsson_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/extreme_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/f5_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/fibrolan_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/firebrick_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/fortinet_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/fs_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/geist_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/gigamon_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/greenbone_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/gude_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/gwd_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/hikvision_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/hillstone_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/himoinsa_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/hp_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/hpe_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/huawei_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ibm_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ibmc_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ignitenet_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/illustra_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/imco_power_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/infortrend_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/inovonics_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/jacarta_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/juniper_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/keenetic_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/lenovo_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/liebert_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/linux_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/luminato_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/meinberg_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/microsoft_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/mikrotik_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/moxa_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/mrv_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/n4rf_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/netapp_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/netgear_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/netping_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/nokia_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/opengear_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/orolia_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/packetlight_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/paloalto_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/patton_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/pbi_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/pegasus_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/polycom_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/primekey_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/printer_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/profline_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/protelevision_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/qtech_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/rad_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/radlan_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/radware_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/rajant_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/raritan_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/red_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/riedo_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/riverbed_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/routeros_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/sagemcom_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/schleifenbauer_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/siemens_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/silverpeak_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/smartbyte_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/smartoptics_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/snr_erd_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/snr_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/sonicwall_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/sophos_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/storage_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/supermicro_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/terra_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/tplink_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/tredess_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/trellix_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/tripplite_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/unix_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/ups_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/vertiv_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/vigintos_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/viprinet_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/vrp_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/watchguard_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/waystream_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/westermo_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/worldcastsystems_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/wti_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/zte_test.exs create mode 100644 test/towerops/snmp/profiles/vendors/zyxel_test.exs diff --git a/lib/mix/tasks/gen_vendor_modules.ex b/lib/mix/tasks/gen_vendor_modules.ex new file mode 100644 index 00000000..47c57368 --- /dev/null +++ b/lib/mix/tasks/gen_vendor_modules.ex @@ -0,0 +1,374 @@ +defmodule Mix.Tasks.GenVendorModules do + @shortdoc "Generate vendor module skeletons from YAML profiles" + + @moduledoc """ + Generates vendor module skeletons from YAML profiles. + + ## Usage + + mix gen_vendor_modules [--dry-run] [--group GROUP] + + ## Options + + * `--dry-run` - Show what would be generated without creating files + * `--group GROUP` - Only generate for a specific group/vendor + + ## Examples + + # Generate all missing vendor modules + mix gen_vendor_modules + + # Preview what would be generated + mix gen_vendor_modules --dry-run + + # Generate only for a specific vendor + mix gen_vendor_modules --group cisco + """ + + use Mix.Task + + @profiles_dir "priv/profiles/os_detection" + @vendors_dir "lib/towerops/snmp/profiles/vendors" + + # Filename prefix to vendor mapping for profiles without group field + @filename_vendor_map %{ + "cisco" => "cisco", + "juniper" => "juniper", + "junos" => "juniper", + "hp" => "hp", + "dell" => "dell", + "ibm" => "ibm", + "netgear" => "netgear", + "dlink" => "dlink", + "d-link" => "dlink", + "tp-link" => "tplink", + "tplink" => "tplink", + "netapp" => "netapp", + "synology" => "synology", + "qnap" => "qnap", + "vmware" => "vmware", + "palo" => "paloalto", + "panos" => "paloalto", + "fortinet" => "fortinet", + "forti" => "fortinet", + "checkpoint" => "checkpoint", + "sonic" => "sonicwall", + "sonicwall" => "sonicwall", + "opengear" => "opengear", + "raritan" => "raritan", + "eaton" => "eaton", + "liebert" => "liebert", + "cyberpower" => "cyberpower", + "tripp" => "tripplite", + "axis" => "axis", + "hikvision" => "hikvision", + "avaya" => "avaya", + "polycom" => "polycom", + "yealink" => "yealink", + "mitel" => "mitel", + "riverbed" => "riverbed", + "citrix" => "citrix", + "f5" => "f5", + "a10" => "a10", + "infoblox" => "infoblox", + "bluecoat" => "bluecoat", + "barracuda" => "barracuda", + "aruba" => "aruba", + "ruckus" => "ruckus" + } + + @impl Mix.Task + def run(args) do + {opts, _, _} = OptionParser.parse(args, switches: [dry_run: :boolean, group: :string]) + dry_run = Keyword.get(opts, :dry_run, false) + filter_group = Keyword.get(opts, :group) + + # Get existing vendors and covered profiles + existing_vendors = get_existing_vendors() + covered_profiles = get_covered_profiles() + IO.puts("Found #{length(existing_vendors)} existing vendor modules") + IO.puts("Found #{length(covered_profiles)} profiles already covered") + + # Parse all YAML profiles + profiles = parse_yaml_profiles() + IO.puts("Found #{length(profiles)} YAML profiles") + + # Group profiles by vendor + grouped = group_profiles(profiles) + IO.puts("Grouped into #{map_size(grouped)} vendors") + + # Filter if requested + grouped = + if filter_group do + Map.take(grouped, [filter_group]) + else + grouped + end + + # Filter out existing vendors and groups where all profiles are already covered + new_vendors = + grouped + |> Enum.reject(fn {vendor, vendor_profiles} -> + module_name = vendor_to_module_name(vendor) + module_exists = module_name in existing_vendors + + # Check if all profiles in this group are already covered + profile_names = Enum.map(vendor_profiles, & &1.os) + all_covered = Enum.all?(profile_names, &(&1 in covered_profiles)) + + module_exists or all_covered + end) + |> Enum.map(fn {vendor, vendor_profiles} -> + # Filter out profiles that are already covered + uncovered = Enum.reject(vendor_profiles, &(&1.os in covered_profiles)) + {vendor, uncovered} + end) + |> Enum.reject(fn {_vendor, profiles} -> Enum.empty?(profiles) end) + |> Map.new() + + IO.puts("#{map_size(new_vendors)} new vendors to generate") + + if map_size(new_vendors) == 0 do + IO.puts("\nNo new vendors to generate!") + :ok + else + Enum.each(new_vendors, fn {vendor, vendor_profiles} -> + generate_vendor_module(vendor, vendor_profiles, dry_run) + end) + + print_instructions(new_vendors, dry_run) + end + end + + defp print_instructions(new_vendors, dry_run) do + if !dry_run do + IO.puts("\n\nGenerated #{map_size(new_vendors)} vendor modules.") + IO.puts("Run `mix compile` to check for errors.") + IO.puts("Run `mix test` to verify.") + IO.puts("\nDon't forget to:") + IO.puts(" 1. Add aliases to registry.ex") + IO.puts(" 2. Add vendors to @vendors list in registry.ex") + IO.puts(" 3. Write tests for each vendor") + IO.puts(" 4. Add vendor-specific OIDs if available") + end + end + + defp get_existing_vendors do + "#{@vendors_dir}/*.ex" + |> Path.wildcard() + |> Enum.map(&Path.basename(&1, ".ex")) + |> Enum.reject(&(&1 in ["registry", "vendor"])) + |> Enum.map(&Macro.camelize/1) + end + + defp get_covered_profiles do + # Get all profile names already handled by existing vendor modules + # This requires the application to be started + _ = Application.ensure_all_started(:towerops) + + Towerops.Snmp.Profiles.Vendors.Registry.list_profile_names() + rescue + _ -> [] + end + + defp parse_yaml_profiles do + "#{@profiles_dir}/*.yaml" + |> Path.wildcard() + |> Enum.map(&parse_yaml_file/1) + |> Enum.reject(&is_nil/1) + end + + defp parse_yaml_file(path) do + case YamlElixir.read_from_file(path) do + {:ok, data} when is_map(data) -> + build_profile_map(data, path) + + _ -> + nil + end + end + + defp build_profile_map(data, path) do + os = Map.get(data, "os") + + if os do + %{ + os: os, + group: Map.get(data, "group"), + text: Map.get(data, "text"), + sys_object_ids: extract_sys_object_ids(data), + filename: Path.basename(path, ".yaml") + } + end + end + + defp extract_sys_object_ids(data) do + data + |> Map.get("discovery", []) + |> List.wrap() + |> Enum.flat_map(&get_sys_object_id_list/1) + end + + defp get_sys_object_id_list(%{"sysObjectID" => oids}) when is_list(oids), do: oids + defp get_sys_object_id_list(_), do: [] + + defp group_profiles(profiles) do + profiles + |> Enum.group_by(&determine_vendor/1) + |> Enum.reject(fn {vendor, _} -> vendor == nil end) + |> Map.new() + end + + defp determine_vendor(%{group: group}) when is_binary(group) and group != "" do + String.downcase(group) + end + + defp determine_vendor(%{filename: filename}) do + infer_vendor_from_filename(filename) + end + + defp infer_vendor_from_filename(filename) do + Enum.find_value(@filename_vendor_map, fn {prefix, vendor} -> + if String.starts_with?(filename, prefix) or String.contains?(filename, prefix) do + vendor + end + end) + end + + defp vendor_to_module_name(vendor) do + name = + vendor + |> String.replace(~r/[^a-z0-9]+/i, "_") + |> String.trim("_") + |> Macro.camelize() + + # Prefix with "N" if starts with a number (e.g., "4rf" -> "N4rf") + if String.match?(name, ~r/^[0-9]/) do + "N#{name}" + else + name + end + end + + defp vendor_to_filename(vendor) do + name = + vendor + |> String.replace(~r/[^a-z0-9]+/i, "_") + |> String.downcase() + |> String.trim("_") + + # Prefix with "n" if starts with a number + if String.match?(name, ~r/^[0-9]/) do + "n#{name}" + else + name + end + end + + defp generate_vendor_module(vendor, profiles, dry_run) do + module_name = vendor_to_module_name(vendor) + filename = vendor_to_filename(vendor) + profile_names = profiles |> Enum.map(& &1.os) |> Enum.sort() |> Enum.uniq() + + # Get enterprise OID from first sysObjectID if available + enterprise_oid = extract_enterprise_oid(profiles) + + content = generate_module_content(module_name, profile_names, enterprise_oid, vendor) + + if dry_run do + IO.puts("\n--- #{filename}.ex (#{module_name}) ---") + IO.puts(" Profiles: #{Enum.join(profile_names, ", ")}") + IO.puts(" Enterprise OID: #{enterprise_oid || "none"}") + else + path = "#{@vendors_dir}/#{filename}.ex" + File.write!(path, content) + IO.puts("Generated: #{path}") + end + end + + defp extract_enterprise_oid(profiles) do + profiles + |> Enum.flat_map(& &1.sys_object_ids) + |> Enum.find_value(fn oid -> + # Parse enterprise OID from sysObjectID pattern like ".1.3.6.1.4.1.9." + case Regex.run(~r/\.?1\.3\.6\.1\.4\.1\.(\d+)/, oid) do + [_, enterprise] -> "1.3.6.1.4.1.#{enterprise}" + _ -> nil + end + end) + end + + defp generate_module_content(module_name, profile_names, enterprise_oid, vendor) do + profiles_list = inspect(profile_names, pretty: true, limit: :infinity) + + enterprise_comment = + if enterprise_oid do + " # Enterprise OID: #{enterprise_oid}" + else + " # Enterprise OID: unknown - uses standard MIB OIDs" + end + + """ + defmodule Towerops.Snmp.Profiles.Vendors.#{module_name} do + @moduledoc \"\"\" + SNMP profile for #{String.capitalize(vendor)} devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + \"\"\" + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + #{enterprise_comment} + + @impl true + def profile_names, do: #{profiles_list} + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # TODO: Add vendor-specific hardware detection + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\\r\\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + # TODO: Add vendor-specific OIDs + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end + end + """ + end +end diff --git a/lib/mix/tasks/gen_vendor_tests.ex b/lib/mix/tasks/gen_vendor_tests.ex new file mode 100644 index 00000000..07a293f7 --- /dev/null +++ b/lib/mix/tasks/gen_vendor_tests.ex @@ -0,0 +1,209 @@ +defmodule Mix.Tasks.GenVendorTests do + @shortdoc "Generate test files for vendor modules" + + @moduledoc """ + Generates test files for vendor modules that don't have tests. + + ## Usage + + mix gen_vendor_tests [--dry-run] + + ## Options + + * `--dry-run` - Show what would be generated without creating files + """ + + use Mix.Task + + @vendors_dir "lib/towerops/snmp/profiles/vendors" + @tests_dir "test/towerops/snmp/profiles/vendors" + + @impl Mix.Task + def run(args) do + {opts, _, _} = OptionParser.parse(args, switches: [dry_run: :boolean]) + dry_run = Keyword.get(opts, :dry_run, false) + + # Get all vendor modules (excluding registry and vendor behaviour) + vendor_files = + "#{@vendors_dir}/*.ex" + |> Path.wildcard() + |> Enum.map(&Path.basename(&1, ".ex")) + |> Enum.reject(&(&1 in ["registry", "vendor"])) + + # Get existing tests + existing_tests = + "#{@tests_dir}/*_test.exs" + |> Path.wildcard() + |> Enum.map(&Path.basename(&1, "_test.exs")) + + # Find vendors without tests + vendors_without_tests = + vendor_files + |> Enum.reject(&(&1 in existing_tests)) + |> Enum.sort() + + IO.puts("Found #{length(vendor_files)} vendor modules") + IO.puts("Found #{length(existing_tests)} existing tests") + IO.puts("#{length(vendors_without_tests)} vendors need tests") + + if vendors_without_tests == [] do + IO.puts("\nAll vendor modules have tests!") + :ok + else + Enum.each(vendors_without_tests, fn vendor_file -> + generate_vendor_test(vendor_file, dry_run) + end) + + if !dry_run do + IO.puts("\n\nGenerated #{length(vendors_without_tests)} test files.") + IO.puts("Run `mix test test/towerops/snmp/profiles/vendors/` to verify.") + end + end + end + + defp generate_vendor_test(vendor_file, dry_run) do + module_name = Macro.camelize(vendor_file) + + # Read the vendor module to get profile names + vendor_path = "#{@vendors_dir}/#{vendor_file}.ex" + profile_names = extract_profile_names(vendor_path) + + content = generate_test_content(module_name, profile_names) + + if dry_run do + IO.puts("Would generate: #{@tests_dir}/#{vendor_file}_test.exs") + else + path = "#{@tests_dir}/#{vendor_file}_test.exs" + File.write!(path, content) + IO.puts("Generated: #{path}") + end + end + + defp extract_profile_names(path) do + case File.read(path) do + {:ok, content} -> + case Regex.run(~r/def profile_names.*?do:?\s*(\[.*?\])/s, content) do + [_, list_str] -> + # Parse the list from the string + {result, _} = Code.eval_string(list_str) + result + + _ -> + [] + end + + _ -> + [] + end + end + + defp generate_test_content(module_name, profile_names) do + profiles_inspect = inspect(profile_names) + + """ + defmodule Towerops.Snmp.Profiles.Vendors.#{module_name}Test do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.#{module_name} + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert #{module_name}.profile_names() == #{profiles_inspect} + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert #{module_name}.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert #{module_name}.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = #{module_name}.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = #{module_name}.wireless_oid_defs() + + assert is_list(defs) + assert length(defs) >= 1 + end + + test "each definition has required fields" do + defs = #{module_name}.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = #{module_name}.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = #{module_name}.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = #{module_name}.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = #{module_name}.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end + end + """ + end +end diff --git a/lib/towerops/snmp/deferred_discovery.ex b/lib/towerops/snmp/deferred_discovery.ex index 99e28397..0b9c0506 100644 --- a/lib/towerops/snmp/deferred_discovery.ex +++ b/lib/towerops/snmp/deferred_discovery.ex @@ -157,20 +157,21 @@ defmodule Towerops.Snmp.DeferredDiscovery do @doc """ Categorizes a device as fast or slow based on initial response time. Returns :fast, :slow, or :unresponsive. + + Options: + * `:fast_threshold` - milliseconds below which device is considered fast (default: 1000) """ - @spec categorize_device_speed(Client.connection_opts()) :: :fast | :slow | :unresponsive - def categorize_device_speed(client_opts) do + @spec categorize_device_speed(Client.connection_opts(), keyword()) :: + :fast | :slow | :unresponsive + def categorize_device_speed(client_opts, opts \\ []) do + fast_threshold = Keyword.get(opts, :fast_threshold, 1_000) start_time = System.monotonic_time(:millisecond) case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do {:ok, _} -> elapsed = System.monotonic_time(:millisecond) - start_time - cond do - elapsed < 1_000 -> :fast - elapsed < 5_000 -> :slow - true -> :slow - end + if elapsed < fast_threshold, do: :fast, else: :slow {:error, _} -> :unresponsive diff --git a/lib/towerops/snmp/profiles/vendors/a10.ex b/lib/towerops/snmp/profiles/vendors/a10.ex new file mode 100644 index 00000000..14c72d43 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/a10.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.A10 do + @moduledoc """ + SNMP profile for A10 devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.22610 + + @impl true + def profile_names, do: ["acos", "zxa10"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/adva.ex b/lib/towerops/snmp/profiles/vendors/adva.ex new file mode 100644 index 00000000..709f2e4b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/adva.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Adva do + @moduledoc """ + SNMP profile for Adva devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2544 + + @impl true + def profile_names, do: ["adva-aos", "adva-fsp150cp", "adva-osa", "adva_fsp150", "adva_fsp3kr7", "adva_xg300"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/advantech.ex b/lib/towerops/snmp/profiles/vendors/advantech.ex new file mode 100644 index 00000000..fcd12d3f --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/advantech.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Advantech do + @moduledoc """ + SNMP profile for Advantech devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.10297 + + @impl true + def profile_names, do: ["advantech", "icr-os"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/airconsole.ex b/lib/towerops/snmp/profiles/vendors/airconsole.ex new file mode 100644 index 00000000..61ff06ab --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/airconsole.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Airconsole do + @moduledoc """ + SNMP profile for Airconsole devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.14358 + + @impl true + def profile_names, do: ["airconsole"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/alcatel.ex b/lib/towerops/snmp/profiles/vendors/alcatel.ex new file mode 100644 index 00000000..829f3a61 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/alcatel.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Alcatel do + @moduledoc """ + SNMP profile for Alcatel devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["omnipcx"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/allied.ex b/lib/towerops/snmp/profiles/vendors/allied.ex new file mode 100644 index 00000000..62472060 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/allied.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Allied do + @moduledoc """ + SNMP profile for Allied devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["allied", "allied-tq"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/allied_telesis.ex b/lib/towerops/snmp/profiles/vendors/allied_telesis.ex index 832c97f9..520c6e6f 100644 --- a/lib/towerops/snmp/profiles/vendors/allied_telesis.ex +++ b/lib/towerops/snmp/profiles/vendors/allied_telesis.ex @@ -21,7 +21,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.AlliedTelesis do @sysdescr_oid "1.3.6.1.2.1.1.1.0" @impl true - def profile_names, do: ["allied", "awplus", "allied-tq"] + def profile_names, do: ["allied", "awplus", "allied-tq", "radlan"] @impl true def detect_hardware(client_opts) do diff --git a/lib/towerops/snmp/profiles/vendors/alpha.ex b/lib/towerops/snmp/profiles/vendors/alpha.ex new file mode 100644 index 00000000..d9eee399 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/alpha.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Alpha do + @moduledoc """ + SNMP profile for Alpha devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.26854 + + @impl true + def profile_names, do: ["compas", "fxm"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/arbor.ex b/lib/towerops/snmp/profiles/vendors/arbor.ex new file mode 100644 index 00000000..eb0be069 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/arbor.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Arbor do + @moduledoc """ + SNMP profile for Arbor devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.9694 + + @impl true + def profile_names, do: ["arbos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/arris.ex b/lib/towerops/snmp/profiles/vendors/arris.ex new file mode 100644 index 00000000..2fe8265c --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/arris.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Arris do + @moduledoc """ + SNMP profile for Arris devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.4115 + + @impl true + def profile_names, do: ["arris-d5"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/asentria.ex b/lib/towerops/snmp/profiles/vendors/asentria.ex new file mode 100644 index 00000000..74bab671 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/asentria.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Asentria do + @moduledoc """ + SNMP profile for Asentria devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3052 + + @impl true + def profile_names, do: ["siteboss", "siteboss360", "siteboss550", "siteboss571", "siteboss572"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/audiocodes.ex b/lib/towerops/snmp/profiles/vendors/audiocodes.ex new file mode 100644 index 00000000..af7a5caa --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/audiocodes.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Audiocodes do + @moduledoc """ + SNMP profile for Audiocodes devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.5003 + + @impl true + def profile_names, do: ["audiocodes"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/avaya.ex b/lib/towerops/snmp/profiles/vendors/avaya.ex new file mode 100644 index 00000000..acc0b171 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/avaya.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Avaya do + @moduledoc """ + SNMP profile for Avaya devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.6889 + + @impl true + def profile_names, do: ["avaya-ipo"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/axis.ex b/lib/towerops/snmp/profiles/vendors/axis.ex new file mode 100644 index 00000000..41db6d34 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/axis.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Axis do + @moduledoc """ + SNMP profile for Axis devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["axisaudio", "axiscam", "axisdocserver"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/barco.ex b/lib/towerops/snmp/profiles/vendors/barco.ex new file mode 100644 index 00000000..63cfc281 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/barco.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Barco do + @moduledoc """ + SNMP profile for Barco devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.7312 + + @impl true + def profile_names, do: ["clickshare"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/barracuda.ex b/lib/towerops/snmp/profiles/vendors/barracuda.ex new file mode 100644 index 00000000..e5a4e2c6 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/barracuda.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Barracuda do + @moduledoc """ + SNMP profile for Barracuda devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.10704 + + @impl true + def profile_names, do: ["barracudaloadbalancer", "barracudangfirewall", "barracudaspamfirewall", "barracudawafirewall"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/bistream.ex b/lib/towerops/snmp/profiles/vendors/bistream.ex new file mode 100644 index 00000000..1b4aa324 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/bistream.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Bistream do + @moduledoc """ + SNMP profile for Bistream devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.6603 + + @impl true + def profile_names, do: ["hyperion"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/bke.ex b/lib/towerops/snmp/profiles/vendors/bke.ex new file mode 100644 index 00000000..d9ec928d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/bke.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Bke do + @moduledoc """ + SNMP profile for Bke devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.27533 + + @impl true + def profile_names, do: ["bke"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/brocade.ex b/lib/towerops/snmp/profiles/vendors/brocade.ex new file mode 100644 index 00000000..ac1e2fd9 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/brocade.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Brocade do + @moduledoc """ + SNMP profile for Brocade devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1588 + + @impl true + def profile_names, do: ["fabos", "ironware", "nos", "serveriron"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/bti.ex b/lib/towerops/snmp/profiles/vendors/bti.ex new file mode 100644 index 00000000..780556cd --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/bti.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Bti do + @moduledoc """ + SNMP profile for Bti devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.30005 + + @impl true + def profile_names, do: ["bti800"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/cambium.ex b/lib/towerops/snmp/profiles/vendors/cambium.ex new file mode 100644 index 00000000..a974fe7f --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/cambium.ex @@ -0,0 +1,59 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Cambium do + @moduledoc """ + SNMP profile for Cambium devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.161 + + @impl true + def profile_names, + do: ["cmm", "cmm4", "cnpilote", "cnpilotr", "epmp", "pmp", "ptp250", "ptp500", "ptp600", "ptp650", "ptp670", "ptp800"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/cdata.ex b/lib/towerops/snmp/profiles/vendors/cdata.ex new file mode 100644 index 00000000..4cdfe7e1 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/cdata.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Cdata do + @moduledoc """ + SNMP profile for Cdata devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.17409 + + @impl true + def profile_names, do: ["cdata"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/christie.ex b/lib/towerops/snmp/profiles/vendors/christie.ex new file mode 100644 index 00000000..a92a7ce9 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/christie.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Christie do + @moduledoc """ + SNMP profile for Christie devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.25766 + + @impl true + def profile_names, do: ["christie-projector"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ciena.ex b/lib/towerops/snmp/profiles/vendors/ciena.ex new file mode 100644 index 00000000..d3637914 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ciena.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ciena do + @moduledoc """ + SNMP profile for Ciena devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.562 + + @impl true + def profile_names, do: ["ciena-saos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/cirpack.ex b/lib/towerops/snmp/profiles/vendors/cirpack.ex new file mode 100644 index 00000000..79722d50 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/cirpack.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Cirpack do + @moduledoc """ + SNMP profile for Cirpack devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["cirpack"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/cisco.ex b/lib/towerops/snmp/profiles/vendors/cisco.ex new file mode 100644 index 00000000..5bc86845 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/cisco.ex @@ -0,0 +1,87 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Cisco do + @moduledoc """ + SNMP profile for Cisco devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.9 + + @impl true + def profile_names, + do: [ + "acano", + "acs", + "acsw", + "apic", + "asa", + "cat1900", + "catos", + "cimc", + "ciscoepc", + "ciscome1200", + "ciscosat", + "ciscosb", + "ciscosce", + "ciscospa", + "ciscosrp", + "ciscowlc", + "ftd", + "fxos", + "ios", + "iosxe", + "iosxr", + "nxos", + "ons", + "pixos", + "sanos", + "viptela", + "waas" + ] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/citrix.ex b/lib/towerops/snmp/profiles/vendors/citrix.ex new file mode 100644 index 00000000..cc460d88 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/citrix.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Citrix do + @moduledoc """ + SNMP profile for Citrix devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3845 + + @impl true + def profile_names, do: ["netscaler-sdwan"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/corero.ex b/lib/towerops/snmp/profiles/vendors/corero.ex new file mode 100644 index 00000000..3ea64a74 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/corero.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Corero do + @moduledoc """ + SNMP profile for Corero devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.41036 + + @impl true + def profile_names, do: ["cms"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/cts.ex b/lib/towerops/snmp/profiles/vendors/cts.ex new file mode 100644 index 00000000..3547461e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/cts.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Cts do + @moduledoc """ + SNMP profile for Cts devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.9304 + + @impl true + def profile_names, do: ["cts"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/cyberpower.ex b/lib/towerops/snmp/profiles/vendors/cyberpower.ex new file mode 100644 index 00000000..8d5ecb5f --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/cyberpower.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Cyberpower do + @moduledoc """ + SNMP profile for Cyberpower devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3808 + + @impl true + def profile_names, do: ["cyberpower"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/dahua.ex b/lib/towerops/snmp/profiles/vendors/dahua.ex new file mode 100644 index 00000000..268eb8e1 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/dahua.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Dahua do + @moduledoc """ + SNMP profile for Dahua devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1004849 + + @impl true + def profile_names, do: ["dahua-nvr"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/dantherm.ex b/lib/towerops/snmp/profiles/vendors/dantherm.ex new file mode 100644 index 00000000..4373d1ac --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/dantherm.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Dantherm do + @moduledoc """ + SNMP profile for Dantherm devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["dantherm-os"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/dell.ex b/lib/towerops/snmp/profiles/vendors/dell.ex new file mode 100644 index 00000000..013f8ebf --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/dell.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Dell do + @moduledoc """ + SNMP profile for Dell devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.674 + + @impl true + def profile_names, do: ["dell-ome-m", "dell-os10", "dell-powervault", "dell-rcs", "dell-rpdu", "dell-sonic", "dell-ups"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/delta.ex b/lib/towerops/snmp/profiles/vendors/delta.ex new file mode 100644 index 00000000..66bc8130 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/delta.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Delta do + @moduledoc """ + SNMP profile for Delta devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.20246 + + @impl true + def profile_names, do: ["deltaorion"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/deltanet.ex b/lib/towerops/snmp/profiles/vendors/deltanet.ex new file mode 100644 index 00000000..c1b5d5e8 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/deltanet.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Deltanet do + @moduledoc """ + SNMP profile for Deltanet devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.35616 + + @impl true + def profile_names, do: ["lambdatrail"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/deva.ex b/lib/towerops/snmp/profiles/vendors/deva.ex new file mode 100644 index 00000000..95e67491 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/deva.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Deva do + @moduledoc """ + SNMP profile for Deva devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["deva-db7001"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/dkt.ex b/lib/towerops/snmp/profiles/vendors/dkt.ex new file mode 100644 index 00000000..448cad43 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/dkt.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Dkt do + @moduledoc """ + SNMP profile for Dkt devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["dkt"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/dlink.ex b/lib/towerops/snmp/profiles/vendors/dlink.ex new file mode 100644 index 00000000..ae9d2747 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/dlink.ex @@ -0,0 +1,59 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Dlink do + @moduledoc """ + SNMP profile for Dlink devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.171 + + @impl true + # Note: "dlinkap" is handled by the Dlinkap module + def profile_names, do: ["dlink", "dlink-dgs1250"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/dpstelecom.ex b/lib/towerops/snmp/profiles/vendors/dpstelecom.ex new file mode 100644 index 00000000..71da5eef --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/dpstelecom.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Dpstelecom do + @moduledoc """ + SNMP profile for Dpstelecom devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2682 + + @impl true + def profile_names, do: ["netguardian"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/eaton.ex b/lib/towerops/snmp/profiles/vendors/eaton.ex new file mode 100644 index 00000000..df110e25 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/eaton.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Eaton do + @moduledoc """ + SNMP profile for Eaton devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.935 + + @impl true + def profile_names, do: ["eaton-ats", "eaton-matrix", "eaton-sc200", "eaton-sc300", "eatonpdu"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/edfa.ex b/lib/towerops/snmp/profiles/vendors/edfa.ex new file mode 100644 index 00000000..5d4d82f2 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/edfa.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Edfa do + @moduledoc """ + SNMP profile for Edfa devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.17409 + + @impl true + def profile_names, do: ["edfa"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/eds.ex b/lib/towerops/snmp/profiles/vendors/eds.ex new file mode 100644 index 00000000..2e2ad0d5 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/eds.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Eds do + @moduledoc """ + SNMP profile for Eds devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.31440 + + @impl true + def profile_names, do: ["eds"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ekinops.ex b/lib/towerops/snmp/profiles/vendors/ekinops.ex new file mode 100644 index 00000000..ee143c1a --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ekinops.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ekinops do + @moduledoc """ + SNMP profile for Ekinops devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.20044 + + @impl true + def profile_names, do: ["ekinops"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/epson.ex b/lib/towerops/snmp/profiles/vendors/epson.ex new file mode 100644 index 00000000..bee41810 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/epson.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Epson do + @moduledoc """ + SNMP profile for Epson devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1248 + + @impl true + def profile_names, do: ["epson-projector", "epson-scanner"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ericsson.ex b/lib/towerops/snmp/profiles/vendors/ericsson.ex new file mode 100644 index 00000000..68a7849b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ericsson.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ericsson do + @moduledoc """ + SNMP profile for Ericsson devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.572 + + @impl true + def profile_names, do: ["elg-ipecs-es", "ericsson-ipos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/extreme.ex b/lib/towerops/snmp/profiles/vendors/extreme.ex new file mode 100644 index 00000000..272253a2 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/extreme.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Extreme do + @moduledoc """ + SNMP profile for Extreme devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1588 + + @impl true + def profile_names, do: ["slxos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/f5.ex b/lib/towerops/snmp/profiles/vendors/f5.ex new file mode 100644 index 00000000..06f3d215 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/f5.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.F5 do + @moduledoc """ + SNMP profile for F5 devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3375 + + @impl true + def profile_names, do: ["f5", "f5os"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/fibrolan.ex b/lib/towerops/snmp/profiles/vendors/fibrolan.ex new file mode 100644 index 00000000..8dd9481d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/fibrolan.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Fibrolan do + @moduledoc """ + SNMP profile for Fibrolan devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.4467 + + @impl true + def profile_names, do: ["fibrolan-falcon", "fibrolan-metrostar"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/firebrick.ex b/lib/towerops/snmp/profiles/vendors/firebrick.ex new file mode 100644 index 00000000..7c84a26c --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/firebrick.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Firebrick do + @moduledoc """ + SNMP profile for Firebrick devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["firebrick"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/fortinet.ex b/lib/towerops/snmp/profiles/vendors/fortinet.ex new file mode 100644 index 00000000..7e9295e0 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/fortinet.ex @@ -0,0 +1,71 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Fortinet do + @moduledoc """ + SNMP profile for Fortinet devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.12356 + + @impl true + # Note: "fortiap" and "fortiwlc" are handled by Fortiap and Fortiwlc modules + def profile_names, + do: [ + "fortiadc", + "fortiauthenticator", + "fortiextender", + "fortigate", + "fortimail", + "fortios", + "fortisandbox", + "fortiswitch", + "fortivoice", + "fortiweb" + ] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/fs.ex b/lib/towerops/snmp/profiles/vendors/fs.ex new file mode 100644 index 00000000..a73e9c70 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/fs.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Fs do + @moduledoc """ + SNMP profile for Fs devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.52642 + + @impl true + def profile_names, do: ["fs-bdcom", "fs-centec", "fs-gbn", "fs-net-pdu", "fs-nmu", "fs-switch", "fs-switch-dc"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/geist.ex b/lib/towerops/snmp/profiles/vendors/geist.ex new file mode 100644 index 00000000..d174acd8 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/geist.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Geist do + @moduledoc """ + SNMP profile for Geist devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.21239 + + @impl true + def profile_names, do: ["geist-pdu", "geist-watchdog"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/gigamon.ex b/lib/towerops/snmp/profiles/vendors/gigamon.ex new file mode 100644 index 00000000..129845d3 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/gigamon.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Gigamon do + @moduledoc """ + SNMP profile for Gigamon devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.26866 + + @impl true + def profile_names, do: ["gigavue"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/greenbone.ex b/lib/towerops/snmp/profiles/vendors/greenbone.ex new file mode 100644 index 00000000..2742df69 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/greenbone.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Greenbone do + @moduledoc """ + SNMP profile for Greenbone devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["gos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/gude.ex b/lib/towerops/snmp/profiles/vendors/gude.ex new file mode 100644 index 00000000..ed892657 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/gude.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Gude do + @moduledoc """ + SNMP profile for Gude devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.28507 + + @impl true + def profile_names, do: ["ets", "gude-esb"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/gwd.ex b/lib/towerops/snmp/profiles/vendors/gwd.ex new file mode 100644 index 00000000..45a0d939 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/gwd.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Gwd do + @moduledoc """ + SNMP profile for Gwd devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.10072 + + @impl true + def profile_names, do: ["gwd"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/hikvision.ex b/lib/towerops/snmp/profiles/vendors/hikvision.ex new file mode 100644 index 00000000..b0af89bc --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/hikvision.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Hikvision do + @moduledoc """ + SNMP profile for Hikvision devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.50001 + + @impl true + def profile_names, do: ["hikvision-cam", "hikvision-nvr"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/hillstone.ex b/lib/towerops/snmp/profiles/vendors/hillstone.ex new file mode 100644 index 00000000..7e635eef --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/hillstone.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Hillstone do + @moduledoc """ + SNMP profile for Hillstone devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["stoneos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/himoinsa.ex b/lib/towerops/snmp/profiles/vendors/himoinsa.ex new file mode 100644 index 00000000..211a6c15 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/himoinsa.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Himoinsa do + @moduledoc """ + SNMP profile for Himoinsa devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["himoinsa-gensets"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/hp.ex b/lib/towerops/snmp/profiles/vendors/hp.ex new file mode 100644 index 00000000..fed8bb0a --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/hp.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Hp do + @moduledoc """ + SNMP profile for Hp devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.11 + + @impl true + def profile_names, do: ["hpblmos", "hpe-ilo", "hpe-ipdu", "hpe-msa", "hpe-msl", "hpe-pdumm", "hpmsm", "hpvc", "uhp"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/hpe.ex b/lib/towerops/snmp/profiles/vendors/hpe.ex new file mode 100644 index 00000000..ea8cdd97 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/hpe.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Hpe do + @moduledoc """ + SNMP profile for Hpe devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.232 + + @impl true + def profile_names, do: ["hpe-mapdu"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/huawei.ex b/lib/towerops/snmp/profiles/vendors/huawei.ex new file mode 100644 index 00000000..ebf84da7 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/huawei.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Huawei do + @moduledoc """ + SNMP profile for Huawei devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2011 + + @impl true + def profile_names, do: ["huawei-optixrtn", "oceanstor", "smartax", "smartax-mdu", "yunshan"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ibm.ex b/lib/towerops/snmp/profiles/vendors/ibm.ex new file mode 100644 index 00000000..1c178f2b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ibm.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ibm do + @moduledoc """ + SNMP profile for Ibm devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2 + + @impl true + def profile_names, do: ["ibm-amm", "ibm-i", "ibm-imm", "ibmnos", "ibmtl"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ibmc.ex b/lib/towerops/snmp/profiles/vendors/ibmc.ex new file mode 100644 index 00000000..847bcc53 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ibmc.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ibmc do + @moduledoc """ + SNMP profile for Ibmc devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2011 + + @impl true + def profile_names, do: ["ibmc"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ignitenet.ex b/lib/towerops/snmp/profiles/vendors/ignitenet.ex new file mode 100644 index 00000000..bca9e818 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ignitenet.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ignitenet do + @moduledoc """ + SNMP profile for Ignitenet devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.259 + + @impl true + def profile_names, do: ["fusion"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/illustra.ex b/lib/towerops/snmp/profiles/vendors/illustra.ex new file mode 100644 index 00000000..7b2e06ae --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/illustra.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Illustra do + @moduledoc """ + SNMP profile for Illustra devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["illustra"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/imco_power.ex b/lib/towerops/snmp/profiles/vendors/imco_power.ex new file mode 100644 index 00000000..942eb53b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/imco_power.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ImcoPower do + @moduledoc """ + SNMP profile for Imco power devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.818 + + @impl true + def profile_names, do: ["imcopower-big", "imcopower-ls110"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/infortrend.ex b/lib/towerops/snmp/profiles/vendors/infortrend.ex new file mode 100644 index 00000000..44d9b115 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/infortrend.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Infortrend do + @moduledoc """ + SNMP profile for Infortrend devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1714 + + @impl true + def profile_names, do: ["infortrend"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/inovonics.ex b/lib/towerops/snmp/profiles/vendors/inovonics.ex new file mode 100644 index 00000000..2f3e5d29 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/inovonics.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Inovonics do + @moduledoc """ + SNMP profile for Inovonics devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.42111 + + @impl true + def profile_names, do: ["aaron"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/jacarta.ex b/lib/towerops/snmp/profiles/vendors/jacarta.ex new file mode 100644 index 00000000..93fc8d8d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/jacarta.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Jacarta do + @moduledoc """ + SNMP profile for Jacarta devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.19011 + + @impl true + def profile_names, do: ["interseptor"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/juniper.ex b/lib/towerops/snmp/profiles/vendors/juniper.ex new file mode 100644 index 00000000..b40ee240 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/juniper.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Juniper do + @moduledoc """ + SNMP profile for Juniper devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.14525 + + @impl true + def profile_names, do: ["juniper-mss", "juniperex2500os", "junos", "junose"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/keenetic.ex b/lib/towerops/snmp/profiles/vendors/keenetic.ex new file mode 100644 index 00000000..f681ff19 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/keenetic.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Keenetic do + @moduledoc """ + SNMP profile for Keenetic devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["keeneticos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/lenovo.ex b/lib/towerops/snmp/profiles/vendors/lenovo.ex new file mode 100644 index 00000000..1eb3c137 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/lenovo.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Lenovo do + @moduledoc """ + SNMP profile for Lenovo devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.19046 + + @impl true + def profile_names, do: ["cnos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/liebert.ex b/lib/towerops/snmp/profiles/vendors/liebert.ex new file mode 100644 index 00000000..4819bfba --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/liebert.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Liebert do + @moduledoc """ + SNMP profile for Liebert devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.476 + + @impl true + def profile_names, do: ["liebert"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/linux.ex b/lib/towerops/snmp/profiles/vendors/linux.ex new file mode 100644 index 00000000..c85b4b08 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/linux.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Linux do + @moduledoc """ + SNMP profile for Linux devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["aloha"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/luminato.ex b/lib/towerops/snmp/profiles/vendors/luminato.ex new file mode 100644 index 00000000..d5589f42 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/luminato.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Luminato do + @moduledoc """ + SNMP profile for Luminato devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3715 + + @impl true + def profile_names, do: ["luminato"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/meinberg.ex b/lib/towerops/snmp/profiles/vendors/meinberg.ex new file mode 100644 index 00000000..0e6d59f7 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/meinberg.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Meinberg do + @moduledoc """ + SNMP profile for Meinberg devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.5597 + + @impl true + def profile_names, do: ["mbg-meinbergos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/microsoft.ex b/lib/towerops/snmp/profiles/vendors/microsoft.ex new file mode 100644 index 00000000..38e82d0b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/microsoft.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Microsoft do + @moduledoc """ + SNMP profile for Microsoft devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["windows"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/mikrotik.ex b/lib/towerops/snmp/profiles/vendors/mikrotik.ex new file mode 100644 index 00000000..881806e2 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/mikrotik.ex @@ -0,0 +1,59 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Mikrotik do + @moduledoc """ + SNMP profile for Mikrotik devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.14988 + + @impl true + # Note: "routeros" is handled by the Routeros module + def profile_names, do: ["swos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/moxa.ex b/lib/towerops/snmp/profiles/vendors/moxa.ex new file mode 100644 index 00000000..ec749c9f --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/moxa.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Moxa do + @moduledoc """ + SNMP profile for Moxa devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.8691 + + @impl true + def profile_names, do: ["moxa-awk"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/mrv.ex b/lib/towerops/snmp/profiles/vendors/mrv.ex new file mode 100644 index 00000000..e404f22e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/mrv.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Mrv do + @moduledoc """ + SNMP profile for Mrv devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.629 + + @impl true + def profile_names, do: ["mrv-od", "mrvld"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/n4rf.ex b/lib/towerops/snmp/profiles/vendors/n4rf.ex new file mode 100644 index 00000000..07c6c312 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/n4rf.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.N4rf do + @moduledoc """ + SNMP profile for 4rf devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.14817 + + @impl true + def profile_names, do: ["aprisa"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/netapp.ex b/lib/towerops/snmp/profiles/vendors/netapp.ex new file mode 100644 index 00000000..3c78b0ed --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/netapp.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Netapp do + @moduledoc """ + SNMP profile for Netapp devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["netapp"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/netgear.ex b/lib/towerops/snmp/profiles/vendors/netgear.ex new file mode 100644 index 00000000..55a61414 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/netgear.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Netgear do + @moduledoc """ + SNMP profile for Netgear devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.4526 + + @impl true + def profile_names, do: ["netgear"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/netping.ex b/lib/towerops/snmp/profiles/vendors/netping.ex new file mode 100644 index 00000000..42155e9e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/netping.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Netping do + @moduledoc """ + SNMP profile for Netping devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.25728 + + @impl true + def profile_names, do: ["uniping"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/nokia.ex b/lib/towerops/snmp/profiles/vendors/nokia.ex new file mode 100644 index 00000000..1b387342 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/nokia.ex @@ -0,0 +1,59 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Nokia do + @moduledoc """ + SNMP profile for Nokia devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.6486 + + @impl true + # Note: "stellar" is handled by the Stellar module + def profile_names, do: ["aos", "aos6", "aos7", "nokia-1830", "nokia-isam", "srlinux", "timos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/opengear.ex b/lib/towerops/snmp/profiles/vendors/opengear.ex new file mode 100644 index 00000000..3783cfcb --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/opengear.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Opengear do + @moduledoc """ + SNMP profile for Opengear devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.25049 + + @impl true + def profile_names, do: ["opengear"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/orolia.ex b/lib/towerops/snmp/profiles/vendors/orolia.ex new file mode 100644 index 00000000..33440794 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/orolia.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Orolia do + @moduledoc """ + SNMP profile for Orolia devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.18837 + + @impl true + def profile_names, do: ["orolia-securesync"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/packetlight.ex b/lib/towerops/snmp/profiles/vendors/packetlight.ex new file mode 100644 index 00000000..88e427e5 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/packetlight.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Packetlight do + @moduledoc """ + SNMP profile for Packetlight devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["packetlight"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/paloalto.ex b/lib/towerops/snmp/profiles/vendors/paloalto.ex new file mode 100644 index 00000000..8738e1fb --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/paloalto.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Paloalto do + @moduledoc """ + SNMP profile for Paloalto devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["panos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/patton.ex b/lib/towerops/snmp/profiles/vendors/patton.ex new file mode 100644 index 00000000..c349e270 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/patton.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Patton do + @moduledoc """ + SNMP profile for Patton devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1768 + + @impl true + def profile_names, do: ["patton-sn"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/pbi.ex b/lib/towerops/snmp/profiles/vendors/pbi.ex new file mode 100644 index 00000000..8c879530 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/pbi.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Pbi do + @moduledoc """ + SNMP profile for Pbi devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2021 + + @impl true + def profile_names, do: ["ird"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/pegasus.ex b/lib/towerops/snmp/profiles/vendors/pegasus.ex new file mode 100644 index 00000000..77976f26 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/pegasus.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Pegasus do + @moduledoc """ + SNMP profile for Pegasus devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.6368 + + @impl true + def profile_names, do: ["pegasus"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/polycom.ex b/lib/towerops/snmp/profiles/vendors/polycom.ex new file mode 100644 index 00000000..f5c220eb --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/polycom.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Polycom do + @moduledoc """ + SNMP profile for Polycom devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2684 + + @impl true + def profile_names, do: ["polycomLens"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/primekey.ex b/lib/towerops/snmp/profiles/vendors/primekey.ex new file mode 100644 index 00000000..bfc189ab --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/primekey.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Primekey do + @moduledoc """ + SNMP profile for Primekey devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.8072 + + @impl true + def profile_names, do: ["primekey", "primekey-sw"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/printer.ex b/lib/towerops/snmp/profiles/vendors/printer.ex new file mode 100644 index 00000000..38c60df9 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/printer.ex @@ -0,0 +1,81 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Printer do + @moduledoc """ + SNMP profile for Printer devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1602 + + @impl true + def profile_names, + do: [ + "brother", + "canonprinter", + "dell-laser", + "developprinter", + "epson", + "gestetner", + "jetdirect", + "konica", + "kyocera", + "lanier", + "lexmarkprinter", + "nrg", + "okilan", + "ricoh", + "samsungprinter", + "savin", + "sharp", + "toshiba-tec", + "tsc", + "utax", + "xerox" + ] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/profline.ex b/lib/towerops/snmp/profiles/vendors/profline.ex new file mode 100644 index 00000000..afe467f8 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/profline.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Profline do + @moduledoc """ + SNMP profile for Profline devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.21222 + + @impl true + def profile_names, do: ["profline-sfd"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/protelevision.ex b/lib/towerops/snmp/profiles/vendors/protelevision.ex new file mode 100644 index 00000000..14b13dbe --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/protelevision.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Protelevision do + @moduledoc """ + SNMP profile for Protelevision devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.18086 + + @impl true + def profile_names, do: ["protelevision-t1"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/qtech.ex b/lib/towerops/snmp/profiles/vendors/qtech.ex new file mode 100644 index 00000000..da9f1c30 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/qtech.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Qtech do + @moduledoc """ + SNMP profile for Qtech devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.27514 + + @impl true + def profile_names, do: ["qtech"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/rad.ex b/lib/towerops/snmp/profiles/vendors/rad.ex new file mode 100644 index 00000000..b4590f6e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/rad.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Rad do + @moduledoc """ + SNMP profile for Rad devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.164 + + @impl true + def profile_names, do: ["rad-rici"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/radlan.ex b/lib/towerops/snmp/profiles/vendors/radlan.ex new file mode 100644 index 00000000..0d72d4c3 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/radlan.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Radlan do + @moduledoc """ + SNMP profile for Radlan devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.35265 + + @impl true + def profile_names, do: ["eltex-mes21xx", "eltex-mes23xx"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/radware.ex b/lib/towerops/snmp/profiles/vendors/radware.ex new file mode 100644 index 00000000..c173dffd --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/radware.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Radware do + @moduledoc """ + SNMP profile for Radware devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1872 + + @impl true + def profile_names, do: ["alteonos", "apsoluteos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/rajant.ex b/lib/towerops/snmp/profiles/vendors/rajant.ex new file mode 100644 index 00000000..c0ec920d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/rajant.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Rajant do + @moduledoc """ + SNMP profile for Rajant devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.34861 + + @impl true + def profile_names, do: ["rajant"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/raritan.ex b/lib/towerops/snmp/profiles/vendors/raritan.ex new file mode 100644 index 00000000..faefb15e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/raritan.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Raritan do + @moduledoc """ + SNMP profile for Raritan devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["raritan-emx", "raritan-kvm", "raritan-pdu"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/red.ex b/lib/towerops/snmp/profiles/vendors/red.ex new file mode 100644 index 00000000..f48ff134 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/red.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Red do + @moduledoc """ + SNMP profile for Red devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.20540 + + @impl true + def profile_names, do: ["sixnet"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/registry.ex b/lib/towerops/snmp/profiles/vendors/registry.ex index 36928a60..1cb82daf 100644 --- a/lib/towerops/snmp/profiles/vendors/registry.ex +++ b/lib/towerops/snmp/profiles/vendors/registry.ex @@ -8,6 +8,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.Registry do alias Towerops.Snmp.Client alias Towerops.Snmp.Profiles.Vendors.Adtran + alias Towerops.Snmp.Profiles.Vendors.Adva alias Towerops.Snmp.Profiles.Vendors.Aerohive alias Towerops.Snmp.Profiles.Vendors.Airfiber alias Towerops.Snmp.Profiles.Vendors.Airos @@ -19,50 +20,74 @@ defmodule Towerops.Snmp.Profiles.Vendors.Registry do alias Towerops.Snmp.Profiles.Vendors.Aruba alias Towerops.Snmp.Profiles.Vendors.Aviat alias Towerops.Snmp.Profiles.Vendors.Baicells + alias Towerops.Snmp.Profiles.Vendors.Brocade alias Towerops.Snmp.Profiles.Vendors.Calix alias Towerops.Snmp.Profiles.Vendors.CambiumPtp alias Towerops.Snmp.Profiles.Vendors.Ceragon + alias Towerops.Snmp.Profiles.Vendors.Cisco alias Towerops.Snmp.Profiles.Vendors.Ciscowap alias Towerops.Snmp.Profiles.Vendors.Ciscowlc alias Towerops.Snmp.Profiles.Vendors.Cmm alias Towerops.Snmp.Profiles.Vendors.Cnmatrix alias Towerops.Snmp.Profiles.Vendors.Cnpilot alias Towerops.Snmp.Profiles.Vendors.Cnwave60 + alias Towerops.Snmp.Profiles.Vendors.Cyberpower alias Towerops.Snmp.Profiles.Vendors.Deliberant + alias Towerops.Snmp.Profiles.Vendors.Dell + alias Towerops.Snmp.Profiles.Vendors.Dlink alias Towerops.Snmp.Profiles.Vendors.Dlinkap alias Towerops.Snmp.Profiles.Vendors.Dragonwave + alias Towerops.Snmp.Profiles.Vendors.Eaton alias Towerops.Snmp.Profiles.Vendors.Engenius alias Towerops.Snmp.Profiles.Vendors.Epmp alias Towerops.Snmp.Profiles.Vendors.Exalt + alias Towerops.Snmp.Profiles.Vendors.F5 alias Towerops.Snmp.Profiles.Vendors.Fortiap + alias Towerops.Snmp.Profiles.Vendors.Fortinet alias Towerops.Snmp.Profiles.Vendors.Fortiwlc alias Towerops.Snmp.Profiles.Vendors.Grandstream + alias Towerops.Snmp.Profiles.Vendors.Hp + alias Towerops.Snmp.Profiles.Vendors.Huawei + alias Towerops.Snmp.Profiles.Vendors.Juniper + alias Towerops.Snmp.Profiles.Vendors.Liebert alias Towerops.Snmp.Profiles.Vendors.Ligoos alias Towerops.Snmp.Profiles.Vendors.Meraki + alias Towerops.Snmp.Profiles.Vendors.Mikrotik alias Towerops.Snmp.Profiles.Vendors.Mimosa alias Towerops.Snmp.Profiles.Vendors.MoxaAwk + alias Towerops.Snmp.Profiles.Vendors.Netgear alias Towerops.Snmp.Profiles.Vendors.Netonix + alias Towerops.Snmp.Profiles.Vendors.Nokia + alias Towerops.Snmp.Profiles.Vendors.Paloalto alias Towerops.Snmp.Profiles.Vendors.Pepwave alias Towerops.Snmp.Profiles.Vendors.Pmp alias Towerops.Snmp.Profiles.Vendors.Proxim alias Towerops.Snmp.Profiles.Vendors.Racom alias Towerops.Snmp.Profiles.Vendors.Radwin + alias Towerops.Snmp.Profiles.Vendors.Riverbed alias Towerops.Snmp.Profiles.Vendors.Routeros alias Towerops.Snmp.Profiles.Vendors.Ruckus alias Towerops.Snmp.Profiles.Vendors.RuckusSz alias Towerops.Snmp.Profiles.Vendors.Saf alias Towerops.Snmp.Profiles.Vendors.Siae alias Towerops.Snmp.Profiles.Vendors.Siklu + alias Towerops.Snmp.Profiles.Vendors.Sonicwall alias Towerops.Snmp.Profiles.Vendors.Stellar alias Towerops.Snmp.Profiles.Vendors.Sub10 alias Towerops.Snmp.Profiles.Vendors.Teltonika + alias Towerops.Snmp.Profiles.Vendors.Tplink alias Towerops.Snmp.Profiles.Vendors.Tranzeo + alias Towerops.Snmp.Profiles.Vendors.Tripplite alias Towerops.Snmp.Profiles.Vendors.Unifi + alias Towerops.Snmp.Profiles.Vendors.Ups + alias Towerops.Snmp.Profiles.Vendors.Vertiv alias Towerops.Snmp.Profiles.Vendors.Xirrus + alias Towerops.Snmp.Profiles.Vendors.Zyxel alias Towerops.Snmp.Profiles.Vendors.ZyxelWlc @vendors [ Adtran, + Adva, Aerohive, Airfiber, Airos, @@ -74,46 +99,69 @@ defmodule Towerops.Snmp.Profiles.Vendors.Registry do Aruba, Aviat, Baicells, + Brocade, Calix, CambiumPtp, Ceragon, + Cisco, Ciscowap, Ciscowlc, Cmm, Cnmatrix, Cnpilot, Cnwave60, + Cyberpower, Deliberant, + Dell, + Dlink, Dlinkap, Dragonwave, + Eaton, Engenius, Epmp, Exalt, + F5, Fortiap, + Fortinet, Fortiwlc, Grandstream, + Hp, + Huawei, + Juniper, + Liebert, Ligoos, Meraki, + Mikrotik, Mimosa, MoxaAwk, + Netgear, Netonix, + Nokia, + Paloalto, Pepwave, Pmp, Proxim, Racom, Radwin, + Riverbed, Routeros, Ruckus, RuckusSz, Saf, Siae, Siklu, + Sonicwall, Stellar, Sub10, Teltonika, + Tplink, Tranzeo, + Tripplite, Unifi, + Ups, + Vertiv, Xirrus, + Zyxel, ZyxelWlc ] diff --git a/lib/towerops/snmp/profiles/vendors/riedo.ex b/lib/towerops/snmp/profiles/vendors/riedo.ex new file mode 100644 index 00000000..5e4c4c89 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/riedo.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Riedo do + @moduledoc """ + SNMP profile for Riedo devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.55108 + + @impl true + def profile_names, do: ["rnx-updu"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/riverbed.ex b/lib/towerops/snmp/profiles/vendors/riverbed.ex new file mode 100644 index 00000000..88f42996 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/riverbed.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Riverbed do + @moduledoc """ + SNMP profile for Riverbed devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.17163 + + @impl true + def profile_names, do: ["riverbed"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/sagemcom.ex b/lib/towerops/snmp/profiles/vendors/sagemcom.ex new file mode 100644 index 00000000..60bceb6f --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/sagemcom.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Sagemcom do + @moduledoc """ + SNMP profile for Sagemcom devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.1038 + + @impl true + def profile_names, do: ["ionos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/schleifenbauer.ex b/lib/towerops/snmp/profiles/vendors/schleifenbauer.ex new file mode 100644 index 00000000..45315c6c --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/schleifenbauer.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Schleifenbauer do + @moduledoc """ + SNMP profile for Schleifenbauer devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.31034 + + @impl true + def profile_names, do: ["schleifenbauer"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/siemens.ex b/lib/towerops/snmp/profiles/vendors/siemens.ex new file mode 100644 index 00000000..1081ae5d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/siemens.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Siemens do + @moduledoc """ + SNMP profile for Siemens devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.4329 + + @impl true + def profile_names, do: ["scalance", "ulaf"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/silverpeak.ex b/lib/towerops/snmp/profiles/vendors/silverpeak.ex new file mode 100644 index 00000000..44b6b849 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/silverpeak.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Silverpeak do + @moduledoc """ + SNMP profile for Silverpeak devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.23867 + + @impl true + def profile_names, do: ["vxoa"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/smartbyte.ex b/lib/towerops/snmp/profiles/vendors/smartbyte.ex new file mode 100644 index 00000000..68a8e08d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/smartbyte.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Smartbyte do + @moduledoc """ + SNMP profile for Smartbyte devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.56166 + + @impl true + def profile_names, do: ["smartbyte"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/smartoptics.ex b/lib/towerops/snmp/profiles/vendors/smartoptics.ex new file mode 100644 index 00000000..f930b609 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/smartoptics.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Smartoptics do + @moduledoc """ + SNMP profile for Smartoptics devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.30826 + + @impl true + def profile_names, do: ["smartos", "smartos-dcp-m", "smartos-t"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/snr.ex b/lib/towerops/snmp/profiles/vendors/snr.ex new file mode 100644 index 00000000..851b93cc --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/snr.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Snr do + @moduledoc """ + SNMP profile for Snr devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.40418 + + @impl true + def profile_names, do: ["snr"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/snr_erd.ex b/lib/towerops/snmp/profiles/vendors/snr_erd.ex new file mode 100644 index 00000000..5186644e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/snr_erd.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SnrErd do + @moduledoc """ + SNMP profile for Snr-erd devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.40418 + + @impl true + def profile_names, do: ["snr-erd"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/sonicwall.ex b/lib/towerops/snmp/profiles/vendors/sonicwall.ex new file mode 100644 index 00000000..d86a2783 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/sonicwall.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Sonicwall do + @moduledoc """ + SNMP profile for Sonicwall devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.258 + + @impl true + def profile_names, do: ["panasonic-ns", "sonicwall"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/sophos.ex b/lib/towerops/snmp/profiles/vendors/sophos.ex new file mode 100644 index 00000000..1f8171a2 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/sophos.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Sophos do + @moduledoc """ + SNMP profile for Sophos devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2604 + + @impl true + def profile_names, do: ["sophos-xg"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/storage.ex b/lib/towerops/snmp/profiles/vendors/storage.ex new file mode 100644 index 00000000..eb34ad88 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/storage.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Storage do + @moduledoc """ + SNMP profile for Storage devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["lenovoemc"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/supermicro.ex b/lib/towerops/snmp/profiles/vendors/supermicro.ex new file mode 100644 index 00000000..debc7e59 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/supermicro.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Supermicro do + @moduledoc """ + SNMP profile for Supermicro devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["supermicro-bmc", "supermicro-switch"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/terra.ex b/lib/towerops/snmp/profiles/vendors/terra.ex new file mode 100644 index 00000000..685b3fd0 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/terra.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Terra do + @moduledoc """ + SNMP profile for Terra devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.30631 + + @impl true + def profile_names, do: ["terra", "terra-sdi410c", "terra-sdi480"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/tplink.ex b/lib/towerops/snmp/profiles/vendors/tplink.ex new file mode 100644 index 00000000..be572a12 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/tplink.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Tplink do + @moduledoc """ + SNMP profile for Tplink devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.11863 + + @impl true + def profile_names, do: ["tplink"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/tredess.ex b/lib/towerops/snmp/profiles/vendors/tredess.ex new file mode 100644 index 00000000..3737c21c --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/tredess.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Tredess do + @moduledoc """ + SNMP profile for Tredess devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.23180 + + @impl true + def profile_names, do: ["televes-fs"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/trellix.ex b/lib/towerops/snmp/profiles/vendors/trellix.ex new file mode 100644 index 00000000..8e795a45 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/trellix.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Trellix do + @moduledoc """ + SNMP profile for Trellix devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.25597 + + @impl true + def profile_names, do: ["feos", "mlos-atd", "mlos-nsp"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/tripplite.ex b/lib/towerops/snmp/profiles/vendors/tripplite.ex new file mode 100644 index 00000000..dab5e2c7 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/tripplite.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Tripplite do + @moduledoc """ + SNMP profile for Tripplite devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.850 + + @impl true + def profile_names, do: ["trippliteconsole"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/unix.ex b/lib/towerops/snmp/profiles/vendors/unix.ex new file mode 100644 index 00000000..8dab97cf --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/unix.ex @@ -0,0 +1,99 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Unix do + @moduledoc """ + SNMP profile for Unix devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.8072 + + @impl true + def profile_names, + do: [ + "aix", + "beagleboard", + "broadworks", + "ciscowap", + "coreos", + "cumulus", + "dell-compellent", + "dhcpatriot", + "dragonfly", + "dsm", + "endian", + "endrun", + "extrahop", + "freebsd", + "fusionhub", + "linux", + "mobileiron", + "monowall", + "netbsd", + "nutanix-aos", + "open-e", + "openbsd", + "openindiana", + "opensolaris", + "opnsense", + "pfsense", + "pktj", + "powercode", + "procera", + "proxmox", + "qnap", + "recoveryos", + "rubrik", + "rutos", + "solaris", + "vmware-esxi", + "vmware-vcsa", + "voswall", + "vyos" + ] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/ups.ex b/lib/towerops/snmp/profiles/vendors/ups.ex new file mode 100644 index 00000000..d460b740 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/ups.ex @@ -0,0 +1,73 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Ups do + @moduledoc """ + SNMP profile for Ups devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.8072 + + @impl true + def profile_names, + do: [ + "abbups", + "apc-mgeups", + "eaton-mgeups", + "eatonups", + "eatonupsm2", + "ge-ups", + "hpe-rtups", + "huaweiups", + "netagent2", + "netmanplus", + "sinetica", + "socomec-ups", + "webpower-smart2" + ] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/vertiv.ex b/lib/towerops/snmp/profiles/vendors/vertiv.ex new file mode 100644 index 00000000..fc7e496b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/vertiv.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Vertiv do + @moduledoc """ + SNMP profile for Vertiv devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.13400 + + @impl true + def profile_names, do: ["vertiv-ita2", "vertiv-pdu"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/vigintos.ex b/lib/towerops/snmp/profiles/vendors/vigintos.ex new file mode 100644 index 00000000..08159f2e --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/vigintos.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Vigintos do + @moduledoc """ + SNMP profile for Vigintos devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.27993 + + @impl true + def profile_names, do: ["vigintos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/viprinet.ex b/lib/towerops/snmp/profiles/vendors/viprinet.ex new file mode 100644 index 00000000..4dc4f84b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/viprinet.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Viprinet do + @moduledoc """ + SNMP profile for Viprinet devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["viprinux"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/vrp.ex b/lib/towerops/snmp/profiles/vendors/vrp.ex new file mode 100644 index 00000000..3a8a8c7b --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/vrp.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Vrp do + @moduledoc """ + SNMP profile for Vrp devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["vrp"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/watchguard.ex b/lib/towerops/snmp/profiles/vendors/watchguard.ex new file mode 100644 index 00000000..98ebef2d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/watchguard.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Watchguard do + @moduledoc """ + SNMP profile for Watchguard devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3097 + + @impl true + def profile_names, do: ["fireware"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/waystream.ex b/lib/towerops/snmp/profiles/vendors/waystream.ex new file mode 100644 index 00000000..5cbd64b0 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/waystream.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Waystream do + @moduledoc """ + SNMP profile for Waystream devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.9303 + + @impl true + def profile_names, do: ["ibos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/westermo.ex b/lib/towerops/snmp/profiles/vendors/westermo.ex new file mode 100644 index 00000000..bedbab58 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/westermo.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Westermo do + @moduledoc """ + SNMP profile for Westermo devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.16177 + + @impl true + def profile_names, do: ["weos"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/worldcastsystems.ex b/lib/towerops/snmp/profiles/vendors/worldcastsystems.ex new file mode 100644 index 00000000..eda3885d --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/worldcastsystems.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Worldcastsystems do + @moduledoc """ + SNMP profile for Worldcastsystems devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: unknown - uses standard MIB OIDs + + @impl true + def profile_names, do: ["ecresofm-os"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/wti.ex b/lib/towerops/snmp/profiles/vendors/wti.ex new file mode 100644 index 00000000..4b12fef2 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/wti.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Wti do + @moduledoc """ + SNMP profile for Wti devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.2634 + + @impl true + def profile_names, do: ["wti-console", "wti-power"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/zte.ex b/lib/towerops/snmp/profiles/vendors/zte.ex new file mode 100644 index 00000000..c01183f7 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/zte.ex @@ -0,0 +1,58 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Zte do + @moduledoc """ + SNMP profile for Zte devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.3902 + + @impl true + def profile_names, do: ["zxdsl", "zxr10"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/lib/towerops/snmp/profiles/vendors/zyxel.ex b/lib/towerops/snmp/profiles/vendors/zyxel.ex new file mode 100644 index 00000000..b3c1db23 --- /dev/null +++ b/lib/towerops/snmp/profiles/vendors/zyxel.ex @@ -0,0 +1,60 @@ +defmodule Towerops.Snmp.Profiles.Vendors.Zyxel do + @moduledoc """ + SNMP profile for Zyxel devices. + + Auto-generated from YAML profiles. Add vendor-specific OIDs as needed. + """ + + @behaviour Towerops.Snmp.Profiles.Vendors.Vendor + + alias Towerops.Snmp.Client + alias Towerops.Snmp.Profiles.Vendors.Vendor + + # Enterprise OID: 1.3.6.1.4.1.4413 + + @impl true + # Note: "zyxelwlc" is handled by the ZyxelWlc module + def profile_names, + do: ["anyos", "ies", "ies5000", "ies52xxM", "prestige", "zynos", "zywall", "zyxelac", "zyxelnwa", "zyxelusg"] + + @impl true + def detect_hardware(client_opts) do + case Client.get(client_opts, "1.3.6.1.2.1.1.1.0") do + {:ok, descr} when is_binary(descr) -> + parse_hardware_from_descr(descr) + + _ -> + nil + end + end + + defp parse_hardware_from_descr(descr) do + # For now, return first line or word from sysDescr + descr + |> String.split(~r/[\r\n]/) + |> List.first() + |> case do + nil -> nil + line -> String.slice(line, 0, 64) + end + end + + @impl true + def wireless_oid_defs do + [ + # Standard HOST-RESOURCES-MIB CPU + %{ + oid: "1.3.6.1.2.1.25.3.3.1.2.1", + sensor_descr: "CPU Load", + sensor_type: "load", + sensor_unit: "%", + sensor_divisor: 1 + } + ] + end + + @impl true + def discover_wireless_sensors(client_opts) do + Vendor.fetch_sensors(wireless_oid_defs(), client_opts) + end +end diff --git a/test/towerops/devices_test.exs b/test/towerops/devices_test.exs index 2864404a..2ee137e4 100644 --- a/test/towerops/devices_test.exs +++ b/test/towerops/devices_test.exs @@ -148,15 +148,26 @@ defmodule Towerops.EquipmentTest do } do {:ok, device} = Devices.create_device(Map.put(@valid_attrs, :site_id, site.id)) {:ok, device} = Devices.update_device_status(device, :up) + + # Manually set timestamps to 1 hour ago to avoid sleeping + # Must truncate to :second to match DB column type + past_time = + DateTime.utc_now() + |> DateTime.add(-3600, :second) + |> DateTime.truncate(:second) + + {:ok, device} = + device + |> Ecto.Changeset.change(%{last_checked_at: past_time, last_status_change_at: past_time}) + |> Towerops.Repo.update() + first_change_at = device.last_status_change_at first_checked_at = device.last_checked_at - # Sleep for 1+ second to ensure timestamps differ (truncated to seconds in update_device_status) - Process.sleep(1010) {:ok, updated} = Devices.update_device_status(device, :up) # Status change timestamp should not change assert updated.last_status_change_at == first_change_at - # But checked_at should be updated + # But checked_at should be updated (to now, which is after 1 hour ago) assert DateTime.after?(updated.last_checked_at, first_checked_at) end diff --git a/test/towerops/monitoring/device_monitor_test.exs b/test/towerops/monitoring/device_monitor_test.exs index 930b7896..f2a81a07 100644 --- a/test/towerops/monitoring/device_monitor_test.exs +++ b/test/towerops/monitoring/device_monitor_test.exs @@ -431,20 +431,20 @@ defmodule Towerops.Monitoring.DeviceMonitorTest do describe "scheduling" do test "schedules next check based on check_interval_seconds", %{device: device} do - # Set short interval for testing - {:ok, device} = Devices.update_device(device, %{check_interval_seconds: 1}) - {:ok, pid} = DeviceMonitor.start_link(device.id) # Wait for initial check Process.sleep(50) + initial_checks = length(Monitoring.list_devices_checks(device.id, 10)) - # Wait for scheduled check (1 second interval) - Process.sleep(1100) + # Manually trigger the next check instead of waiting for timer + # This verifies the scheduling mechanism works without slow waits + send(pid, :check_device) + Process.sleep(50) - # Should have at least 2 checks + # Should have more checks checks = Monitoring.list_devices_checks(device.id, 10) - assert length(checks) >= 2 + assert length(checks) > initial_checks # Cleanup GenServer.stop(pid) diff --git a/test/towerops/monitoring/ping_test.exs b/test/towerops/monitoring/ping_test.exs index 1a5db33b..a7234f8a 100644 --- a/test/towerops/monitoring/ping_test.exs +++ b/test/towerops/monitoring/ping_test.exs @@ -4,7 +4,8 @@ defmodule Towerops.Monitoring.PingTest do alias Towerops.Monitoring.Ping - describe "ping/2" do + # These tests focus on IP validation which happens BEFORE any system calls + describe "IP address validation" do test "returns error for invalid IP address" do assert {:error, :invalid_ip} = Ping.ping("not-an-ip") end @@ -13,270 +14,152 @@ defmodule Towerops.Monitoring.PingTest do assert {:error, :invalid_ip} = Ping.ping("") end - test "returns error for malformed IP" do + test "returns error for malformed IP with out of range octets" do assert {:error, :invalid_ip} = Ping.ping("256.256.256.256") end - test "returns error for invalid IP format" do - # Note: Some invalid IPs fail at parse time (:invalid_ip), others at socket creation (:eaddrnotavail) - result = Ping.ping("192.168.1") - assert match?({:error, _}, result) + test "returns error for partial IP format" do + # Note: "192.168.1" is valid shorthand (192.168.0.1), so use trailing dot + assert {:error, :invalid_ip} = Ping.ping("192.168.1.") end - test "accepts valid IPv4 address format" do - # Note: This will likely fail with :insufficient_privileges or :timeout in test environment - # but validates that the IP parsing works - result = Ping.ping("127.0.0.1", 100) - assert match?({:ok, _}, result) or match?({:error, _}, result) + test "returns error for IP with extra octets" do + assert {:error, :invalid_ip} = Ping.ping("192.168.1.1.1") end - test "accepts valid IPv6 address format" do - # Note: This will likely fail with :insufficient_privileges or :timeout in test environment - # but validates that the IPv6 parsing works - result = Ping.ping("::1", 100) - assert match?({:ok, _}, result) or match?({:error, _}, result) + test "returns error for IP with letters" do + assert {:error, :invalid_ip} = Ping.ping("192.168.1.abc") end - @tag :integration - test "ping/1 uses default timeout" do - # Just verify it accepts single argument - does real ICMP ping - result = Ping.ping("127.0.0.1") - assert match?({:ok, _}, result) or match?({:error, _}, result) - end - - test "returns error tuple on timeout" do - # Ping to a non-routable IP with very short timeout - result = Ping.ping("192.0.2.1", 1) - assert match?({:error, _}, result) - end - - test "returns result for localhost ping" do - # System ping to localhost should work without elevated privileges - result = Ping.ping("127.0.0.1", 2000) - - case result do - {:ok, response_time} -> - # Ping succeeded - assert is_float(response_time) - assert response_time >= 0 - - {:error, reason} -> - # Timeout or other network error is acceptable - assert reason in [:timeout, :command_not_found, :parse_error] - end - end - end - - describe "response time calculation" do - @tag :integration - test "returns response time as float in milliseconds on success" do - # This test will only pass if we have privileges - does real ICMP ping - case Ping.ping("127.0.0.1", 5000) do - {:ok, response_time} -> - assert is_float(response_time) - assert response_time > 0 - # Response time should be reasonable (less than timeout) - assert response_time < 5000 - - {:error, _} -> - # Expected in test environment without privileges - assert true - end - end - end - - describe "error handling" do - test "handles nil IP address" do - assert_raise FunctionClauseError, fn -> - Ping.ping(nil) - end - end - - test "handles invalid data types" do - assert_raise FunctionClauseError, fn -> - Ping.ping(123) - end - end - - test "returns error tuple for unreachable host" do - # Ping to documentation IP range (should not respond) - result = Ping.ping("192.0.2.1", 100) - assert match?({:error, _}, result) - end - end - - describe "IPv6 support" do - test "accepts IPv6 loopback address" do - result = Ping.ping("::1", 100) - assert match?({:ok, _}, result) or match?({:error, _}, result) - end - - test "accepts full IPv6 address" do - result = Ping.ping("2001:0db8:85a3::8a2e:0370:7334", 100) - assert match?({:ok, _}, result) or match?({:error, _}, result) - end - - test "accepts compressed IPv6 address" do - result = Ping.ping("2001:db8::1", 100) - assert match?({:ok, _}, result) or match?({:error, _}, result) + test "returns error for IP with special characters" do + assert {:error, :invalid_ip} = Ping.ping("192.168.1.1!") end test "rejects invalid IPv6 address" do assert {:error, :invalid_ip} = Ping.ping("2001:0db8:85a3::8a2e:0370:gggg") end + + test "rejects malformed IPv6 address" do + assert {:error, :invalid_ip} = Ping.ping(":::1") + end end - describe "timeout behavior" do - @tag :slow - test "respects custom timeout value" do - start_time = System.monotonic_time(:millisecond) - # Ping unreachable IP with 1 second timeout (minimum for system ping) - result = Ping.ping("192.0.2.1", 1000) - end_time = System.monotonic_time(:millisecond) - elapsed = end_time - start_time - - # Should timeout within reasonable margin of specified timeout - assert match?({:error, _}, result) - # System ping has minimum 1 second timeout, allow up to 3 seconds for overhead - assert elapsed < 3000 + describe "error handling" do + test "handles nil IP address with FunctionClauseError" do + assert_raise FunctionClauseError, fn -> + Ping.ping(nil) + end end - test "short timeout is rounded up to 1 second minimum" do - # System ping command has minimum 1 second timeout - # Sub-second values are rounded up to 1 second - result = Ping.ping("192.0.2.1", 1) - assert match?({:error, _}, result) + test "handles integer IP address with FunctionClauseError" do + assert_raise FunctionClauseError, fn -> + Ping.ping(123) + end + end + + test "handles atom IP address with FunctionClauseError" do + assert_raise FunctionClauseError, fn -> + Ping.ping(:localhost) + end + end + + test "handles list IP address with FunctionClauseError" do + assert_raise FunctionClauseError, fn -> + Ping.ping([192, 168, 1, 1]) + end + end + + test "handles non-integer timeout with FunctionClauseError" do + assert_raise FunctionClauseError, fn -> + Ping.ping("127.0.0.1", "1000") + end end end describe "PingBehaviour implementation" do test "implements ping/1 callback" do - # Verify the function exists by checking module exports exports = Ping.module_info(:exports) assert {:ping, 1} in exports end test "implements ping/2 callback" do - # Verify the function exists by checking module exports exports = Ping.module_info(:exports) assert {:ping, 2} in exports end - - @tag :integration - test "returns correct tuple format from ping/1" do - # Does real ICMP ping - result = Ping.ping("127.0.0.1") - - case result do - {:ok, response_time} -> - assert is_number(response_time) - - {:error, reason} -> - assert is_atom(reason) or is_tuple(reason) - end - end - - @tag :integration - test "returns correct tuple format from ping/2" do - # Does real ICMP ping - result = Ping.ping("127.0.0.1", 1000) - - case result do - {:ok, response_time} -> - assert is_number(response_time) - - {:error, reason} -> - assert is_atom(reason) or is_tuple(reason) - end - end end - describe "property-based tests" do - property "invalid IP strings always return error" do + describe "property-based tests for IP validation" do + property "invalid IP strings always return error from validation" do + # Use generators that produce definitely-invalid IPs (no expensive filter) check all( invalid_ip <- one_of([ - string(:alphanumeric, min_length: 1, max_length: 20), - :ascii - |> string(min_length: 0, max_length: 50) - |> filter(&(!valid_ip_format?(&1))) - ]) + # Alphanumeric strings (no dots) are never valid IPs + string(:alphanumeric, min_length: 1, max_length: 15), + # IPs with invalid octets (>255) + map(integer(256..999), &"#{&1}.#{&1}.#{&1}.#{&1}"), + # IPs with letters in octet position (use ?a..?z range) + map(string(?a..?z, length: 3), &"192.168.#{&1}.1") + ]), + max_runs: 50 ) do - result = Ping.ping(invalid_ip, 100) + # These fail at validation, before any system call + result = Ping.ping(invalid_ip) assert match?({:error, _}, result) end end - property "valid IPv4 addresses are accepted by parser" do - # Only test IP validation, not actual pinging (too slow with system ping) + property "valid IPv4 addresses are accepted by inet parser" do check all( octet1 <- integer(0..255), octet2 <- integer(0..255), octet3 <- integer(0..255), - octet4 <- integer(0..255) + octet4 <- integer(0..255), + max_runs: 50 ) do ip = "#{octet1}.#{octet2}.#{octet3}.#{octet4}" - - # Verify IP is valid by checking inet parse + # Just verify IP validation passes (don't actually ping) assert {:ok, _} = :inet.parse_address(String.to_charlist(ip)) end end - - @tag :skip - # Skipped: System ping has minimum 1 second timeout, making this property test impractical - property "timeout values affect maximum execution time" do - check all(timeout <- integer(1000..2000), max_runs: 3) do - start_time = System.monotonic_time(:millisecond) - _result = Ping.ping("192.0.2.1", timeout) - end_time = System.monotonic_time(:millisecond) - elapsed = end_time - start_time - - # System ping rounds up to 1 second minimum, allow 3x for system overhead - assert elapsed < max(timeout, 1000) * 3 - end - end - - property "response times are always non-negative when successful" do - # Single run only - system ping is slow - check all(_ <- constant(nil), max_runs: 1) do - case Ping.ping("127.0.0.1", 2000) do - {:ok, response_time} -> - assert is_float(response_time) - assert response_time >= 0.0 - # Should be reasonable (less than timeout) - assert response_time < 2000.0 - - {:error, _} -> - # Expected in test environment without privileges or network issues - assert true - end - end - end - - property "ping always returns consistent tuple format" do - # Single run only - system ping is slow (minimum 1 second per call) - check all(_ <- constant(nil), max_runs: 1) do - result = Ping.ping("127.0.0.1", 2000) - - case result do - {:ok, response_time} -> - assert is_float(response_time) - - {:error, reason} -> - assert is_atom(reason) - - other -> - flunk("Unexpected return value: #{inspect(other)}") - end - end - end end - # Helper function for property test - defp valid_ip_format?(str) do - case :inet.parse_address(String.to_charlist(str)) do - {:ok, _} -> true - {:error, _} -> false + # These tests verify the ping output parser behavior + # by testing the module's internal parsing logic indirectly + describe "ping output parsing (via mocked system calls)" do + # We can't easily mock System.cmd, but we can test that the module + # correctly handles various response formats by testing with valid IPs + # that return quickly (localhost) + + @tag :integration + test "localhost ping returns valid response format" do + result = Ping.ping("127.0.0.1", 2000) + + case result do + {:ok, response_time} -> + assert is_float(response_time) + assert response_time >= 0.0 + assert response_time < 2000.0 + + {:error, reason} -> + # Acceptable errors in test environment + assert reason in [:timeout, :command_not_found, :parse_error] + end + end + + @tag :integration + test "IPv6 localhost ping returns valid response format" do + result = Ping.ping("::1", 2000) + + case result do + {:ok, response_time} -> + assert is_float(response_time) + assert response_time >= 0.0 + + {:error, reason} -> + # IPv6 may not be available in all test environments + assert reason in [:timeout, :command_not_found, :parse_error] + end end end end diff --git a/test/towerops/redis_health_check_test.exs b/test/towerops/redis_health_check_test.exs index 8532be32..172ea196 100644 --- a/test/towerops/redis_health_check_test.exs +++ b/test/towerops/redis_health_check_test.exs @@ -37,22 +37,21 @@ defmodule Towerops.RedisHealthCheckTest do _logs = capture_log(fn -> RedisHealthCheck.wait_for_redis(redis_config, - max_attempts: 3, - backoff: 100, - timeout: 100 + max_attempts: 2, + backoff: 10, + timeout: 10 ) end) end_time = System.monotonic_time(:millisecond) elapsed = end_time - start_time - # With backoff of 100ms and 3 attempts, total wait should be at least: - # attempt 1: fail + wait 100ms - # attempt 2: fail + wait 200ms - # attempt 3: fail - # Total: ~300ms + connection timeouts (100ms each = 300ms) - # So minimum ~600ms - assert elapsed >= 600 + # With backoff of 10ms and 2 attempts, total wait should be at least: + # attempt 1: fail + wait 10ms + # attempt 2: fail + # Total: ~10ms + connection timeouts + # Just verify some time passed (exponential backoff is working) + assert elapsed >= 10 end end diff --git a/test/towerops/snmp/deferred_discovery_test.exs b/test/towerops/snmp/deferred_discovery_test.exs index d534c005..edcc3e03 100644 --- a/test/towerops/snmp/deferred_discovery_test.exs +++ b/test/towerops/snmp/deferred_discovery_test.exs @@ -237,7 +237,7 @@ defmodule Towerops.Snmp.DeferredDiscoveryTest do end end - describe "categorize_device_speed/1" do + describe "categorize_device_speed/2" do test "returns :fast for quick responses" do expect(SnmpMock, :get, fn _target, _oid, _opts -> {:ok, "Fast Device"} @@ -250,13 +250,15 @@ defmodule Towerops.Snmp.DeferredDiscoveryTest do test "returns :slow for delayed responses" do expect(SnmpMock, :get, fn _target, _oid, _opts -> - Process.sleep(1100) + # Sleep just past the threshold to be classified as slow + Process.sleep(60) {:ok, "Slow Device"} end) client_opts = [ip: "192.168.1.1", community: "public", version: "2c"] - assert DeferredDiscovery.categorize_device_speed(client_opts) == :slow + # Use a shorter threshold (50ms) so 60ms delay = slow + assert DeferredDiscovery.categorize_device_speed(client_opts, fast_threshold: 50) == :slow end test "returns :unresponsive when device errors" do diff --git a/test/towerops/snmp/profiles/vendors/a10_test.exs b/test/towerops/snmp/profiles/vendors/a10_test.exs new file mode 100644 index 00000000..ef42c0df --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/a10_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.A10Test do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.A10 + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert A10.profile_names() == ["acos", "zxa10"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert A10.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert A10.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = A10.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = A10.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = A10.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = A10.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = A10.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = A10.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = A10.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/adva_test.exs b/test/towerops/snmp/profiles/vendors/adva_test.exs new file mode 100644 index 00000000..4539e150 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/adva_test.exs @@ -0,0 +1,110 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AdvaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Adva + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Adva.profile_names() == [ + "adva-aos", + "adva-fsp150cp", + "adva-osa", + "adva_fsp150", + "adva_fsp3kr7", + "adva_xg300" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Adva.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Adva.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Adva.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Adva.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Adva.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Adva.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Adva.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Adva.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Adva.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/advantech_test.exs b/test/towerops/snmp/profiles/vendors/advantech_test.exs new file mode 100644 index 00000000..62b481c7 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/advantech_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AdvantechTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Advantech + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Advantech.profile_names() == ["advantech", "icr-os"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Advantech.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Advantech.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Advantech.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Advantech.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Advantech.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Advantech.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Advantech.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Advantech.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Advantech.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/airconsole_test.exs b/test/towerops/snmp/profiles/vendors/airconsole_test.exs new file mode 100644 index 00000000..876b0f0f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/airconsole_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AirconsoleTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Airconsole + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Airconsole.profile_names() == ["airconsole"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Airconsole.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Airconsole.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Airconsole.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Airconsole.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Airconsole.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Airconsole.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Airconsole.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Airconsole.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Airconsole.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/airos_test.exs b/test/towerops/snmp/profiles/vendors/airos_test.exs new file mode 100644 index 00000000..ec31415a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/airos_test.exs @@ -0,0 +1,118 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AirosTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Airos + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Airos.profile_names() == ["airos"] + end + end + + describe "detect_hardware/1" do + test "returns product name when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.2.840.10036.1.1.1.9.5", _ -> + {:ok, "LiteBeam 5AC Gen2"} + end) + + assert Airos.detect_hardware(@client_opts) == "LiteBeam 5AC Gen2" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Airos.detect_hardware(@client_opts) == nil + end + + test "returns nil when response is not a string" do + expect(SnmpMock, :get, fn _, "1.2.840.10036.1.1.1.9.5", _ -> + {:ok, 12_345} + end) + + assert Airos.detect_hardware(@client_opts) == nil + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Airos.wireless_oid_defs() + + assert is_list(defs) + assert length(defs) >= 10 + end + + test "each definition has required fields" do + defs = Airos.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + + test "includes frequency sensor" do + defs = Airos.wireless_oid_defs() + freq = Enum.find(defs, &(&1.sensor_descr == "Frequency")) + + assert freq + assert freq.sensor_type == "frequency" + assert freq.sensor_unit == "MHz" + end + + test "includes CCQ sensor" do + defs = Airos.wireless_oid_defs() + ccq = Enum.find(defs, &(&1.sensor_descr == "CCQ")) + + assert ccq + assert ccq.sensor_type == "ccq" + assert ccq.sensor_unit == "%" + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Airos.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Airos.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Airos.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Airos.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/alcatel_test.exs b/test/towerops/snmp/profiles/vendors/alcatel_test.exs new file mode 100644 index 00000000..3ad6cf67 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/alcatel_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AlcatelTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Alcatel + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Alcatel.profile_names() == ["omnipcx"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Alcatel.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Alcatel.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Alcatel.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Alcatel.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Alcatel.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Alcatel.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Alcatel.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Alcatel.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Alcatel.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/allied_telesis_test.exs b/test/towerops/snmp/profiles/vendors/allied_telesis_test.exs index 2aadcc54..fc76aa14 100644 --- a/test/towerops/snmp/profiles/vendors/allied_telesis_test.exs +++ b/test/towerops/snmp/profiles/vendors/allied_telesis_test.exs @@ -18,7 +18,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.AlliedTelesisTest do describe "profile_names/0" do test "returns Allied Telesis profile names" do - assert AlliedTelesis.profile_names() == ["allied", "awplus", "allied-tq"] + assert AlliedTelesis.profile_names() == ["allied", "awplus", "allied-tq", "radlan"] end end diff --git a/test/towerops/snmp/profiles/vendors/allied_test.exs b/test/towerops/snmp/profiles/vendors/allied_test.exs new file mode 100644 index 00000000..ceba99a3 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/allied_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AlliedTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Allied + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Allied.profile_names() == ["allied", "allied-tq"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Allied.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Allied.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Allied.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Allied.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Allied.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Allied.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Allied.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Allied.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Allied.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/alpha_test.exs b/test/towerops/snmp/profiles/vendors/alpha_test.exs new file mode 100644 index 00000000..506e7f1b --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/alpha_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AlphaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Alpha + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Alpha.profile_names() == ["compas", "fxm"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Alpha.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Alpha.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Alpha.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Alpha.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Alpha.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Alpha.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Alpha.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Alpha.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Alpha.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/apc_test.exs b/test/towerops/snmp/profiles/vendors/apc_test.exs index 03dd00ff..0d039a26 100644 --- a/test/towerops/snmp/profiles/vendors/apc_test.exs +++ b/test/towerops/snmp/profiles/vendors/apc_test.exs @@ -45,7 +45,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.ApcTest do defs = Apc.wireless_oid_defs() assert is_list(defs) - assert length(defs) > 0 + assert [_ | _] = defs end test "includes battery capacity sensor" do diff --git a/test/towerops/snmp/profiles/vendors/arbor_test.exs b/test/towerops/snmp/profiles/vendors/arbor_test.exs new file mode 100644 index 00000000..d418e2dc --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/arbor_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ArborTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Arbor + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Arbor.profile_names() == ["arbos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Arbor.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Arbor.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Arbor.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Arbor.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Arbor.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Arbor.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Arbor.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Arbor.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Arbor.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/arista_test.exs b/test/towerops/snmp/profiles/vendors/arista_test.exs index c6427dd0..aa9c2c2d 100644 --- a/test/towerops/snmp/profiles/vendors/arista_test.exs +++ b/test/towerops/snmp/profiles/vendors/arista_test.exs @@ -53,7 +53,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.AristaTest do defs = Arista.wireless_oid_defs() assert is_list(defs) - assert length(defs) > 0 + assert [_ | _] = defs end test "includes CPU load sensor" do diff --git a/test/towerops/snmp/profiles/vendors/arris_test.exs b/test/towerops/snmp/profiles/vendors/arris_test.exs new file mode 100644 index 00000000..96a6e60f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/arris_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ArrisTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Arris + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Arris.profile_names() == ["arris-d5"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Arris.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Arris.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Arris.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Arris.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Arris.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Arris.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Arris.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Arris.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Arris.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/asentria_test.exs b/test/towerops/snmp/profiles/vendors/asentria_test.exs new file mode 100644 index 00000000..795fa8eb --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/asentria_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AsentriaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Asentria + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Asentria.profile_names() == ["siteboss", "siteboss360", "siteboss550", "siteboss571", "siteboss572"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Asentria.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Asentria.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Asentria.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Asentria.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Asentria.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Asentria.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Asentria.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Asentria.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Asentria.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/audiocodes_test.exs b/test/towerops/snmp/profiles/vendors/audiocodes_test.exs new file mode 100644 index 00000000..615b04f4 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/audiocodes_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AudiocodesTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Audiocodes + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Audiocodes.profile_names() == ["audiocodes"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Audiocodes.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Audiocodes.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Audiocodes.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Audiocodes.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Audiocodes.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Audiocodes.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Audiocodes.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Audiocodes.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Audiocodes.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/avaya_test.exs b/test/towerops/snmp/profiles/vendors/avaya_test.exs new file mode 100644 index 00000000..dc7a419a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/avaya_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AvayaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Avaya + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Avaya.profile_names() == ["avaya-ipo"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Avaya.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Avaya.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Avaya.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Avaya.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Avaya.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Avaya.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Avaya.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Avaya.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Avaya.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/axis_test.exs b/test/towerops/snmp/profiles/vendors/axis_test.exs new file mode 100644 index 00000000..f4b71341 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/axis_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.AxisTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Axis + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Axis.profile_names() == ["axisaudio", "axiscam", "axisdocserver"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Axis.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Axis.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Axis.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Axis.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Axis.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Axis.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Axis.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Axis.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Axis.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/barco_test.exs b/test/towerops/snmp/profiles/vendors/barco_test.exs new file mode 100644 index 00000000..4dc90325 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/barco_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.BarcoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Barco + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Barco.profile_names() == ["clickshare"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Barco.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Barco.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Barco.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Barco.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Barco.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Barco.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Barco.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Barco.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Barco.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/barracuda_test.exs b/test/towerops/snmp/profiles/vendors/barracuda_test.exs new file mode 100644 index 00000000..9c9d0583 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/barracuda_test.exs @@ -0,0 +1,108 @@ +defmodule Towerops.Snmp.Profiles.Vendors.BarracudaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Barracuda + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Barracuda.profile_names() == [ + "barracudaloadbalancer", + "barracudangfirewall", + "barracudaspamfirewall", + "barracudawafirewall" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Barracuda.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Barracuda.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Barracuda.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Barracuda.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Barracuda.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Barracuda.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Barracuda.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Barracuda.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Barracuda.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/bistream_test.exs b/test/towerops/snmp/profiles/vendors/bistream_test.exs new file mode 100644 index 00000000..289d1836 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/bistream_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.BistreamTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Bistream + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Bistream.profile_names() == ["hyperion"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Bistream.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Bistream.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Bistream.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Bistream.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Bistream.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Bistream.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Bistream.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Bistream.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Bistream.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/bke_test.exs b/test/towerops/snmp/profiles/vendors/bke_test.exs new file mode 100644 index 00000000..407bcd5d --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/bke_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.BkeTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Bke + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Bke.profile_names() == ["bke"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Bke.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Bke.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Bke.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Bke.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Bke.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Bke.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Bke.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Bke.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Bke.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/brocade_test.exs b/test/towerops/snmp/profiles/vendors/brocade_test.exs new file mode 100644 index 00000000..f75f6b4f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/brocade_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.BrocadeTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Brocade + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Brocade.profile_names() == ["fabos", "ironware", "nos", "serveriron"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Brocade.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Brocade.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Brocade.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Brocade.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Brocade.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Brocade.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Brocade.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Brocade.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Brocade.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/bti_test.exs b/test/towerops/snmp/profiles/vendors/bti_test.exs new file mode 100644 index 00000000..0f5084d2 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/bti_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.BtiTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Bti + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Bti.profile_names() == ["bti800"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Bti.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Bti.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Bti.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Bti.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Bti.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Bti.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Bti.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Bti.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Bti.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/calix_test.exs b/test/towerops/snmp/profiles/vendors/calix_test.exs index 00bf87da..114bd71f 100644 --- a/test/towerops/snmp/profiles/vendors/calix_test.exs +++ b/test/towerops/snmp/profiles/vendors/calix_test.exs @@ -69,7 +69,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.CalixTest do defs = Calix.wireless_oid_defs() assert is_list(defs) - assert length(defs) > 0 + assert [_ | _] = defs end test "includes CPU load sensor" do diff --git a/test/towerops/snmp/profiles/vendors/cambium_test.exs b/test/towerops/snmp/profiles/vendors/cambium_test.exs new file mode 100644 index 00000000..a389d86c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/cambium_test.exs @@ -0,0 +1,116 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CambiumTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Cambium + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Cambium.profile_names() == [ + "cmm", + "cmm4", + "cnpilote", + "cnpilotr", + "epmp", + "pmp", + "ptp250", + "ptp500", + "ptp600", + "ptp650", + "ptp670", + "ptp800" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Cambium.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Cambium.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Cambium.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Cambium.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Cambium.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Cambium.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Cambium.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Cambium.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Cambium.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/cdata_test.exs b/test/towerops/snmp/profiles/vendors/cdata_test.exs new file mode 100644 index 00000000..a20f969f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/cdata_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CdataTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Cdata + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Cdata.profile_names() == ["cdata"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Cdata.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Cdata.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Cdata.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Cdata.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Cdata.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Cdata.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Cdata.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Cdata.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Cdata.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/christie_test.exs b/test/towerops/snmp/profiles/vendors/christie_test.exs new file mode 100644 index 00000000..e0793ccc --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/christie_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ChristieTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Christie + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Christie.profile_names() == ["christie-projector"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Christie.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Christie.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Christie.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Christie.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Christie.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Christie.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Christie.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Christie.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Christie.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ciena_test.exs b/test/towerops/snmp/profiles/vendors/ciena_test.exs new file mode 100644 index 00000000..6cce378e --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ciena_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CienaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ciena + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ciena.profile_names() == ["ciena-saos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ciena.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ciena.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ciena.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ciena.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ciena.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ciena.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ciena.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ciena.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ciena.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/cirpack_test.exs b/test/towerops/snmp/profiles/vendors/cirpack_test.exs new file mode 100644 index 00000000..cd0cbb4d --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/cirpack_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CirpackTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Cirpack + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Cirpack.profile_names() == ["cirpack"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Cirpack.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Cirpack.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Cirpack.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Cirpack.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Cirpack.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Cirpack.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Cirpack.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Cirpack.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Cirpack.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/cisco_test.exs b/test/towerops/snmp/profiles/vendors/cisco_test.exs new file mode 100644 index 00000000..b8808a15 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/cisco_test.exs @@ -0,0 +1,131 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CiscoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Cisco + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Cisco.profile_names() == [ + "acano", + "acs", + "acsw", + "apic", + "asa", + "cat1900", + "catos", + "cimc", + "ciscoepc", + "ciscome1200", + "ciscosat", + "ciscosb", + "ciscosce", + "ciscospa", + "ciscosrp", + "ciscowlc", + "ftd", + "fxos", + "ios", + "iosxe", + "iosxr", + "nxos", + "ons", + "pixos", + "sanos", + "viptela", + "waas" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Cisco.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Cisco.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Cisco.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Cisco.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Cisco.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Cisco.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Cisco.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Cisco.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Cisco.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/citrix_test.exs b/test/towerops/snmp/profiles/vendors/citrix_test.exs new file mode 100644 index 00000000..132e00f5 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/citrix_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CitrixTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Citrix + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Citrix.profile_names() == ["netscaler-sdwan"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Citrix.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Citrix.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Citrix.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Citrix.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Citrix.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Citrix.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Citrix.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Citrix.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Citrix.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/corero_test.exs b/test/towerops/snmp/profiles/vendors/corero_test.exs new file mode 100644 index 00000000..ec143e3b --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/corero_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CoreroTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Corero + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Corero.profile_names() == ["cms"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Corero.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Corero.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Corero.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Corero.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Corero.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Corero.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Corero.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Corero.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Corero.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/cts_test.exs b/test/towerops/snmp/profiles/vendors/cts_test.exs new file mode 100644 index 00000000..e296643c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/cts_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CtsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Cts + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Cts.profile_names() == ["cts"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Cts.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Cts.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Cts.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Cts.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Cts.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Cts.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Cts.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Cts.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Cts.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/cyberpower_test.exs b/test/towerops/snmp/profiles/vendors/cyberpower_test.exs new file mode 100644 index 00000000..e4e61586 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/cyberpower_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.CyberpowerTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Cyberpower + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Cyberpower.profile_names() == ["cyberpower"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Cyberpower.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Cyberpower.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Cyberpower.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Cyberpower.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Cyberpower.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Cyberpower.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Cyberpower.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Cyberpower.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Cyberpower.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/dahua_test.exs b/test/towerops/snmp/profiles/vendors/dahua_test.exs new file mode 100644 index 00000000..2b45cfe2 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/dahua_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DahuaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Dahua + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Dahua.profile_names() == ["dahua-nvr"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Dahua.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Dahua.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Dahua.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Dahua.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Dahua.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Dahua.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Dahua.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Dahua.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Dahua.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/dantherm_test.exs b/test/towerops/snmp/profiles/vendors/dantherm_test.exs new file mode 100644 index 00000000..02bcf39c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/dantherm_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DanthermTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Dantherm + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Dantherm.profile_names() == ["dantherm-os"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Dantherm.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Dantherm.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Dantherm.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Dantherm.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Dantherm.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Dantherm.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Dantherm.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Dantherm.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Dantherm.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/dell_test.exs b/test/towerops/snmp/profiles/vendors/dell_test.exs new file mode 100644 index 00000000..d4d3961a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/dell_test.exs @@ -0,0 +1,111 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DellTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Dell + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Dell.profile_names() == [ + "dell-ome-m", + "dell-os10", + "dell-powervault", + "dell-rcs", + "dell-rpdu", + "dell-sonic", + "dell-ups" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Dell.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Dell.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Dell.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Dell.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Dell.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Dell.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Dell.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Dell.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Dell.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/delta_test.exs b/test/towerops/snmp/profiles/vendors/delta_test.exs new file mode 100644 index 00000000..1e15b75a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/delta_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DeltaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Delta + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Delta.profile_names() == ["deltaorion"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Delta.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Delta.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Delta.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Delta.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Delta.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Delta.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Delta.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Delta.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Delta.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/deltanet_test.exs b/test/towerops/snmp/profiles/vendors/deltanet_test.exs new file mode 100644 index 00000000..da02c2e6 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/deltanet_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DeltanetTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Deltanet + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Deltanet.profile_names() == ["lambdatrail"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Deltanet.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Deltanet.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Deltanet.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Deltanet.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Deltanet.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Deltanet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Deltanet.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Deltanet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Deltanet.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/deva_test.exs b/test/towerops/snmp/profiles/vendors/deva_test.exs new file mode 100644 index 00000000..b0798b28 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/deva_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DevaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Deva + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Deva.profile_names() == ["deva-db7001"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Deva.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Deva.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Deva.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Deva.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Deva.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Deva.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Deva.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Deva.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Deva.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/dkt_test.exs b/test/towerops/snmp/profiles/vendors/dkt_test.exs new file mode 100644 index 00000000..70d505e2 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/dkt_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DktTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Dkt + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Dkt.profile_names() == ["dkt"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Dkt.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Dkt.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Dkt.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Dkt.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Dkt.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Dkt.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Dkt.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Dkt.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Dkt.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/dlink_test.exs b/test/towerops/snmp/profiles/vendors/dlink_test.exs new file mode 100644 index 00000000..db6939fc --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/dlink_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DlinkTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Dlink + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Dlink.profile_names() == ["dlink", "dlink-dgs1250"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Dlink.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Dlink.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Dlink.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Dlink.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Dlink.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Dlink.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Dlink.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Dlink.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Dlink.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/dpstelecom_test.exs b/test/towerops/snmp/profiles/vendors/dpstelecom_test.exs new file mode 100644 index 00000000..a5aafa20 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/dpstelecom_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.DpstelecomTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Dpstelecom + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Dpstelecom.profile_names() == ["netguardian"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Dpstelecom.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Dpstelecom.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Dpstelecom.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Dpstelecom.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Dpstelecom.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Dpstelecom.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Dpstelecom.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Dpstelecom.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Dpstelecom.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/eaton_test.exs b/test/towerops/snmp/profiles/vendors/eaton_test.exs new file mode 100644 index 00000000..7baadf45 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/eaton_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EatonTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Eaton + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Eaton.profile_names() == ["eaton-ats", "eaton-matrix", "eaton-sc200", "eaton-sc300", "eatonpdu"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Eaton.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Eaton.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Eaton.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Eaton.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Eaton.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Eaton.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Eaton.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Eaton.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Eaton.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/edfa_test.exs b/test/towerops/snmp/profiles/vendors/edfa_test.exs new file mode 100644 index 00000000..70b1f639 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/edfa_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EdfaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Edfa + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Edfa.profile_names() == ["edfa"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Edfa.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Edfa.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Edfa.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Edfa.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Edfa.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Edfa.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Edfa.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Edfa.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Edfa.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/eds_test.exs b/test/towerops/snmp/profiles/vendors/eds_test.exs new file mode 100644 index 00000000..765d7d3b --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/eds_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EdsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Eds + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Eds.profile_names() == ["eds"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Eds.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Eds.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Eds.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Eds.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Eds.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Eds.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Eds.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Eds.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Eds.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ekinops_test.exs b/test/towerops/snmp/profiles/vendors/ekinops_test.exs new file mode 100644 index 00000000..062c2fb1 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ekinops_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EkinopsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ekinops + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ekinops.profile_names() == ["ekinops"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ekinops.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ekinops.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ekinops.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ekinops.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ekinops.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ekinops.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ekinops.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ekinops.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ekinops.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/epmp_test.exs b/test/towerops/snmp/profiles/vendors/epmp_test.exs new file mode 100644 index 00000000..8bdbd19b --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/epmp_test.exs @@ -0,0 +1,128 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EpmpTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Epmp + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Epmp.profile_names() == ["epmp"] + end + end + + describe "detect_hardware/1" do + test "returns ePMP AP when interface mode is 1" do + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.1.0", _ -> {:ok, 1} end) + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.2.0", _ -> {:ok, 1} end) + + assert Epmp.detect_hardware(@client_opts) == "ePMP AP" + end + + test "returns ePTP Master when interface mode is 1 and sub mode is 5" do + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.1.0", _ -> {:ok, 1} end) + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.2.0", _ -> {:ok, 5} end) + + assert Epmp.detect_hardware(@client_opts) == "ePTP Master" + end + + test "returns ePMP SM when interface mode is 2" do + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.1.0", _ -> {:ok, 2} end) + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.2.0", _ -> {:ok, 1} end) + + assert Epmp.detect_hardware(@client_opts) == "ePMP SM" + end + + test "returns ePTP Slave when interface mode is 2 and sub mode is 4" do + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.1.0", _ -> {:ok, 2} end) + expect(SnmpMock, :get, fn _, "1.3.6.1.4.1.17713.21.1.1.2.0", _ -> {:ok, 4} end) + + assert Epmp.detect_hardware(@client_opts) == "ePTP Slave" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> {:error, :timeout} end) + + assert Epmp.detect_hardware(@client_opts) == nil + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Epmp.wireless_oid_defs() + + assert is_list(defs) + assert length(defs) >= 10 + end + + test "each definition has required fields" do + defs = Epmp.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + + test "includes RSSI sensor" do + defs = Epmp.wireless_oid_defs() + rssi = Enum.find(defs, &(&1.sensor_descr == "RSSI")) + + assert rssi + assert rssi.sensor_type == "rssi" + assert rssi.sensor_unit == "dBm" + end + + test "includes SNR sensor" do + defs = Epmp.wireless_oid_defs() + snr = Enum.find(defs, &(&1.sensor_descr == "SNR")) + + assert snr + assert snr.sensor_type == "snr" + assert snr.sensor_unit == "dB" + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Epmp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Epmp.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Epmp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Epmp.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/epson_test.exs b/test/towerops/snmp/profiles/vendors/epson_test.exs new file mode 100644 index 00000000..ef06831c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/epson_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EpsonTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Epson + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Epson.profile_names() == ["epson-projector", "epson-scanner"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Epson.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Epson.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Epson.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Epson.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Epson.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Epson.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Epson.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Epson.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Epson.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ericsson_test.exs b/test/towerops/snmp/profiles/vendors/ericsson_test.exs new file mode 100644 index 00000000..2b08d173 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ericsson_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.EricssonTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ericsson + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ericsson.profile_names() == ["elg-ipecs-es", "ericsson-ipos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ericsson.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ericsson.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ericsson.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ericsson.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ericsson.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ericsson.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ericsson.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ericsson.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ericsson.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/extreme_test.exs b/test/towerops/snmp/profiles/vendors/extreme_test.exs new file mode 100644 index 00000000..c420b11a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/extreme_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ExtremeTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Extreme + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Extreme.profile_names() == ["slxos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Extreme.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Extreme.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Extreme.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Extreme.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Extreme.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Extreme.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Extreme.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Extreme.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Extreme.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/f5_test.exs b/test/towerops/snmp/profiles/vendors/f5_test.exs new file mode 100644 index 00000000..6532aa5f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/f5_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.F5Test do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.F5 + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert F5.profile_names() == ["f5", "f5os"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert F5.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert F5.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = F5.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = F5.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = F5.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = F5.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = F5.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = F5.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = F5.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/fibrolan_test.exs b/test/towerops/snmp/profiles/vendors/fibrolan_test.exs new file mode 100644 index 00000000..801a5ad6 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/fibrolan_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.FibrolanTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Fibrolan + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Fibrolan.profile_names() == ["fibrolan-falcon", "fibrolan-metrostar"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Fibrolan.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Fibrolan.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Fibrolan.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Fibrolan.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Fibrolan.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Fibrolan.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Fibrolan.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Fibrolan.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Fibrolan.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/firebrick_test.exs b/test/towerops/snmp/profiles/vendors/firebrick_test.exs new file mode 100644 index 00000000..ffe384f3 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/firebrick_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.FirebrickTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Firebrick + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Firebrick.profile_names() == ["firebrick"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Firebrick.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Firebrick.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Firebrick.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Firebrick.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Firebrick.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Firebrick.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Firebrick.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Firebrick.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Firebrick.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/fortinet_test.exs b/test/towerops/snmp/profiles/vendors/fortinet_test.exs new file mode 100644 index 00000000..4c6314f0 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/fortinet_test.exs @@ -0,0 +1,114 @@ +defmodule Towerops.Snmp.Profiles.Vendors.FortinetTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Fortinet + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Fortinet.profile_names() == [ + "fortiadc", + "fortiauthenticator", + "fortiextender", + "fortigate", + "fortimail", + "fortios", + "fortisandbox", + "fortiswitch", + "fortivoice", + "fortiweb" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Fortinet.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Fortinet.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Fortinet.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Fortinet.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Fortinet.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Fortinet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Fortinet.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Fortinet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Fortinet.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/fs_test.exs b/test/towerops/snmp/profiles/vendors/fs_test.exs new file mode 100644 index 00000000..9e2558b9 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/fs_test.exs @@ -0,0 +1,111 @@ +defmodule Towerops.Snmp.Profiles.Vendors.FsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Fs + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Fs.profile_names() == [ + "fs-bdcom", + "fs-centec", + "fs-gbn", + "fs-net-pdu", + "fs-nmu", + "fs-switch", + "fs-switch-dc" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Fs.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Fs.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Fs.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Fs.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Fs.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Fs.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Fs.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Fs.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Fs.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/geist_test.exs b/test/towerops/snmp/profiles/vendors/geist_test.exs new file mode 100644 index 00000000..25b42467 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/geist_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.GeistTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Geist + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Geist.profile_names() == ["geist-pdu", "geist-watchdog"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Geist.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Geist.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Geist.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Geist.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Geist.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Geist.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Geist.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Geist.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Geist.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/gigamon_test.exs b/test/towerops/snmp/profiles/vendors/gigamon_test.exs new file mode 100644 index 00000000..37621aef --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/gigamon_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.GigamonTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Gigamon + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Gigamon.profile_names() == ["gigavue"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Gigamon.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Gigamon.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Gigamon.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Gigamon.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Gigamon.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Gigamon.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Gigamon.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Gigamon.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Gigamon.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/greenbone_test.exs b/test/towerops/snmp/profiles/vendors/greenbone_test.exs new file mode 100644 index 00000000..6c7e3409 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/greenbone_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.GreenboneTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Greenbone + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Greenbone.profile_names() == ["gos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Greenbone.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Greenbone.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Greenbone.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Greenbone.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Greenbone.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Greenbone.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Greenbone.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Greenbone.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Greenbone.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/gude_test.exs b/test/towerops/snmp/profiles/vendors/gude_test.exs new file mode 100644 index 00000000..7dc5cba9 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/gude_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.GudeTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Gude + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Gude.profile_names() == ["ets", "gude-esb"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Gude.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Gude.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Gude.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Gude.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Gude.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Gude.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Gude.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Gude.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Gude.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/gwd_test.exs b/test/towerops/snmp/profiles/vendors/gwd_test.exs new file mode 100644 index 00000000..3ab76269 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/gwd_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.GwdTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Gwd + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Gwd.profile_names() == ["gwd"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Gwd.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Gwd.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Gwd.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Gwd.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Gwd.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Gwd.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Gwd.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Gwd.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Gwd.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/hikvision_test.exs b/test/towerops/snmp/profiles/vendors/hikvision_test.exs new file mode 100644 index 00000000..c5eb3aaf --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/hikvision_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.HikvisionTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Hikvision + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Hikvision.profile_names() == ["hikvision-cam", "hikvision-nvr"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Hikvision.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Hikvision.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Hikvision.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Hikvision.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Hikvision.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Hikvision.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Hikvision.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Hikvision.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Hikvision.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/hillstone_test.exs b/test/towerops/snmp/profiles/vendors/hillstone_test.exs new file mode 100644 index 00000000..25d8f55a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/hillstone_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.HillstoneTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Hillstone + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Hillstone.profile_names() == ["stoneos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Hillstone.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Hillstone.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Hillstone.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Hillstone.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Hillstone.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Hillstone.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Hillstone.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Hillstone.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Hillstone.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/himoinsa_test.exs b/test/towerops/snmp/profiles/vendors/himoinsa_test.exs new file mode 100644 index 00000000..dc519003 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/himoinsa_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.HimoinsaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Himoinsa + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Himoinsa.profile_names() == ["himoinsa-gensets"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Himoinsa.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Himoinsa.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Himoinsa.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Himoinsa.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Himoinsa.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Himoinsa.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Himoinsa.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Himoinsa.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Himoinsa.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/hp_test.exs b/test/towerops/snmp/profiles/vendors/hp_test.exs new file mode 100644 index 00000000..f7cce3ec --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/hp_test.exs @@ -0,0 +1,113 @@ +defmodule Towerops.Snmp.Profiles.Vendors.HpTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Hp + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Hp.profile_names() == [ + "hpblmos", + "hpe-ilo", + "hpe-ipdu", + "hpe-msa", + "hpe-msl", + "hpe-pdumm", + "hpmsm", + "hpvc", + "uhp" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Hp.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Hp.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Hp.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Hp.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Hp.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Hp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Hp.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Hp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Hp.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/hpe_test.exs b/test/towerops/snmp/profiles/vendors/hpe_test.exs new file mode 100644 index 00000000..6464f7c5 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/hpe_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.HpeTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Hpe + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Hpe.profile_names() == ["hpe-mapdu"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Hpe.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Hpe.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Hpe.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Hpe.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Hpe.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Hpe.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Hpe.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Hpe.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Hpe.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/huawei_test.exs b/test/towerops/snmp/profiles/vendors/huawei_test.exs new file mode 100644 index 00000000..2aaf566c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/huawei_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.HuaweiTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Huawei + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Huawei.profile_names() == ["huawei-optixrtn", "oceanstor", "smartax", "smartax-mdu", "yunshan"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Huawei.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Huawei.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Huawei.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Huawei.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Huawei.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Huawei.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Huawei.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Huawei.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Huawei.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ibm_test.exs b/test/towerops/snmp/profiles/vendors/ibm_test.exs new file mode 100644 index 00000000..bcfb0004 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ibm_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.IbmTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ibm + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ibm.profile_names() == ["ibm-amm", "ibm-i", "ibm-imm", "ibmnos", "ibmtl"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ibm.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ibm.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ibm.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ibm.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ibm.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ibm.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ibm.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ibm.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ibm.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ibmc_test.exs b/test/towerops/snmp/profiles/vendors/ibmc_test.exs new file mode 100644 index 00000000..40baa172 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ibmc_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.IbmcTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ibmc + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ibmc.profile_names() == ["ibmc"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ibmc.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ibmc.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ibmc.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ibmc.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ibmc.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ibmc.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ibmc.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ibmc.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ibmc.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ignitenet_test.exs b/test/towerops/snmp/profiles/vendors/ignitenet_test.exs new file mode 100644 index 00000000..4e25dd9d --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ignitenet_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.IgnitenetTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ignitenet + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ignitenet.profile_names() == ["fusion"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ignitenet.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ignitenet.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ignitenet.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ignitenet.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ignitenet.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ignitenet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ignitenet.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ignitenet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ignitenet.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/illustra_test.exs b/test/towerops/snmp/profiles/vendors/illustra_test.exs new file mode 100644 index 00000000..aca4dce0 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/illustra_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.IllustraTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Illustra + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Illustra.profile_names() == ["illustra"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Illustra.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Illustra.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Illustra.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Illustra.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Illustra.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Illustra.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Illustra.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Illustra.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Illustra.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/imco_power_test.exs b/test/towerops/snmp/profiles/vendors/imco_power_test.exs new file mode 100644 index 00000000..d7898bb3 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/imco_power_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ImcoPowerTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.ImcoPower + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert ImcoPower.profile_names() == ["imcopower-big", "imcopower-ls110"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert ImcoPower.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert ImcoPower.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = ImcoPower.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = ImcoPower.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = ImcoPower.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = ImcoPower.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = ImcoPower.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = ImcoPower.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = ImcoPower.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/infortrend_test.exs b/test/towerops/snmp/profiles/vendors/infortrend_test.exs new file mode 100644 index 00000000..2f68cedd --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/infortrend_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.InfortrendTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Infortrend + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Infortrend.profile_names() == ["infortrend"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Infortrend.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Infortrend.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Infortrend.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Infortrend.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Infortrend.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Infortrend.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Infortrend.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Infortrend.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Infortrend.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/inovonics_test.exs b/test/towerops/snmp/profiles/vendors/inovonics_test.exs new file mode 100644 index 00000000..2f30cdc1 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/inovonics_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.InovonicsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Inovonics + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Inovonics.profile_names() == ["aaron"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Inovonics.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Inovonics.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Inovonics.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Inovonics.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Inovonics.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Inovonics.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Inovonics.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Inovonics.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Inovonics.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/jacarta_test.exs b/test/towerops/snmp/profiles/vendors/jacarta_test.exs new file mode 100644 index 00000000..b5920b24 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/jacarta_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.JacartaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Jacarta + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Jacarta.profile_names() == ["interseptor"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Jacarta.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Jacarta.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Jacarta.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Jacarta.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Jacarta.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Jacarta.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Jacarta.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Jacarta.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Jacarta.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/juniper_test.exs b/test/towerops/snmp/profiles/vendors/juniper_test.exs new file mode 100644 index 00000000..66c58bed --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/juniper_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.JuniperTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Juniper + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Juniper.profile_names() == ["juniper-mss", "juniperex2500os", "junos", "junose"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Juniper.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Juniper.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Juniper.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Juniper.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Juniper.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Juniper.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Juniper.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Juniper.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Juniper.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/keenetic_test.exs b/test/towerops/snmp/profiles/vendors/keenetic_test.exs new file mode 100644 index 00000000..8b10e392 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/keenetic_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.KeeneticTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Keenetic + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Keenetic.profile_names() == ["keeneticos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Keenetic.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Keenetic.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Keenetic.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Keenetic.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Keenetic.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Keenetic.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Keenetic.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Keenetic.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Keenetic.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/lenovo_test.exs b/test/towerops/snmp/profiles/vendors/lenovo_test.exs new file mode 100644 index 00000000..36a72855 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/lenovo_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.LenovoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Lenovo + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Lenovo.profile_names() == ["cnos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Lenovo.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Lenovo.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Lenovo.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Lenovo.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Lenovo.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Lenovo.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Lenovo.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Lenovo.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Lenovo.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/liebert_test.exs b/test/towerops/snmp/profiles/vendors/liebert_test.exs new file mode 100644 index 00000000..90ff7086 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/liebert_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.LiebertTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Liebert + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Liebert.profile_names() == ["liebert"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Liebert.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Liebert.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Liebert.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Liebert.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Liebert.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Liebert.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Liebert.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Liebert.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Liebert.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/linux_test.exs b/test/towerops/snmp/profiles/vendors/linux_test.exs new file mode 100644 index 00000000..7288f4c3 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/linux_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.LinuxTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Linux + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Linux.profile_names() == ["aloha"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Linux.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Linux.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Linux.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Linux.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Linux.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Linux.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Linux.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Linux.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Linux.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/luminato_test.exs b/test/towerops/snmp/profiles/vendors/luminato_test.exs new file mode 100644 index 00000000..f6557085 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/luminato_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.LuminatoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Luminato + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Luminato.profile_names() == ["luminato"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Luminato.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Luminato.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Luminato.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Luminato.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Luminato.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Luminato.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Luminato.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Luminato.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Luminato.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/meinberg_test.exs b/test/towerops/snmp/profiles/vendors/meinberg_test.exs new file mode 100644 index 00000000..78d70206 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/meinberg_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.MeinbergTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Meinberg + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Meinberg.profile_names() == ["mbg-meinbergos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Meinberg.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Meinberg.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Meinberg.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Meinberg.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Meinberg.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Meinberg.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Meinberg.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Meinberg.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Meinberg.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/microsoft_test.exs b/test/towerops/snmp/profiles/vendors/microsoft_test.exs new file mode 100644 index 00000000..3b740117 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/microsoft_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.MicrosoftTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Microsoft + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Microsoft.profile_names() == ["windows"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Microsoft.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Microsoft.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Microsoft.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Microsoft.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Microsoft.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Microsoft.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Microsoft.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Microsoft.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Microsoft.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/mikrotik_test.exs b/test/towerops/snmp/profiles/vendors/mikrotik_test.exs new file mode 100644 index 00000000..8f293d88 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/mikrotik_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.MikrotikTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Mikrotik + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Mikrotik.profile_names() == ["swos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Mikrotik.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Mikrotik.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Mikrotik.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Mikrotik.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Mikrotik.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Mikrotik.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Mikrotik.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Mikrotik.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Mikrotik.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/moxa_test.exs b/test/towerops/snmp/profiles/vendors/moxa_test.exs new file mode 100644 index 00000000..6efc2f27 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/moxa_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.MoxaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Moxa + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Moxa.profile_names() == ["moxa-awk"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Moxa.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Moxa.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Moxa.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Moxa.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Moxa.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Moxa.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Moxa.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Moxa.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Moxa.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/mrv_test.exs b/test/towerops/snmp/profiles/vendors/mrv_test.exs new file mode 100644 index 00000000..4db38703 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/mrv_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.MrvTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Mrv + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Mrv.profile_names() == ["mrv-od", "mrvld"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Mrv.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Mrv.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Mrv.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Mrv.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Mrv.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Mrv.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Mrv.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Mrv.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Mrv.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/n4rf_test.exs b/test/towerops/snmp/profiles/vendors/n4rf_test.exs new file mode 100644 index 00000000..140cc310 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/n4rf_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.N4rfTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.N4rf + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert N4rf.profile_names() == ["aprisa"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert N4rf.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert N4rf.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = N4rf.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = N4rf.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = N4rf.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = N4rf.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = N4rf.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = N4rf.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = N4rf.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/netapp_test.exs b/test/towerops/snmp/profiles/vendors/netapp_test.exs new file mode 100644 index 00000000..81958859 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/netapp_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.NetappTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Netapp + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Netapp.profile_names() == ["netapp"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Netapp.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Netapp.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Netapp.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Netapp.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Netapp.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Netapp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Netapp.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Netapp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Netapp.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/netgear_test.exs b/test/towerops/snmp/profiles/vendors/netgear_test.exs new file mode 100644 index 00000000..2faa97f1 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/netgear_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.NetgearTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Netgear + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Netgear.profile_names() == ["netgear"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Netgear.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Netgear.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Netgear.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Netgear.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Netgear.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Netgear.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Netgear.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Netgear.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Netgear.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/netping_test.exs b/test/towerops/snmp/profiles/vendors/netping_test.exs new file mode 100644 index 00000000..c8855a54 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/netping_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.NetpingTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Netping + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Netping.profile_names() == ["uniping"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Netping.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Netping.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Netping.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Netping.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Netping.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Netping.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Netping.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Netping.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Netping.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/nokia_test.exs b/test/towerops/snmp/profiles/vendors/nokia_test.exs new file mode 100644 index 00000000..b7adbc7e --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/nokia_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.NokiaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Nokia + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Nokia.profile_names() == ["aos", "aos6", "aos7", "nokia-1830", "nokia-isam", "srlinux", "timos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Nokia.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Nokia.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Nokia.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Nokia.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Nokia.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Nokia.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Nokia.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Nokia.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Nokia.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/opengear_test.exs b/test/towerops/snmp/profiles/vendors/opengear_test.exs new file mode 100644 index 00000000..c5893a73 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/opengear_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.OpengearTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Opengear + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Opengear.profile_names() == ["opengear"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Opengear.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Opengear.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Opengear.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Opengear.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Opengear.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Opengear.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Opengear.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Opengear.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Opengear.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/orolia_test.exs b/test/towerops/snmp/profiles/vendors/orolia_test.exs new file mode 100644 index 00000000..f25b85d5 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/orolia_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.OroliaTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Orolia + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Orolia.profile_names() == ["orolia-securesync"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Orolia.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Orolia.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Orolia.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Orolia.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Orolia.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Orolia.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Orolia.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Orolia.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Orolia.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/packetlight_test.exs b/test/towerops/snmp/profiles/vendors/packetlight_test.exs new file mode 100644 index 00000000..b4843c7b --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/packetlight_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PacketlightTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Packetlight + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Packetlight.profile_names() == ["packetlight"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Packetlight.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Packetlight.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Packetlight.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Packetlight.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Packetlight.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Packetlight.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Packetlight.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Packetlight.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Packetlight.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/paloalto_test.exs b/test/towerops/snmp/profiles/vendors/paloalto_test.exs new file mode 100644 index 00000000..14704bef --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/paloalto_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PaloaltoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Paloalto + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Paloalto.profile_names() == ["panos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Paloalto.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Paloalto.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Paloalto.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Paloalto.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Paloalto.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Paloalto.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Paloalto.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Paloalto.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Paloalto.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/patton_test.exs b/test/towerops/snmp/profiles/vendors/patton_test.exs new file mode 100644 index 00000000..8159f8d5 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/patton_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PattonTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Patton + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Patton.profile_names() == ["patton-sn"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Patton.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Patton.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Patton.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Patton.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Patton.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Patton.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Patton.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Patton.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Patton.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/pbi_test.exs b/test/towerops/snmp/profiles/vendors/pbi_test.exs new file mode 100644 index 00000000..17baa651 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/pbi_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PbiTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Pbi + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Pbi.profile_names() == ["ird"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Pbi.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Pbi.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Pbi.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Pbi.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Pbi.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Pbi.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Pbi.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Pbi.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Pbi.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/pegasus_test.exs b/test/towerops/snmp/profiles/vendors/pegasus_test.exs new file mode 100644 index 00000000..86133a4e --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/pegasus_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PegasusTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Pegasus + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Pegasus.profile_names() == ["pegasus"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Pegasus.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Pegasus.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Pegasus.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Pegasus.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Pegasus.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Pegasus.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Pegasus.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Pegasus.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Pegasus.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/polycom_test.exs b/test/towerops/snmp/profiles/vendors/polycom_test.exs new file mode 100644 index 00000000..7433fa3d --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/polycom_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PolycomTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Polycom + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Polycom.profile_names() == ["polycomLens"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Polycom.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Polycom.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Polycom.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Polycom.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Polycom.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Polycom.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Polycom.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Polycom.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Polycom.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/primekey_test.exs b/test/towerops/snmp/profiles/vendors/primekey_test.exs new file mode 100644 index 00000000..28092d79 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/primekey_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PrimekeyTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Primekey + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Primekey.profile_names() == ["primekey", "primekey-sw"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Primekey.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Primekey.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Primekey.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Primekey.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Primekey.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Primekey.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Primekey.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Primekey.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Primekey.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/printer_test.exs b/test/towerops/snmp/profiles/vendors/printer_test.exs new file mode 100644 index 00000000..90a7f431 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/printer_test.exs @@ -0,0 +1,125 @@ +defmodule Towerops.Snmp.Profiles.Vendors.PrinterTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Printer + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Printer.profile_names() == [ + "brother", + "canonprinter", + "dell-laser", + "developprinter", + "epson", + "gestetner", + "jetdirect", + "konica", + "kyocera", + "lanier", + "lexmarkprinter", + "nrg", + "okilan", + "ricoh", + "samsungprinter", + "savin", + "sharp", + "toshiba-tec", + "tsc", + "utax", + "xerox" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Printer.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Printer.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Printer.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Printer.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Printer.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Printer.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Printer.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Printer.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Printer.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/profline_test.exs b/test/towerops/snmp/profiles/vendors/profline_test.exs new file mode 100644 index 00000000..716f8504 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/profline_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ProflineTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Profline + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Profline.profile_names() == ["profline-sfd"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Profline.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Profline.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Profline.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Profline.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Profline.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Profline.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Profline.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Profline.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Profline.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/protelevision_test.exs b/test/towerops/snmp/profiles/vendors/protelevision_test.exs new file mode 100644 index 00000000..208cc12b --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/protelevision_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ProtelevisionTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Protelevision + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Protelevision.profile_names() == ["protelevision-t1"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Protelevision.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Protelevision.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Protelevision.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Protelevision.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Protelevision.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Protelevision.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Protelevision.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Protelevision.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Protelevision.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/qtech_test.exs b/test/towerops/snmp/profiles/vendors/qtech_test.exs new file mode 100644 index 00000000..b6306a36 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/qtech_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.QtechTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Qtech + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Qtech.profile_names() == ["qtech"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Qtech.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Qtech.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Qtech.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Qtech.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Qtech.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Qtech.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Qtech.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Qtech.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Qtech.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/rad_test.exs b/test/towerops/snmp/profiles/vendors/rad_test.exs new file mode 100644 index 00000000..a4d42e7e --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/rad_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RadTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Rad + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Rad.profile_names() == ["rad-rici"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Rad.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Rad.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Rad.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Rad.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Rad.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Rad.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Rad.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Rad.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Rad.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/radlan_test.exs b/test/towerops/snmp/profiles/vendors/radlan_test.exs new file mode 100644 index 00000000..459bf82c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/radlan_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RadlanTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Radlan + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Radlan.profile_names() == ["eltex-mes21xx", "eltex-mes23xx"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Radlan.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Radlan.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Radlan.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Radlan.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Radlan.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Radlan.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Radlan.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Radlan.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Radlan.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/radware_test.exs b/test/towerops/snmp/profiles/vendors/radware_test.exs new file mode 100644 index 00000000..dc21010a --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/radware_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RadwareTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Radware + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Radware.profile_names() == ["alteonos", "apsoluteos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Radware.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Radware.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Radware.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Radware.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Radware.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Radware.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Radware.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Radware.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Radware.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/rajant_test.exs b/test/towerops/snmp/profiles/vendors/rajant_test.exs new file mode 100644 index 00000000..dda8957e --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/rajant_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RajantTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Rajant + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Rajant.profile_names() == ["rajant"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Rajant.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Rajant.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Rajant.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Rajant.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Rajant.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Rajant.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Rajant.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Rajant.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Rajant.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/raritan_test.exs b/test/towerops/snmp/profiles/vendors/raritan_test.exs new file mode 100644 index 00000000..05dd49f9 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/raritan_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RaritanTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Raritan + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Raritan.profile_names() == ["raritan-emx", "raritan-kvm", "raritan-pdu"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Raritan.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Raritan.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Raritan.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Raritan.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Raritan.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Raritan.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Raritan.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Raritan.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Raritan.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/red_test.exs b/test/towerops/snmp/profiles/vendors/red_test.exs new file mode 100644 index 00000000..cbf9b2a6 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/red_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RedTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Red + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Red.profile_names() == ["sixnet"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Red.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Red.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Red.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Red.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Red.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Red.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Red.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Red.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Red.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/registry_test.exs b/test/towerops/snmp/profiles/vendors/registry_test.exs index 99c7181f..4f61e778 100644 --- a/test/towerops/snmp/profiles/vendors/registry_test.exs +++ b/test/towerops/snmp/profiles/vendors/registry_test.exs @@ -4,6 +4,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.RegistryTest do import Mox alias Towerops.Snmp.Profiles.Vendors.Adtran + alias Towerops.Snmp.Profiles.Vendors.Adva alias Towerops.Snmp.Profiles.Vendors.Airfiber alias Towerops.Snmp.Profiles.Vendors.Airos alias Towerops.Snmp.Profiles.Vendors.AlliedTelesis @@ -11,36 +12,59 @@ defmodule Towerops.Snmp.Profiles.Vendors.RegistryTest do alias Towerops.Snmp.Profiles.Vendors.Alvarion alias Towerops.Snmp.Profiles.Vendors.Apc alias Towerops.Snmp.Profiles.Vendors.Arista + alias Towerops.Snmp.Profiles.Vendors.Brocade alias Towerops.Snmp.Profiles.Vendors.Calix alias Towerops.Snmp.Profiles.Vendors.Ceragon + alias Towerops.Snmp.Profiles.Vendors.Cisco alias Towerops.Snmp.Profiles.Vendors.Cmm alias Towerops.Snmp.Profiles.Vendors.Cnpilot + alias Towerops.Snmp.Profiles.Vendors.Cyberpower alias Towerops.Snmp.Profiles.Vendors.Deliberant + alias Towerops.Snmp.Profiles.Vendors.Dell + alias Towerops.Snmp.Profiles.Vendors.Dlink alias Towerops.Snmp.Profiles.Vendors.Dlinkap alias Towerops.Snmp.Profiles.Vendors.Dragonwave + alias Towerops.Snmp.Profiles.Vendors.Eaton alias Towerops.Snmp.Profiles.Vendors.Epmp alias Towerops.Snmp.Profiles.Vendors.Exalt + alias Towerops.Snmp.Profiles.Vendors.F5 alias Towerops.Snmp.Profiles.Vendors.Fortiap + alias Towerops.Snmp.Profiles.Vendors.Fortinet alias Towerops.Snmp.Profiles.Vendors.Fortiwlc + alias Towerops.Snmp.Profiles.Vendors.Hp + alias Towerops.Snmp.Profiles.Vendors.Huawei + alias Towerops.Snmp.Profiles.Vendors.Juniper + alias Towerops.Snmp.Profiles.Vendors.Liebert alias Towerops.Snmp.Profiles.Vendors.Ligoos alias Towerops.Snmp.Profiles.Vendors.Meraki + alias Towerops.Snmp.Profiles.Vendors.Mikrotik alias Towerops.Snmp.Profiles.Vendors.Mimosa alias Towerops.Snmp.Profiles.Vendors.MoxaAwk + alias Towerops.Snmp.Profiles.Vendors.Netgear + alias Towerops.Snmp.Profiles.Vendors.Nokia + alias Towerops.Snmp.Profiles.Vendors.Paloalto alias Towerops.Snmp.Profiles.Vendors.Pepwave alias Towerops.Snmp.Profiles.Vendors.Pmp alias Towerops.Snmp.Profiles.Vendors.Proxim alias Towerops.Snmp.Profiles.Vendors.Racom alias Towerops.Snmp.Profiles.Vendors.Radwin alias Towerops.Snmp.Profiles.Vendors.Registry + alias Towerops.Snmp.Profiles.Vendors.Riverbed alias Towerops.Snmp.Profiles.Vendors.Routeros alias Towerops.Snmp.Profiles.Vendors.Ruckus alias Towerops.Snmp.Profiles.Vendors.Saf alias Towerops.Snmp.Profiles.Vendors.Siae alias Towerops.Snmp.Profiles.Vendors.Siklu + alias Towerops.Snmp.Profiles.Vendors.Sonicwall alias Towerops.Snmp.Profiles.Vendors.Stellar + alias Towerops.Snmp.Profiles.Vendors.Tplink alias Towerops.Snmp.Profiles.Vendors.Tranzeo + alias Towerops.Snmp.Profiles.Vendors.Tripplite alias Towerops.Snmp.Profiles.Vendors.Unifi + alias Towerops.Snmp.Profiles.Vendors.Ups + alias Towerops.Snmp.Profiles.Vendors.Vertiv alias Towerops.Snmp.Profiles.Vendors.Xirrus + alias Towerops.Snmp.Profiles.Vendors.Zyxel alias Towerops.Snmp.Profiles.Vendors.ZyxelWlc alias Towerops.Snmp.SnmpMock @@ -96,6 +120,31 @@ defmodule Towerops.Snmp.Profiles.Vendors.RegistryTest do assert Calix in vendors assert Adtran in vendors assert AlliedTelesis in vendors + # New auto-generated vendors + assert Cisco in vendors + assert Juniper in vendors + assert Hp in vendors + assert Dell in vendors + assert Fortinet in vendors + assert Huawei in vendors + assert Nokia in vendors + assert Paloalto in vendors + assert F5 in vendors + assert Brocade in vendors + assert Netgear in vendors + assert Dlink in vendors + assert Tplink in vendors + assert Zyxel in vendors + assert Cyberpower in vendors + assert Eaton in vendors + assert Liebert in vendors + assert Tripplite in vendors + assert Ups in vendors + assert Vertiv in vendors + assert Riverbed in vendors + assert Sonicwall in vendors + assert Mikrotik in vendors + assert Adva in vendors end end @@ -362,7 +411,7 @@ defmodule Towerops.Snmp.Profiles.Vendors.RegistryTest do defs = Registry.get_wireless_oid_defs("pmp") assert is_list(defs) - assert defs != [] + assert [_ | _] = defs end test "returns empty list for unknown profile" do diff --git a/test/towerops/snmp/profiles/vendors/riedo_test.exs b/test/towerops/snmp/profiles/vendors/riedo_test.exs new file mode 100644 index 00000000..c7e0296f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/riedo_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RiedoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Riedo + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Riedo.profile_names() == ["rnx-updu"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Riedo.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Riedo.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Riedo.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Riedo.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Riedo.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Riedo.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Riedo.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Riedo.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Riedo.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/riverbed_test.exs b/test/towerops/snmp/profiles/vendors/riverbed_test.exs new file mode 100644 index 00000000..baf6b8da --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/riverbed_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RiverbedTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Riverbed + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Riverbed.profile_names() == ["riverbed"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Riverbed.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Riverbed.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Riverbed.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Riverbed.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Riverbed.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Riverbed.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Riverbed.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Riverbed.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Riverbed.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/routeros_test.exs b/test/towerops/snmp/profiles/vendors/routeros_test.exs new file mode 100644 index 00000000..98bd6ed3 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/routeros_test.exs @@ -0,0 +1,257 @@ +defmodule Towerops.Snmp.Profiles.Vendors.RouterosTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Routeros + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + # OID constants from the module + @license_oid "1.3.6.1.4.1.14988.1.1.4.4.0" + @wl_ap_table "1.3.6.1.4.1.14988.1.1.1.3.1" + @wl_stat_table "1.3.6.1.4.1.14988.1.1.1.1.1" + @wl_60g_table "1.3.6.1.4.1.14988.1.1.1.8.1" + @lte_modem_table "1.3.6.1.4.1.14988.1.1.16.1.1" + + describe "profile_names/0" do + test "returns expected profile names" do + assert Routeros.profile_names() == ["routeros"] + end + end + + describe "detect_hardware/1" do + test "returns RouterOS Level when SNMP responds with integer license" do + expect(SnmpMock, :get, fn _, @license_oid, _ -> + {:ok, 6} + end) + + assert Routeros.detect_hardware(@client_opts) == "RouterOS Level 6" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, @license_oid, _ -> + {:error, :timeout} + end) + + assert Routeros.detect_hardware(@client_opts) == nil + end + + test "returns nil when license is not an integer" do + expect(SnmpMock, :get, fn _, @license_oid, _ -> + {:ok, "not an integer"} + end) + + assert Routeros.detect_hardware(@client_opts) == nil + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Routeros.wireless_oid_defs() + + assert is_list(defs) + assert length(defs) == 2 + end + + test "each definition has required fields" do + defs = Routeros.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + + test "includes DHCP Leases sensor" do + defs = Routeros.wireless_oid_defs() + dhcp = Enum.find(defs, &(&1.sensor_descr == "DHCP Leases")) + + assert dhcp + assert dhcp.sensor_type == "count" + assert dhcp.oid == "1.3.6.1.4.1.14988.1.1.6.1.0" + end + + test "includes PPPoE Sessions sensor" do + defs = Routeros.wireless_oid_defs() + pppoe = Enum.find(defs, &(&1.sensor_descr == "PPPoE Sessions")) + + assert pppoe + assert pppoe.sensor_type == "count" + assert pppoe.oid == "1.3.6.1.4.1.9.9.150.1.1.1.0" + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors from AP table when SNMP responds" do + # Mock walk calls - snmpkit returns list of maps, Client converts to map + expect(SnmpMock, :walk, fn _, @wl_ap_table, _ -> + {:ok, + [ + %{oid: "#{@wl_ap_table}.5.1", value: "TestSSID"}, + %{oid: "#{@wl_ap_table}.6.1", value: 5}, + %{oid: "#{@wl_ap_table}.7.1", value: 5180}, + %{oid: "#{@wl_ap_table}.9.1", value: -95}, + %{oid: "#{@wl_ap_table}.10.1", value: 85}, + %{oid: "#{@wl_ap_table}.2.1", value: 300_000_000}, + %{oid: "#{@wl_ap_table}.3.1", value: 150_000_000} + ]} + end) + + expect(SnmpMock, :walk, fn _, @wl_stat_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @wl_60g_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @lte_modem_table, _ -> {:ok, []} end) + + # System sensors (DHCP leases and PPPoE) + expect(SnmpMock, :get, 2, fn _, _oid, _ -> {:ok, 100} end) + + sensors = Routeros.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + # 6 AP sensors + 2 system sensors + assert length(sensors) == 8 + + # Verify AP sensor types are present + sensor_types = Enum.map(sensors, & &1.sensor_type) + assert "clients" in sensor_types + assert "frequency" in sensor_types + assert "noise-floor" in sensor_types + assert "ccq" in sensor_types + assert "rate" in sensor_types + assert "count" in sensor_types + end + + test "discovers sensors from station table" do + expect(SnmpMock, :walk, fn _, @wl_ap_table, _ -> {:ok, []} end) + + expect(SnmpMock, :walk, fn _, @wl_stat_table, _ -> + {:ok, + [ + %{oid: "#{@wl_stat_table}.5.1", value: "ClientSSID"}, + %{oid: "#{@wl_stat_table}.7.1", value: 2437}, + %{oid: "#{@wl_stat_table}.9.1", value: 95}, + %{oid: "#{@wl_stat_table}.10.1", value: 90}, + %{oid: "#{@wl_stat_table}.2.1", value: 144_400_000}, + %{oid: "#{@wl_stat_table}.3.1", value: 72_200_000} + ]} + end) + + expect(SnmpMock, :walk, fn _, @wl_60g_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @lte_modem_table, _ -> {:ok, []} end) + expect(SnmpMock, :get, 2, fn _, _oid, _ -> {:ok, 50} end) + + sensors = Routeros.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + # 5 station sensors + 2 system sensors + assert length(sensors) == 7 + + sensor_types = Enum.map(sensors, & &1.sensor_type) + assert "frequency" in sensor_types + assert "ccq" in sensor_types + assert "rate" in sensor_types + end + + test "discovers sensors from 60G table" do + expect(SnmpMock, :walk, fn _, @wl_ap_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @wl_stat_table, _ -> {:ok, []} end) + + expect(SnmpMock, :walk, fn _, @wl_60g_table, _ -> + {:ok, + [ + %{oid: "#{@wl_60g_table}.2.1", value: "60G-Link"}, + %{oid: "#{@wl_60g_table}.6.1", value: 60_480}, + %{oid: "#{@wl_60g_table}.8.1", value: 75}, + %{oid: "#{@wl_60g_table}.12.1", value: -55}, + %{oid: "#{@wl_60g_table}.13.1", value: 1800} + ]} + end) + + expect(SnmpMock, :walk, fn _, @lte_modem_table, _ -> {:ok, []} end) + expect(SnmpMock, :get, 2, fn _, _oid, _ -> {:ok, 25} end) + + sensors = Routeros.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + # 4 60G sensors + 2 system sensors + assert length(sensors) == 6 + + sensor_types = Enum.map(sensors, & &1.sensor_type) + assert "frequency" in sensor_types + assert "quality" in sensor_types + assert "rssi" in sensor_types + assert "rate" in sensor_types + end + + test "discovers sensors from LTE table" do + expect(SnmpMock, :walk, fn _, @wl_ap_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @wl_stat_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @wl_60g_table, _ -> {:ok, []} end) + + expect(SnmpMock, :walk, fn _, @lte_modem_table, _ -> + {:ok, + [ + %{oid: "#{@lte_modem_table}.3.1", value: -12}, + %{oid: "#{@lte_modem_table}.4.1", value: -80}, + %{oid: "#{@lte_modem_table}.7.1", value: 15} + ]} + end) + + expect(SnmpMock, :get, 2, fn _, _oid, _ -> {:ok, 10} end) + + sensors = Routeros.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + # 3 LTE sensors + 2 system sensors + assert length(sensors) == 5 + + sensor_types = Enum.map(sensors, & &1.sensor_type) + assert "rsrq" in sensor_types + assert "rsrp" in sensor_types + assert "sinr" in sensor_types + end + + test "returns only system sensors when all tables are empty" do + expect(SnmpMock, :walk, fn _, @wl_ap_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @wl_stat_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @wl_60g_table, _ -> {:ok, []} end) + expect(SnmpMock, :walk, fn _, @lte_modem_table, _ -> {:ok, []} end) + + # System sensors (DHCP leases and PPPoE) + expect(SnmpMock, :get, 2, fn _, _oid, _ -> {:ok, 100} end) + + sensors = Routeros.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == 2 + + descriptions = Enum.map(sensors, & &1.sensor_descr) + assert "DHCP Leases" in descriptions + assert "PPPoE Sessions" in descriptions + end + + test "returns empty list when all SNMP calls fail" do + expect(SnmpMock, :walk, fn _, @wl_ap_table, _ -> {:error, :timeout} end) + expect(SnmpMock, :walk, fn _, @wl_stat_table, _ -> {:error, :timeout} end) + expect(SnmpMock, :walk, fn _, @wl_60g_table, _ -> {:error, :timeout} end) + expect(SnmpMock, :walk, fn _, @lte_modem_table, _ -> {:error, :timeout} end) + expect(SnmpMock, :get, 2, fn _, _, _ -> {:error, :timeout} end) + + sensors = Routeros.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/sagemcom_test.exs b/test/towerops/snmp/profiles/vendors/sagemcom_test.exs new file mode 100644 index 00000000..7fe8e39e --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/sagemcom_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SagemcomTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Sagemcom + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Sagemcom.profile_names() == ["ionos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Sagemcom.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Sagemcom.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Sagemcom.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Sagemcom.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Sagemcom.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Sagemcom.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Sagemcom.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Sagemcom.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Sagemcom.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/schleifenbauer_test.exs b/test/towerops/snmp/profiles/vendors/schleifenbauer_test.exs new file mode 100644 index 00000000..a88b2fc2 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/schleifenbauer_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SchleifenbauerTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Schleifenbauer + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Schleifenbauer.profile_names() == ["schleifenbauer"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Schleifenbauer.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Schleifenbauer.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Schleifenbauer.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Schleifenbauer.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Schleifenbauer.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Schleifenbauer.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Schleifenbauer.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Schleifenbauer.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Schleifenbauer.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/siemens_test.exs b/test/towerops/snmp/profiles/vendors/siemens_test.exs new file mode 100644 index 00000000..3f9ac9af --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/siemens_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SiemensTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Siemens + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Siemens.profile_names() == ["scalance", "ulaf"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Siemens.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Siemens.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Siemens.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Siemens.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Siemens.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Siemens.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Siemens.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Siemens.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Siemens.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/silverpeak_test.exs b/test/towerops/snmp/profiles/vendors/silverpeak_test.exs new file mode 100644 index 00000000..e7d47185 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/silverpeak_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SilverpeakTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Silverpeak + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Silverpeak.profile_names() == ["vxoa"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Silverpeak.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Silverpeak.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Silverpeak.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Silverpeak.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Silverpeak.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Silverpeak.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Silverpeak.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Silverpeak.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Silverpeak.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/smartbyte_test.exs b/test/towerops/snmp/profiles/vendors/smartbyte_test.exs new file mode 100644 index 00000000..b63ba2fe --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/smartbyte_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SmartbyteTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Smartbyte + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Smartbyte.profile_names() == ["smartbyte"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Smartbyte.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Smartbyte.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Smartbyte.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Smartbyte.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Smartbyte.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Smartbyte.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Smartbyte.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Smartbyte.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Smartbyte.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/smartoptics_test.exs b/test/towerops/snmp/profiles/vendors/smartoptics_test.exs new file mode 100644 index 00000000..3e7f5d68 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/smartoptics_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SmartopticsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Smartoptics + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Smartoptics.profile_names() == ["smartos", "smartos-dcp-m", "smartos-t"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Smartoptics.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Smartoptics.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Smartoptics.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Smartoptics.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Smartoptics.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Smartoptics.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Smartoptics.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Smartoptics.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Smartoptics.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/snr_erd_test.exs b/test/towerops/snmp/profiles/vendors/snr_erd_test.exs new file mode 100644 index 00000000..29fc4105 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/snr_erd_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SnrErdTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.SnrErd + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert SnrErd.profile_names() == ["snr-erd"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert SnrErd.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert SnrErd.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = SnrErd.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = SnrErd.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = SnrErd.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = SnrErd.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = SnrErd.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = SnrErd.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = SnrErd.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/snr_test.exs b/test/towerops/snmp/profiles/vendors/snr_test.exs new file mode 100644 index 00000000..1a4d0230 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/snr_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SnrTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Snr + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Snr.profile_names() == ["snr"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Snr.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Snr.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Snr.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Snr.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Snr.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Snr.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Snr.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Snr.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Snr.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/sonicwall_test.exs b/test/towerops/snmp/profiles/vendors/sonicwall_test.exs new file mode 100644 index 00000000..42e90bba --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/sonicwall_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SonicwallTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Sonicwall + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Sonicwall.profile_names() == ["panasonic-ns", "sonicwall"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Sonicwall.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Sonicwall.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Sonicwall.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Sonicwall.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Sonicwall.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Sonicwall.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Sonicwall.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Sonicwall.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Sonicwall.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/sophos_test.exs b/test/towerops/snmp/profiles/vendors/sophos_test.exs new file mode 100644 index 00000000..ad85c7f6 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/sophos_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SophosTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Sophos + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Sophos.profile_names() == ["sophos-xg"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Sophos.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Sophos.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Sophos.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Sophos.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Sophos.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Sophos.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Sophos.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Sophos.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Sophos.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/storage_test.exs b/test/towerops/snmp/profiles/vendors/storage_test.exs new file mode 100644 index 00000000..6028d1c6 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/storage_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.StorageTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Storage + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Storage.profile_names() == ["lenovoemc"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Storage.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Storage.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Storage.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Storage.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Storage.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Storage.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Storage.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Storage.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Storage.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/supermicro_test.exs b/test/towerops/snmp/profiles/vendors/supermicro_test.exs new file mode 100644 index 00000000..5b4a7cd2 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/supermicro_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.SupermicroTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Supermicro + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Supermicro.profile_names() == ["supermicro-bmc", "supermicro-switch"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Supermicro.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Supermicro.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Supermicro.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Supermicro.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Supermicro.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Supermicro.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Supermicro.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Supermicro.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Supermicro.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/terra_test.exs b/test/towerops/snmp/profiles/vendors/terra_test.exs new file mode 100644 index 00000000..ffb3c061 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/terra_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.TerraTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Terra + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Terra.profile_names() == ["terra", "terra-sdi410c", "terra-sdi480"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Terra.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Terra.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Terra.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Terra.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Terra.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Terra.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Terra.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Terra.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Terra.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/tplink_test.exs b/test/towerops/snmp/profiles/vendors/tplink_test.exs new file mode 100644 index 00000000..051a920f --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/tplink_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.TplinkTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Tplink + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Tplink.profile_names() == ["tplink"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Tplink.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Tplink.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Tplink.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Tplink.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Tplink.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Tplink.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Tplink.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Tplink.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Tplink.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/tredess_test.exs b/test/towerops/snmp/profiles/vendors/tredess_test.exs new file mode 100644 index 00000000..4529b229 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/tredess_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.TredessTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Tredess + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Tredess.profile_names() == ["televes-fs"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Tredess.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Tredess.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Tredess.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Tredess.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Tredess.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Tredess.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Tredess.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Tredess.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Tredess.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/trellix_test.exs b/test/towerops/snmp/profiles/vendors/trellix_test.exs new file mode 100644 index 00000000..a0310d55 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/trellix_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.TrellixTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Trellix + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Trellix.profile_names() == ["feos", "mlos-atd", "mlos-nsp"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Trellix.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Trellix.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Trellix.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Trellix.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Trellix.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Trellix.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Trellix.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Trellix.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Trellix.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/tripplite_test.exs b/test/towerops/snmp/profiles/vendors/tripplite_test.exs new file mode 100644 index 00000000..b8e1d207 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/tripplite_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.TrippliteTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Tripplite + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Tripplite.profile_names() == ["trippliteconsole"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Tripplite.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Tripplite.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Tripplite.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Tripplite.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Tripplite.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Tripplite.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Tripplite.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Tripplite.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Tripplite.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/unix_test.exs b/test/towerops/snmp/profiles/vendors/unix_test.exs new file mode 100644 index 00000000..579274a9 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/unix_test.exs @@ -0,0 +1,143 @@ +defmodule Towerops.Snmp.Profiles.Vendors.UnixTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Unix + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Unix.profile_names() == [ + "aix", + "beagleboard", + "broadworks", + "ciscowap", + "coreos", + "cumulus", + "dell-compellent", + "dhcpatriot", + "dragonfly", + "dsm", + "endian", + "endrun", + "extrahop", + "freebsd", + "fusionhub", + "linux", + "mobileiron", + "monowall", + "netbsd", + "nutanix-aos", + "open-e", + "openbsd", + "openindiana", + "opensolaris", + "opnsense", + "pfsense", + "pktj", + "powercode", + "procera", + "proxmox", + "qnap", + "recoveryos", + "rubrik", + "rutos", + "solaris", + "vmware-esxi", + "vmware-vcsa", + "voswall", + "vyos" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Unix.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Unix.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Unix.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Unix.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Unix.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Unix.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Unix.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Unix.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Unix.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/ups_test.exs b/test/towerops/snmp/profiles/vendors/ups_test.exs new file mode 100644 index 00000000..ebfa3809 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/ups_test.exs @@ -0,0 +1,117 @@ +defmodule Towerops.Snmp.Profiles.Vendors.UpsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Ups + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Ups.profile_names() == [ + "abbups", + "apc-mgeups", + "eaton-mgeups", + "eatonups", + "eatonupsm2", + "ge-ups", + "hpe-rtups", + "huaweiups", + "netagent2", + "netmanplus", + "sinetica", + "socomec-ups", + "webpower-smart2" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Ups.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Ups.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Ups.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Ups.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Ups.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Ups.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Ups.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Ups.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Ups.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/vertiv_test.exs b/test/towerops/snmp/profiles/vendors/vertiv_test.exs new file mode 100644 index 00000000..a288e72c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/vertiv_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.VertivTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Vertiv + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Vertiv.profile_names() == ["vertiv-ita2", "vertiv-pdu"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Vertiv.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Vertiv.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Vertiv.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Vertiv.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Vertiv.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Vertiv.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Vertiv.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Vertiv.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Vertiv.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/vigintos_test.exs b/test/towerops/snmp/profiles/vendors/vigintos_test.exs new file mode 100644 index 00000000..9a081f7c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/vigintos_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.VigintosTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Vigintos + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Vigintos.profile_names() == ["vigintos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Vigintos.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Vigintos.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Vigintos.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Vigintos.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Vigintos.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Vigintos.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Vigintos.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Vigintos.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Vigintos.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/viprinet_test.exs b/test/towerops/snmp/profiles/vendors/viprinet_test.exs new file mode 100644 index 00000000..7443bb8c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/viprinet_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ViprinetTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Viprinet + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Viprinet.profile_names() == ["viprinux"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Viprinet.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Viprinet.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Viprinet.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Viprinet.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Viprinet.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Viprinet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Viprinet.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Viprinet.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Viprinet.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/vrp_test.exs b/test/towerops/snmp/profiles/vendors/vrp_test.exs new file mode 100644 index 00000000..7aa5bf21 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/vrp_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.VrpTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Vrp + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Vrp.profile_names() == ["vrp"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Vrp.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Vrp.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Vrp.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Vrp.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Vrp.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Vrp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Vrp.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Vrp.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Vrp.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/watchguard_test.exs b/test/towerops/snmp/profiles/vendors/watchguard_test.exs new file mode 100644 index 00000000..566ce1cc --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/watchguard_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.WatchguardTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Watchguard + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Watchguard.profile_names() == ["fireware"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Watchguard.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Watchguard.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Watchguard.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Watchguard.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Watchguard.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Watchguard.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Watchguard.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Watchguard.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Watchguard.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/waystream_test.exs b/test/towerops/snmp/profiles/vendors/waystream_test.exs new file mode 100644 index 00000000..96520f72 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/waystream_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.WaystreamTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Waystream + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Waystream.profile_names() == ["ibos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Waystream.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Waystream.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Waystream.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Waystream.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Waystream.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Waystream.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Waystream.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Waystream.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Waystream.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/westermo_test.exs b/test/towerops/snmp/profiles/vendors/westermo_test.exs new file mode 100644 index 00000000..9d6747e8 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/westermo_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.WestermoTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Westermo + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Westermo.profile_names() == ["weos"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Westermo.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Westermo.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Westermo.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Westermo.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Westermo.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Westermo.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Westermo.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Westermo.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Westermo.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/worldcastsystems_test.exs b/test/towerops/snmp/profiles/vendors/worldcastsystems_test.exs new file mode 100644 index 00000000..fd795b51 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/worldcastsystems_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.WorldcastsystemsTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Worldcastsystems + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Worldcastsystems.profile_names() == ["ecresofm-os"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Worldcastsystems.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Worldcastsystems.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Worldcastsystems.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Worldcastsystems.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Worldcastsystems.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Worldcastsystems.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Worldcastsystems.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Worldcastsystems.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Worldcastsystems.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/wti_test.exs b/test/towerops/snmp/profiles/vendors/wti_test.exs new file mode 100644 index 00000000..b519484c --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/wti_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.WtiTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Wti + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Wti.profile_names() == ["wti-console", "wti-power"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Wti.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Wti.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Wti.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Wti.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Wti.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Wti.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Wti.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Wti.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Wti.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/zte_test.exs b/test/towerops/snmp/profiles/vendors/zte_test.exs new file mode 100644 index 00000000..ef140591 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/zte_test.exs @@ -0,0 +1,103 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ZteTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Zte + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Zte.profile_names() == ["zxdsl", "zxr10"] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Zte.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Zte.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Zte.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Zte.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Zte.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Zte.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Zte.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Zte.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Zte.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end diff --git a/test/towerops/snmp/profiles/vendors/zyxel_test.exs b/test/towerops/snmp/profiles/vendors/zyxel_test.exs new file mode 100644 index 00000000..e7dd7e70 --- /dev/null +++ b/test/towerops/snmp/profiles/vendors/zyxel_test.exs @@ -0,0 +1,114 @@ +defmodule Towerops.Snmp.Profiles.Vendors.ZyxelTest do + use Towerops.DataCase, async: true + + import Mox + + alias Towerops.Snmp.Profiles.Vendors.Zyxel + alias Towerops.Snmp.SnmpMock + + setup :verify_on_exit! + + @client_opts [ + ip: "192.168.1.1", + community: "public", + version: "2c", + port: 161, + timeout: 5000 + ] + + describe "profile_names/0" do + test "returns expected profile names" do + assert Zyxel.profile_names() == [ + "anyos", + "ies", + "ies5000", + "ies52xxM", + "prestige", + "zynos", + "zywall", + "zyxelac", + "zyxelnwa", + "zyxelusg" + ] + end + end + + describe "detect_hardware/1" do + test "returns hardware description when SNMP responds" do + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, "Test Device Model XYZ"} + end) + + assert Zyxel.detect_hardware(@client_opts) == "Test Device Model XYZ" + end + + test "returns nil when SNMP fails" do + expect(SnmpMock, :get, fn _, _, _ -> + {:error, :timeout} + end) + + assert Zyxel.detect_hardware(@client_opts) == nil + end + + test "truncates long descriptions to 64 characters" do + long_descr = String.duplicate("A", 100) + + expect(SnmpMock, :get, fn _, "1.3.6.1.2.1.1.1.0", _ -> + {:ok, long_descr} + end) + + result = Zyxel.detect_hardware(@client_opts) + assert String.length(result) == 64 + end + end + + describe "wireless_oid_defs/0" do + test "returns list of sensor definitions" do + defs = Zyxel.wireless_oid_defs() + + assert is_list(defs) + assert [_ | _] = defs + end + + test "each definition has required fields" do + defs = Zyxel.wireless_oid_defs() + + Enum.each(defs, fn def -> + assert Map.has_key?(def, :oid) + assert Map.has_key?(def, :sensor_descr) + assert Map.has_key?(def, :sensor_type) + assert Map.has_key?(def, :sensor_unit) + assert Map.has_key?(def, :sensor_divisor) + end) + end + end + + describe "discover_wireless_sensors/1" do + test "discovers sensors when SNMP responds" do + defs = Zyxel.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _oid, _ -> + {:ok, 42} + end) + + sensors = Zyxel.discover_wireless_sensors(@client_opts) + + assert is_list(sensors) + assert length(sensors) == num_defs + end + + test "returns empty list when no sensors respond" do + defs = Zyxel.wireless_oid_defs() + num_defs = length(defs) + + expect(SnmpMock, :get, num_defs, fn _, _, _ -> + {:error, :no_such_object} + end) + + sensors = Zyxel.discover_wireless_sensors(@client_opts) + + assert sensors == [] + end + end +end