Wie kann ich analysieren eine raw SNMP-trap in Perl?
Vor ein paar Wochen schrieb ich einen SNMP-relayer für unser ops-Gruppe. Sie haben einige dumme Geräte, die nur senden von traps an eine einzige IP, und wir haben ein monitoring-system überwacht, auf mehrere IPs für die Verfügbarkeit. Der code ist tot einfach und praktisch:
while (recv($packet)) {
foreach $target (@targets) {
send($target, $packet);
}
}
Es wird gearbeitet, im Grunde genommen, aber jetzt ist das offensichtlich zu kurz kommen, dass es nicht die Absender-IP ist ein Problem (anscheinend die erste Klasse des Geräts, inklusive der info, wie ein varbind und einige neue Klasse nicht).
Was ich tun möchte ist mein code so etwas wie dieses:
while ($server->recv($packet)) {
my $obj = decompile($packet)
if (!$obj->{varbind}{snmpTrapAddress}) {
$obj->{varbind}{snmpTrapAddress} = inet_ntoa($server->peeraddr());
}
$packet = compile($obj);
foreach $target (@targets) {
send($target, $packet);
}
}
In anderen Worten, wenn mein sender ist nicht darunter snmpTrapAddress, fügen Sie es hinzu. Das problem ist, dass jeder SNMP-Paket habe ich mir angeschaut, für Perl scheint sehr stark konzentriert auf die Infrastruktur der Empfang von traps und darstellende bekommt.
Also: gibt es eine einfache Perl-Modul, dass wird mir erlauben, zu sagen "hier ist ein Daten-blob repräsentiert eine snmp-trap. Sie entschlüsseln in etwas ich kann leicht manipulieren, dann kompilieren Sie es wieder in einen blob, die ich werfen kann, die über das Netzwerk"?
Wenn die Antwort, die Sie geben, ist "verwenden von SNMP-dummy", bieten Sie Beispiele dafür? Ich kann nur blind sein, sondern von der Ausgabe von perldoc SNMP es ist mir nicht klar, wie es zu benutzen auf diese Weise.
EDIT:
Stellt sich heraus, nachdem Sie sich ein wenig um, dass "SNMP-encoding" ist wirklich ASN.1 BER (Basic Encoding Rules). Auf dieser Basis bin ich mit einem gehen mit Convert::BER. Ich würde es dennoch begrüßen alle leicht brechen/Bearbeiten/neu erstellen-Tipps für SNMP.
- Ich weiß nicht, etwas über
SNMP
aberNet-SNMP
hat eineNet::SNMP::Message
Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich nie die perfekte Lösung. Net::SNMP::Message (Teil Net::SNMP) ermöglichen könnten, diese aber nicht zu haben scheinen eine öffentlich definierte Schnittstelle, und keiner von Net::SNMP-Schnittstelle schien besonders relevant. NSNMP ist am nächsten an den Geist von dem, was ich gesucht hatte, aber es ist spröde und hat nicht funktioniert für mein Paket aus der box und wenn ich dabei bin, zu unterstützen spröde code, es geht um meine eigene spröde code =).
Mo::SNMP bekam auch in der Nähe, was ich suchte, aber es war auch defekt, out of the box. Es scheint verlassen, mit dem letzten release im Jahr 2001 und die Entwickler die letzten CPAN-release im Jahr 2002. Ich wusste nicht, dass es an der Zeit, aber ich denke heute, dass es kaputt ist, weil eine änderung in der Schnittstelle zu den Convert::BER-Modul verwendet.
Mon::SNMP, hab mir zeigte in Richtung Convert::BER. Ein paar tausend liest der Convert::BER-POD, Mo::SNMP-Quelle, und RFC 1157 (esp. 4.1.6, "Die Trap-PDU") später und ich kam mit diesem code als proof-of-concept machen, was ich wollte. Das ist nur proof-of-concept (aus Gründen, die ich beschreiben werde, nach dem code) also kann es nicht perfekt sein, aber ich dachte, dass es möglicherweise nützliche Referenz für zukünftige Perl-Leute in diesem Bereich arbeiten, also hier ist es:
So, das ist es. Hier ist der kicker. Ich nahm die ops an Ihr Wort, dass Sie nicht immer die IP-Adresse des ursprünglichen Absender in die Falle. Während der Arbeit durch dieses Beispiel habe ich gefunden, dass, zumindest in dem Beispiel, das Sie Gaben mir die original-IP war in der agent-addr-Feld in der Falle. Danach zeigt Sie, und wo in der API des Tools Ihre Verwendung dieser ausgesetzt ist, gingen Sie Weg, um zu versuchen, um die änderung an Ihrem Ende. Ich bin daving den code oben gegen die Zeit, die Sie mich Fragen, für etwas, was ich wirklich brauchen, um den dreck in der Schachtel, aber für jetzt, die oben noch nicht streng geprüft proof-of-concept-code. Hoffe es hilft jemandem eines Tages.
Haben Sie versucht,NSNMP?
Definitiv Auschecken SNMP_Session.
http://code.google.com/p/snmp-session/
Stellen Sie sicher, Folgen Sie den links zu den alten Verteilung Website, die hat mehrere Beispiele.
Habe ich im Grunde reiste denselben Weg durch die Mo::SNMP, Convert::BER, TCP/IP Illustrated, etc.. SNMP_Session ist das einzige, was ich in der Lage gewesen, zu arbeiten. Durch die Arbeit, ich meine akzeptieren, eine SNMP-trap-UDP-port 162 und dekodiert es in einer string-Entsprechungen für Protokollierung, ohne neu zu erfinden, mehrere Räder. Ich bin nur mit der receive-trap-Funktionalität, aber ich denke, es kann tun, was Sie wollen, auch.
Es ist auf Google Code, nicht CPAN aber so ist es ein wenig schwer zu finden.