Posté le: Jeu Oct 12, 2006 3:48 pm Sujet du message: Detection du changement du routage d'un tunnel...
J'utilise Nagios pour superviser mes équipements.
Sur un point réseau je dispose de deux sorties, une SDSL et une ADSL.
Dans chaque sortie j'ai deux tunnels.
J'ai activé l'EIGRP sur chaque tunnel pour que dans le cas d'un probleme sur l'une ou l'autre des sorties, mon tunnel soit re-router vers l'autre sortie.
Jusque la tout va bien.
Maintenant je souhaite détecter via SNMP que mon tunnel a changé de route zéro afin de savoir vers quel sortie je passe. Je pense qu'en SNMP ceci est réalisable, mais je ne suis pas certain.
Pour le moment en parsant la mib standard (Noed IP), en croisant les infos de ipRouteDest et ipRouteIfIndex il semble que l'on peut déterminer le changement de route.
Si quelqu'un peut me valider ceci, je dois créer un script Nagios pour superviser cela.
Posté le: Jeu Déc 14, 2006 6:04 pm Sujet du message: Ma premiere version
Voila mon plugins Nagios pour checker qu'un tunnel passe bien par l'interface déterminé a l'installation du CPE.
Le script demande certainement a être optimisé, mais pour le moment il fait bien ce que je lui demande.
Dans mon fichier misccommands de Nagios je déclare la commande suivante :
Les paramètres de la commande sont donc :
22 : ifIndex du tunnel supervisé.
10.0.0.1 : IP par ou j'interroge mon CPE. (Utile que dans mon cas je pense - Nous avons un réseau de management)
192.168.10.10 : IP Source du tunnel.
172.18.0.1 : NextHop du tunnel. C'est cette IP que l'on vérifie.
communaute : Communaute SNMP (RO suffit).
Et enfin le script perl, a mettre dans le repertoire libexec de Nagios avec les droits d'execution bien sur.
Citation:
#!/usr/bin/perl
# (c) StephanP
# Script permettant de checker qu'un tunnel passe par l'interface
# determiné lors du provisionnement du CPE.
#
use strict;
use Net::SNMP;
use Getopt::Long;
############################################################
# Declaration des variables et constantes
############################################################
my $ifIndex = '1.3.6.1.2.1.2.2.1.2';
my $ifOperStatus = '1.3.6.1.2.1.2.2.1.8';
my $ipRouteNextHop = '1.3.6.1.2.1.4.21.1.7';
use constant STATE_OK => 0;
use constant STATE_WARNING => 1;
use constant STATE_CRITICAL => 2;
use constant STATE_UNKNOWN => 3;
use constant STATE_WARNING1 => 8;
use constant STATE_WARNING2 => 9;
use constant STATE_UP => 0;
use constant STATE_DOWN => 2;
# Verification des paramètres.
my $size = @ARGV;
exit_bad(3, 'Need one argument') unless $size >= 1;
my ($iftunnel, $ipsup, $ipdest, $nexthop, $communaute) = split ',', @ARGV[0];
my $status = Interface_Status($ipsup, $communaute, $iftunnel);
#print "status de l'interface $iftunnel : ".$status."\n";
if ($status == 0){
# si l'interface tunnel est UP on verifie le NextHop.
my $statusnexthop = Check_Nexthop($iftunnel, $ipsup, $ipdest, $nexthop, $communaute);
if ($statusnexthop == STATE_UP){
print "Tunnel Status and Route OK\n";
exit STATE_UP;
}else{
print "Tunnel Status OK - Route NOK\n";
exit STATE_WARNING;
}
} else {
# Si l'interface tunnel est DOWN on renvoi DOWN.
print "Tunnel Status DOWN\n";
exit STATE_DOWN;
}
#showUsage();
#############################################################
# Verification du status du tunnel.
#############################################################
sub Check_Nexthop() {
my $iface = shift;
my $host = shift;
my $ipde = shift;
my $nhop = shift;
my $community = shift;
# Connexion SNMP
my ($session, $error) = Net::SNMP->session(
-hostname => $host,
-community => $community,
-timeout => 1,
);
return STATE_DOWN unless $session;
my $ipnexthop_ipdest = $ipRouteNextHop.".".$ipde;
my $result = $session->get_request(-varbindlist => [$ipnexthop_ipdest]);
my $thenexthop = $result->{$ipnexthop_ipdest};
#### A MODIFIER POUR LE RETOUR
#print "Next hop de $ipde : ".$thenexthop."\n";
#print " Comparaisons avec NextHop OK : $nhop\n";
if ($thenexthop eq $nhop){
#print "C'est bon\n";
return STATE_UP;
} else {
#print "C'est pô bon\n";
return STATE_CRITICAL;
}
}
#############################################################
# Verification du status du tunnel.
#############################################################
sub Interface_Status() {
my $host = shift;
my $community = shift;
my $iface = shift;
my ($session, $error) = Net::SNMP->session(
-hostname => $host,
-community => $community,
-timeout => 1,
);
return STATE_DOWN unless $session;
my $ifOperStatusInst = $ifOperStatus.".".$iface;
my $result = $session->get_request(-varbindlist => [$ifOperStatusInst]);
return STATE_DOWN if not $result;
my $status = $result->{$ifOperStatusInst};
#print "in status_snmp: status = $status\n";
if ($status == 1){# 1 : iface is up
return STATE_UP;
}
return STATE_DOWN;
}
################################################################################
# correspondance entre etat alerte altitude et code de retour plugin nagios
################################################################################
sub nagios_exit_code {
my $code = shift;
if ($code == STATE_WARNING1 || $code == STATE_WARNING2 || $code == STATE_WARNING){
return STATE_WARNING;
}
if($code == STATE_OK){
return STATE_OK;
}
if ($code == STATE_DOWN || $code == STATE_DOWN){
return STATE_DOWN;
}
return STATE_UNKNOWN;
}
#############################################################
# Fonction de sortie sur erreur.
#############################################################
sub exit_bad($) {
my $ret = shift;
my $s = shift;
print "$s\n";
exit($ret);
}
############################################################
# Affichage du 'Usage' de la commande.
############################################################
sub showUsage(){
# A Faire
print "
Utilisation : chktunnel.pl
";
}
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum