traphandler supplémentaire ?

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

traphandler supplémentaire ?

Message par giantgoab » 22 avril 2009, 09:43

Bonjour à tous !

En attendant de trouver une solution pour faire marcher mon weathermap, je me suis attelé
à la problématique suivante de mon stage, à savoir récupérer les traps envoyés par les impimantes et
les bornes wifi en cas d'évènements le necéssitant (nouvelle connexion, impression etc...)

J'arrive à récupérer ces traps via un petit handler en perl que voici

Code : Tout sélectionner

#!/usr/bin/perl
#trap handler basique,
#uniquement log de traps

my $TRAP_FILE = "/tmp/traps_all";

my $host = <STDIN>;
# Read the Hostname - First line of input from STDIN
 chomp($host);
my $ip = <STDIN>;       # Read the IP - Second line of input
 chomp($ip);

while(<STDIN>) {
        chomp($_);
        push(@vars,$_);
}

open(TRAPFILE, ">> $TRAP_FILE");
$date = `date`;
chomp($date);
print(TRAPFILE "New trap received: $date for $OID\n\nHOST: $host\nIP:
$ip\n");
foreach(@vars) {
        if(@vars =~ /SNMPv2-SMI/){
                print "c'est rien\n";
        }
        else {
        print(TRAPFILE "TRAP: $_\n");
        }
}

print(TRAPFILE "\n----------\n");
close(TRAPFILE);
Les traps sont recus (et affichés dans le terminal quad je le demande au lancement de snmptrapd) puis logués dans un fichier.
Mon problème est que pour le faire fonctionner, il faut que je modifie snmptrapd.conf pour le mettre par défaut
et cela courcircuite le handler d'EON et que donc les réponses aux traps envoyés par nagios et compagnie
ne reviennent plus à EON mais sont interceptés par mon script.
(qui plus est lesdeux tyes de traps proviennent de machines et équipements aussi supervisés par nagios

Y-existerait-il un moyen pour qu'au moment ou je traite le trap avec mon handler, je puisse le renvoyer
au handlerd'EON si il ne fait pas parti de ceux que je suis censé recevoir ?

Si vous avez une idée ou si vous connaissez un autre moyen, par exemple que la distinction soit faite avant le traitement
par le handler et que l'on puisse ensuite définir vers lequel on va envoyer le trap reçu pour qu'l soit traité, ca m'intéresserait assez ^^

au cas ou voila mon smptrapd.conf:
format2 %02.2l/%02.2m/%y %02.2h:%02.2j:%02.2k %W de %A\n
ignoreauthfailure yes
#authCommunity log,execute,net EyesOfNetwork
authCommunity log,execute,net public

traphandle default /tmp/traphandler.pl

#/srv/eyesofnetwork/snmptt/bin/snmptthandler
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

Re: traphandler supplémentaire ?

Message par giantgoab » 22 avril 2009, 12:13

Bon apparement les traphandlers récupèrent leurs traps à traiter via l'entrée standard
(dites moi si je me trompe hein)
donc à priori il est possible que je renvoie un trap vers le handler par défaut d'EON une fois qu'il a passé mes regexp non ?

si c'est le cas j'ai plus de soucis et je peux commencer le traitement des traps reçus
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

Re: traphandler supplémentaire ?

Message par giantgoab » 22 avril 2009, 15:12

è_é finalement ce sera fait en php
les collègues qui utiliseront et modifieront le script après moi sont fachés avec perl ( lol )

Alors j'arrive à récupérer mes traps, mais je n'arrive pas à renvoyer ceux
que je veux vers le traphandler de Eon.

actuellement je fais ceci:
exec("/srv/eyesofnetwork/snmptt/bin/snmptthandler ".$trap);
et le terminal me répond:
sh: -c: line 0: syntax error near unexpected token `newline'
sh: -c: line 0: `/srv/eyesofnetwork/snmptt/bin/snmptthandler <'
je pense qu'il aime pas les retours à la ligne dans le trap, mais je vois pas comment les changer
et qu'ils restent interpretables comme tels par le handler de EON...
des idées ?
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

Avatar du membre
Seb
Messages : 3558
Enregistré le : 11 février 2009, 17:35
Localisation : Limoges
Contact :

Re: traphandler supplémentaire ?

Message par Seb » 22 avril 2009, 15:15

Pour enlever les sauts d eligne il faut rajouter /n a la fin de la ligne de commande je crois(ou \n???)
"Mieux vaut cent chevaux sous une selle que d'un âne assis dessus"
Joe dans son bar servant un de ses clients...JBT

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

Re: traphandler supplémentaire ?

Message par giantgoab » 22 avril 2009, 15:22

j'aurais bien aimé mais il a pas l'air d'accord:
string exec ( string command , array output , int return_var )
exec exécute la commande command .


command
La commande à exécuter.
output
Si l'argument output est présent, alors ce tableau sera rempli par les lignes retournées par la commande. Les espaces de début et de fin de chaîne, comme \n , ne seront pas inclus dans ce tableau. Il faut noter que si ce tableau contient des éléments, exec ajoutera les nouvelles lignes à la fin du tableau. Si vous ne voulez pas que les nouveaux éléments soient concaténés, utilisez la fonction unset avec ce tableau avant de le passer à exec .
return_var
Si l'argument return_var est présent en plus du tableau output , alors le statut de retour d'exécution sera inscrit dans cette variable.
je vais voir si ca passe avec le code Ascii XD
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

Avatar du membre
Seb
Messages : 3558
Enregistré le : 11 février 2009, 17:35
Localisation : Limoges
Contact :

Re: traphandler supplémentaire ?

Message par Seb » 22 avril 2009, 15:32

D'autant plus que n'etant pasdevel d'origine mais plus bidouilleur ce genre de commande/script prrrrrrrt!
dsl!
Mais sinon avec le trap handler d'origine rien ne marchait?
Même en mettant la bonne communauté?
"Mieux vaut cent chevaux sous une selle que d'un âne assis dessus"
Joe dans son bar servant un de ses clients...JBT

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

Re: traphandler supplémentaire ?

Message par giantgoab » 22 avril 2009, 15:37

bah le but c'est justement de traiter ce qui n'est pas traité par nagios,
le coller dans une bdd et utiliser une appli existante que mes collègues avaient dévellopé.

Pour par exemple recevoir les traps du spanning-tree et les analyser,
créer un log des impressions etc....

Sinon bah en fait je sais d'où vient le problème, c'est pas parce qu'il y a des retours à la ligne,
cest parce que la récupération du trap merde.
Dans ma variable j'ai que "<" XD
génant non ?
je dois avoir mal parametré ma fonction de lecture
D'autant plus que n'etant pasdevel d'origine mais plus bidouilleur
è_é moi en théorie je suis plus dev, gros codeur bourrin quoi ><

EDIT:
pas compliquée l'erreur finalement j'ai mis fgetc() au lieu de fread()
(fgetc() ne retourne qu'un caractère :p)
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

Avatar du membre
Seb
Messages : 3558
Enregistré le : 11 février 2009, 17:35
Localisation : Limoges
Contact :

Re: traphandler supplémentaire ?

Message par Seb » 22 avril 2009, 15:42

Sinon en alternative pour les logs cisco,linux,etc...il y a ce brave syslog-ng!
installer le rpm puis le plugin cacti et hop!
Je l'ai installé sur une v1.2 et ça marche nickel!
"Mieux vaut cent chevaux sous une selle que d'un âne assis dessus"
Joe dans son bar servant un de ses clients...JBT

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

Re: traphandler supplémentaire ?

Message par giantgoab » 22 avril 2009, 16:03

j'ai des doutes sur syslog-ng avec les imprimantes et le spanning tree,
tu crois que ca fonctionne ?
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

giantgoab
Messages : 235
Enregistré le : 06 avril 2009, 13:57

Re: traphandler supplémentaire ?

Message par giantgoab » 23 avril 2009, 10:09

à moins que je m'amuse à configurer chaque port de chaque routeur sous nagios pour qu'il les check
(ce qui risque de me prendre le reste du millénaire), je suis obligé de passer par un handler secondaire
car les traps envoyés par les equipements lors d'évenements ne seront pas traités.

Et syslog-ng ca aurait pu marcher, mais mes imprimantes n'ont pas de logs donc impossible de les cntraliser avec cette application non ?

Code : Tout sélectionner


#!/usr/bin/php

<?php
error_reporting(E_ALL);


// déclaration des fichiers de log et fichiers temporaires utilisés.
//#################################################################

$all_traps='/tmp/traps_all';
$switchs_traps='/tmp/traps_switch';
$printer_traps='/tmp/traps_printer';
$temp_file='/tmp/temp_trap_file';

// Déclaration des variables utilisées
//####################################

$use_output=$all_traps; //fichier d'écriture des traps généraux
$res_sys=0; //variable de retour de l'appel au handler EON
$string_sys="test"; // chaîne de retour de l'appel au handler EON

// Tests préliminaires sur les fichiers
//#####################################

/* * * * Test de l'existence et création * * * */

if(!file_exists($all_traps)){ system("echo '' > ".$all_traps);}
if(!file_exists($switchs_traps)){ system("echo ''> ".$switchs_traps);}
if(!file_exists($printer_traps)){ system("echo ''> ".$printer_traps);}
if(!file_exists($temp_file_traps)){ system("echo ''>".$temp_file);}

/* * * * Tests des possibilités d'écriture * * * */

if(!is_writable($all_traps)){
        die("Impossible de continuer, le fichier ".$all_traps. " n'est pas accessible en écriture.");
}
if(!is_writable($switchs_traps)){
        die("Impossible de continuer, le fichier ".$switchs_traps. " n'est pas accessible en écriture.");

}
if(!is_writable($printer_traps)){
        die("Impossible de continuer, le fichier ".$printer_traps. " n'est pas accessible en écriture.");
}
if(!is_writable($temp_file)){
        die("Impossible de continuer, le fichier ".$temp_file. " n'est pas accessible en écriture.");
}


/***********************************************************
************************************************************
******* Fin des Tests, début du programme principal ********
************************************************************
************************************************************/

$trap=fread(STDIN,300);
// là on récupère tout le trap en une seul chaîne de caractères
//echo $trap;

// variable de test
$test=0;

// séparation des traps selon les cas à traiter
if(ereg("port [A-Z0-9]{1,3} is Blocked by STP",$trap)){
        // Le trap est au sujet d'un blocage par STP
        $test=1;
        $use_output=$switch_traps;
}elseif(ereg("port [A-Z0-9]{1,3} Duplex Mismatch.",$trap)){
        // Le trap est envoyé suite au problème de duplex mismatch
        $test=2;
        $use_output=$switch_traps;
}elseif(ereg("port [A-Z0-9]{1,3} is now off-line",$trap)){
        // L'extinction de l'equipement dépendant du port en question
        // a provoqué l'envoi du trap
        $test=3;
        $use_output=$switch_traps;
}elseif(ereg("port [A-Z0-9]{1,3} is now on-line",$trap)){
        // Le démarage de l'equipement dépendant du port en question
       // a provoqué l'envoi du trap
        $test=4;
        $use_output=$switch_traps;
}else{
        //Le trap a une autre cause => on le rebalance sur le traphandler
        //défini par EON
        $test=5;
        //$trap=str_replace("<UNKNOWN>","UNKNOWN",$trap);
        /************************************************
        *** redirection sur l'handler d'EON ? ***********
       *** et repassage en entrée standard du handler******/

        $tmpfd=fopen($temp_file,"w");
        fwrite($tmpfd,$trap);
        $string_sys=system('/srv/eyesofnetwork/snmptt/bin/snmptthandler < '.$temp_file,$res_sys);
        if($string_sys=="FALSE"){
                die("Erreur lors de l'appel au traphandler de EON:\n".$string_sys);
        }
}
echo "\n**********************\n";
echo $test;
echo "\n**********************\n";
echo $res_sys."\n";
echo $string_sys;
echo "\n**********************\n";


$fd=fopen('/tmp/traps_all','a');

// écriture dans le fichier de log associé
fwrite($fd,$trap);
fclose($fd);
?>

eh oui je suis un cinglé lol mais ca a l'air de fonctionner et j'arrive à renvoyer les tras qui me concernent pas à nagios
qui visiblement se débrouille avec dans son coin ^^
j'ai plus qu'à créer les cas pour les derniers types de traps et faire l'integration des traps dans la base de données et le handler sera terminé

Après je m'attaque à l'interface de consultation è_é

EDIT:
Je suis pris d'un doute, je me demande si le trap que je recois doit être envoyé à:
/srv/eyesofnetwork/snmptt/bin/snmptthandler
ou bien à:
/srv/eyesofnetwork/nagios-3.0.6/var/log/rw/nagios.cmd
Modifié en dernier par giantgoab le 22 mai 2009, 09:35, modifié 1 fois.
- redémarrage des process à distance [=======>] 100% Done
- Documentation v1.1 [====> ] 70% [En cours]
- Détection automatisée des processus et services à monitorer [=====>] 100% (envoyé pour vérification)

Répondre