#!/usr/local/bin/perl -w # # $Id: bulkwalk.pl,v 1.1.1.1 2003/12/18 01:16:52 toni Exp $ # # This is an example of using the 'bulkwalk' functionality of the SNMP::Multi # module. This script queries the hosts 'router1.my.com' and 'router2.my.com' # for the sysUpTime.0 and sysContact.0 non-repeater variables, as well as the # 'ifInOctets' and 'ifOutOctets' subtree on each host. # # Remember that GETBULK works like GETNEXT -- if you want the first instance # of a tag (i.e. 'sysUpTime.0'), you must ask for the preceeding tag (the # branch 'sysUpTime', in this case). # # Note that the response contains one SNMP::VarList for each requested Varbind. # use strict; use Carp; use SNMP::Multi; my $comm = 'super!secret'; # SNMP community string my @hosts = qw/ router1.my.com router2.my.com /; # List of hosts to query # Build a VarReq for the hosts we wish to query. This request asks for # the sysUpTime.0 and sysContact.0 vars, as well as a list of the in and # out octet counts for every interface. The request is the same for both # hosts. # my $req = SNMP::Multi::VarReq->new ( nonrepeaters => 2, maxrepetitions => 100, hosts => [ @hosts ], vars => [ [ 'sysUpTime' ], [ 'sysContact' ], # Non-repeaters [ 'ifInOctets' ], [ 'ifOutOctets' ] ] # Repeated vars ) or croak "VarReq: $SNMP::Multi::VarReq::error\n"; # Create an SNMP::Multi object to do the work. This will be a "bulkwalk" # object, so we have to use SNMP v2c. # my $sm = SNMP::Multi->new ( Method => 'bulkwalk', Community => $comm, Version => '2c', Timeout => 5 ) or croak "$SNMP::Multi::error\n"; # Hand the host/variable request structure into the SNMP::Multi object. It # could also have done in the SNMP::Multi::new() invocation above. # $sm->request($req) or die $sm->error; # Now go out and make the requests to the hosts. The execute() method will # return after either 15 seconds has elapsed, or a response has been received # for all of the requests in the VarReq. # my $response = $sm->execute(15) or croak "$SNMP::Multi::error\n"; # Now unpack the Response object. Note that lists of the returned values for # any part of the Response tree can be retrieved through the values() methods # of the various objects in the Response. # print "Got responses for ", (join ' ', $response->hostnames), ":\n"; # This is rather noisy, but a good example... # print map { "\t$_\n" } $response->values(); for my $host ($response->hosts()) { print "Results for $host: \n"; # $host will stringify to the hostname. for my $result ($host->results()) { # If there was an error on this set of requests, print it and go to # the next request Result. # if ($result->error()) { print "Error: ", $result->error(), "\n"; next; } # Dump the values of all requests for the host. Again, this is # just an example of what could be done. # # print "Values for $host: ", map { "\t$_\n" } $result->values(); # Print the variables returned by the agent on the host. This is # much easier to read than the values() output above. $varist is # an SNMP::VarList as returned by SNMP.pm. # for my $varlist ($result->varlists()) { print "VarList:\n", map { "\t" . $_->fmt() . "\n" } @$varlist; } print "\n"; } } exit 0;