From 028f2600a2b96d537143a302fe615d6379669ba7 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Mon, 19 Jan 2026 14:06:51 -0600 Subject: [PATCH] Auto-expand MIB directories to include subdirectories - Update MibTranslator to automatically expand configured MIB directories - snmptranslate doesn't search recursively, so we explicitly list all subdirs - Simplify config to only specify root priv/mibs directory - Update both config.exs (production) and dev.exs (development) - Subdirectories like mikrotik/, cisco/, net-snmp/ are auto-discovered --- config/config.exs | 4 +--- config/dev.exs | 8 ++------ lib/towerops/snmp/mib_translator.ex | 31 +++++++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/config/config.exs b/config/config.exs index ee5935ac..4b87d3a1 100644 --- a/config/config.exs +++ b/config/config.exs @@ -90,12 +90,10 @@ config :towerops, ToweropsWeb.Endpoint, # SNMP MIB directories for production (in Docker image) # MIB files are included in the release at /app/priv/mibs +# MibTranslator automatically expands these to include subdirectories # Override in dev.exs for local development paths config :towerops, :mib_dirs, [ "/app/priv/mibs", - "/app/priv/mibs/mikrotik", - "/app/priv/mibs/cisco", - "/app/priv/mibs/net-snmp", "/usr/share/snmp/mibs" ] diff --git a/config/dev.exs b/config/dev.exs index 3a6e74b4..20123b1a 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -98,14 +98,10 @@ config :towerops, :env, :dev # Configure SNMP MIB directories for development # Point to local priv/mibs subdirectories where MIB files are stored # Note: The root mibs/ directory only contains symlinks to LibreNMS repo +# SNMP MIB directories for development +# MibTranslator automatically expands these to include subdirectories config :towerops, :mib_dirs, [ - # Standard MIBs in priv/mibs root Path.join([File.cwd!(), "priv", "mibs"]), - # Vendor-specific MIB directories - Path.join([File.cwd!(), "priv", "mibs", "mikrotik"]), - Path.join([File.cwd!(), "priv", "mibs", "cisco"]), - Path.join([File.cwd!(), "priv", "mibs", "net-snmp"]), - # System MIBs as fallback "/usr/share/snmp/mibs" ] diff --git a/lib/towerops/snmp/mib_translator.ex b/lib/towerops/snmp/mib_translator.ex index fd7a5572..59d20afb 100644 --- a/lib/towerops/snmp/mib_translator.ex +++ b/lib/towerops/snmp/mib_translator.ex @@ -57,9 +57,13 @@ defmodule Towerops.Snmp.MibTranslator do defp translate_mib_name(mib_name) do # Get MIB directories from config or use default - mib_dirs = Application.get_env(:towerops, :mib_dirs, ["/app/mibs", "/usr/share/snmp/mibs"]) + mib_dirs = Application.get_env(:towerops, :mib_dirs, ["/app/priv/mibs", "/usr/share/snmp/mibs"]) + + # Expand directories to include subdirectories (snmptranslate doesn't search recursively) + expanded_dirs = Enum.flat_map(mib_dirs, &expand_mib_directory/1) + # snmptranslate requires colon-separated paths with + prefix for each directory - mib_path = Enum.map_join(mib_dirs, ":", fn dir -> "+#{dir}" end) + mib_path = Enum.map_join(expanded_dirs, ":", fn dir -> "+#{dir}" end) mib_dir_args = if mib_path == "", do: [], else: ["-M", mib_path] # Use snmptranslate to convert MIB name to numeric OID @@ -83,4 +87,27 @@ defmodule Towerops.Snmp.MibTranslator do Logger.error("snmptranslate command failed: #{inspect(e)}") {:error, :command_not_found} end + + # Expand a MIB directory to include itself and all subdirectories + # snmptranslate doesn't search recursively, so we need to explicitly list all dirs + defp expand_mib_directory(dir) do + if File.exists?(dir) and File.dir?(dir) do + # Include the directory itself + subdirs = + dir + |> File.ls!() + |> Enum.map(&Path.join(dir, &1)) + |> Enum.filter(&File.dir?/1) + |> Enum.reject(fn subdir -> + # Skip hidden directories and common non-MIB directories + basename = Path.basename(subdir) + String.starts_with?(basename, ".") or basename in ["lost+found"] + end) + + [dir | subdirs] + else + # Directory doesn't exist, return empty list + [] + end + end end