2010-12-15 6 views
2

다음과 같이하고 싶지만 최선의 방법을 사용하고 있는지 잘 모르겠습니다.내 perl 스크립트가 관리되는 시스템에서 SNMP 트랩을 수신하려면 어떻게해야합니까?

Sparc/Solaris 10 시스템에서 실행중인 perl 스크립트는 들어오는 SNMP 트랩 패킷을 기다려야합니다 (on 예를 들어 포트 162). 트랩을 받으면 디코드하여 처리하고 다음 트랩을 기다리는 것을 다시 시작해야합니다.

David M. Town의 Net :: SNMP를 살펴 보았지만 요청을 보내고 응답 만받을 수 있다고 생각합니다. 나는이 문서에서 자발적 트랩 메시지를 기다리는 방법을 찾을 수 없다 : http://search.cpan.org/dist/Net-SNMP/lib/Net/SNMP.pm

반면 Net-SNMP 패키지는 매우 견고하고 잘 사용되는 라이브러리처럼 보이지만 그곳에는 문서 명확한 경로를 제공하지 않습니다. SNMP :: TrapSession은 트랩을 보낼 수는 있지만받을 수는 없습니다 (?).

일부 인터넷 검색은 "snmptrapd"바이너리를 사용해야하고 snmptrapd가 메시지를받을 때 스크립트를 호출하기 위해 내장 된 펄 기능을 사용해야한다고 제안합니다. 이것은 작동하지만 임베디드 펄 옵션은 커다란 파일 지원없이 컴파일 된 펄 바이너리를 필요로하기 때문에 비실용적이다. 나는 타겟 시스템을 가지고 있지 않으므로 컴파일러/인터프리터를 대체 할 수 없다. 필자는 특별히 컴파일 된 펄을 사용하여 소프트웨어를 제공 할 수 있었지만, 필자가 피하려고했던 크로스 플랫폼 문제를 해결할 수있었습니다.

내가 SNMP4J 또는 그와 유사한 Java를 사용하지 않고 Perl을 사용하는 이유는 이전에 HP NNM의 perl API에 의존했던 기존 perl 코드가 있기 때문에 무료 소프트웨어 백엔드로 이동해야합니다. 라이센스 비용.

+1

후 실제로 net-snmp의 Perl API에는 존재하지 않습니다. 내가 가진 권고는 제공된 snmptrapd 프로그램을 사용하고 스크립트가 텍스트 출력을 구문 분석하도록하는 것이었다. 이것은 정상적으로 작동 할 것입니다. 그러나 원시 BER 데이터에 액세스하는 것을 선호하며 텍스트 데이터를 구문 분석 할 때 예상되는 성능 저하를 몹시 좋아하지 않습니다. 아마도 Snmp4j 옵션을 사용할 것입니다. 언어 스위치가 큰 문제는 아닐 수도 있습니다. – Jolta

+0

누구든지 관심이있는 경우 Java 경로를 종료했습니다. 간단한 2 스레드 설정이 잘 작동합니다. Producer는 Snmp4j를 통해 들어오는 트랩을 수신 대기열에 넣습니다. 소비자 (별도의 스레드에서)는 FIFO 단위로 큐를 읽고 처리합니다. 네트워크 측에서 아무 것도 떨어 뜨리지 않고 초당 약 400 개의 트랩을 넣을 수 있습니다. 대조적으로 snmptrapd (net-snmp)는 초당 10-50 개 이상의 트랩을 허용하지는 않습니다. 이는 제 경우의 딜 브레이커입니다. – Jolta

답변

2

SNMP 트랩을 구문 분석하기 위해 Perl 라이브러리 SNMP_Session.pm을 사용하는 간단한 예제는 Essential SNMP - page 194입니다.

+1

감사합니다! 처음에 SNMP_Session lib를 가리 키기 때문에이 대답을 받아 들일 것입니다. – Jolta

2

패킷을 구문 분석하는 라이브러리 루틴을 찾으십니까? UDP 패킷을 직접 수신 한 다음 수신 한 모든 패킷을 snmp 라이브러리로 전달하여 구문 분석 할 수 있습니까? 내가 Perl이 아닌 Python을 사용하고 있지만 그게 내가하고있는 일이다.

+0

바람직하게는 원시 UDP 데이터를 처리하고 SNMP 패킷을 직접 필터링하지 않아도됩니다. 그게 lib를하는 것보다 더 많은 일이 될 것입니다. ;)하지만 그래, 그게 가능해야합니다, 내가 본 모든 SNMP는 lib는 BER 데이터를 인코딩/디코딩하는 기능을 가지고, 그냥 누락되었습니다 "차단 들어"기능입니다. – Jolta

2

당신은 당신이 같은 일을 할 수있다 (BTW 완전히 펄 임) SNMP_Session 라이브러리를 얻을 경우 메일 링리스트 NET-SNMP-사용자에게 이메일 도중,이 기능 배운

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