Forgot to say, that it was compiled from sources with nothing more
than --enable-perl-embed, but that is turned on by default.
2008/5/31, michael kapelko <[EMAIL PROTECTED]>:
> I use net-snmp-5.4.1 on CentOS release 4.4 (Final)
>
> # uname -a
> Linux zond2 2.6.9-42.ELsmp #1 SMP Tue Aug 15 10:35:26 BST 2006 x86_64
> x86_64 x86_64 GNU/Linux
>
>
> And my perl script is:
>
> #!/usr/bin/perl
>
> # This module must be registered in the `snmptrapd.conf' this way:
> # perl do "/path/to/catchTraps.pl"
> # To make `snmptrapd' accept traps, you must add the following:
> # authCommunity log,execute,net monitor
> # to the `snmptrapd.conf'
>
> use strict;
> use warnings;
> # Autoflush
> use FileHandle;
>
> # =====================================
> # CONFIGURATION
> # =====================================
>
> # Path to log directory where trap files go WITH ENDING SLASH!!!
> (/usr/, not /usr)
> my $logDir = "/root/traps/";
>
> # =====================================
> # MAIN
> # =====================================
>
> # Extension of trap files
> my $extension = '.traplog';
> # Must be set to zero when first run
> my $curLogFile = 0;
> # OIDs of traps we catch
> my $oidMAC = '.1.3.6.1.4.1.43.0.85';
> my $oidLinkUp = '.1.3.6.1.6.3.1.1.5.4';
> my $oidLinkDown = '.1.3.6.1.6.3.1.1.5.3';
> # OIDs inside PDU we get
> my $oidMACValuePart = '.1.3.6.1.4.1.43.10.22.2.1.4.1.';
> my $oidPortPart = '.1.3.6.1.2.1.2.2.1.1.';
> my $oidAdmStatPart = '.1.3.6.1.2.1.2.2.1.7.';
> my $oidOprStatPart = '.1.3.6.1.2.1.2.2.1.8.';
> # Register to snmptrapd
> NetSNMP::TrapReceiver::register("all", \&customReceiver) ||
> warn "failed to register custom perl trap handler\n";
> print STDERR "Loaded custom perl snmptrapd handler\n";
>
> sub customReceiver {
> my @pdu = @{$_[1]};
> my($typeName, $mac, $port, $macState, $ip, $admStat, $oprStat);
> # Get info from PDU
> foreach my $line (@pdu) {
> my $oid = $line->[0];
> my $value = $line->[1];
> if($value =~ /^OID: $oidMAC/) {
> $typeName = "mac";
> }
> elsif($value =~ /^OID: $oidLinkUp/ or $value =~ /^OID:
> $oidLinkDown/) {
> $typeName = "linkupdown";
> }
> elsif($oid =~
> /$oidMACValuePart(\d+)\.(\d+\.\d+\.\d+\.\d+.\d+\.\d+)/) {
> $port = $1;
> $mac = $2;
> $macState = $value;
> $macState =~ s/^INTEGER: (\d+)/$1/;
> }
> elsif($value =~ /^IpAddress: (\d+\.\d+\.\d+\.\d+)/) {
> $ip = $1;
> }
> elsif($oid =~ /$oidPortPart(\d+)/) {
> # 3Com switch port number begins with 101, not 1, so we subtract
> 100
> $port = $1 - 100;
> }
> elsif($oid =~ /$oidAdmStatPart/) {
> $admStat = $value;
> $admStat =~ s/^INTEGER: (\d+)/$1/;
> }
> elsif($oid =~ /$oidOprStatPart/) {
> $oprStat = $value;
> $oprStat =~ s/^INTEGER: (\d+)/$1/;
> }
> }
> #print "type: $typeName ip: $ip port: $port mac: $mac macState:
> $macState admStat: $admStat oprStat: $oprStat\n";
> if(($typeName eq "mac") and ($macState == 1) and $ip and $port and $mac)
> {
> my $output = join("\t", $ip, $port, $typeName, $mac);
> logRotateToFile($curLogFile, $logDir, $extension, $output);
> }
> elsif(($typeName eq "linkupdown") and $ip and $port and $admStat
> and $oprStat) {
> my $output = join("\t", $ip, $port, $typeName, $admStat, $oprStat);
> logRotateToFile($curLogFile, $logDir, $extension, $output);
> }
> }
>
> # Log-rotate
> # \param curLogFile
> # \param logDir
> # \param extension
> # \param Message
> sub logRotateToFile {
> # We MUST use $_[0] instead of new variable to change global
> curLogFile value
> my $logDir = $_[1];
> my $extension = $_[2];
> my $message = $_[3];
> my $curLocalTime = strftime("%Y-%m-%d %H:%M:%S", localtime());
> # File name = minutes passed since 1970-01-01 00:00
> # We multiply by 60 to get UNIX time in seconds again, but within
> minute ranges
> my $fileName = int(time() / 60) * 60;
> # Rotate log file if necessary
> if($fileName ne $_[0]) {
> my $rootPt = $logDir . $_[0] . $extension;
> # For the first run we do not rotate files
> if($_[0] ne "0") {
> # Close file
> close(LOGFILE);
> # Rename it
> rename("${rootPt}.tmp", $rootPt);
> }
> # Now open new file and make it current
> $_[0] = $fileName;
> $rootPt = $logDir . $_[0] . $extension;
> open(LOGFILE, ">>${rootPt}.tmp") or die "Could not open file: $!";
> # Flush to file when printing, skip buffering
> LOGFILE->autoflush(1);
> }
> print LOGFILE "$curLocalTime\t$message\n";
> }
>
> I can only suspect my rotation logger to cause memory leak, but I
> can't see anything wrong with that.
> Thanks.
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users