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