2010-12-15 73 views
2

我想做以下操作,但我不确定我是否使用了最佳方法:我的Perl脚本如何从管理系统接收SNMP陷阱?

在Sparc/Solaris 10计算机上运行的perl脚本应该等待传入的SNMP陷阱数据包(on例如端口162)。当它收到一个陷阱时,它应该对它进行解码并对其进行一些处理,然后重新等待下一个陷阱。

我已经研究过的Net :: SNMP由David M.镇,但我认为它仅允许发送请求和接收响应。我无法找到一个方法来等待这个文档中自发的陷阱消息: http://search.cpan.org/dist/Net-SNMP/lib/Net/SNMP.pm

的net-snmp软件包,在另一方面,似乎是一个非常稳健,很好用的库,但即使在那里的文档没有为我提供一条清晰的道路。 SNMP :: TrapSession允许我发送陷阱,但没有收到它们(?)。

一些使用Google搜索引擎的人建议我应该使用“snmptrapd”二进制文件并使用它的嵌入式Perl函数在snmptrapd收到消息时调用我的脚本。这可以工作,但是不切实际,因为嵌入式perl选项需要在没有大文件支持的情况下编译perl二进制文件。我不拥有目标系统,因此不能替换编译器/解释器。我可以用特别编译的perl发布我的软件,但那会给我我希望避免的跨平台问题。

我使用Perl而不是SNMP与SNMP4J或类似软件的原因是我的遗留Perl代码先前依赖于HP NNM的perl API,我需要转移到免费的软件后端以消除许可证费用。

+1

后连接电子邮件的NET-SNMP用户邮件列表中,我了解到,这个功能实际上在net-snmp的Perl API中不存在。我得到的建议是使用提供的snmptrapd程序,并让我的脚本解析其文本输出。这肯定会起作用,但我宁愿有权访问原始的BER数据,但我并不热衷于解析文本数据的可能性能。 最有可能的,我会用SNMP4J选项去 - 语言切换可能不是一个大问题。 – Jolta 2010-12-16 09:49:54

+0

如果有人感兴趣,我最终会去Java路线。一个简单的2线程设置工作正常:生产者通过Snmp4j侦听传入的陷阱,并将它们放在队列中。消费者(在单独的线程中)以FIFO为基础读取队列并进行处理。我能够在每秒钟大约400个陷阱中插入网络,而不会丢失网络端的任何内容。 相比之下,我不能让snmptrapd(NET-SNMP)接受超过每秒10-50陷阱,这是我的情况下,因素在于。 – Jolta 2011-01-12 13:59:53

回答

2

你正在寻找一个库程序来接收解析报文?您可以自己监听UDP数据包,然后将收到的数据包传递给snmp库以解析它们吗?这就是我正在做的,虽然我使用python而不是perl。

+0

最好我不必处理原始UDP数据并自己过滤掉SNMP数据包。这比用lib做更多的工作。 ;)但是,这应该是可能的,我所看过的每个SNMP lib都具有对BER数据进行编码/解码的功能,这只是我错过的“阻止监听”功能。 – Jolta 2010-12-16 09:41:57

2

如果你得到SNMP_Session库(这是完全Perl的BTW),你可以做这样的事情:

my $trap_session = SNMPv1_Session->open_trap_session(); 
my ($trap, $sender_addr, $sender_port) = $trap_session->receive_trap(); 
my @blah = $trap_session->decode_trap_request ($trap) 
+0

我假设$ trap_session-> receive_trap()是一个阻塞呼叫?这看起来就像我一直在寻找的东西。谢谢! – Jolta 2010-12-16 09:45:53