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

Reply via email to