Try it this way. Create a set number of sessions, then dispatch events (using snmp_dispatch_once()) until you get a reply. Then create another and dispatch events until you get another reply, and so on. Adjust the value of $MAXCONCURRENT to control your memory usage.
(Note:Untested code):
#!/usr/bin/perl -w
use warnings;
use strict;
use Net::IP;
use Net::SNMP qw( snmp_dispatch_once oid_lex_sort );
#use Smart::Comments '###';
my $startip = $ARGV[0] || die "Missing Starting IP";
my $endip = $ARGV[1] || die "Missing Ending IP";
my $community = $ARGV[2] || die "Missing community string";
my $ips = Net::IP->new( "$ARGV[ 0 ] - $ARGV[ 1 ]" );
my $MAXCONCURRENT = 50;
my $running = 0;
### Updated do{} while (taken from docs) to while(){} per reply.
while( ++$ips ) {
my( $session, $error ) = Net::SNMP->session(
-hostname => $ips->ip,
-version => 'snmpv2c',
-nonblocking => 1,
-community => "$community",
-timeout => 3,
-retries => 1,
);
if( defined( $session ) ) {
my $serialno = '.1.3.6.1.3.83.1.1.4.0';
my $mac = '.1.3.6.1.2.1.2.2.1.6.2';
my @msoids = ( $mac, $serialno );
my $result = $session->get_request(
-varbindlist => \@msoids,
-callback => [ \&getms, $session, $ips->ip ]
);
$running++; ## Count the sessions started
}else{
warn "Session not defined for %s: %s\n", $ips->ip, $session->e
+rror_status;
};
## start another unless we have the max running
next unless $running > $MAXCONCURRENT;
## Dispatch events until we get a reply from one
snmp_dispatch_once() while $running > $MAXCONCURRENT;
}
exit;
sub getms {
my $obj = shift;
my $session = shift;
my $hfcip = shift;
$running--; ## One more done
if (!defined($obj->var_bind_list)) {
warn "$hfcip SNMP Error.", $obj->error_status,"\n";
return;
}
## print values for the oids
$session->close;
}
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|