2010-12-15 74 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