#!/usr/bin/perl -w
##########################################################################
# $Id: sendmail,v 1.1 2002/03/29 15:32:14 kirk Exp $
##########################################################################
# $Log: sendmail,v $
# Revision 1.1  2002/03/29 15:32:14  kirk
# Added some filters found in RH's release
#
#
# Revision ???  2000/07/12 Simon Liddington <sjl@zepler.org>
# added unknown users
# added relay denials
# added authentication warnings
# added forward errors
# added returns after 4 hours
# ignores alias database building
# ignores daemon start messages
# ignores clone messages
# ignores all to= lines whatever follows stat=
#
# Revision 1.2  2000/04/19 07:11:00  ken
# sendmail Queue ID can include lowercase.
#
# Revision 1.1  2000/04/19 06:29:17  ken
# Initial revision
#
##########################################################################

########################################################
# This was written and is maintained by:
#    Kenneth Porter <shiva@well.com>
#
# Please send all comments, suggestions, bug reports,
#    etc, to shiva@well.com.
#
########################################################

$MsgsSent = 0;
$BytesTransferred = 0;
$FourHourReturns = 0;

while (defined($ThisLine = <STDIN>)) {
    if ( ( $ThisLine =~ m/^[a-zA-Z0-9]+: to=.*stat=/ ) or
	 ( $ThisLine =~ m/^alias database [^ ]* (auto)?rebuilt by/ ) or 
	 ( $ThisLine =~ m/^[^ ]*: [0-9]* aliases, longest [0-9]* bytes, [0-9]* bytes total/ ) or 
	 ( $ThisLine =~ m/^starting daemon (.*):/ ) or 
	 ( $ThisLine =~ m/^[a-zA-Z0-9]+: clone [a-zA-Z0-9]+, owner=/ ) ) { 
	# We don't care about these
    }
    elsif ( ($Bytes) = ($ThisLine =~ /^[a-zA-Z0-9]+: from=.*size=([0-9]+).*$/) ) {
	$MsgsSent++;
	$BytesTransferred += $Bytes;
    }
    elsif ( ($User) = ($ThisLine =~ /^[a-zA-Z0-9]+: <([^ ]*)>... User unknown$/) ) {
        $UnknownUsers{$User}++;
    }
    elsif ( ($Dest,$Relay) = ($ThisLine =~ /^[a-zA-Z0-9]+: ruleset=check_rcpt, arg1=<([^ ]*)>, relay=([^,]*), reject=550 <[^ ]*>... Relaying denied/) ) {
        $Temp = "From " . $Relay . " to " . $Dest;
        $RelayDenied{$Temp}++;
    }
    elsif ( ($Warning)  = ($ThisLine =~ /^[a-zA-Z0-9]+: Authentication-Warning: [^ ]+: ([^ ]+ set sender to [^ ]+ using -f)/) ) {
        $AuthWarns{$Warning}++;
    }
    elsif ( ($Forward,$Error) = ($ThisLine =~ /^[a-zA-Z0-9]+: forward ([^ ]*): transient error: (.*)$/) ) {
        $Temp = $Forward . ": " . $Error;
        $ForwardErrors{$Temp}++;
    }
    elsif ( ($Temp) = ($ThisLine =~ /^[a-zA-Z0-9]+: forward ([^ ]*: Permission denied)/) ) {
        $ForwardErrors{$Temp}++;
    }
    elsif ( $ThisLine =~ m/^[a-zA-Z0-9]+: [a-zA-Z0-9]+: return to sender: Warning: could not send message for past 4 hours/ ) {
        $FourHourReturns++;
    }
    else {
	# Report any unmatched entries...
	push @OtherList,$ThisLine;
    }
}

if ((@OtherList) or
    ($MsgsSent > 0) or
    ($FourHourReturns > 0) or
    (keys %UnknownUsers) or
    (keys %RelayDenied) or
    (keys %AuthWarns) or
    (keys %ForwardErrors)) {
    print "\n\n --------------------- sendmail Begin ------------------------ ";

    if($MsgsSent > 0) {
        print "\n\n" . $BytesTransferred . " bytes transferred";
        print "\n" . $MsgsSent . " messages sent";
    }

    if($FourHourReturns > 0) {
        print "\n\n" . $FourHourReturns . " messages returned after 4 hours";
    }

    if (keys %UnknownUsers) {
	print "\n\nUnknown users:\n";
	foreach $ThisOne (keys %UnknownUsers) {
	    print "    " . $ThisOne . ": " . $UnknownUsers{$ThisOne} . " Times(s)\n";
	}
    }

    if (keys %RelayDenied) {
	print "\n\nRelaying denied:\n";
	foreach $ThisOne (keys %RelayDenied) {
	    print "    " . $ThisOne . ": " . $RelayDenied{$ThisOne} . " Times(s)\n";
	}
    }

    if (keys %AuthWarns) {
	print "\n\nAuthentication warnings:\n";
	foreach $ThisOne (keys %AuthWarns) {
	    print "    " . $ThisOne . ": " . $AuthWarns{$ThisOne} . " Times(s)\n";
	}
    }

    if (keys %ForwardErrors) {
	print "\n\nForwarding errors:\n";
	foreach $ThisOne (keys %ForwardErrors) {
	    print "    " . $ThisOne . ": " . $ForwardErrors{$ThisOne} . " Times(s)\n";
	}
    }

    if ($#OtherList >= 0) {
	print "\n\n**Unmatched Entries**\n\n";
	print @OtherList;
    }

    print "\n ---------------------- sendmail End ------------------------- \n";

}

exit(0);

