Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

snmpget et perl ... ou comment traiter une valeur de retour !!!

14 réponses
Avatar
toon
Bonjour.

Je pense que mon soucis a deja ete partage par bon nombre d'administrateurs
desireux de superviser leur reseau informatique via SNMP, et des script
ecrit en perl.
Je desire recuperer le resultat d'un snmpget (par exemple le traffic reseau
d'un port de switch) pour le traiter et l'injecter par exemple dans une base
rrdtool.
J'ai deja trouve plein de chose sur le net (rrdtool et freebsd), mais rien
de bien precis.

Par exemple :
#!/usr/bin/perl
$target = "./snmpget -c public -Oqv 192.168.155.10
.1.3.1.2.1.2.2.1.5.10101";
$result = system($target);
#$result = $result + 1;
print "$result\n";

Le resultat du snmpget est 10000000, par contre le resultat de $result est
0, et si j'enleve l'avant derniere ligne, $result devient 1.

0 c'est quoi, le code de sortie de la commande ???

Aider moi SVP !!!

10 réponses

1 2
Avatar
Régis Caspar
toon wrote:
Bonjour.

Je desire recuperer le resultat d'un snmpget (par exemple le traffic reseau
d'un port de switch) pour le traiter et l'injecter par exemple dans une base
rrdtool.
J'ai deja trouve plein de chose sur le net (rrdtool et freebsd), mais rien
de bien precis.

Par exemple :
#!/usr/bin/perl
$target = "./snmpget -c public -Oqv 192.168.155.10
.1.3.1.2.1.2.2.1.5.10101";
$result = system($target);
#$result = $result + 1;
print "$resultn";


Bonjour,

extrait de perldoc -f system :
The return value is the exit status of the program as returned
by the "wait" call. To get the actual exit value shift right by
eight (see below). See also "exec". This is *not* what you want
to use to capture the output from a command, for that you should
use merely backticks or "qx//", as described in "`STRING`" in
perlop. Return value of -1 indicates a failure to start the
program (inspect $! for the reason).


--
Régis Caspar

Avatar
toon
Waouh ... je crains de ne pas trop comprendre !!!
Quelques explications seraient les bien venue, sinon je mettrais les mains
dans le camboui lundi.

Merci tout de meme pour cette piste !!!

"Régis Caspar" <regis.caspar+ a écrit dans le message de
news: 41b02f7c$0$32657$
toon wrote:
Bonjour.

Je desire recuperer le resultat d'un snmpget (par exemple le traffic
reseau


d'un port de switch) pour le traiter et l'injecter par exemple dans une
base


rrdtool.
J'ai deja trouve plein de chose sur le net (rrdtool et freebsd), mais
rien


de bien precis.

Par exemple :
#!/usr/bin/perl
$target = "./snmpget -c public -Oqv 192.168.155.10
.1.3.1.2.1.2.2.1.5.10101";
$result = system($target);
#$result = $result + 1;
print "$resultn";


Bonjour,

extrait de perldoc -f system :
The return value is the exit status of the program as returned
by the "wait" call. To get the actual exit value shift right by
eight (see below). See also "exec". This is *not* what you want
to use to capture the output from a command, for that you should
use merely backticks or "qx//", as described in "`STRING`" in
perlop. Return value of -1 indicates a failure to start the
program (inspect $! for the reason).


--
Régis Caspar



Avatar
Patrick Mevzek
Je desire recuperer le resultat d'un snmpget (par exemple le traffic


Et pourquoi ne pas utiliser le module idoine, soit Net::SNMP ?

Vous aurez a priori moins de soucis que d'essayer de vous caler sur le
résultat de snmpget, tout en gérant correctement les erreurs.
Sans compter le coût en performance du fork.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
Paul Gaborit
À (at) Fri, 3 Dec 2004 17:31:34 +0100,
"toon" écrivait (wrote):
Waouh ... je crains de ne pas trop comprendre !!!
Quelques explications seraient les bien venue, sinon je mettrais les mains
dans le camboui lundi.


