bulkwalk.pl
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:4k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. use SNMP;
  2. # Hard-coded hostname and community.  This is icky, but I didn't want to 
  3. # muddle the example with parsing command line arguments.  Deal with it. -r
  4. #
  5. my $hostname='localhost';
  6. my $port='161';
  7. my $community='public';
  8. $SNMP::debugging = 0;
  9. $SNMP::dump_packet = 0;
  10. $sess = new SNMP::Session( 'DestHost' => $hostname,
  11.    'Community' => $community,
  12.    'RemotePort' => $port,
  13.    'Timeout' => 300000,
  14.    'Retries' => 3,
  15.    'Version' => '2c',
  16.    'UseLongNames' => 1,    # Return full OID tags
  17.    'UseNumeric' => 1,    # Return dotted decimal OID
  18.    'UseEnums' => 0,    # Don't use enumerated vals
  19.    'UseSprintValue' => 0); # Don't pretty-print values
  20. die "Cannot create session: ${SNMP::ErrorStr}n" unless defined $sess;
  21. # Set up a list of two non-repeaters and some repeated variables.
  22. #
  23. # IMPORTANT NOTE:
  24. #
  25. #   The 'get' performed for non-repeaters is a "GETNEXT" (the non-repeater
  26. #   requests are not fulfilled with SNMP GET's).  This means that you must
  27. #   ask for the lexicographically preceeding variable for non-repeaters.
  28. #
  29. #   For most branches (i.e. 'sysUpTime'), this "just works" -- be sure you
  30. #   don't ask for an instance, and the response will be as expected.  However,
  31. #   if you want a specific variable instance (i.e. 'ifSpeed.5'), you must 
  32. #   ask for the _preceeding_ variable ('ifSpeed.4' in this example).
  33. #
  34. #   See section 4.2.3 of RFC 1905 for more details on GETBULK PDU handling.
  35. #
  36. my $vars = new SNMP::VarList( ['sysUpTime'], # Nonrepeater variable
  37. ['ifNumber'], # Nonrepeater variable
  38. ['ifSpeed'], # Repeated variable
  39. ['ifDescr'] );  # Repeated variable.
  40. # Do the bulkwalk of the two non-repeaters, and the repeaters.  Ask for no
  41. # more than 8 values per response packet.  If the caller already knows how
  42. # many instances will be returned for the repeaters, it can ask only for
  43. # that many repeaters.
  44. #
  45. @resp = $sess->bulkwalk(2, 8, $vars);
  46. die "Cannot do bulkwalk: $sess->{ErrorStr} ($sess->{ErrorNum})n"
  47. if $sess->{ErrorNum};
  48. # Print out the returned response for each variable.
  49. for $vbarr ( @resp ) {
  50.     # Determine which OID this request queried.  This is kept in the VarList
  51.     # reference passed to bulkwalk().
  52.     $oid = $$vars[$i++]->tag();
  53.     # Count the number of responses to this query.  The count will be 1 for
  54.     # non-repeaters, 1 or more for repeaters.
  55.     $num = scalar @$vbarr;
  56.     print "$num responses for oid $oid: n";
  57.     # Display the returned list of varbinds using the SNMP::Varbind methods.
  58.     for $v (@$vbarr) {
  59. printf("t%s = %s (%s)n", $v->name, $v->val, $v->type);
  60.     }
  61.     print "n";
  62. }
  63. #
  64. # Now do the same bulkwalk again, but in asynchronous mode.  Set up a Perl
  65. # callback to receive the reference to the array of arrays of Varbind's for
  66. # the return value, and pass along the $vars VarList to it.  This allows us
  67. # to print the oid tags (the callback code is almost the same as above).
  68. #
  69. # First, define the Perl callback to be called when the bulkwalk completes.
  70. # The call to SNMP::finish() will cause the SNMP::MainLoop() to return once
  71. # the callback has completed, so that processing can continue.
  72. #
  73. sub callback {
  74.     my ($vars, $values) = @_;
  75.     
  76.     for $vbarr ( @$values ) {
  77. # Determine which OID this request queried.  This is kept in the 
  78. # '$vars' VarList reference passed to the Perl callback by the
  79. # asynchronous callback.
  80. $oid = (shift @$vars)->tag();
  81. # Count the number of responses to this query.  The count will be 1 for
  82. # non-repeaters, 1 or more for repeaters.
  83. $num = scalar @$vbarr;
  84. print "$num responses for oid $oid: n";
  85. # Display the returned list of varbinds using the SNMP::Varbind methods.
  86. for $v (@$vbarr) {
  87.     printf("t%s = %s (%s)n", $v->name, $v->val, $v->type);
  88. }
  89. print "n";
  90.     }
  91.     SNMP::finish();
  92. }
  93. # The actual bulkwalk request is done here.  Note that the $vars VarList 
  94. # reference will be passed to the Perl callback when the bulkwalk completes.
  95. my $reqid = $sess->bulkwalk(2, 8, $vars, [ &callback, $vars ]);
  96. die "Cannot do async bulkwalk: $sess->{ErrorStr} ($sess->{ErrorNum})n"
  97. if $sess->{ErrorNum};
  98. # Now drop into the SNMP event loop and await completion of the bulkwalk.
  99. # The call to SNMP::finish() in &callback will make the SNMP::MainLoop()
  100. # return to the caller.
  101. #
  102. SNMP::MainLoop();
  103. exit 0;