diff options
Diffstat (limited to 'perl/SNMP/examples/bulkwalk.pl')
-rw-r--r-- | perl/SNMP/examples/bulkwalk.pl | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/perl/SNMP/examples/bulkwalk.pl b/perl/SNMP/examples/bulkwalk.pl new file mode 100644 index 0000000..3ee2412 --- /dev/null +++ b/perl/SNMP/examples/bulkwalk.pl @@ -0,0 +1,121 @@ +use SNMP; + +# Hard-coded hostname and community. This is icky, but I didn't want to +# muddle the example with parsing command line arguments. Deal with it. -r +# +my $hostname='localhost'; +my $port='161'; +my $community='public'; + +$SNMP::debugging = 0; +$SNMP::dump_packet = 0; + +$sess = new SNMP::Session( 'DestHost' => $hostname, + 'Community' => $community, + 'RemotePort' => $port, + 'Timeout' => 300000, + 'Retries' => 3, + 'Version' => '2c', + 'UseLongNames' => 1, # Return full OID tags + 'UseNumeric' => 1, # Return dotted decimal OID + 'UseEnums' => 0, # Don't use enumerated vals + 'UseSprintValue' => 0); # Don't pretty-print values + +die "Cannot create session: ${SNMP::ErrorStr}\n" unless defined $sess; + +# Set up a list of two non-repeaters and some repeated variables. +# +# IMPORTANT NOTE: +# +# The 'get' performed for non-repeaters is a "GETNEXT" (the non-repeater +# requests are not fulfilled with SNMP GET's). This means that you must +# ask for the lexicographically preceeding variable for non-repeaters. +# +# For most branches (i.e. 'sysUpTime'), this "just works" -- be sure you +# don't ask for an instance, and the response will be as expected. However, +# if you want a specific variable instance (i.e. 'ifSpeed.5'), you must +# ask for the _preceeding_ variable ('ifSpeed.4' in this example). +# +# See section 4.2.3 of RFC 1905 for more details on GETBULK PDU handling. +# + +my $vars = new SNMP::VarList( ['sysUpTime'], # Nonrepeater variable + ['ifNumber'], # Nonrepeater variable + ['ifSpeed'], # Repeated variable + ['ifDescr'] ); # Repeated variable. + +# Do the bulkwalk of the two non-repeaters, and the repeaters. Ask for no +# more than 8 values per response packet. If the caller already knows how +# many instances will be returned for the repeaters, it can ask only for +# that many repeaters. +# +@resp = $sess->bulkwalk(2, 8, $vars); +die "Cannot do bulkwalk: $sess->{ErrorStr} ($sess->{ErrorNum})\n" + if $sess->{ErrorNum}; + +# Print out the returned response for each variable. +for $vbarr ( @resp ) { + # Determine which OID this request queried. This is kept in the VarList + # reference passed to bulkwalk(). + $oid = $$vars[$i++]->tag(); + + # Count the number of responses to this query. The count will be 1 for + # non-repeaters, 1 or more for repeaters. + $num = scalar @$vbarr; + print "$num responses for oid $oid: \n"; + + # Display the returned list of varbinds using the SNMP::Varbind methods. + for $v (@$vbarr) { + printf("\t%s = %s (%s)\n", $v->name, $v->val, $v->type); + } + print "\n"; +} + +# +# Now do the same bulkwalk again, but in asynchronous mode. Set up a Perl +# callback to receive the reference to the array of arrays of Varbind's for +# the return value, and pass along the $vars VarList to it. This allows us +# to print the oid tags (the callback code is almost the same as above). +# +# First, define the Perl callback to be called when the bulkwalk completes. +# The call to SNMP::finish() will cause the SNMP::MainLoop() to return once +# the callback has completed, so that processing can continue. +# +sub callback { + my ($vars, $values) = @_; + + for $vbarr ( @$values ) { + # Determine which OID this request queried. This is kept in the + # '$vars' VarList reference passed to the Perl callback by the + # asynchronous callback. + $oid = (shift @$vars)->tag(); + + # Count the number of responses to this query. The count will be 1 for + # non-repeaters, 1 or more for repeaters. + $num = scalar @$vbarr; + print "$num responses for oid $oid: \n"; + + # Display the returned list of varbinds using the SNMP::Varbind methods. + for $v (@$vbarr) { + printf("\t%s = %s (%s)\n", $v->name, $v->val, $v->type); + } + print "\n"; + } + + SNMP::finish(); +} + +# The actual bulkwalk request is done here. Note that the $vars VarList +# reference will be passed to the Perl callback when the bulkwalk completes. +# +my $reqid = $sess->bulkwalk(2, 8, $vars, [ \&callback, $vars ]); +die "Cannot do async bulkwalk: $sess->{ErrorStr} ($sess->{ErrorNum})\n" + if $sess->{ErrorNum}; + +# Now drop into the SNMP event loop and await completion of the bulkwalk. +# The call to SNMP::finish() in &callback will make the SNMP::MainLoop() +# return to the caller. +# +SNMP::MainLoop(); + +exit 0; |