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

SNMP编程

开发平台:

Unix_Linux

  1. package NetSNMP::TrapReceiver;
  2. use 5.00006;
  3. use strict;
  4. use Carp;
  5. require Exporter;
  6. require DynaLoader;
  7. use AutoLoader;
  8. use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
  9. @ISA = qw(Exporter
  10. DynaLoader);
  11. require NetSNMP::OID;
  12. # Items to export into callers namespace by default. Note: do not export
  13. # names by default without a very good reason. Use EXPORT_OK instead.
  14. # Do not simply export all your public functions/methods/constants.
  15. # This allows declaration use NetSNMP::TrapReceiver ':all';
  16. # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
  17. # will save memory.
  18. %EXPORT_TAGS = ( 'all' => [ qw(
  19. NETSNMPTRAPD_AUTH_HANDLER
  20. NETSNMPTRAPD_HANDLER_BREAK
  21. NETSNMPTRAPD_HANDLER_FAIL
  22. NETSNMPTRAPD_HANDLER_FINISH
  23. NETSNMPTRAPD_HANDLER_OK
  24. NETSNMPTRAPD_POST_HANDLER
  25. NETSNMPTRAPD_PRE_HANDLER
  26. netsnmp_add_default_traphandler
  27. netsnmp_add_global_traphandler
  28. netsnmp_add_traphandler
  29. ) ] );
  30. @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
  31. @EXPORT = qw(
  32. NETSNMPTRAPD_AUTH_HANDLER
  33. NETSNMPTRAPD_HANDLER_BREAK
  34. NETSNMPTRAPD_HANDLER_FAIL
  35. NETSNMPTRAPD_HANDLER_FINISH
  36. NETSNMPTRAPD_HANDLER_OK
  37. NETSNMPTRAPD_POST_HANDLER
  38. NETSNMPTRAPD_PRE_HANDLER
  39. );
  40. $VERSION = '5.2.2';
  41. # sub new {
  42. #     my $type = shift;
  43. #     my ($self);
  44. #     %$self = @_;
  45. #     bless($self, $type);
  46. #     return $self;
  47. # }
  48. # sub register($$$$) {
  49. #     my ($self, $oid, $sub) = @_;
  50. #     my $reg = NetSNMP::TrapReceiver::registration::new($oid, $sub);
  51. #     if ($reg) {
  52. #  $reg->register();
  53. #  $self->{'regobjs'}{$name} = $reg;
  54. #     }
  55. #     return $reg;
  56. # }
  57. sub AUTOLOAD {
  58.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  59.     # XS function.
  60.     my $constname;
  61.     ($constname = $AUTOLOAD) =~ s/.*:://;
  62.     croak "&NetSNMP::TrapReceiver::constant not defined" if $constname eq 'constant';
  63.     my ($error, $val) = constant($constname);
  64.     if ($error) { croak $error; }
  65.     {
  66. no strict 'refs';
  67. # Fixed between 5.005_53 and 5.005_61
  68. #XXX if ($] >= 5.00561) {
  69. #XXX     *$AUTOLOAD = sub () { $val };
  70. #XXX }
  71. #XXX else {
  72.     *$AUTOLOAD = sub { $val };
  73. #XXX }
  74.     }
  75.     goto &$AUTOLOAD;
  76. }
  77. bootstrap NetSNMP::TrapReceiver $VERSION;
  78. # Preloaded methods go here.
  79. # Autoload methods go after =cut, and are processed by the autosplit program.
  80. 1;
  81. __END__
  82. =head1 NAME
  83. NetSNMP::TrapReceiver - Embedded perl trap handling for Net-SNMP's snmptrapd
  84. =head1 SYNOPSIS
  85. Put the following lines in your snmptrapd.conf file:
  86.   perl NetSNMP::TrapReceiver::register("trapOID", &myfunc);
  87. =head1 ABSTRACT
  88. The NetSNMP::TrapReceiver module is used to register perl
  89. subroutines into the Net-SNMP snmptrapd process.  Net-SNMP MUST have
  90. been configured using --with-embedded-perl.  Registration of
  91. functions is then done through the snmptrapd.conf configuration
  92. file.  This module can NOT be used in a normal perl script to
  93. receive traps.  It is intended solely for embedded use within the
  94. snmptrapd demon.
  95. =head1 DESCRIPTION
  96. Within the snmprapd.conf file, the keyword "perl" may be used to call
  97. any perl expression and using this ability, you can use the
  98. NetSNMP::TrapReceiver module to register functions which will be
  99. called every time a given notification (a trap or an inform) is
  100. received.  Registered functions are called with 2 arguments.  The
  101. first is a reference to a hash containing information about how the
  102. trap was received (what version of the SNMP protocol was used, where
  103. it came from, what SNMP user name or community name it was sent under,
  104. etc).  The second argument is a reference to an array containing the
  105. variable bindings (OID and value information) that define the
  106. noification itself.  Each variable is itself a reference to an array
  107. containing three values: a NetSNMP::OID object, the value that came
  108. associated with it, and the value's numeric type (see NetSNMP::ASN for
  109. further details on SNMP typing information).
  110. Subroutines are registered using the NetSNMP::TrapReceiver::register
  111. funcion, which takes two arguments.  The first is a string describing
  112. the notification you want to register for (such as "linkUp" or
  113. "MyMIB::MyTrap" or ".1.3.6.1.4.1.2021....").  Two special keywords can
  114. be used in place of an OID: "default" and "all".  The "default"
  115. keyword indicates you want your handler to be called in the case where
  116. no other handlers are called.  The "all" keyword indicates that the
  117. handler should ALWAYS be called for every notification.
  118. =head1 EXAMPLE
  119. As an example, put the following code into a file (say
  120. "/usr/local/share/snmp/mytrapd.pl"):
  121.   #!/usr/bin/perl
  122.   sub my_receiver {
  123.       print "********** PERL RECEIVED A NOTIFICATION:n";
  124.       # print the PDU info (a hash reference)
  125.       print "PDU INFO:n";
  126.       foreach my $k(keys(%{$_[0]})) {
  127.    printf "  %-30s %sn", $k, $_[0]{$k};
  128.       }
  129.       # print the variable bindings:
  130.       print "VARBINDS:n";
  131.       foreach my $x (@{$_[1]}) { 
  132.   printf "  %-30s type=%-2d value=%sn", $x->[0], $x->[2], $x->[1]; 
  133.       }
  134.   }
  135.   NetSNMP::TrapReceiver::register("all", &my_receiver) || 
  136.     warn "failed to register our perl trap handlern";
  137.   print STDERR "Loaded the example perl snmptrapd handlern";
  138. Then, put the following line in your snmprapd.conf file:
  139.   perl do "/usr/local/share/snmp/mytrapd.pl";
  140. Start snmptrapd (as root, and the following other opions make it stay
  141. in the foreground and log to stderr):
  142.   snmptrapd -f -Le
  143. You should see it start up and display the final message from the end
  144. of the above perl script:
  145.   Loaded the perl snmptrapd handler
  146.   2004-02-11 10:08:45 NET-SNMP version 5.2 Started.
  147. Then, if you send yourself a fake trap using the following example command:
  148.   snmptrap -v 2c -c mycommunity localhost 0 linkUp ifIndex.1 i 1 
  149.       ifAdminStatus.1 i up ifOperStatus.1 i up ifDescr s eth0
  150. You should see the following output appear from snmptrapd as your perl
  151. code gets executed:
  152.   ********** PERL RECEIVED A NOTIFICATION:
  153.   PDU INFO:
  154.     notificationtype               TRAP
  155.     receivedfrom                   127.0.0.1
  156.     version                        1
  157.     errorstatus                    0
  158.     messageid                      0
  159.     community                      mycommunity
  160.     transactionid                  2
  161.     errorindex                     0
  162.     requestid                      765160220
  163.   VARBINDS:
  164.     sysUpTimeInstance              type=67 value=0:0:00:00.00
  165.     snmpTrapOID.0                  type=6  value=linkUp
  166.     ifIndex.1                      type=2  value=1
  167.     ifAdminStatus.1                type=2  value=1
  168.     ifOperStatus.1                 type=2  value=1
  169.     ifDescr                        type=4  value="eth0"
  170. =head1 EXPORT
  171. None by default.
  172. # =head2 Exportable constants
  173. #   NETSNMPTRAPD_AUTH_HANDLER
  174. #   NETSNMPTRAPD_HANDLER_BREAK
  175. #   NETSNMPTRAPD_HANDLER_FAIL
  176. #   NETSNMPTRAPD_HANDLER_FINISH
  177. #   NETSNMPTRAPD_HANDLER_OK
  178. #   NETSNMPTRAPD_POST_HANDLER
  179. #   NETSNMPTRAPD_PRE_HANDLER
  180. =head1 SEE ALSO
  181. NetSNMP::OID, NetSNMP::ASN
  182. snmptrapd.conf(5) for configuring the Net-SNMP trap receiver.
  183. snmpd.conf(5) for configuring the Net-SNMP snmp agent for sending traps.
  184. http://www.Net-SNMP.org/
  185. =head1 AUTHOR
  186. W. Hardaker, E<lt>hardaker@users.sourceforge.netE<gt>
  187. =head1 COPYRIGHT AND LICENSE
  188. Copyright 2004 by W. Hardaker
  189. This library is free software; you can redistribute it and/or modify
  190. it under the same terms as Perl itself.
  191. =cut