summaryrefslogtreecommitdiff
path: root/perl/TrapReceiver/TrapReceiver.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl/TrapReceiver/TrapReceiver.pm')
-rw-r--r--perl/TrapReceiver/TrapReceiver.pm286
1 files changed, 286 insertions, 0 deletions
diff --git a/perl/TrapReceiver/TrapReceiver.pm b/perl/TrapReceiver/TrapReceiver.pm
new file mode 100644
index 0000000..e7e2921
--- /dev/null
+++ b/perl/TrapReceiver/TrapReceiver.pm
@@ -0,0 +1,286 @@
+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.0702';
+
+# 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