From 6c6b68f8fb1bf28077708a841b9b240d37e2f862 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Sat, 17 Jan 2026 18:18:38 -0600 Subject: [PATCH] fix: normalize OID format for sysObjectID matching LibreNMS uses leading dot format (.1.3.6.1...) but SNMP returns OIDs without leading dot (1.3.6.1...). Normalize by prepending dot to sys_object_id before matching, and use starts_with instead of contains for more accurate prefix matching. --- lib/towerops/device_profiles.ex | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/towerops/device_profiles.ex b/lib/towerops/device_profiles.ex index ebce23a6..fbb8a847 100644 --- a/lib/towerops/device_profiles.ex +++ b/lib/towerops/device_profiles.ex @@ -170,12 +170,17 @@ defmodule Towerops.DeviceProfiles do defp match_rule?(%DetectionRule{rule_type: "sysObjectID"} = rule, system_info) do sys_object_id = Map.get(system_info, :sys_object_id, "") + # Normalize OID - prepend dot if not present for pattern matching + # LibreNMS uses ".1.3.6.1..." format, SNMP returns "1.3.6.1..." format + normalized_oid = if String.starts_with?(sys_object_id, "."), do: sys_object_id, else: "." <> sys_object_id + cond do rule.pattern && rule.pattern != "" -> - String.contains?(sys_object_id, rule.pattern) + String.starts_with?(normalized_oid, rule.pattern) rule.value && rule.value != "" -> - sys_object_id == rule.value + normalized_value = if String.starts_with?(rule.value, "."), do: rule.value, else: "." <> rule.value + normalized_oid == normalized_value true -> false