Peut-être qu'une traduction aidera :

La valeur retournée [par 'system'] est le statut de sortie (exit status)
du programme tel que retourné par l'appel "wait()". Pour obtenir la valeur
réelle de sortie, il faut décaler la valeur de retour de 8 bits vers la
droite. Voir aussi "exec". Ce n'est pas ce qu'il faut utiliser pour
capturer la sortie d'une commande. Pour cela, regarder les apostrophes
inversées (backticks) ou "qx//" comme décrit dans "`CHAINE`" dans la page
de manuel perlop. Une valeur de retour "-1" indique l'échec du lancement
du programme ($! en donne la raison).

Extrait de :

<http://www.enstimac.fr/Perl/DocFr/perlfunc.html#item_system>

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
toon
Bonjour.

Vous voulez sans doute parler du module Perl inclus dans le package NetSnmp
!!!
J'ai du mal a en comprendre toute la science ... ca ressemble a du perl,
mais les exemples me semble tout de meme asser complexes.
Je me suis donc tourne vers le perl "natif" en quelque sorte afin de voir si
je ne pouvais pas avoir un resultat croorect rapidement. Je rappelle que la
valeur de sortie est reinjecte dans une base rrd via rrdtool update !!!

Merci tout de meme pour votre reponse !!!

"Patrick Mevzek" a écrit dans le message de
news:
Je desire recuperer le resultat d'un snmpget (par exemple le traffic


Et pourquoi ne pas utiliser le module idoine, soit Net::SNMP ?

Vous aurez a priori moins de soucis que d'essayer de vous caler sur le
résultat de snmpget, tout en gérant correctement les erreurs.
Sans compter le coût en performance du fork.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>



Avatar
toon
Merci pour l'info, et merci pour le site qui me semble etre une reference
pour tout debutant en perl !!!

"Paul Gaborit" a écrit dans le message de
news:

À (at) Fri, 3 Dec 2004 17:31:34 +0100,
"toon" écrivait (wrote):
Waouh ... je crains de ne pas trop comprendre !!!
Quelques explications seraient les bien venue, sinon je mettrais les
mains


dans le camboui lundi.


Peut-être qu'une traduction aidera :

La valeur retournée [par 'system'] est le statut de sortie (exit
status)

du programme tel que retourné par l'appel "wait()". Pour obtenir la
valeur

réelle de sortie, il faut décaler la valeur de retour de 8 bits vers
la

droite. Voir aussi "exec". Ce n'est pas ce qu'il faut utiliser pour
capturer la sortie d'une commande. Pour cela, regarder les apostrophes
inversées (backticks) ou "qx//" comme décrit dans "`CHAINE`" dans la
page

de manuel perlop. Une valeur de retour "-1" indique l'échec du
lancement

du programme ($! en donne la raison).

Extrait de :

<http://www.enstimac.fr/Perl/DocFr/perlfunc.html#item_system>

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>



Avatar
Patrick Mevzek
J'ai du mal a en comprendre toute la science ... ca ressemble a du perl,
mais les exemples me semble tout de meme asser complexes. Je me suis
donc tourne vers le perl "natif" en quelque sorte afin de voir si je ne
pouvais pas avoir un resultat croorect rapidement. Je rappelle que la
valeur de sortie est reinjecte dans une base rrd via rrdtool update !!!


C'est exactement ce que je fais aussi, avec Net::SNMP et RRDs
Un exemple:

