| package NetSNMP::TrapReceiver; |
| |
| use 5.00006; |
| use strict; |
| use Carp; |
| |
| require Exporter; |
| require DynaLoader; |
| |
| use AutoLoader; |
| use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); |
| @ISA = qw(Exporter |
| DynaLoader); |
| |
| require NetSNMP::OID; |
| |
| |
| # Items to export into callers namespace by default. Note: do not export |
| # names by default without a very good reason. Use EXPORT_OK instead. |
| # Do not simply export all your public functions/methods/constants. |
| |
| # This allows declaration use NetSNMP::TrapReceiver ':all'; |
| # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK |
| # will save memory. |
| %EXPORT_TAGS = ( 'all' => [ qw( |
| NETSNMPTRAPD_AUTH_HANDLER |
| NETSNMPTRAPD_HANDLER_BREAK |
| NETSNMPTRAPD_HANDLER_FAIL |
| NETSNMPTRAPD_HANDLER_FINISH |
| NETSNMPTRAPD_HANDLER_OK |
| NETSNMPTRAPD_POST_HANDLER |
| NETSNMPTRAPD_PRE_HANDLER |
| netsnmp_add_default_traphandler |
| netsnmp_add_global_traphandler |
| netsnmp_add_traphandler |
| ) ] ); |
| |
| @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); |
| |
| @EXPORT = qw( |
| NETSNMPTRAPD_AUTH_HANDLER |
| NETSNMPTRAPD_HANDLER_BREAK |
| NETSNMPTRAPD_HANDLER_FAIL |
| NETSNMPTRAPD_HANDLER_FINISH |
| NETSNMPTRAPD_HANDLER_OK |
| NETSNMPTRAPD_POST_HANDLER |
| NETSNMPTRAPD_PRE_HANDLER |
| ); |
| |
| $VERSION = '5.0703'; |
| |
| # sub new { |
| # my $type = shift; |
| # my ($self); |
| # %$self = @_; |
| # bless($self, $type); |
| # return $self; |
| # } |
| |
| # sub register($$$$) { |
| # my ($self, $oid, $sub) = @_; |
| # my $reg = NetSNMP::TrapReceiver::registration::new($oid, $sub); |
| # if ($reg) { |
| # $reg->register(); |
| # $self->{'regobjs'}{$name} = $reg; |
| # } |
| # return $reg; |
| # } |
| |
| sub AUTOLOAD { |
| # This AUTOLOAD is used to 'autoload' constants from the constant() |
| # XS function. |
| |
| my $constname; |
| ($constname = $AUTOLOAD) =~ s/.*:://; |
| croak "&NetSNMP::TrapReceiver::constant not defined" if $constname eq 'constant'; |
| my ($error, $val) = constant($constname); |
| if ($error) { croak $error; } |
| { |
| no strict 'refs'; |
| # Fixed between 5.005_53 and 5.005_61 |
| #XXX if ($] >= 5.00561) { |
| #XXX *$AUTOLOAD = sub () { $val }; |
| #XXX } |
| #XXX else { |
| *$AUTOLOAD = sub { $val }; |
| #XXX } |
| } |
| goto &$AUTOLOAD; |
| } |
| |
| bootstrap NetSNMP::TrapReceiver $VERSION; |
| |
| # Preloaded methods go here. |
| |
| # Autoload methods go after =cut, and are processed by the autosplit program. |
| |
| 1; |
| __END__ |
| |
| =head1 NAME |
| |
| NetSNMP::TrapReceiver - Embedded perl trap handling for Net-SNMP's snmptrapd |
| |
| =head1 SYNOPSIS |
| |
| Put the following lines in your snmptrapd.conf file: |
| |
| perl NetSNMP::TrapReceiver::register("trapOID", \&myfunc); |
| |
| =head1 ABSTRACT |
| |
| The NetSNMP::TrapReceiver module is used to register perl |
| subroutines into the Net-SNMP snmptrapd process. Net-SNMP MUST have |
| been configured using --enable-embedded-perl. Registration of |
| functions is then done through the snmptrapd.conf configuration |
| file. This module can NOT be used in a normal perl script to |
| receive traps. It is intended solely for embedded use within the |
| snmptrapd demon. |
| |
| =head1 DESCRIPTION |
| |
| Within the snmptrapd.conf file, the keyword "perl" may be used to call |
| any perl expression and using this ability, you can use the |
| NetSNMP::TrapReceiver module to register functions which will be |
| called every time a given notification (a trap or an inform) is |
| received. Registered functions are called with 2 arguments. The |
| first is a reference to a hash containing information about how the |
| trap was received (what version of the SNMP protocol was used, where |
| it came from, what SNMP user name or community name it was sent under, |
| etc). The second argument is a reference to an array containing the |
| variable bindings (OID and value information) that define the |
| noification itself. Each variable is itself a reference to an array |
| containing three values: a NetSNMP::OID object, the value that came |
| associated with it, and the value's numeric type (see NetSNMP::ASN for |
| further details on SNMP typing information). |
| |
| Registered functions should return one of the following values: |
| |
| =over 2 |
| |
| =item NETSNMPTRAPD_HANDLER_OK |
| |
| Handling the trap succeeded, but lets the snmptrapd demon check for |
| further appropriate handlers. |
| |
| =item NETSNMPTRAPD_HANDLER_FAIL |
| |
| Handling the trap failed, but lets the snmptrapd demon check for |
| further appropriate handlers. |
| |
| =item NETSNMPTRAPD_HANDLER_BREAK |
| |
| Stops evaluating the list of handlers for this specific trap, but lets |
| the snmptrapd demon apply global handlers. |
| |
| =item NETSNMPTRAPD_HANDLER_FINISH |
| |
| Stops searching for further appropriate handlers. |
| |
| =back |
| |
| If a handler function does not return anything appropriate or even |
| nothing at all, a return value of NETSNMPTRAPD_HANDLER_OK is assumed. |
| |
| Subroutines are registered using the NetSNMP::TrapReceiver::register |
| function, which takes two arguments. The first is a string describing |
| the notification you want to register for (such as "linkUp" or |
| "MyMIB::MyTrap" or ".1.3.6.1.4.1.2021...."). Two special keywords can |
| be used in place of an OID: "default" and "all". The "default" |
| keyword indicates you want your handler to be called in the case where |
| no other handlers are called. The "all" keyword indicates that the |
| handler should ALWAYS be called for every notification. |
| |
| |
| =head1 EXAMPLE |
| |
| As an example, put the following code into a file (say |
| "/usr/local/share/snmp/mytrapd.pl"): |
| |
| #!/usr/bin/perl |
| |
| sub my_receiver { |
| print "********** PERL RECEIVED A NOTIFICATION:\n"; |
| |
| # print the PDU info (a hash reference) |
| print "PDU INFO:\n"; |
| foreach my $k(keys(%{$_[0]})) { |
| if ($k eq "securityEngineID" || $k eq "contextEngineID") { |
| printf " %-30s 0x%s\n", $k, unpack('h*', $_[0]{$k}); |
| } |
| else { |
| printf " %-30s %s\n", $k, $_[0]{$k}; |
| } |
| } |
| |
| # print the variable bindings: |
| print "VARBINDS:\n"; |
| foreach my $x (@{$_[1]}) { |
| printf " %-30s type=%-2d value=%s\n", $x->[0], $x->[2], $x->[1]; |
| } |
| } |
| |
| NetSNMP::TrapReceiver::register("all", \&my_receiver) || |
| warn "failed to register our perl trap handler\n"; |
| |
| print STDERR "Loaded the example perl snmptrapd handler\n"; |
| |
| Then, put the following line in your snmprapd.conf file: |
| |
| perl do "/usr/local/share/snmp/mytrapd.pl"; |
| |
| Start snmptrapd (as root, and the following other opions make it stay |
| in the foreground and log to stderr): |
| |
| snmptrapd -f -Le |
| |
| You should see it start up and display the final message from the end |
| of the above perl script: |
| |
| Loaded the perl snmptrapd handler |
| 2004-02-11 10:08:45 NET-SNMP version 5.2 Started. |
| |
| Then, if you send yourself a fake trap using the following example command: |
| |
| snmptrap -v 2c -c mycommunity localhost 0 linkUp ifIndex.1 i 1 \ |
| ifAdminStatus.1 i up ifOperStatus.1 i up ifDescr s eth0 |
| |
| You should see the following output appear from snmptrapd as your perl |
| code gets executed: |
| |
| ********** PERL RECEIVED A NOTIFICATION: |
| PDU INFO: |
| notificationtype TRAP |
| receivedfrom 127.0.0.1 |
| version 1 |
| errorstatus 0 |
| messageid 0 |
| community mycommunity |
| transactionid 2 |
| errorindex 0 |
| requestid 765160220 |
| VARBINDS: |
| sysUpTimeInstance type=67 value=0:0:00:00.00 |
| snmpTrapOID.0 type=6 value=linkUp |
| ifIndex.1 type=2 value=1 |
| ifAdminStatus.1 type=2 value=1 |
| ifOperStatus.1 type=2 value=1 |
| ifDescr type=4 value="eth0" |
| |
| =head1 EXPORT |
| |
| None by default. |
| |
| # =head2 Exportable constants |
| |
| # NETSNMPTRAPD_AUTH_HANDLER |
| # NETSNMPTRAPD_HANDLER_BREAK |
| # NETSNMPTRAPD_HANDLER_FAIL |
| # NETSNMPTRAPD_HANDLER_FINISH |
| # NETSNMPTRAPD_HANDLER_OK |
| # NETSNMPTRAPD_POST_HANDLER |
| # NETSNMPTRAPD_PRE_HANDLER |
| |
| =head1 SEE ALSO |
| |
| NetSNMP::OID, NetSNMP::ASN |
| |
| snmptrapd.conf(5) for configuring the Net-SNMP trap receiver. |
| |
| snmpd.conf(5) for configuring the Net-SNMP snmp agent for sending traps. |
| |
| http://www.Net-SNMP.org/ |
| |
| =head1 AUTHOR |
| |
| W. Hardaker, E<lt>hardaker@users.sourceforge.netE<gt> |
| |
| =head1 COPYRIGHT AND LICENSE |
| |
| Copyright 2004 by W. Hardaker |
| |
| This library is free software; you can redistribute it and/or modify |
| it under the same terms as Perl itself. |
| |
| =cut |