towerops/lib/snmpkit.ex

192 lines
7.6 KiB
Elixir
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

defmodule SnmpKit do
@moduledoc """
Unified API for SnmpKit - A comprehensive SNMP toolkit for Elixir.
This module provides a clean, organized interface to all SnmpKit functionality
through context-based sub-modules:
- `SnmpKit.SNMP` - SNMP operations (get, walk, bulk, etc.)
- `SnmpKit.MIB` - MIB compilation, loading, and resolution
## Timeout Behavior
SnmpKit uses two types of timeouts:
### PDU Timeout (`:timeout` parameter)
- Controls how long to wait for each individual SNMP PDU response
- Default: 10 seconds for GET/GETBULK, 30 seconds for walks
- Applied per SNMP packet, not per operation
### Task Timeout (internal)
- Prevents operations from hanging indefinitely
- GET/GETBULK: PDU timeout + 1 second (safeguard)
- Walk operations: 20 minutes maximum (allows large table walks)
### Walk Operations
Walk operations may send many GETBULK PDUs to retrieve all data:
- Each PDU has its own timeout (PDU timeout)
- Large tables may need 50-200+ PDUs
- Total time = N_pdus × PDU_timeout (up to 20 minute maximum)
## Quick Examples
# SNMP Operations
{:ok, value} = SnmpKit.SNMP.get("192.168.1.1", "sysDescr.0")
{:ok, results} = SnmpKit.SNMP.walk("192.168.1.1", "system")
# With custom PDU timeout
{:ok, value} = SnmpKit.SNMP.get("192.168.1.1", "sysDescr.0", timeout: 15_000)
{:ok, results} = SnmpKit.SNMP.walk("192.168.1.1", "ifTable", timeout: 30_000)
# MIB Operations
{:ok, oid} = SnmpKit.MIB.resolve("sysDescr.0")
{:ok, compiled} = SnmpKit.MIB.compile("MY-MIB.mib")
For backward compatibility, many common operations are also available
directly on the main SnmpKit module.
"""
# Direct API for most common operations (backward compatibility)
defdelegate get(target, oid), to: SnmpKit.SnmpMgr
defdelegate get(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate get_next(target, oid), to: SnmpKit.SnmpMgr
defdelegate get_next(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate walk(target, oid), to: SnmpKit.SnmpMgr
defdelegate walk(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate set(target, oid, value), to: SnmpKit.SnmpMgr
defdelegate set(target, oid, value, opts), to: SnmpKit.SnmpMgr
defdelegate resolve(name), to: SnmpKit.SnmpMgr.MIB
# Bulk operations (top-level convenience)
defdelegate get_bulk(target, oid_or_oids), to: SnmpKit.SnmpMgr
defdelegate get_bulk(target, oid_or_oids, opts), to: SnmpKit.SnmpMgr
defdelegate bulk_walk(target, root_oid), to: SnmpKit.SnmpMgr
defdelegate bulk_walk(target, root_oid, opts), to: SnmpKit.SnmpMgr
# Walk table convenience
defdelegate walk_table(target, table_oid), to: SnmpKit.SnmpMgr
defdelegate walk_table(target, table_oid, opts), to: SnmpKit.SnmpMgr
defmodule SNMP do
@moduledoc """
SNMP client operations for querying and managing SNMP devices.
This module provides all SNMP protocol operations including:
- Basic operations: get, set, get_next
- Bulk operations: get_bulk, walk, table operations
- Pretty formatting
"""
# Core SNMP Operations
defdelegate get(target, oid), to: SnmpKit.SnmpMgr
defdelegate get(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate get_next(target, oid), to: SnmpKit.SnmpMgr
defdelegate get_next(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate set(target, oid, value), to: SnmpKit.SnmpMgr
defdelegate set(target, oid, value, opts), to: SnmpKit.SnmpMgr
# Async Operations
defdelegate get_async(target, oid), to: SnmpKit.SnmpMgr
defdelegate get_async(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate get_bulk_async(target, oid), to: SnmpKit.SnmpMgr
defdelegate get_bulk_async(target, oid, opts), to: SnmpKit.SnmpMgr
# Bulk Operations
defdelegate get_bulk(target, oid), to: SnmpKit.SnmpMgr
defdelegate get_bulk(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate bulk_walk(target, oid), to: SnmpKit.SnmpMgr
defdelegate bulk_walk(target, oid, opts), to: SnmpKit.SnmpMgr
@doc """
Like get_bulk/3 but raises on error.
"""
@spec get_bulk!(term(), term(), keyword()) :: term()
def get_bulk!(target, oid, opts \\ []) do
case get_bulk(target, oid, opts) do
{:ok, result} -> result
{:error, reason} -> raise("get_bulk! failed: #{inspect(reason)}")
end
end
@doc """
Like bulk_walk/3 but raises on error.
"""
@spec bulk_walk!(term(), term(), keyword()) :: term()
def bulk_walk!(target, root_oid, opts \\ []) do
case bulk_walk(target, root_oid, opts) do
{:ok, result} -> result
{:error, reason} -> raise("bulk_walk! failed: #{inspect(reason)}")
end
end
# Walk Operations
defdelegate walk(target, oid), to: SnmpKit.SnmpMgr
defdelegate walk(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate walk_table(target, table_oid), to: SnmpKit.SnmpMgr
defdelegate walk_table(target, table_oid, opts), to: SnmpKit.SnmpMgr
# Table Operations
defdelegate get_column(target, table_oid, column), to: SnmpKit.SnmpMgr
defdelegate get_column(target, table_oid, column, opts), to: SnmpKit.SnmpMgr
# Pretty Formatting
defdelegate get_pretty(target, oid), to: SnmpKit.SnmpMgr
defdelegate get_pretty(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate walk_pretty(target, oid), to: SnmpKit.SnmpMgr
defdelegate walk_pretty(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate bulk_pretty(target, oid), to: SnmpKit.SnmpMgr
defdelegate bulk_pretty(target, oid, opts), to: SnmpKit.SnmpMgr
defdelegate bulk_walk_pretty(target, oid), to: SnmpKit.SnmpMgr
defdelegate bulk_walk_pretty(target, oid, opts), to: SnmpKit.SnmpMgr
end
defmodule MIB do
@moduledoc """
MIB (Management Information Base) operations.
This module provides comprehensive MIB support including:
- MIB compilation from source files
- Loading and managing compiled MIBs
- OID name resolution and reverse lookup
- MIB tree navigation and analysis
"""
alias SnmpKit.SnmpMgr.MIB
# MIB Resolution and Lookup
defdelegate resolve(name), to: MIB
defdelegate reverse_lookup(oid), to: MIB
defdelegate children(oid), to: MIB
defdelegate parent(oid), to: MIB
defdelegate walk_tree(root_oid), to: MIB
defdelegate walk_tree(root_oid, opts), to: MIB
# High-level MIB Management (SnmpMgr.MIB)
defdelegate compile(mib_file), to: MIB
defdelegate compile(mib_file, opts), to: MIB
defdelegate compile_dir(directory), to: MIB
defdelegate compile_dir(directory, opts), to: MIB
defdelegate load(compiled_mib_path), to: MIB
defdelegate parse_mib_file(mib_file), to: MIB
defdelegate parse_mib_file(mib_file, opts), to: MIB
defdelegate parse_mib_content(content), to: MIB
defdelegate parse_mib_content(content, opts), to: MIB
defdelegate resolve_enhanced(name), to: MIB
defdelegate resolve_enhanced(name, opts), to: MIB
defdelegate load_and_integrate_mib(mib_file), to: MIB
defdelegate load_and_integrate_mib(mib_file, opts), to: MIB
defdelegate load_standard_mibs(), to: MIB
# Low-level MIB Compilation (SnmpLib.MIB)
defdelegate compile_raw(mib_source), to: SnmpKit.SnmpLib.MIB, as: :compile
defdelegate compile_raw(mib_source, opts), to: SnmpKit.SnmpLib.MIB, as: :compile
defdelegate compile_string(mib_content), to: SnmpKit.SnmpLib.MIB
defdelegate compile_string(mib_content, opts), to: SnmpKit.SnmpLib.MIB
defdelegate load_compiled(compiled_path), to: SnmpKit.SnmpLib.MIB
defdelegate compile_all(mib_files), to: SnmpKit.SnmpLib.MIB
defdelegate compile_all(mib_files, opts), to: SnmpKit.SnmpLib.MIB
# Registry Management
defdelegate start_link(), to: MIB
defdelegate start_link(opts), to: MIB
end
end