SnmpKit ๐Ÿš€

IMPORTANT: Breaking changes in 1.0

  • Standardized result shape: all SNMP operations now return enriched maps per varbind: %{name?, oid, type, value, formatted?}
  • include_names: true by default (can be disabled per call or globally)
  • include_formatted: true by default (can be disabled to avoid formatting overhead)
  • Pretty helpers now preserve type and raw value and return the same enriched map shape
  • Migration guide: see docs/enriched-output-migration.md
  • Removed deprecated functions: get_with_type/3 and get_next_with_type/3 (use get/3 and get_next/3 which now always include type in the enriched map)
  • Multi-target APIs keep their outer return_format but inner items are enriched maps

Hex.pm Documentation License

A modern, comprehensive SNMP toolkit for Elixir - featuring a unified API, pure Elixir implementation, and powerful device simulation.

SnmpKit is a complete SNMP (Simple Network Management Protocol) solution built from the ground up in pure Elixir. It provides a clean, organized API for SNMP operations, MIB management, and realistic device simulation.

โœจ Key Features

Performance and result toggles

  • include_names: true by default; set include_names: false per call or via application config to skip reverse lookup and speed up response processing
  • include_formatted: true by default; set include_formatted: false to skip formatting and return raw values only

Examples

  • High-throughput walk without formatting or name resolution:
{:ok, rows} = SnmpKit.SNMP.walk("192.168.1.1", "ifTable", include_names: false, include_formatted: false)
# rows: [%{oid: "1.3.6...", type: :integer, value: 1}, ...]

Multi-target defaults (1.0)

  • Concurrent Multi is the default for multi-target operations (get_multi, get_bulk_multi, walk_multi)
  • Default SNMP version for multi-target operations is :v2c (override with version: :v1 if needed)
  • No manual engine/service start is required โ€” components are ensured at call time
  • Legacy/simple behavior is still available via strategy: :simple
  • Note: Single-target operations default to :v1 (configurable via SnmpKit.SnmpMgr.Config)
# Default: Concurrent Multi
{:ok, results} = SnmpKit.get_multi([{"h1", "sysDescr.0"}, {"h2", "sysUpTime.0"}])

# Legacy/simple path (opt-in)
{:ok, results} = SnmpKit.get_multi([{"h1", "sysDescr.0"}, {"h2", "sysUpTime.0"}], strategy: :simple)
  • ๐ŸŽฏ Unified API - Clean, context-based modules (SnmpKit.SNMP, SnmpKit.MIB, SnmpKit.Sim)
  • ๐Ÿงฌ Pure Elixir Implementation - No Erlang SNMP dependencies
  • ๐Ÿ“‹ Advanced MIB Support - Native parsing, compilation, and object resolution
  • ๐Ÿ–ฅ๏ธ Realistic Device Simulation - Create SNMP devices for testing and development
  • โšก High Performance - Optimized for large-scale operations and concurrent requests
  • ๐Ÿงช Testing Friendly - Comprehensive test helpers and simulated devices

๐Ÿš€ Quick Start

Installation

def deps do
  [
    {:snmpkit, "~> 1.0"}
  ]
end

Basic Usage

# Basic SNMP operations return enriched maps
{:ok, %{name: name, oid: oid, type: type, value: description, formatted: formatted}} =
  SnmpKit.SNMP.get("192.168.1.1", "sysDescr.0")

{:ok, system_info} = SnmpKit.SNMP.walk("192.168.1.1", "system")
# system_info: [
#   %{name: "sysDescr.0", oid: "1.3.6.1.2.1.1.1.0", type: :octet_string, value: "...", formatted: "..."},
#   ...
# ]

# MIB operations
{:ok, oid} = SnmpKit.MIB.resolve("sysDescr.0")
{:ok, name} = SnmpKit.MIB.reverse_lookup([1, 3, 6, 1, 2, 1, 1, 1, 0])

# Device simulation
device_profile = %{
  name: "Test Router",
  objects: %{[1, 3, 6, 1, 2, 1, 1, 1, 0] => "Test Router v1.0"}
}
{:ok, device} = SnmpKit.Sim.start_device(device_profile, port: 1161)

๐Ÿ—๏ธ Architecture

๐Ÿ“š Documentation

๐Ÿค Contributing

We welcome contributions! Please see the Contributing Guide for guidelines.

๐Ÿ“„ License

SnmpKit is released under the MIT License.


Ready to simplify your SNMP operations? Get started with SnmpKit today! ๐Ÿš€