5 个版本

使用旧 Rust 2015

0.2.2 2017年4月5日
0.2.1 2017年1月22日
0.2.0 2017年1月22日
0.1.1 2016年10月5日
0.1.0 2016年10月4日

#50 in #synchronous

Download history 167/week @ 2024-02-26 299/week @ 2024-03-04 45/week @ 2024-03-11 109/week @ 2024-03-18 19/week @ 2024-03-25 76/week @ 2024-04-01 38/week @ 2024-04-08 52/week @ 2024-04-15 38/week @ 2024-04-22 41/week @ 2024-04-29 30/week @ 2024-05-06 41/week @ 2024-05-13 38/week @ 2024-05-20 56/week @ 2024-05-27 62/week @ 2024-06-03 52/week @ 2024-06-10

217 每月下载量
用于 roboplc

MIT/Apache

49KB
1K SLoC

RUST-SNMP

纯 Rust 的 SNMPv2 客户端库,无需依赖。

Documentation Build Status


lib.rs:

RUST-SNMP

纯 Rust 的 SNMPv2 客户端库,无需依赖。

支持

  • GET
  • GETNEXT
  • GETBULK
  • SET
  • 基本的 SNMPv2 类型
  • 同步请求
  • UDP 传输

目前不支持

  • SNMPv1
  • SNMPv3
  • MIBs
  • 异步请求
  • 除 UDP 以外的传输

待办事项

  • 异步请求
  • 遍历功能
  • 额外的 ObjectIdentifier 工具方法
  • 解耦 PDU 构建/解析与套接字处理
  • SNMPv3(需要外部依赖)

示例

GET NEXT

use std::time::Duration;
use snmp::{SyncSession, Value};

let sys_descr_oid = &[1,3,6,1,2,1,1,1,];
let agent_addr    = "198.51.100.123:161";
let community     = b"f00b4r";
let timeout       = Duration::from_secs(2);

let mut sess = SyncSession::new(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 snmp::SyncSession;

let system_oid      = &[1,3,6,1,2,1,1,];
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(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 snmp::{SyncSession, Value};

let syscontact_oid  = &[1,3,6,1,2,1,1,4,0];
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(agent_addr, community, Some(timeout), 0).unwrap();
let response = sess.set(&[(syscontact_oid, contact)]).unwrap();

assert_eq!(response.error_status, snmp::snmp::ERRSTATUS_NOERROR);
for (name, val) in response.varbinds {
    println!("{} => {:?}", name, val);
}

无运行时依赖