#!/usr/bin/perl -w # (C) 2003-2007 Willem Jan Hengeveld # Web: http://www.xs4all.nl/~itsme/ # http://wiki.xda-developers.com/ # # $Id: recentbounces 1502 2007-04-15 07:54:20Z itsme $ # use strict; # lists recent bounces by our spamfilter. use Time::localtime; use File::stat; use POSIX 'getuid'; if (getuid()) { exec "sudo $0 @ARGV"; } my @months=qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my %months= map { $months[$_]=>$_+1 } (0..$#months); my %msgs; processlogfile("/var/log/mail.log"); processlogfile("/var/log/mail.log.0"); for my $msg (sort { $a->{datetime} cmp $b->{datetime} } grep { defined $_->{datetime} } values %msgs) { next if (!defined $msg->{flags} || $msg->{flags}!=3); next if ($msg->{to} !~ /itsme/); next if ($msg->{status} eq "sent"); printf("%s %6d %s %s\n", $msg->{datetime}, $msg->{size}, $msg->{from}, $msg->{msgid} || ""); } exit(0); sub processlogfile { my ($fn)= @_; my ($fileyear, $filemonth, $fileday)= getfileymd($fn); open FH, (($fn =~ /\.gz$/) ? "zcat $fn |" : $fn) or die "$fn: $!\n"; my $curyear= $fileyear; while () { chomp; if (/^(\w+)\s+(\d+)/) { my ($month, $day)= ($months{$1}, $2); if ($month > $filemonth) { $curyear= $fileyear-1; } else { $curyear= $fileyear; } } # \w+ = 'innocent' # qmgr\S+ = qmgr[pid] if (/^(\w+)\s+(\d+)\s+(\S+)\s+\w+\s+postfix\/qmgr\S+:\s+(\w+):\s+from=<(.*?)>,\s+size=(\d+)/) { my ($month, $day, $time, $msgid, $from, $size)= ($1, $2, $3, $4, $5, $6, $7, $8); $msgs{$msgid}{datetime} ||= sprintf("%04d-%02d-%02d %s", $curyear, $months{$month}, $day, $time); $msgs{$msgid}{from} = $from; $msgs{$msgid}{size} = $size; $msgs{$msgid}{flags} |= 1; } elsif (/^(\w+)\s+(\d+)\s+(\S+)\s+\w+\s+postfix\/pipe\S+:\s+(\w+):\s+to=<(.*?)>.*status=(\w+)/) { my ($month, $day, $time, $msgid, $to, $status)= ($1, $2, $3, $4, $5, $6); $msgs{$msgid}{datetime} ||= sprintf("%04d-%02d-%02d %s", $curyear, $months{$month}, $day, $time); $msgs{$msgid}{to} = $to; $msgs{$msgid}{status} = $status; $msgs{$msgid}{flags} |= 2; } elsif (/^(\w+)\s+(\d+)\s+(\S+)\s+\w+\s+postfix\/cleanup\S+:\s+(\w+):\s+message-id=<(.*?)>/) { my ($month, $day, $time, $msgid, $messageid)= ($1, $2, $3, $4, $5); $msgs{$msgid}{datetime} ||= sprintf("%04d-%02d-%02d %s", $curyear, $months{$month}, $day, $time); $msgs{$msgid}{msgid} = $messageid; } } close FH; } sub getfileymd { my ($fn)= @_; my $mtime= localtime(stat($fn)->mtime); return (1900+$mtime->year, 1+$mtime->mon, $mtime->mday) }