Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

get_bulk_request with Net::SNMP

by Anonymous Monk
on Jul 15, 2015 at 07:34 UTC ( #1134839=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I am writing a script to generate a config file for monitoring purpose. In this script, I'd like to have a function which do a snmp bulk_request using Net::SNMP, for each device I monitor. My devices are switches, and my final goal with this function is to make SNMP requests so I can get all the values I need for all the ports. For this, I used the example provided in the doc https://metacpan.org/pod/Net::SNMP#Non-blocking-SNMPv2c-get-bulk-request-for-ifTable as a starting point. I am able to get it working, but I would like to make the example a function to integrate it in my script
sub getSNMP { my $OID_ifTable = '1.3.6.1.2.1.2.2'; my $OID_ifPhysAddress = '1.3.6.1.2.1.2.2.1.6'; my $host = shift; my ($session, $error) = Net::SNMP->session( -hostname => $host || 'localhost', -community =>'maectn', -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_ifTable ], -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 (Net::SNMP::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}; } } } sub table_callback { my ($session, $table) = @_; my $OID_ifTable = '1.3.6.1.2.1.2.2'; my $list = $session->var_bind_list(); if (!defined $list) { printf "ERROR: %s\n", $session->error(); return; } my @names = $session->var_bind_names(); my $next = undef; while (@names) { $next = shift @names; if (!oid_base_match($OID_ifTable, $next)) { return; # Table is done. } $table->{$next} = $list->{$next}; } my $result = $session->get_bulk_request( -varbindlist => [ $next ], -maxrepetitions => 10, ); if (!defined $result) { printf "ERROR: %s.\n", $session->error(); } return; }
I call the function getSNMP this way
getSNMP($self->{ip});
The problem is that when I call the function, the query do not work, when I insert print statements for debugging, it shows nothing. Can you Monks give me some pointers to put me in the right direction? Thank you

Replies are listed 'Best First'.
Re: get_bulk_request with Net::SNMP
by Anonymous Monk on Jul 15, 2015 at 12:43 UTC
    solved

      Hello Anonymous,

      It would be nice to provide the solution to your problem so others can benefit from it also.

      Seeking for Perl wisdom...on the process of learning...not there...yet!
        The problem was that the OID in $OID_ifTable was wrong, so the line return; was allways triggered and so no response was stored in this line $table->{$next} = $list->{$next};
        while (@names) { $next = shift @names; if (!oid_base_match($OID_ifTable, $next)) { return; # Table is done. } $table->{$next} = $list->{$next};

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1134839]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (3)
As of 2020-11-30 02:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?