#!/usr/local/bin/perl use Socket; my $log = "/var/log/snmp/trap.log"; my $nslookup = 1; my $debug = 0; my $port = 162; my $proto = getprotobyname('udp') || &error("getprotobyname:$!"); my $that = sockaddr_in($port, INADDR_ANY) || &error("sockaddr_in:$!"); socket(S, AF_INET, SOCK_DGRAM, $proto) || &error("socket:$!"); bind(S, $that) || &error("bind:$!"); binmode S; while(1) { my $data = ""; recv(S, $data, 256, 0) || ($data = "\0"x73 . "recv:$!"); print "recv\n" . &dump($data) . "\n" if($debug); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my $date = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $year +1900, $mon +1, $mday, $hour, $min, $sec ); my $src = sprintf("%d.%d.%d.%d", unpack("C4", substr($data, 0x21, 4))); my $msg = substr($data, 0x49); chomp($msg); if( $nslookup ) { if( $msg =~ /^(\@in) (\d+)\.(\d+)\.(\d+)\.(\d+) (.*)$/ ) { my $tmp = pack("C4", $2, $3, $4, $5); $tmp = gethostbyaddr($tmp, AF_INET); $tmp = "$2.$3.$4.$5" if($tmp eq ""); $msg = sprintf("%s %s %s", $1, $tmp, $6); } } if( open(F, ">> $log") ) { printf(F "%s %s %s\n", $date, $src, $msg); close(F); } } close(S) || &error("close:$!"); exit 0; sub dump { my @data = unpack( "C*", $_[0] ); my $line; my $i = 0; my $msg = ''; foreach ( @data ) { if( ($i % 0x10)==0 ) { $msg = $msg . sprintf( "%05X : " , $i ); $line = ''; } $msg = $msg . "- " if( ($i % 0x10) && ($i % 0x08)==0 ); $msg = $msg . sprintf( "%02X ", $_ ); if( $_ >= 0x20 && $_ <= 0x7E ) { $line = sprintf( "%s%c", $line, $_ ); } else { $line = "$line."; } $i++; $msg = $msg . " $line\n" if( ($i % 0x10)==0 ); } if( $i % 0x10 ) { $msg = $msg . ' 'x ( (16-($i % 0x10)) * 3); $msg = $msg . ' ' if( ($i % 0x10) < 9 ); $msg = $msg . " $line\n"; } return $msg; } sub error { print "error:$_[0]\n"; exit(1); }