sub do_poll
{
my $boid='.1.3.6.1.4.1.2021.65.101.';
my ($session,$err)=Net::SNMP->session(-hostname=>'localhost',-community=>'public');
my $now=time();
my $last=$#ngs+1;
my $response=$session->get_request(map { $boid.$_ } (1..$last) );
my @all=map { $response->{$boid.$_} } (1..$last);
my $todo=$now.":".join(":",@all).":".join(":",('U') x (10-$#all-1));
RRDs::update($rrd,$todo);
my $e=RRDs::error();
die "ERROR: Cannot update ${rrd} with '$todo' $en" if ($e);
}

Largement améliorable encore.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
toon
Oui oui ... j'ai enfin reussi a avoir quelque chose de potable via un script
en perl.
Faut dire que je debute en la matiere (perl), et avant mon "rrdtool update"
j'ai un paquet de print.
En fait, j'ai choisi la facilite en redirigeant la sortie du snmpget dans le
fichier que je vais lire ensuite via perl. C'est super simple de manipuler
le contenu dans fichier avec perl !!!

Bref, c'est un peu une usine a gaz, mais ca marche ... sauf que je ne suis
vraiment pas sur d'avoir une valeur correct en ce qui concerne le graph
qu'il me genere.
En effet, j'ai l'impression que les data obtenues (traffic reseau entrant et
sortant sur un switch cisco) via snmpget sont divise par 10. J'ai un traffic
de l'ordre de 4Mbs pendant une grosse phase de transfert de fichier, alors
que ma carte est une gigabytes (en fait deux cartes en loadbalancing). Un
traffic de l'ordre de 40 serait plus plausible.

D'ou cette question.
Lors de la phase de creation de la basse rrd, sur la section DS, comment
parametrer correctement les deux dernieres valeur. Par defaut je laisse U.

DS:trafficIn:COUNTER:120:U:U

Merci d'avance pour votre reponse !!!
"Patrick Mevzek" a écrit dans le message de
news:
J'ai du mal a en comprendre toute la science ... ca ressemble a du perl,
mais les exemples me semble tout de meme asser complexes. Je me suis
donc tourne vers le perl "natif" en quelque sorte afin de voir si je ne
pouvais pas avoir un resultat croorect rapidement. Je rappelle que la
valeur de sortie est reinjecte dans une base rrd via rrdtool update !!!


C'est exactement ce que je fais aussi, avec Net::SNMP et RRDs
Un exemple:

sub do_poll
{
my $boid='.1.3.6.1.4.1.2021.65.101.';
my
($session,$err)=Net::SNMP->session(-hostname=>'localhost',-community=>'publi

c');
my $now=time();
my $last=$#ngs+1;
my $response=$session->get_request(map { $boid.$_ } (1..$last) );
my @all=map { $response->{$boid.$_} } (1..$last);
my $todo=$now.":".join(":",@all).":".join(":",('U') x (10-$#all-1));
RRDs::update($rrd,$todo);
my $e=RRDs::error();
die "ERROR: Cannot update ${rrd} with '$todo' $en" if ($e);
}

Largement améliorable encore.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>



Avatar
Patrick Mevzek
En fait, j'ai choisi la facilite en redirigeant la sortie du snmpget
dans le fichier que je vais lire ensuite via perl.


En règle générale, mauvaise idée.

En effet, j'ai l'impression que les data obtenues (traffic reseau
entrant et sortant sur un switch cisco) via snmpget sont divise par 10.


Vous êtes sûrs que vous mélangez pas octets (bytes) et bits ?
Ca ferait un rapport 8.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
toon
En fait, j'ai choisi la facilite en redirigeant la sortie du snmpget
dans le fichier que je vais lire ensuite via perl.


En règle générale, mauvaise idée.


Oui, mais je n'y arrive pas autrement. Si vous avez une piste meilleur a me
proposer, je suis tout ouiiiii !!!

En effet, j'ai l'impression que les data obtenues (traffic reseau
entrant et sortant sur un switch cisco) via snmpget sont divise par 10.


Vous êtes sûrs que vous mélangez pas octets (bytes) et bits ?
Ca ferait un rapport 8.


La valeur renvoye par un snmpget sur le port d'un switch cisco me renvoit
une valeur en octets (bytes) non ?!?

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>



1 2