我想做以下操作,但我不確定我是否使用了最佳方法:我的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,我需要轉移到免費的軟件後端以消除許可證費用。
後連接電子郵件的NET-SNMP用戶郵件列表中,我瞭解到,這個功能實際上在net-snmp的Perl API中不存在。我得到的建議是使用提供的snmptrapd程序,並讓我的腳本解析其文本輸出。這肯定會起作用,但我寧願有權訪問原始的BER數據,但我並不熱衷於解析文本數據的可能性能。 最有可能的,我會用SNMP4J選項去 - 語言切換可能不是一個大問題。 – Jolta 2010-12-16 09:49:54
如果有人感興趣,我最終會去Java路線。一個簡單的2線程設置工作正常:生產者通過Snmp4j偵聽傳入的陷阱,並將它們放在隊列中。消費者(在單獨的線程中)以FIFO爲基礎讀取隊列並進行處理。我能夠在每秒鐘大約400個陷阱中插入網絡,而不會丟失網絡端的任何內容。 相比之下,我不能讓snmptrapd(NET-SNMP)接受超過每秒10-50陷阱,這是我的情況下,因素在於。 – Jolta 2011-01-12 13:59:53