2010-12-15 37 views
2

Je voudrais faire ce qui suit, mais je ne suis pas sûr d'utiliser la meilleure méthode:Comment mon script Perl peut-il recevoir les interruptions SNMP d'un système géré?

Un script Perl, s'exécutant sur une machine Sparc/Solaris 10, doit attendre les paquets d'interruption SNMP entrants port 162 par exemple). Quand il reçoit un piège, il doit le décoder et y faire un traitement, puis reprendre l'attente du prochain trap. J'ai examiné Net :: SNMP par David M. Town, mais je pense que cela permet seulement d'envoyer des requêtes et de recevoir des réponses. Je ne peux pas trouver une méthode pour attendre les messages d'interruption spontanée dans cette documentation: http://search.cpan.org/dist/Net-SNMP/lib/Net/SNMP.pm

Le package Net-SNMP, d'autre part, apparaît comme une bibliothèque très robuste et bien utilisé, mais même dans la documentation ne me donne pas un chemin clair. SNMP :: TrapSession me permet d'envoyer des traps, mais pas de les recevoir (?). Un peu de googling m'amène à suggérer que je devrais utiliser le binaire "snmptrapd" et utiliser les fonctions perl intégrées, pour appeler mon script quand snmptrapd reçoit un message. Cela pourrait fonctionner, mais ne serait pas pratique puisque l'option perl embarquée nécessite un binaire perl compilé sans support de fichiers volumineux. Je ne possède pas le système cible et je ne peux donc pas remplacer le compilateur/interpréteur. Je pourrais expédier mon logiciel avec un perl spécialement compilé, mais cela me donnerait des problèmes multiplateformes que j'espérais éviter. La raison pour laquelle j'utilise Perl et non Java avec SNMP4J ou similaire, c'est que j'ai un code Perl hérité qui dépendait auparavant de l'API Perl de HP NNM, et je dois passer à un back-end logiciel libre pour éliminer le coût de la licence.

+1

Après en e-mail à la liste-snmp-utilisateurs nets de diffusion, je l'ai appris que cette fonction En fait, il n'existe pas dans l'API Perl de net-snmp. La recommandation que j'ai eue était d'utiliser le programme snmptrapd fourni et de faire en sorte que mon script analyse sa sortie de texte. Cela fonctionnerait sûrement, mais je préférerais avoir accès aux données brutes de BER et je ne suis pas désireux de prendre le coup de performance possible des données de texte d'analyse. Très probablement, je vais aller avec l'option Snmp4j - un changement de langue pourrait ne pas être un gros problème. – Jolta

+0

Dans le cas où quelqu'un est intéressé, j'ai fini par aller sur la route de Java. Une configuration simple à 2 fils fonctionne très bien: le producteur écoute les pièges entrants via Snmp4j et les place dans une file d'attente. Le consommateur (dans un fil séparé) lit la file d'attente sur une base FIFO et effectue le traitement. Je suis capable de presser à peu près 400 pièges par seconde sans perdre quoi que ce soit du côté du réseau. En revanche, je ne peux pas obtenir snmptrapd (net-snmp) pour accepter plus de 10-50 pièges par seconde, ce qui est un dealbreaker dans mon cas. – Jolta

Répondre

2

Un exemple simple d'utilisation de la bibliothèque Perl SNMP_Session.pm pour l'analyse des interruptions SNMP: Essential SNMP - page 194.

+1

Merci! Je vais accepter cette réponse parce que vous étiez le premier à me diriger vers SNMP_Session lib. – Jolta

2

Cherchez-vous une routine de bibliothèque pour recevoir et analyser le paquet? Pouvez-vous écouter les paquets UDP vous-même et ensuite transmettre les paquets que vous recevez à la bibliothèque snmp pour les analyser? C'est ce que je fais, même si j'utilise python plutôt que perl.

+0

De préférence, je n'aurais pas besoin de traiter les données UDP brutes et de filtrer moi-même les paquets SNMP. Ce serait plus de travail que d'avoir une lib. ;) Mais oui, cela devrait être possible, chaque librairie SNMP que j'ai regardée a des fonctions pour encoder/décoder les données BER, c'est juste la fonction "bloquant l'écoute" qui me manque. – Jolta

2

Si vous obtenez la bibliothèque SNMP_Session (ce qui est tout à Perl BTW) vous pouvez faire des choses comme ceci:

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

Je suppose que $ trap_session-> receive_trap() est un appel bloquant? Cela ressemble à ce que je cherchais. Merci! – Jolta