anyevent是基于事件和回调的格式,有时候用起来不太方便.
结合coro变成同步方式就容易理解一些.
#/usr/bin/env perl
#测试anyevent::snmp+coro
#测试取多个oid
use Coro;
use AnyEvent;
use AnyEvent::SNMP;
use Net::SNMP;
my $cocurrent = 1; # 并发数
#my @todoList = map { "192.168.6." . $_ } (1 .. 254); #
my @todoList = ("192.168.6.87","192.168.6.25","192.168.6.45"); #
my $oid=".1.3.6.1.2.1.1.3.0"; #sysuptime
my $oid1=".1.3.6.1.2.1.1.1.0"; #sysDescr
my @coro;
#my $cv = AnyEvent->condvar;
doit() foreach 1..$cocurrent;
sub doit{
my $ip = shift @todoList;
return if not defined $ip;
my $sess=Net::SNMP->session (-hostname => $ip,
-community => "public",
-timeout => 1,
-nonblocking => 1,
-translate => [-timeticks => 0x0]
);
#先取sysuptime
push @coro, async {
#print "$ip.\n";
my $ret=$sess->get_request (
-varbindlist => [ $oid ],
#-varbindlist => \@oids,
-callback => Coro::rouse_cb
);
#my @result = Coro::rouse_wait;
my ($session) = Coro::rouse_wait;
my $result = $session->var_bind_list();
if (!defined $result) {
printf "ERROR: Get request failed for host '%s': %s.\n",
$session->hostname(), $session->error();
}
else{
printf "The sysuptime for host '%s' is %s.\n",
$session->hostname(), $result->{$oid};
#继续取sysDescr
#print "$ip.\n";
#push @coro, async {
my $ret=$sess->get_request (
-varbindlist => [ $oid1 ],
-callback => Coro::rouse_cb
);
my ($session) = Coro::rouse_wait;
my $result = $session->var_bind_list();
if (!defined $result) {
printf "ERROR: Get request sysDescr failed for host '%s': %s.\n",
$session->hostname(), $session->error();
}
else{
printf "The sysDescr for host '%s' is %s.\n",
$session->hostname(), $result->{$oid1};
}
#}
}
&doit();
}
}
foreach (@coro) {
#print "joining\n";
$_->join;
#print "joined\n";
};