#!/usr/bin/perl -w
# (C) 2003-2007 Willem Jan Hengeveld <itsme@xs4all.nl>
# Web: http://www.xs4all.nl/~itsme/
#      http://wiki.xda-developers.com/
#
# $Id$
#

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 (<FH>) {
        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)
}
