一个完全用Go编写的SNMP客户端库

1,696 阅读4分钟

gosnmp

Mentioned in Awesome Go

Build Status
PkgGoDev

GoSNMP是一个完全用Go编写的SNMP客户端库。它提供了Get,
GetNext, GetBulk, Walk, BulkWalk, Set和Traps。它支持IPv4和
IPv6,使用SNMPv1SNMPv2cSNMPv3
linux/amd64和linux/386进行了构建测试。

关于

gosnmpAndreas Louca开始,然后
,由Sonia Hamilton完全重写
(2012-2020),现在所有权已经转移到社区
gosnmp/gosnmp。

如需支持和帮助,请加入我们在
Gophers Slack的#snmp频道。

概述

GoSNMP具有以下SNMP功能。

  • 获取(单个或多个OID)
  • 获取下一个
  • GetBulk(仅SNMPv2c和SNMPv3)
  • Walk- 使用GETNEXT检索一个子树的值。
  • BulkWalk- 使用GETBULK检索一个子树的值(仅SNMPv2c和
    SNMPv3)。
  • BulkWalkAll- 类似于BulkWalk,但是返回一个包含所有值的填充数组,而不是使用回调函数来流转结果。
  • Set- 支持整数和八位数字符串。
  • SendTrap- 发送SNMP TRAPs。
  • Listen- 作为一个NMS来接收TRAPs。

GoSNMP有以下帮助函数。

  • ToBigInt- 将返回的值视为*big.Int
  • Partition- 便于划分大的OID片断

gosnmp/gosnmp已经完全脱离了alouca/gosnmp,你的代码
,需要在这些(和其他)地方进行修改。

  • Get函数有一个不同的方法签名
  • NewGoSNMP函数已被删除,使用Connect代替
    (见下面的用法)。Connect 使用GoSNMP 结构;
    gosnmp.Default 是提供给你使用的。
  • GoSNMP不再依赖alouca/gologger- 如果你的
    记录器符合gosnmp.LoggerInterface 接口,你可以使用它;否则
    调试将被禁用。
type

要启用日志,你必须调用gosnmp.NewLogger()函数,并传递一个指向你的日志接口的指针,例如用标准的*log.Logger。

gosnmp

g

你可以使用golang build标签 "gosnmp_nodebug "从你的应用程序中完全删除日志代码,例如。

go build -tags gosnmp_nodebug

这将完全禁用gosnmp库的日志记录,即使在代码中指定了logger接口。这提供了一个小的性能改进。

安装

go get github.com/gosnmp/gosnmp

文档

pkg.go.dev/github.com/…

使用方法

下面是examples/example/main.go ,演示了如何使用GoSNMP。

// Default is a pointer to a GoSNMP struct that contains sensible defaults

运行这个例子得到以下输出(来自我的打印机)。

% go run example.go
0: oid: 1.3.6.1.2.1.1.4.0 string: Administrator
1: oid: 1.3.6.1.2.1.1.7.0 number: 104
  • examples/example2.go 类似于 ,但是它使用了一个 自定义的 ,而不是example.go
    &GoSNMP g.Default
  • examples/walkexample.go 演示了使用BulkWalk
  • examples/example3.go 示范了SNMPv3
  • examples/trapserver.go 示范编写一个SNMP v2c陷阱服务器

MIB解析器

我没有任何计划写一个MIB解析器。其他人建议
github.com/sleepinggen…

贡献

欢迎投稿,尤其是有数据包捕获的投稿(见下文
)。

如果你从来没有为Go项目贡献过,这里有一个工作流程的例子。

  1. 在GitHub网页上叉开这个 repo
  2. go get github.com/gosnmp/gosnmp
  3. cd $GOPATH/src/github.com/gosnmp/gosnmp
  4. git remote rename origin upstream
  5. git remote add origin [[email protected]](https://golangexample.com/cdn-cgi/l/email-protection):<your-github-username>/gosnmp.git
  6. git checkout -b development
  7. git push -u origin development (设置推送位置,检查是否正常)

数据包抓取

按以下方式创建你的数据包捕获。

预期的输出,通过snmp命令获得。比如说。

% snmpget -On -v2c -c public 203.50.251.17 1.3.6.1.2.1.1.7.0 \
  1.3.6.1.2.1.2.2.1.2.6 1.3.6.1.2.1.2.2.1.5.3
.1.3.6.1.2.1.1.7.0 = INTEGER: 78
.1.3.6.1.2.1.2.2.1.2.6 = STRING: GigabitEthernet0
.1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 4294967295

数据包捕获,在运行snmpget时获得。例如:

sudo tcpdump -s 0 -i eth0 -w foo.pcap host 203.50.251.17 and port 161

漏洞

Rane的文件SNMP:简单?网络管理
协议
,在学习SNMP
协议时很有用。

请在
Github上创建一个带有数据包捕获的问题(将捕获上传至Google Drive、Dropbox或类似的
),其中包含缺少BER类型的样本,或你发现的任何其他bug
。如果可能的话,请包括2或3个丢失/有问题的BER类型的例子

以下BER类型已经实现。

  • 0x00 未知类型
  • 0x01 布尔型
  • 0x02 整数
  • 0x03 BitString
  • 0x04 八位数字符串
  • 0x05 空值
  • 0x06 对象标识符
  • 0x07 对象描述
  • 0x40 IPAddress (IPv4 & IPv6)
  • 0x41 计数器32
  • 0x42 Gauge32
  • 0x43 TimeTicks
  • 0x44 不透明 (浮点数和双数)
  • 0x45 NsapAddress
  • 0x46 Counter64
  • 0x47 Uinteger32
  • 0x78 不透明的浮点
  • 0x79 不透明的双数
  • 0x80 NoSuchObject
  • 0x81 NoSuchInstance
  • 0x82 EndOfMibView

运行测试

在Docker中进行本地测试

docker build -t gosnmp/gosnmp:latest 

export

测试分组如下。

  • 单元测试(验证数据打包和编排)。
    • marshal_test.go
    • misc_test.go
  • 公共API一致性测试。
    • gosnmp_api_test.go
  • 端到端集成测试。
    • generic_e2e_test.go

通用的端到端集成测试generic_e2e_test.go ,应该对任何符合SNMP MIB-2的主机(如路由器、NAS盒、打印机)进行

Mocks的生成是使用。

mockgen -source=interface.go -destination=mocks/gosnmp_mock.go -package=mocks

但是目前已经删除了,因为它们会破坏linting。

剖析cpu的使用。

go 

剖析内存使用情况。

go 

检查测试覆盖率。

go get github.com/axw/gocov/gocov
go get github.com/matm/gocov-html
gocov 

许可证

部分代码来自Golang项目(特别是一些用于解除误码率响应的
函数),其条款与Go语言的
和条件相同。其余的代码采用BSD
许可证。

更多细节请参见LICENSE文件。

其余代码的版权归GoSNMP作者所有 - 作者名单见
AUTHORS.md。

GitHub

查看Github