From dd0b29aefbd02743ac8b387936be6e297642110a Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Wed, 11 Feb 2026 16:19:58 -0600 Subject: [PATCH] fix: handle "null" string values in SNMP parsing Some devices (e.g., AirOS 8.7.14) return the literal string "null" for unavailable metrics like UCD CPU stats. Added explicit handling in parse_integer/1 and parse_float/1 to return nil for "null" strings, preventing ArgumentError when attempting binary_to_integer conversion. --- CHANGELOG.txt | 8 ++++++++ lib/towerops/snmp/profiles/base.ex | 3 +++ 2 files changed, 11 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index e8d69fa2..6a79531c 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,14 @@ CHANGELOG - towerops-web ======================== +2026-02-11 - fix: handle "null" string values in SNMP parsing + - File: lib/towerops/snmp/profiles/base.ex (parse_integer/1, parse_float/1) + Added explicit handling for "null" string values before attempting integer/float + conversion. Some devices (e.g., AirOS 8.7.14) return the literal string "null" + for unavailable metrics like UCD CPU stats, which caused ArgumentError when + parse_integer/parse_float tried to convert them. Now returns nil, which gets + coerced to 0 by the || 0 fallback in the calling code. + 2026-02-11 - fix: deduplicate sensors with leading-dot OID differences - File: lib/towerops/snmp/profiles/dynamic.ex (deduplicate_by_oid/1) Normalized OIDs by stripping leading dots when grouping for deduplication. diff --git a/lib/towerops/snmp/profiles/base.ex b/lib/towerops/snmp/profiles/base.ex index 0dd85ec2..dd37ebd3 100644 --- a/lib/towerops/snmp/profiles/base.ex +++ b/lib/towerops/snmp/profiles/base.ex @@ -1434,11 +1434,14 @@ defmodule Towerops.Snmp.Profiles.Base do defp parse_integer(value) when is_integer(value), do: value defp parse_integer(""), do: nil + defp parse_integer("null"), do: nil defp parse_integer(value) when is_binary(value), do: String.to_integer(value) defp parse_integer(_), do: nil defp parse_float(value) when is_float(value), do: value defp parse_float(value) when is_integer(value), do: value / 1.0 + defp parse_float(""), do: nil + defp parse_float("null"), do: nil defp parse_float(value) when is_binary(value), do: String.to_float(value) defp parse_float(_), do: nil