【发布时间】:2010-12-15 12:28:22
【问题描述】:
我想执行以下操作,但我不确定我是否使用了最好的方法:
在 Sparc/Solaris 10 机器上运行的 perl 脚本应该等待传入的 SNMP 陷阱数据包(例如在端口 162 上)。当它收到一个陷阱时,它应该对其进行解码并对其进行一些处理,然后继续等待下一个陷阱。
我研究过 David M. Town 的 Net::SNMP,但我认为它只允许发送请求和接收响应。我在本文档中找不到等待自发陷阱消息的方法: http://search.cpan.org/dist/Net-SNMP/lib/Net/SNMP.pm
另一方面,Net-SNMP 包似乎是一个非常强大且使用良好的库,但即使在那里,文档也没有为我提供清晰的路径。 SNMP::TrapSession 允许我发送陷阱,但不接收它们 (?)。
一些谷歌搜索让我得到建议,我应该使用“snmptrapd”二进制文件并使用它的嵌入式 perl 函数,以便在 snmptrapd 收到消息时调用我的脚本。这可以工作,但不切实际,因为嵌入式 perl 选项需要在没有大文件支持的情况下编译的 perl 二进制文件。我不拥有目标系统,因此无法替换编译器/解释器。我可以使用专门编译的 perl 来发布我的软件,但这会给我带来我希望避免的跨平台问题。
我使用 Perl 而不是 Java 与 SNMP4J 或类似的原因是,我有以前依赖于 HP NNM 的 perl API 的旧版 perl 代码,我需要迁移到免费软件后端以消除许可费用。
【问题讨论】:
-
通过电子邮件发送到net-snmp-users 邮件列表后,我了解到net-snmp 的Perl API 中实际上不存在此功能。我得到的建议是使用提供的 snmptrapd 程序并让我的脚本解析其文本输出。这肯定会奏效,但我更愿意访问原始 BER 数据,而且我不热衷于解析文本数据可能带来的性能损失。最有可能的是,我会选择 Snmp4j 选项 - 语言切换可能不是什么大问题。
-
如果有人感兴趣,我最终选择了 Java 路线。一个简单的 2 线程设置工作正常:生产者通过 Snmp4j 监听传入的陷阱,并将它们放入队列中。消费者(在单独的线程中)基于 FIFO 读取队列并进行处理。我每秒可以将大约 400 个陷阱挤入其中,而不会在网络端丢弃任何东西。相比之下,我无法让 snmptrapd (net-snmp) 每秒接受超过 10-50 个陷阱,这在我的情况下是个大问题。