#!/usr/bin/perl # This is a snmptrapd handler script to convert snmp traps into email # messages. # Usage: # Put a line like the following in your snmptrapd.conf file: # traphandle TRAPOID|default /usr/local/bin/traptoemail [-f FROM] [-s SMTPSERVER]b ADDRESSES # FROM defaults to "root" # SMTPSERVER defaults to "localhost" use Net::SMTP; use Getopt::Std; use POSIX qw(strftime); $opts{'s'} = "localhost"; $opts{'f'} = 'root@' . `hostname`; chomp($opts{'f'}); getopts("hs:f:", \%opts); if ($opts{'h'}) { print " traptoemail [-s smtpserver] [-f fromaddress] toaddress [...] traptoemail shouldn't be called interatively by a user. It is designed to be called as an snmptrapd extension via a \"traphandle\" directive in the snmptrapd.conf file. See the snmptrapd.conf file for details. Options: -s smtpserver Sets the smtpserver for where to send the mail through. -f fromaddress Sets the email address to be used on the From: line. toaddress Where you want the email sent to. "; exit; } die "no recepients to send mail to" if ($#ARGV < 0); # process the trap: $hostname = ; chomp($hostname); $ipaddress = ; chomp($ipaddress); $maxlen = 0; while() { ($oid, $value) = /([^\s]+)\s+(.*)/; push @oids, $oid; push @values, $value; $maxlen = (length($oid) > $maxlen) ? length($oid) : $maxlen; } $maxlen = 60 if ($maxlen > 60); $formatstr = "%" . $maxlen . "s %s\n"; die "illegal trap" if ($#oids < 1); # send the message $message = Net::SMTP->new($opts{'s'}) || die "can't talk to server $opts{'s'}\n"; $message->mail($opts{'f'}); $message->to(@ARGV) || die "failed to send to the recepients ",join(",",@ARGV),": $!"; $message->data(); $message->datasend("To: " . join(", ",@ARGV) . "\n"); $message->datasend("From: $opts{f}\n"); $message->datasend("Date: ".strftime("%a, %e %b %Y %X %z", localtime())."\n"); $message->datasend("Subject: trap received from $hostname: $values[1]\n"); $message->datasend("\n"); $message->datasend("Host: $hostname ($ipaddress)\n"); for($i = 0; $i <= $#oids; $i++) { $message->datasend(sprintf($formatstr, $oids[$i], $values[$i])); } $message->dataend(); $message->quit;