печать имени MIB из значений MIB в Perl - PullRequest
5 голосов
/ 14 декабря 2011

Это код, который я использовал для обхода таблицы в net:snmp с использованием 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;
      }

Вывод:

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

Но для меня необходим следующий вывод:

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

Главное в выводе - я хочу, чтобы имена mib печатались на выходе вместо значений mib

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Вы можете использовать модуль SNMP (доступный в Ubuntu как libsnmp-perl), который предлагает привязанный хэш к загруженным MIB, %SNMP::MIB. Вот пример кода:

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

Поскольку %SNMP::MIB - это связанный хеш, вы не можете просто выполнить поиск и присвоить лексическую переменную, т.е. my $oid = $SNMP::MIB{$oidstr}. Вы должны получать к нему доступ каждый раз.

Существует много другой информации, которую он загружает из MIB, включая тип данных, который может помочь в решении проблемы, с которой вы, похоже, столкнулись hrSystemDate. Также см. справочную страницу для mib_api , если вам нужно загрузить определенные MIB. Однако те, которые вы использовали в своем примере, по умолчанию загружены в мою систему.

0 голосов
/ 27 декабря 2011

вы пробовали команду snmpget на вашем сервере? Когда я запускаю snmpget непосредственно на CLI, результат приходит с именем:

Пример: / usr / local / bin / snmpget -O Q -v 2c -c Сообщество x.x.x.x .1.3.6.1.2.1.31.1.1.1.6.100663301 IF-MIB :: ifHCInOctets.100663301 = 152528664859348

Если это работает для вас, вы можете использовать команду в коде PERL вместо использования LIB. Тогда вам просто нужно справиться с выводом.

Кроме того, вы можете использовать snmptranslate для перевода ваших OID:

Пример: / usr / local / bin / snmptranslate 1.3.6.1.2.1.25.1.1

HOST-RESOURCES-MIB :: hrSystemUptime

Подробнее -> http://www.net -snmp.org / wiki / index.php / TUT: snmptranslate

EDIT

Почему бы вам не:

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};  
    }  
 }  

На моей машине это сработало:

> /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

...