OVH Cloud OVH Cloud

net::snmp et récupération d'information

1 réponse
Avatar
marc
bonjour,
je construis un petit programme pour récupérer les adresses MAC des
machines connectées sur un routeur.
Pour cela j'utilise le module Net::SNMP et les fonctions get_request et/ou
get_bulk_request.

Tout fonctionnais pour le mieux (affichage du debug du prg):
indice <94>, oid <.1.3.6.1.2.1.4.22.1.2.94.172.20.74.74>, machine
<172.20.74.74>, val <0x0060b0acbd5c>
que l'on peut vérifier avec snmpget :
IP-MIB::ipNetToMediaPhysAddress.94.172.20.74.74 = STRING: 0:60:b0:ac:bd:5c

jusqu'a ce que je tombe sur l'erreur suivante :
indice <94>, oid <.1.3.6.1.2.1.4.22.1.2.94.172.20.74.75>, machine
<172.20.74.75>, val <ON >
IP-MIB::ipNetToMediaPhysAddress.94.172.20.74.75 = STRING: 0:4f:4e:d:24:3d

Après avoir cherché, il semble que si l'adresse MAC contient les valeurs
"4f4e" ou "4548" la fonction "$session1->var_bind_list->{$oid}" retourne un
STRING au lieu de la valeur hexadécimal. Il interprete le "4f4e" comme
"ON" (et 4548 comme EH) et la suite comme des caractères imprimable au lieu
de dire toute cette d'octets est de l'hexa et donc je retourne la chaine
0x..4f4e.. (ou 0x ...4548...).

tout traitement sur "$session1->var_bind_list->{$oid}" ne fonctionne pas
(sprintf, pack/unpack)....

J'ai voulu essayé le module SNMP, mais celui-ci plante "Can't use string
("SNMP") as a HASH ref while "strict refs" in use
at /usr/lib/perl5/5.8.5/ExtUtils/MM_Unix.pm line 503." pendant le test du
module.

Bref, si vous aviez des éléments a me fournir je suis preneur...

1 réponse

Avatar
Jacques Caron
Salut,

On Thu, 09 Jun 2005 10:51:54 +0200, marc wrote:

Après avoir cherché, il semble que si l'adresse MAC contient les valeurs
"4f4e" ou "4548" la fonction "$session1->var_bind_list->{$oid}" retourne
un STRING au lieu de la valeur hexadécimal. Il interprete le "4f4e" comme
"ON" (et 4548 comme EH) et la suite comme des caractères imprimable au
lieu de dire toute cette d'octets est de l'hexa et donc je retourne la
chaine
0x..4f4e.. (ou 0x ...4548...).


C'est plus large que ça: il essaie toujours d'interpréter comme du texte,
sauf si ça n'y ressemble vraiment pas. Mais certains caractères qui ne
sont pas vraiment du texte sont considérés comme tels, en particulier 0x00:

OCTET STRINGs and Opaques containing non-printable ASCII characters are
converted into a hexadecimal representation prefixed with "0x". B<NOTE:>
The following ASCII control characters are considered to be printable by
the module: NUL(0x00), HT(0x09), LF(0x0A), FF(0x0C), and CR(0x0D).


Bref, dans ton exemple, 0:60:b0:ac:bd:5c contient tout plein de caractères
qui ne lui plaisent pas (>127 je suppose), alors que 0:4f:4e:d:24:3d, lui,
ne contient que du pur ASCII, un NUL et un CR, qui sont considérés comme
du texte.

Il semblerait qu'il soit possible de modifier ce comportement, voir la
section sur translate dans man Net::SNMP.

tout traitement sur "$session1->var_bind_list->{$oid}" ne fonctionne pas
(sprintf, pack/unpack)....


Ca ça m'étonne un peu... Même pas un petit join ":",map {sprintf
"%02x",$_} unpack "C*",$valeur?

Jacques.