2011-12-14 11 views
5

Este es el código que he usado para caminar a través de la mesa en net:snmp usando Perl:nombre MIB impresión de los valores MIB en Perl

 #! /usr/local/bin/perl 

     use strict; 
     use warnings; 

     use Net::SNMP qw(:snmp); 

     my $OID_hrSystem = '1.3.6.1.2.1.25.1'; 
     my $OID_ifPhysAddress = '1.3.6.1.2.1.2.2.1.6';   

     my ($session, $error) = Net::SNMP->session(
     -hostname => shift || 'localhost', 
     -community => shift || 'public', 
     -nonblocking => 1, 
     -translate => [-octetstring => 0], 
     -version  => 'snmpv2c', 
    ); 

     if (!defined $session) { 
     printf "ERROR: %s.\n", $error; 
     exit 1; 
     } 

     my %table; # Hash to store the results 

     my $result = $session->get_bulk_request(
     -varbindlist => [ $OID_hrSystem ], 
     -callback  => [ \&table_callback, \%table ], 
     -maxrepetitions => 10, 
    ); 

     if (!defined $result) { 
     printf "ERROR: %s\n", $session->error(); 
     $session->close(); 
     exit 1; 
     } 

     # Now initiate the SNMP message exchange. 

     snmp_dispatcher(); 

     $session->close(); 

     # Print the results, specifically formatting ifPhysAddress. 

     for my $oid (oid_lex_sort(keys %table)) { 
     if (!oid_base_match($OID_ifPhysAddress, $oid)) { 
      printf "%s = %s\n", $oid, $table{$oid};     
     } else {         
      printf "%s = %s\n", $oid, unpack 'H*', $table{$oid}; 
     }          
     } 

     exit 0; 

     sub table_callback 
     { 
     my ($session, $table) = @_; 

     my $list = $session->var_bind_list(); 

     if (!defined $list) { 
      printf "ERROR: %s\n", $session->error(); 
      return; 
     } 

     # Loop through each of the OIDs in the response and assign 
     # the key/value pairs to the reference that was passed with 
     # the callback. Make sure that we are still in the table 
     # before assigning the key/values. 

     my @names = $session->var_bind_names(); 
     my $next = undef; 

     while (@names) { 
      $next = shift @names; 
      if (!oid_base_match($OID_hrSystem, $next)) { 
       return; # Table is done. chakri 
      } 
      $table->{$next} = $list->{$next}; 
     } 

     # Table is not done, send another request, starting at the last 
     # OBJECT IDENTIFIER in the response. No need to include the 
     # calback argument, the same callback that was specified for the 
     # original request will be used. 

     my $result = $session->get_bulk_request(
      -varbindlist => [ $next ], 
      -maxrepetitions => 10, 
     ); 

     if (!defined $result) { 
      printf "ERROR: %s.\n", $session->error(); 
     } 

     return; 
     } 

de salida es:

1.3.6.1.2.1.25.1.1.0 = 1 hour, 12:00.77 

1.3.6.1.2.1.25.1.2.0 = � 
         + 

1.3.6.1.2.1.25.1.3.0 = 1536 

1.3.6.1.2.1.25.1.4.0 = BOOT_IMAGE=/boot/vmlinuz-3.0.0-14-generic root=UUID=5c4c8d22-3cea-4410-aaad-f297c75d217e ro quiet splash vt.handoff=7 

1.3.6.1.2.1.25.1.5.0 = 1 

1.3.6.1.2.1.25.1.6.0 = 133 

1.3.6.1.2.1.25.1.7.0 = 0 

Pero la salida necesaria para me es el siguiente:

hrSystemUptime.0 = 1:08:54.36 

hrSystemDate.0 = 2011-12-14,16:0:2.0,+1:0 

hrSystemInitialLoadDevice.0 = 1536 

hrSystemInitialLoadParameters.0 = "BOOT_IMAGE=/boot/vmlinuz-3.0.0-14-generic root=UUID=5c4c8d22-3cea-4410-aaad-f297c75d217e ro quiet splash vt.handoff=7" 

hrSystemNumUsers.0 = 1 

hrSystemProcesses.0 = 133 

hrSystemMaxProcesses.0 = 0 

lo principal en la salida es que quiero nombres MIB que se imprimirán en t él dio salida en lugar de los valores de mib

+1

Hace [esta pregunta SO] (http://stackoverflow.com/questions/2433187/is-there-a-simple-way-to-map-snmpmib-strings-to-oids-in-perl) funciona para ¿tú? – CanSpice

+0

sí, funciona, pero quiero el resultado en mi camino –

Respuesta

0

¿Has probado el comando snmpget en tu servidor? Cuando ejecuto snmpget directamente en CLI, el resultado aparece con el nombre:

Ex:/usr/local/bin/snmpget -OQ -v 2c -c Comunidad xxxx .1.3.6.1.2.1.31.1.1.1.6.100663301 IF-MIB :: ifHCInOctets.100663301 = 152528664859348

Si funciona para usted, es posible que desee exectute el comando en el código Perl, en lugar de utilizar la LIB. Entonces solo tienes que manejar con la salida.

Además, tou puede utilizar snmptranslate a Tranlate sus OID:

Ej:/usr/local/bin/snmptranslate 1.3.6.1.2.1.25.1.1

HOST-RESOURCES-MIB :: hrSystemUptime

Más Info ->http://www.net-snmp.org/wiki/index.php/TUT:snmptranslate

EDITAR

¿Por qué no:

my $pathSnmpTranslate = '/your/path/to/snmptranslate'; 

for my $oid (oid_lex_sort(keys %table)) { 
    my $oidTrans = `$pathSnmpTranslate $oid`; 
    if (!oid_base_match($OID_ifPhysAddress, $oid)) { 
     printf "%s = %s\n", $oidTrans, $table{$oid}; 
    } else {  
     printf "%s = %s\n", $oidTrans, unpack 'H*',$table{$oid}; 
    } 
} 

En mi máquina funcionó:

> /xxx % /usr/local/bin/snmptranslate 1.3.6.1.2.1.25.1.1
HOST-RESOURCES-MIB :: hrSystemUptime

> /xxx % /usr/local/bin/snmptranslate 1.3.6.1.2.1.25.1.1.0
HOST-RESOURCES-MIB :: hrSystemUptime.0

+0

sí, podemos usar snmpget pero quiero obtener el resultado en mi programa, puedes ver que mi programa también usa traducir como dijiste. Incluso entonces no funciona –

+0

Respuesta anterior, después de ** EDIT ** – Fred

+0

@Cherry Chakri: ¿Has probado el código que publiqué? – Fred

1

Usted podría usar el SNMP module (disponible en Ubuntu como libsnmp-perl) que ofrece un hash vinculado a MIB cargadas, %SNMP::MIB. Aquí hay un código de ejemplo:

use SNMP; 
SNMP::initMib(); 
print "$SNMP::MIB{'1.3.6.1.2.1.25.1.1.0'}{label} = \n"; 
#Should print "hrSystemUptime = " 

Debido %SNMP::MIB es un hash atada, no se puede simplemente hacer una búsqueda y asignar a una variable léxica, es decir my $oid = $SNMP::MIB{$oidstr}. Tienes que acceder a él directamente cada vez.

Hay mucha otra información que carga de la MIB, incluido el tipo de datos, que podría ayudar con el problema que parece que tiene con hrSystemDate. Además, consulte the man page for mib_api si necesita cargar MIB específicos. Sin embargo, los que usaste en tu ejemplo se cargaron de manera predeterminada en mi sistema.

Cuestiones relacionadas