NAME

Mojo::SNMP - Run SNMP requests with Mojo::IOLoop

VERSION

0.13

SYNOPSIS

Using methods with callbacks

use Mojo::SNMP;
my $snmp = Mojo::SNMP->new;

$snmp->defaults({timeout => 3, community => "public"});

$snmp->get_next(["10.0.0.1", "10.0.0.2"], ["1.3.6.1.2.1.1.3.0"], sub {
  my ($self, $err, $session) = @_;
});

$snmp->wait unless $snmp->ioloop->is_running;

Using prepare

use Mojo::SNMP;
my $snmp = Mojo::SNMP->new;
my @response;

$snmp->on(response => sub {
  my ($snmp, $session, $args) = @_;
  warn "Got response from $args->{hostname} on $args->{method}(@{$args->{request}})...\n";
  push @response, $session->var_bind_list;
});

$snmp->defaults({
  community => "public", # v1, v2c
  username  => "foo", # v3
  version   => "v2c", # v1, v2c or v3
});

$snmp->prepare("127.0.0.1", get_next => ["1.3.6.1.2.1.1.3.0"]);
$snmp->prepare("localhost", {version => "v3"}, get => ["1.3.6.1.2.1.1.3.0"]);

# start the IOLoop unless it is already running
$snmp->wait unless $snmp->ioloop->is_running;

DESCRIPTION

Mojo::SNMP is an async library for fetching or writing data from/to many SNMP agents. The module does its best to not get in your way, but rather provide a simple API which allow you to extract information from multiple servers at the same time.

This module uses Net::SNMP and Mojo::IOLoop to fetch data from hosts asynchronously. It does this by using a custom dispatcher, Mojo::SNMP::Dispatcher, which attach the sockets created by Net::SNMP directly into the ioloop reactor.

If you want greater speed, you should check out Net::SNMP::XS and make sure Mojo::Reactor::EV and EV is installed.

Mojo::SNMP is supposed to be a replacement for a module I wrote earlier, called SNMP::Effective. Reason for the rewrite is that I'm using the framework Mojolicious which includes an awesome IO loop which allow me to do cool stuff inside my web server.

EVENTS

error

$self->on(error => sub { my ($self, $str, $session, $args) = @_; ... });

Emitted on errors which may occur. $session is a Net::SNMP object and is only available if the error is a result of a Net::SNMP method, such as get_request().

See "response" for $args description.

finish

$self->on(finish => sub { my $self = shift; ... });

Emitted when all requests have completed.

response

$self->on(response => sub { my ($self, $session, $args) = @_; ... });

Called each time a host responds. The $session is the current Net::SNMP object. $args is a hash ref with the arguments given to "prepare", with some additional information:

{
  method => $str, # get, get_next, ...
  request => [$oid, ...],
  ...
}

timeout

$self->on(timeout => sub { my $self = shift; ... })

Emitted if "wait" has been running for more than "master_timeout" seconds.

ATTRIBUTES

concurrent

$self = $self->concurrent(20);
$int = $self->concurrent;

How many hosts to fetch data from at once. Default is 20. (The default may change in later versions)

defaults

$self = $self->defaults({community => "public"});
$hash_ref = $self->community;

This attribute holds a hash ref with default arguments which will be passed on to "session" in Net::SNMP. User-submitted %args will be merged with the defaults before being submitted to "prepare". prepare() will filter out and ignore arguments that don't work for the SNMP version.

NOTE: SNMP version will default to "v2c".

master_timeout

$self = $self->master_timeout(15);
$int = $self->master_timeout;

How long to run in total before timeout. Note: This is NOT per host but for the complete run. Default is 0, which means that it will never time out.

If you want to set a timeout per request request to a host, then this need to be set in "defaults" or in $args passed on to "prepare" or one of the other request methods.

ioloop

$self = $self->ioloop(Mojo::IOLoop->new);
$ioloop = $self->ioloop;

Holds an instance of Mojo::IOLoop.

METHODS

add_custom_request_method

Mojo::SNMP->add_custom_request_method(my_custom_method => sub {
  my ($session, %args) = @_;
  # do custom stuff..
});

Net::SNMP has defined basic methods to write/retrieve data from/to the SNMP agent. "add_custom_request_method" allow you to add support for custom methods, which can be useful if you find yourself doing the same complicated logic over and over again. "bulk_walk" and "walk" are custom methods bundled with this module.

NOTE: This method will define the methods in a global scope, meaning the code below will call the custom callback instead of "get_next_request" in Net::SNMP for all instances of Mojo::SNMP:

$self->add_custom_request_method(get_next => sub { ... });

bulk_walk

$self->bulk_walk($host, $args, \@oids, sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

This is a custom SNMP method added by "add_custom_request_method". See "prepare" for generic information about the variables associated with this method.

This method will run "get_bulk_request" in Net::SNMP until it receives an OID which does not match the base OID. maxrepetitions in $args will default to 10, but could be overrided to potentially increase performance. Example:

$self->bulk_walk("192.168.0.1" => {maxrepetitions => 25}, sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

get

$self->get($host, \%args, \@oids, sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

Will send a SNMP get-request to the remote agent. See "get_request" in Net::SNMP for details on which %args you can pass on. See "prepare" for generic information about the variables associated with this method.

get_bulk

$self->get_bulk($host, \%args, \@oids, sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

Will send a SNMP get-bulk-request to the remote agent. See "get_bulk_request" in Net::SNMP for details on which %args you can pass on. See "prepare" for generic information about the variables associated with this method.

get_next

$self->get_next($host, \%args, \@oids, sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

Will send a SNMP get-next-request to the remote agent. See "get_next_request" in Net::SNMP for details on which $args you can pass on. See "prepare" for generic information about the variables associated with this method.

prepare

$self = $self->prepare($host, \%args, ...);
$self = $self->prepare(\@hosts, \%args, ...);
$self = $self->prepare(\@hosts, ...);
$self = $self->prepare("*" => ...);
  • $host

    This can either be an array ref or a single host. The "host" can be whatever "session" in Net::SNMP can handle; generally a hostname or IP address.

  • \%args

    A hash ref of options which will be passed directly to "session" in Net::SNMP. This argument is optional. See also "defaults".

  • dot-dot-dot

    A list of key-value pairs of SNMP operations and bindlists which will be given to "prepare". The operations are the same as the method names available in Net::SNMP, but without "_request" at end:

    get
    get_next
    set
    get_bulk
    inform
    walk
    bulk_walk
    ...

    The special hostname "*" will apply the given operation to all previously defined hosts.

Examples:

$self->prepare("192.168.0.1" => {version => "v2c"}, get_next => [$oid, ...]);
$self->prepare("192.168.0.1" => {version => "v3"}, get => [$oid, ...]);
$self->prepare(localhost => set => [$oid => OCTET_STRING, $value, ...]);
$self->prepare("*" => get => [$oid, ...]);

Note: To get the OCTET_STRING constant and friends you need to do:

use Net::SNMP ":asn1";

set

use Net::SNMP ":asn1"; # Export OCTET_STRING

$self->set($host, $args => [$oid, OCTET_STRING, $value, ...], sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

Will send a SNMP set-request to the remote agent. See "set_request" in Net::SNMP for details on which $args you can pass on. See "prepare" for generic information about the variables associated with this method.

walk

$self->walk($host, $args, \@oids, sub {
  my ($self, $err, $session) = @_;
  return warn $err if $err;
  push @{$res{$host}}, $session->var_bind_list;
});

This is a custom SNMP method added by "add_custom_request_method". See "prepare" for generic information about the variables associated with this method.

This method will run "get_next_request" in Net::SNMP until an oid retrieved does not match the base OID, or if the tree is exhausted. You might want to use "bulk_walk" instead for better performance.

wait

$self->wait;

This is useful if you want to block your code: wait() starts the ioloop and runs until "master_timeout" or "finish" is reached.

my $snmp = Mojo::SNMP->new;
$snmp->prepare(...)->wait; # blocks while retrieving data
# ... your program continues after the SNMP operations have finished.

AUTHOR

Jan Henning Thorsen - jhthorsen@cpan.org

CONTRIBUTORS

Espen Tallaksen - espen.tallaksen@telenor.com

Joshua Keroes - joshua.keroes@integratelecom.com

Oliver Gorwits - oliver@cpan.org

Per Carlson - per.carlson@broadnet.no

COPYRIGHT & LICENSE

Copyright (C) 2012-2018, "AUTHOR" and "CONTRIBUTORS".

This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.