SNMP (net-snmp)
v0.2.4Read a network device over SNMP with the net-snmp CLI — system group, interface table, BGP peers (BGP4-MIB) and OSPF neighbors / general group (OSPF-MIB), plus a generic single-OID get and a bounded subtree walk. The routing reads exist to give operators visibility into BGP / OSPF state on devices this control plane can't reach by a native API — e.g. a pfSense + FRR edge firewall, where the REST API exposes no routing-protocol state. All read-only.
snmpget
snmpbulkwalk
Install
emisar pack install
fetches this pack, re-validates it, and verifies its content hash against the
--hash
below — the exact bytes this page was rendered against, so a tampered copy is
rejected — before copying it into the runner's packs dir. The command reloads a
running daemon itself; no manual restart.
sudo emisar pack install snmp --hash sha256:b63c4b702fcfd4669ff8b7387693ea478a997cae6be0053b69b1dddd4dcdee08
Setup
Every action runs a net-snmp client (snmpget / snmpbulkwalk) against the {{ args.host }} you pass, after requiring that exact destination in
SNMP_ALLOWED_HOSTS
. Install net-snmp on the runner host (Debian: apt-get install snmp), enable SNMP on each target device, and set the credentials below.
Environment
Set these on the runner host, then add each name to
execution.inherit_env
so the value reaches the action.
-
SNMP_ALLOWED_HOSTSrequiredComma-separated exact device hostnames, IP addresses, or
host:portdestinations that actions may target. Matching is ASCII case-insensitive; entries do not accept wildcards, CIDRs, URLs, or spaces. -
SNMP_VERSIONdefault 2cSNMP version — "1", "2c" (default), or "3". The table reads use GETBULK, so they need 2c or 3. Prefer 3 (authPriv) on any untrusted path: v1/v2c send the community in cleartext on the wire.
-
SNMP_COMMUNITYThe read-only community string (SNMP v1/v2c). Written to a transient snmp.conf the tool reads via SNMPCONFPATH, so it never appears in the process arguments or the audit log. Use a least-privilege RO community.
-
SNMP_USERSNMPv3 security (user) name.
-
SNMP_LEVELdefault authPrivSNMPv3 security level: noAuthNoPriv, authNoPriv, or authPriv (default).
-
SNMP_AUTH_PROTOdefault SHASNMPv3 authentication protocol (e.g. SHA, SHA-256, MD5).
-
SNMP_AUTH_PASSSNMPv3 authentication passphrase. Streamed via snmp.conf, never in argv.
-
SNMP_PRIV_PROTOdefault AESSNMPv3 privacy (encryption) protocol (e.g. AES, AES-256, DES).
-
SNMP_PRIV_PASSSNMPv3 privacy passphrase. Streamed via snmp.conf, never in argv.
Notes
-
SNMP_ALLOWED_HOSTSand any SNMP credentials or protocol settings you set (SNMP_COMMUNITY,SNMP_USER,SNMP_AUTH_PASS,SNMP_PRIV_PASS,SNMP_VERSION,SNMP_LEVEL, and the protocol choices) must also be allowlisted in the runner'sexecution.inherit_env— the action env is scrubbed to PATH/LANG/LC_ALL/TERM by default, so a variable present on the host but not inherited is silently dropped and the call is refused or fails authentication. -
Actions query by NUMERIC OID so they work without MIB files (Debian's
snmppackage ships none by default —mibs :is commented out). Output is therefore numeric too; each routing action's description maps the columns and decodes the state enums. Installsnmp-mibs-downloaderon the runner for symbolic names if you prefer. - Enable SNMP on the device first. pfSense: Services → SNMP (set an RO community, bind it to the management interface, not WAN). The host arg is the device address; an unreachable device or wrong community fails the action (non-zero exit), it is not reported as empty.
-
BGP4-MIB / OSPF-MIB are not served by the base snmpd — FRR exports them over AgentX. On the firewall/router, enable AgentX in FRR (
agentxin the daemon config) and run bgpd/ospfd with the SNMP module, and setmaster agentxin snmpd.conf. Without that, bgp_peers / ospf_* return nothing even though SNMP itself works (snmp.system will still answer). - This pack only reads. SNMP SET (writes) is intentionally not implemented — community-based SET is a notorious abuse surface, and emisar mutators belong in device-native, auditable packs.
Verify it works
Runs snmp.system, a low-risk
read that confirms the pack can reach its target. Run it on the host once the pack
is installed; pack install runs it for
you.
sudo emisar pack verify snmp
Install and configure a pack walks through the whole sequence on a host.
Actions 7 total
View on GitHub-
snmp.bgp_peers script low Low — read-only or trivially reversible
snmpwalk BGP4-MIB bgpPeerTable (1.3.6.1.2.1.15.3)
List BGP peers from BGP4-MIB bgpPeerTable — per-peer bgpPeerState (.2: 1=idle 2=connect 3=active 4=opensent 5=openconfirm 6=established), bgpPeerAdminStatus (.3: 1=stop 2=start), bgpPeerRemoteAddr (.7), bgpPeerRemoteAs (.9), in/out updates (.10/.11), and bgpPeerFsmEstablishedTime (.16). The right read for "is the BGP session up?" on a router or firewall (e.g. pfSense + FRR) that this control plane can't reach by a native API. Walks 1.3.6.1.2.1.15.3.
View source on GitHub -
snmp.get script low Low — read-only or trivially reversible
snmpget a single OID
Get a single SNMP object by OID — one snmpget. Use for a specific scalar the curated reads don't cover (e.g. a vendor MIB value). Give a numeric OID like 1.3.6.1.2.1.1.5.0, or a symbolic one (SNMPv2-MIB::sysName.0) if the device's MIBs are installed on the runner.
View source on GitHub -
snmp.interfaces script low Low — read-only or trivially reversible
snmpwalk IF-MIB ifTable (1.3.6.1.2.1.2.2)
List a device's interfaces from IF-MIB ifTable — per-interface ifDescr (.2), ifType (.3), ifSpeed (.5), ifAdminStatus (.7: 1=up 2=down), ifOperStatus (.8: 1=up 2=down), and in/out octets (.10/.16) and errors (.14/.20). Use to spot a down or errored link. Walks 1.3.6.1.2.1.2.2.
View source on GitHub -
snmp.ospf_general script low Low — read-only or trivially reversible
snmpwalk OSPF-MIB ospfGeneralGroup (1.3.6.1.2.1.14.1)
Show the OSPF general group from OSPF-MIB — ospfRouterId (.1), ospfAdminStat (.2: 1=enabled 2=disabled), ospfVersionNumber (.3), and the area-border / AS-border router flags (.4/.5). Use to confirm OSPF is enabled and read the router id. Walks 1.3.6.1.2.1.14.1.
View source on GitHub -
snmp.ospf_neighbors script low Low — read-only or trivially reversible
snmpwalk OSPF-MIB ospfNbrTable (1.3.6.1.2.1.14.10)
List OSPF neighbors from OSPF-MIB ospfNbrTable — per-neighbor ospfNbrIpAddr (.1), ospfNbrRtrId (.3), and ospfNbrState (.6: 1=down 2=attempt 3=init 4=twoWay 5=exchangeStart 6=exchange 7=loading 8=full). A healthy adjacency is 8=full (or 4=twoWay on a DR-other). Use to confirm OSPFv2 adjacencies. Walks 1.3.6.1.2.1.14.10. (OSPFv3 lives in OSPFV3-MIB — use snmp.walk.)
View source on GitHub -
snmp.system script low Low — read-only or trivially reversible
snmpwalk system group (1.3.6.1.2.1.1)
Show the SNMP system group of a device — sysDescr (model/OS), sysObjectID, sysUpTime, sysContact, sysName, sysLocation. The first stop to confirm SNMP works and identify what the device is. Walks 1.3.6.1.2.1.1.
View source on GitHub -
snmp.walk script low Low — read-only or trivially reversible
snmpwalk an OID subtree
Walk an SNMP subtree by root OID — one snmpbulkwalk (requires SNMP v2c or v3). Use to read a table or MIB the curated reads don't cover (e.g. OSPFV3-MIB 1.3.6.1.2.1.191, or a vendor table). Output is capped, so a very large subtree is truncated; narrow the root OID. Give a numeric OID, or a symbolic one if the device's MIBs are installed on the runner.
View source on GitHub