##########################################################################
# $Id$
##########################################################################
#######################################################
## Copyright (c) 2008 Kirk Bauer
## Covered under the included MIT/X-Consortium License:
## http://www.opensource.org/licenses/mit-license.php
## All modifications and contributions by other persons to
## this script are assumed to have been donated to the
## Logwatch project and thus assume the above copyright
## and licensing terms. If you want to make contributions
## under your own copyright or a different license this
## must be explicitly stated in the contribution an the
## Logwatch project reserves the right to not accept such
## contributions. If you have made significant
## contributions to this script and want to claim
## copyright please contact logwatch-devel@lists.sourceforge.net.
#########################################################
$Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
$QmailDetail = $ENV{'qmail_high_detail'};
$QmailThreshold = $ENV{'threshold'};
$RemoteThreshold = $ENV{'remote_threshold'};
$LocalThreshold = $ENV{'local_threshold'};
$FromThreshold = $ENV{'from_threshold'};
$IgnoreUnmatched = $ENV{'qmail_ignore_unmatched'} || 0;
while (defined($ThisLine = <STDIN>)) {
if (
( $ThisLine =~ /new msg/ ) or
( $ThisLine =~ /status: / ) or
( $ThisLine =~ /bounce msg/ ) or
( $ThisLine =~ /triple bounce/ ) or
( $ThisLine =~ /tcpserver/ ) or
( $ThisLine =~ /end msg/ )
) {
# We don't care about these
} elsif (
($msgid,$DeliveryResponse,$Response) = ( $ThisLine =~ /delivery (\d+)\: (.*?)\:(.*)/ )
) {
if ( $Response =~ /did_/ ) {
# ignore these.
} else {
if ( ($ResponseCode) = ( $Response =~ /Remote_host_said\:_(\d{3})_/ ) ) {
$ServerResponses->{$DeliveryResponse}->{$ResponseCode}++;
} else {
if ( $DeliveryResponse =~ /failure/ ) {
$ResponseCode=511;
$ServerResponses->{$DeliveryResponse}->{$ResponseCode}++;
}
if ( $DeliveryResponse =~ /deferral/ ) {
$ResponseCode=443;
$ServerResponses->{$DeliveryResponse}->{$ResponseCode}++;
}
}
}
} elsif ( ($EmailFrom) = ( $ThisLine =~ /from \<(.*)\>/ ) ) {
$From{$EmailFrom}++;
} elsif ( ($ToLocal) = ( $ThisLine =~ /to local (.*)/ ) ) {
$Local{$ToLocal}++;
} elsif ( ($ToRemote) = ( $ThisLine =~ /to remote (.*)/ ) ) {
$Remote{$ToRemote}++;
} else {
# Report any unmatched entries...
push @OtherList,$ThisLine;
}
}
if ($QmailDetail >= 1) {
if ($QmailThreshold > 0) {
if (($RemoteThreshold < 0) or ($RemoteThreshold eq '')) {
$RemoteThreshold = $QmailThreshold;
}
if (($FromThreshold < 0) or ($FromThreshold eq '')) {
$FromThreshold = $QmailThreshold;
}
if (($LocalThreshold < 0) or ($LocalThreshold eq '')) {
$LocalThreshold = $QmailThreshold;
}
}
if (($RemoteThreshold < 0) or ($RemoteThreshold eq '')) {
$RemoteThreshold = 0;
}
if (($FromThreshold < 0) or ($FromThreshold eq '')) {
$FromThreshold = 0;
}
if (($LocalThreshold < 0) or ($LocalThreshold eq '')) {
$LocalThreshold = 0;
}
if ( (keys %From) ) {
print "\nEmails from (Threshold of " . $FromThreshold . "):\n";
$threshold_reached=0;
foreach $Line (sort {$a cmp $b} keys %From) {
if ($From{$Line} >= $FromThreshold) {
$threshold_reached=1;
print "\t" . $Line . " - ". $From{$Line} . " Time(s)\n";
}
}
if ($threshold_reached < 1) {
print "\t" . "None found above the threshold\n";
}
}
if ( (keys %Remote) ) {
print "\nEmails to Remote Server (Threshold of " . $RemoteThreshold . "):\n";
$threshold_reached=0;
foreach $Line (sort {$a cmp $b} keys %Remote) {
if ($Remote{$Line} >= $RemoteThreshold) {
$threshold_reached=1;
print "\t" . $Line . " - ". $Remote{$Line} . " Time(s)\n";
}
}
if ($threshold_reached < 1) {
print "\t" . "None found above the threshold\n";
}
}
if ( (keys %Local) ) {
print "\nEmails to Local Server (Threshold of " . $LocalThreshold . "):\n";
$threshold_reached=0;
foreach $Line (sort {$a cmp $b} keys %Local) {
if ($Local{$Line} >= $LocalThreshold) {
$threshold_reached=1;
print "\t" . $Line . " - ". $Local{$Line} . " Time(s)\n";
}
}
if ($threshold_reached < 1) {
print "\t" . "None found above the threshold\n";
}
}
}
if (keys %{$ServerResponses}) {
print "\nRemote Server Responses:\n";
foreach $Line (sort {$a cmp $b} keys %{$ServerResponses}) {
foreach $Detail (sort {$a cmp $b} keys %{$ServerResponses->{$Line}}) {
$ServerResponseTotal{$Line} += $ServerResponses->{$Line}->{$Detail};
$ServerResponseOverallTotal += $ServerResponses->{$Line}->{$Detail};
print "\t".ucfirst($Line)."(" . $Detail . ") - ". $ServerResponses->{$Line}->{$Detail} . " Time(s)\n";
}
}
print "\n\tPercentage(s):\n";
foreach $Details (sort {$a cmp $b} keys %ServerResponseTotal) {
$percentage = (($ServerResponseTotal{$Details} / $ServerResponseOverallTotal) * 100);
print "\t\t" . ucfirst($Details) . " - ";
printf("%.2f",$percentage);
print " %\n";
}
}
if (($#OtherList >= 0) and (not $IgnoreUnmatched)){
print "\n**Unmatched Entries**\n";
print @OtherList;
}
exit(0);
# vi: shiftwidth=3 tabstop=3 syntax=perl et
# Local Variables:
# mode: perl
# perl-indent-level: 3
# indent-tabs-mode: nil
# End: