SNMP::Simple - shortcuts for when using SNMP


SNMP-Simple documentation Contained in the SNMP-Simple distribution.

Index


Code Index:

NAME

Top

SNMP::Simple - shortcuts for when using SNMP

SYNOPSIS

Top

    use SNMP::Simple;

    $name     = $s->get('sysName');       # same as sysName.0
    $location = $s->get('sysLocation');

    @array    = $s->get_list('hrPrinterStatus');
    $arrayref = $s->get_list('hrPrinterStatus');

    @list_of_lists = $s->get_table(
        qw(
            prtConsoleOnTime
            prtConsoleColor
            prtConsoleDescription
            )
    );

    @list_of_hashes = $s->get_named_table(
        name   => 'prtInputDescription',
        media  => 'prtInputMediaName',
        status => 'prtInputStatus',
        level  => 'prtInputCurrentLevel',
        max    => 'prtInputMaxCapacity',
    );

DESCRIPTION

Top

This module provides shortcuts when performing repetitive information-retrieval tasks with SNMP.

Instead of this:

    use SNMP;
    $vars = new SNMP::VarList( ['prtConsoleOnTime'], ['prtConsoleColor'],
        ['prtConsoleDescription'], );
    my ( $light_status, $light_color, $light_desc ) = $s->getnext($vars);
    die $s->{ErrorStr} if $s->{ErrorStr};
    while ( !$s->{ErrorStr} and $$vars[0]->tag eq "prtConsoleOnTime" ) {
        push @{ $data{lights} },
            {
            status => ( $light_status ? 0 : 1 ),
            color       => SNMP::mapEnum( $$vars[1]->tag, $light_color ),
            description => $light_desc,
            };
        ( $light_status, $light_color, $light_desc ) = $s->getnext($vars);
    }

...you can do this:

    use SNMP::Simple;
    $data{lights} = $s->get_named_table(
        status => 'prtConsoleOnTime',
        color  => 'prtConsoleColor',
        name   => 'prtConsoleDescription',
    );

SNMP Beginners, read me first!

Please, please, please do not use this module as a starting point for working with SNMP and Perl. Look elsewhere for starting resources:

* The SNMP module
* The Net-SNMP web site (http://www.net-snmp.org/) and tutorial (http://www.net-snmp.org/tutorial-5/)
* Appendix E of Perl for System Administration (http://www.amazon.com/exec/obidos/tg/detail/-/1565926099) by David N. Blank-Edelman

SNMP Advanced and Intermediate users, read me first!

I'll admit this is a complete slaughtering of SNMP, but my goals were precise. If you think SNMP::Simple could be refined in any way, feel free to send me suggestions/fixes/patches.

METHODS

Top

new( @args )

Creates a new SNMP::Simple object. Arguments given are passed directly to SNMP::Session->new. See "SNMP::Session" in SNMP for details.

Example:

    use SNMP::Simple

    my $s = SNMP::Simple->new(
        DestHost  => 'host.example.com',
        Community => 'public',
        Version   => 1,
    ) or die "couldn't create session";

    ...

get( $oid )

Gets the named variable and returns its value. If no value is returned, get() will try to retrieve a list named $name and return its first vlaue. Thus, for convenience,

    $s->get('sysDescr')

..should be the same as:

    $s->get('sysDescr.0')

Numbered OIDs are fine, too, with or without a leading dot:

    $s->get('1.3.6.1.2.1.1.1.0')

SNMP::mapEnum() is automatically used on the result.

get_list( $oid )

Returns leaves of the given OID.

If called in array context, returns an array. If called in scalar context, returns an array reference.

get_table( @oids )

Given a list of OIDs, this will return a list of lists of all of the values of the table.

For example, to get a list of all known network interfaces on a machine and their status:

    $s->get_table('ifDescr', 'ifOperStatus')

Would return something like the following:

    [ 'lo',   'up'   ], 
    [ 'eth0', 'down' ], 
    [ 'eth1', 'up'   ],
    [ 'sit0', 'down' ]

If called in array context, returns an array (of arrays). If called in scalar context, returns an array reference.

get_named_table( %oids_by_alias )

Like "get_table", but lets you rename ugly OID names on the fly. To get a list of all known network interfaces on a machine and their status:

    $s->get_table( name => 'ifDescr', status => 'ifOperStatus' )

Would return something like the following:

        {   
            status => 'up',
            name   => 'lo'
        },
        {
            status => 'down',
            name   => 'eth0'
        },
        {
            status => 'up',
            name   => 'eth1'
        },
        {
            status => 'down',
            name   => 'sit0'
        }

If called in array context, returns an array (of hashes). If called in scalar context, returns an array reference.

EXAMPLES

Top

A sample script examples/printerstats.pl is included with this distribution.

SEE ALSO

Top

SNMP

AUTHOR

Top

Ian Langworth, <ian@cpan.org>

BUGS

Top

* There are no real tests.
* I haven't tested this with v3.

Please report any bugs or feature requests to bug-snmp-simple@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


SNMP-Simple documentation Contained in the SNMP-Simple distribution.
package SNMP::Simple;
use strict;
use warnings;

use Carp;

our $VERSION = 0.02;

use SNMP;

$SNMP::use_enums = 1;    # can be overridden with new(UseEnums=>0)

sub new {
    my ( $class, @args ) = @_;
    my $session = SNMP::Session->new(@args)
        or croak "Couldn't create session";
    bless \$session, $class;
}

sub get {
    my ( $self, $name ) = @_;
    my $result = $$self->get($name) || ( $self->get_list($name) )[0];
    my $enum = SNMP::mapEnum( $name, $result );
    return defined $enum ? $enum : $result;
}

sub get_list {
    my ( $self, $oid ) = @_;
    my @table = $self->get_table($oid);
    my @output = map { $_->[0] } @table;
    return wantarray ? @output : \@output;
}

sub get_table {
    my ( $self, @oids ) = @_;
    my @output = ();

    # build our varlist, the fun VarList way
    my $vars = new SNMP::VarList( map { [$_] } @oids );

    # get our initial results, assume that we should be able to get at least
    # *one* row back
    my @results = $$self->getnext($vars);
    croak $$self->{ErrorStr} if $$self->{ErrorStr};

    # dNb's recipe for iteration: make sure that there's no error and that the
    # OID name of the first cell is actually what we want
    while ( !$$self->{ErrorStr} and $$vars[0]->tag eq $oids[0] ) {
        push @output, [@results];
        @results = $$self->getnext($vars);
    }

    return wantarray ? @output : \@output;
}

sub get_named_table {
    my $self        = shift;
    my %oid_to_name = reverse @_;
    my @oids        = keys %oid_to_name;

    # remap table so it's a list of hashes instead of a list of lists
    my @table = $self->get_table( keys %oid_to_name );
    my @output;
    foreach my $row (@table) {
        my %data = ();
        for ( my $i = 0; $i < @oids; $i++ ) {
            $data{ $oid_to_name{ $oids[$i] } } = $row->[$i];
        }
        push @output, \%data;
    }

    return wantarray ? @output : \@output;
}

1;