Expand description
RUST-SNMP
Dependency-free basic SNMP v1/v2 client in Rust.
This is a fork of the original snmp crate which has been abandoned long time ago.
New features added to the fork:
- SNMP v1 support
- MIBs support (requires
libnetsnmp) - Crate code has been refactored and cleaned up
- OIDs have been migrated to asn1 (via der-parser)
Supports:
- GET
- GETNEXT
- GETBULK
- SET
- Basic SNMP v1/v2 types
- Synchronous requests
- UDP transport
- MIBs (with
mibsfeature, requireslibnetsnmp)
Currently does not support:
- SNMPv3
§TODO
- Transport-agnostic API
- SNMPv3
§Examples
§GET NEXT
use std::time::Duration;
use snmp2::{SyncSession, Value, Oid};
let sys_descr_oid = Oid::from(&[1,3,6,1,2,1,1,1,]).unwrap();
let agent_addr = "198.51.100.123:161";
let community = b"f00b4r";
let timeout = Duration::from_secs(2);
let mut sess = SyncSession::new_v2c(agent_addr, community, Some(timeout), 0).unwrap();
let mut response = sess.getnext(&sys_descr_oid).unwrap();
if let Some((_oid, Value::OctetString(sys_descr))) = response.varbinds.next() {
println!("myrouter sysDescr: {}", String::from_utf8_lossy(sys_descr));
}§GET BULK
use std::time::Duration;
use snmp2::{SyncSession, Oid};
let system_oid = Oid::from(&[1,3,6,1,2,1,1,]).unwrap();
let agent_addr = "[2001:db8:f00:b413::abc]:161";
let community = b"f00b4r";
let timeout = Duration::from_secs(2);
let non_repeaters = 0;
let max_repetitions = 7; // number of items in "system" OID
let mut sess = SyncSession::new_v2c(agent_addr, community, Some(timeout), 0).unwrap();
let response = sess.getbulk(&[&system_oid], non_repeaters, max_repetitions).unwrap();
for (name, val) in response.varbinds {
println!("{} => {:?}", name, val);
}§SET
use std::time::Duration;
use snmp2::{SyncSession, Value, Oid};
let syscontact_oid = Oid::from(&[1,3,6,1,2,1,1,4,0]).unwrap();
let contact = Value::OctetString(b"Thomas A. Anderson");
let agent_addr = "[2001:db8:f00:b413::abc]:161";
let community = b"f00b4r";
let timeout = Duration::from_secs(2);
let mut sess = SyncSession::new_v2c(agent_addr, community, Some(timeout), 0).unwrap();
let response = sess.set(&[(&syscontact_oid, contact)]).unwrap();
assert_eq!(response.error_status, snmp2::snmp::ERRSTATUS_NOERROR);
for (name, val) in response.varbinds {
println!("{} => {:?}", name, val);
}§Working with MIBs
Prepare the system
apt-get install libsnmp-dev snmp-mibs-downloaderⓘ
use snmp2::{mibs::{self, MibConversion as _}, Oid};
mibs::init(&mibs::Config::new().mibs(&["./ibmConvergedPowerSystems.mib"]))
.unwrap();
let snmp_oid = Oid::from(&[1, 3, 6, 1, 4, 1, 2, 6, 201, 3]).unwrap();
let name = snmp_oid.mib_name().unwrap();
assert_eq!(name, "IBM-CPS-MIB::cpsSystemSendTrap");
let snmp_oid2 = Oid::from_mib_name(&name).unwrap();
assert_eq!(snmp_oid, snmp_oid2);§Copyright
Copyright 2016 Hroi Sigurdsson
Copyright 2024 Serhij Symonenko, Bohemia Automation Limited
Licensed under the Apache License, Version 2.0 or the MIT license, at your option. This file may not be copied, modified, or distributed except according to those terms.
Modules§
Structs§
- ASN.1/DER decoder iterator.
- Object ID (OID) representation which can be relative or non-relative. An example for an OID in string representation is
"1.2.840.113549.1.1.5". - Synchronous SNMPv2 client.
Enums§
- SNMP error type.
- SNMP protocol version.