NAME
POE::Component::SNMP - POE interface to Net::SNMP
SYNOPSIS
# this script is included in the distribution as eg/snmp_sample.pl
use POE qw/Component::SNMP/;
my %system = ( sysUptime => '.1.3.6.1.2.1.1.3.0',
sysName => '.1.3.6.1.2.1.1.5.0',
sysLocation => '.1.3.6.1.2.1.1.6.0',
);
my @oids = values %system;
my $base_oid = '.1.3.6.1.2.1.1'; # system.*
POE::Session->create( inline_states =>
{ _start => \&_start,
snmp_handler => \&snmp_handler,
}
);
sub _start {
my ($kernel, $heap) = @_[KERNEL, HEAP];
POE::Component::SNMP->create( alias => 'snmp', # same as default
hostname => 'localhost',
community => 'public',
timeout => 3,
);
$kernel->post( snmp => get => snmp_handler => -varbindlist => \@oids );
# ... or maybe even ...
$kernel->post( snmp => walk => snmp_handler => -baseoid => $base_oid );
$heap->{pending} = 2;
}
sub snmp_handler {
my ($kernel, $heap, $request, $response) = @_[KERNEL, HEAP, ARG0, ARG1];
my ($alias, $host, $cmd, @args) = @$request;
my ($results) = @$response;
if (ref $results) {
print "$host SNMP config ($cmd):\n";
print "sysName: $results->{$system{sysName}}\n";
print "sysUptime: $results->{$system{sysUptime}}\n";
print "sysLocation: $results->{$system{sysLocation}}\n";
} else {
print "$host SNMP error ($cmd => @args):\n$results\n";
}
if (--$heap->{pending} == 0) {
$kernel->post( $alias => 'finish' );
}
}
$poe_kernel->run();
DESCRIPTION
POE::Component::SNMP is a POE-ized wrapper around the Net::SNMP module written by David M. Town. Most of its arguments aren't even evaluated by POE, except for -alias
, as described below.
CREATING SNMP COMPONENTS
- create - create an SNMP session
-
POE::Component::SNMP->create( hostname => $hostname, # required [alias => $alias, ] # default 'snmp' [community => $community,] # default 'public', with a warning [version => $version, ] # default '1', SNMPv1 [timeout => $timeout, ] # default 5.0 [retries => $retries, ] # default 1 [debug => $debug, ] # default 0 [ ... any other arguments Net::SNMP recognizes ... ] );
create()
passes all of its arguments to the constructor for a Net::SNMP object untouched with the exception of-alias
. See "METHODS" in Net::SNMP onsession()
for details. The constructor supports either of the following two parameter naming styles:$object->method(-parameter => $value); $object->method( parameter => $value);
-hostname
is required.-community
defaults to 'public', but the module will emit a runtime warning if the community is not explicitly specified.-alias
is not required unless you want to query more than one host. See "Concurrency", below.
Concurrency
In order to access multiple SNMP hosts simultaneously, you must create a separate instance of the component for each host, by giving each component a different -alias
parameter in the constructor.
The -alias
and -hostname
parameters, as well as other values, are passed back to callback events, as described in "CALLBACKS" below, so the callback can determine which host the current response (or timeout) is related to.
Note: It is a fatal runtime error to attempt to create more than one SNMP session with the same -alias
.
Sockets
By default, Net::SNMP creates a single socket per network interface. Since POE can only watch one connection per socket at a time, this creates a conflict if you want to contact more than one remote host simultaneously. The workaround used by the module is to create each socket using a different randomly generated value for the -localport
parameter, specifying a unique local UDP port for each host. This could potentially interfere with remote communications if your local firewall policy requires a specific source port for outgoing SNMP requests (as noted by David Town, the author of Net::SNMP). In this situation, you can supply an explicit -localport
argument to the constructor, but remember that every active session requires its own unique local port per session/host, per interface.
REQUESTS
Most of the events accept a list of arguments which are passed directly to a Net::SNMP session. See "METHODS" in Net::SNMP for more information on these arguments.
Requests take the form:
$poe_kernel->post( $session_alias => $request => $callback_state => @snmp_args );
See the SYNOPSIS for specific examples.
- get
-
See "METHODS" in Net::SNMP on
get_request()
. - getnext
-
See "METHODS" in Net::SNMP on
get_next_request()
. - getbulk
-
See "METHODS" in Net::SNMP on
get_bulk_request()
. - walk
-
See "METHODS" in Net::SNMP on
get_table()
. - inform
-
See "METHODS" in Net::SNMP on
inform_request()
. - set
-
See "METHODS" in Net::SNMP on
set_request()
. - trap
-
$kernel->post( snmp => trap => @snmp_args ); # or, even better: my $status = $kernel->call( snmp => trap => @snmp_args );
Send a SNMPv1 trap message. See "METHODS" in Net::SNMP on
trap()
. This method differs from the others in that it does *not* take a state name as a callback parameter. If the method is invoked with$kernel->call()
, the return value is that oftrap()
. A false value indicates an error, and the error message can be retrieved usingerrmsg
, below. - errmsg
-
my $last_snmp_error_message = $kernel->call( snmp => 'errmsg' );
Retrieves the last SNMP error message, if any, from the specified SNMP session.
- finish
-
$kernel->post( snmp => 'finish' );
Shut down the SNMP component. Cancels any pending requests and closes the session.
CALLBACKS
When a request either receives a response or times out, the supplied callback event (a POE event name defined in the session that called the SNMP component) is invoked.
The callback's $_[ARG0]
parameter is an array reference containing the request information: the component alias, hostname, the method called, and parameters supplied to the request.
The callback's $_[ARG1]
parameter is an array reference containing the response information: either a hash reference containing response data or a scalar error message string.
Note: This is a change from previous versions of the module! For compatibility, any errors are still returned in $_[ARG1][1], but this will go away.
SEE ALSO
Net::SNMP
POE
AUTHOR
Adopted and maintained by Rob Bloodgood <rob@exitexchange.com>
Originally by Todd Caine <tcaine@eli.net>
COPYRIGHT AND LICENSE
Copyright 2004-2006 by Rob Bloodgood
Copyright 2003 by Todd Caine
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 398:
Unterminated C<...> sequence