|
Packit |
57988d |
# Copyright 2003-2006 by Willi Mann <willi@wm1.at>
|
|
Packit |
57988d |
###########################################################################
|
|
Packit |
57988d |
# $Id$
|
|
Packit |
57988d |
###########################################################################
|
|
Packit |
57988d |
# $Log: courier,v $
|
|
Packit |
57988d |
# Revision 1.18 2008/06/30 20:47:20 kirk
|
|
Packit |
57988d |
# fixed copyright holders for files where I know who they should be
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# Revision 1.17 2008/05/06 22:30:50 mike
|
|
Packit |
57988d |
# Fix for port= in login count -mgt
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# Revision 1.16 2008/05/04 23:24:10 mike
|
|
Packit |
57988d |
# Dos2unixed -mgt
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# Revision 1.15 2007/02/16 04:15:52 bjorn
|
|
Packit |
57988d |
# Using default license for Logwatch, per Willi Mann.
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
###########################################################################
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# Please don't change the formatting:
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# if (...) {
|
|
Packit |
57988d |
# ...
|
|
Packit |
57988d |
# }
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# but
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
# (while|foreach) ..
|
|
Packit |
57988d |
# {
|
|
Packit |
57988d |
# ...
|
|
Packit |
57988d |
# }
|
|
Packit |
57988d |
#
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#######################################################
|
|
Packit |
57988d |
### Copyright 2003-2006 by Willi Mann <willi@wm1.at>
|
|
Packit |
57988d |
### Covered under the included MIT/X-Consortium License:
|
|
Packit |
57988d |
### http://www.opensource.org/licenses/mit-license.php
|
|
Packit |
57988d |
### All modifications and contributions by other persons to
|
|
Packit |
57988d |
### this script are assumed to have been donated to the
|
|
Packit |
57988d |
### Logwatch project and thus assume the above copyright
|
|
Packit |
57988d |
### and licensing terms. If you want to make contributions
|
|
Packit |
57988d |
### under your own copyright or a different license this
|
|
Packit |
57988d |
### must be explicitly stated in the contribution an the
|
|
Packit |
57988d |
### Logwatch project reserves the right to not accept such
|
|
Packit |
57988d |
### contributions. If you have made significant
|
|
Packit |
57988d |
### contributions to this script and want to claim
|
|
Packit |
57988d |
### copyright please contact logwatch-devel@lists.sourceforge.net.
|
|
Packit |
57988d |
##########################################################
|
|
Packit |
57988d |
|
|
Packit |
57988d |
use strict;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#Could be neccessary in some environments
|
|
Packit |
57988d |
unless ($ENV{'courier_enable'} == 1) {exit 0};
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $Debug = $ENV{'LOGWATCH_DEBUG'};
|
|
Packit |
57988d |
my $DoLookup = $ENV{'courier_ip_lookup'};
|
|
Packit |
57988d |
my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'};
|
|
Packit |
57988d |
my $overrideDetail = $ENV{'courier_override_detail_level'};
|
|
Packit |
57988d |
my $printAllUnmatched = $ENV{'courier_print_all_unmatched'};
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$Detail = $overrideDetail if defined $overrideDetail;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $PrintMailQueue = $ENV{'courier_printmailqueue'};
|
|
Packit |
57988d |
my $Tables = $ENV{'courier_tables'};
|
|
Packit |
57988d |
my $RemoveAdditionalInfo = $ENV{'courier_removeadditionalinfo'};
|
|
Packit |
57988d |
my $MostFrequentSender = $ENV{'courier_mostfrequentsender'};
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $DeliverMailSize = 0;
|
|
Packit |
57988d |
my $LastLine;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my %OtherList;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub LookupIP {
|
|
Packit |
57988d |
my ($name, $a1, $a2,$a3,$a4,$PackedAddr,$Addr);
|
|
Packit |
57988d |
$Addr = $_[0];
|
|
Packit |
57988d |
($a1,$a2,$a3,$a4) = split /\./,$Addr;
|
|
Packit |
57988d |
$PackedAddr = pack('C4',$a1,$a2,$a3,$a4);
|
|
Packit |
57988d |
if ($DoLookup) {
|
|
Packit |
57988d |
if ($name = gethostbyaddr ($PackedAddr,2)) {
|
|
Packit |
57988d |
return ($name . " (" . $Addr . ")");
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
return ($Addr);
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
else {
|
|
Packit |
57988d |
return ($Addr);
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#Make pseudo IPv6 to IPv4
|
|
Packit |
57988d |
sub LookupIPv46 {
|
|
Packit |
57988d |
my $IPv4Addr;
|
|
Packit |
57988d |
my $Addr = shift;
|
|
Packit |
57988d |
if ( ($IPv4Addr) = ($Addr =~ /::ffff:([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/ ) ) {
|
|
Packit |
57988d |
return $IPv4Addr;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
else {
|
|
Packit |
57988d |
return $Addr;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub PushUnmatched
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $service = shift;
|
|
Packit |
57988d |
my $line = shift;
|
|
Packit |
57988d |
if ( $printAllUnmatched or $service =~ /courier/ or $service =~ /^authdaemon/ ) {
|
|
Packit |
57988d |
$OtherList{$service}{$line}++;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub recprint1
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $hash = shift;
|
|
Packit |
57988d |
my $depth = shift;
|
|
Packit |
57988d |
my $prefar = shift;
|
|
Packit |
57988d |
my $IPar = shift;
|
|
Packit |
57988d |
my $indention = shift || 0;
|
|
Packit |
57988d |
my $calldepth = shift || $depth;
|
|
Packit |
57988d |
my $sizehash = shift;
|
|
Packit |
57988d |
my $out = "";
|
|
Packit |
57988d |
my $inum = 0;
|
|
Packit |
57988d |
my $size = 0;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my @prefar = @{$prefar} if defined $prefar;
|
|
Packit |
57988d |
my $pref = shift(@prefar);
|
|
Packit |
57988d |
$pref .= " " if defined $pref;
|
|
Packit |
57988d |
$pref = "" if not defined $pref;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my @IPar = @{$IPar} if defined $IPar;
|
|
Packit |
57988d |
my $IP = shift(@IPar);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
foreach my $key1 (sort keys %{$hash})
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my ( $rout, $nmb, $rsize);
|
|
Packit |
57988d |
if ($depth > 1) {
|
|
Packit |
57988d |
($rout, $nmb, $rsize) = recprint1($hash->{$key1}, $depth - 1, \@prefar, \@IPar, $indention + 3, $calldepth, defined $sizehash ? $sizehash->{$key1} : undef) if $depth > 1;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
$rout = "";
|
|
Packit |
57988d |
$nmb = $hash->{$key1};
|
|
Packit |
57988d |
$rsize = $sizehash->{$key1} if defined $sizehash;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if ($key1 ne "-" or $rout ne "") {
|
|
Packit |
57988d |
$out .= (" " x $indention).$pref;
|
|
Packit |
57988d |
if ($IP) {
|
|
Packit |
57988d |
$out .= LookupIP(LookupIPv46($key1));
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
$out .= $key1;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$out .= " - ".nTimes($nmb);
|
|
Packit |
57988d |
$out .= ", ".$rsize." Bytes" if defined $sizehash;
|
|
Packit |
57988d |
$out .= "\n";
|
|
Packit |
57988d |
$out .= $rout;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$out .= "\n" if $depth == $calldepth;
|
|
Packit |
57988d |
$inum += $nmb;
|
|
Packit |
57988d |
$size += $rsize;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if (wantarray) {
|
|
Packit |
57988d |
return ($out, $inum, $size);
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
return $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub tblprint1
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $hash = shift;
|
|
Packit |
57988d |
my $sizehash = shift;
|
|
Packit |
57988d |
my $onerec = shift || 0; #boolean
|
|
Packit |
57988d |
my $IP = shift || 0; #boolean
|
|
Packit |
57988d |
my $onerectitle = shift || "";
|
|
Packit |
57988d |
my $tablecolumns = shift; #LISTREF
|
|
Packit |
57988d |
my $tabletitle = shift || "";
|
|
Packit |
57988d |
if (not $onerec){
|
|
Packit |
57988d |
return maketbl1($hash, $sizehash, $IP, $tablecolumns, $tabletitle);
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
my ( $out, $nmb, $size ) = ("", 0,0);
|
|
Packit |
57988d |
my ( $lout, $lnmb, $lsize);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
foreach my $key1 (sort keys %{$hash})
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
($lout, $lnmb, $lsize) = maketbl1($hash->{$key1}, defined $sizehash ? $sizehash->{$key1} : undef, $IP, $tablecolumns, undef, "-");
|
|
Packit |
57988d |
if ($onerectitle) {
|
|
Packit |
57988d |
$out .= "$onerectitle: $key1\n";
|
|
Packit |
57988d |
$out .= "-" x (2 + length($onerectitle) + length($key1))."\n";
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
$out .= "$key1\n";
|
|
Packit |
57988d |
$out .= "-" x (length($key1))."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$out .= $lout;
|
|
Packit |
57988d |
$nmb += $lnmb;
|
|
Packit |
57988d |
$size += $lsize;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if ($tabletitle) {
|
|
Packit |
57988d |
my $tout = $tabletitle;
|
|
Packit |
57988d |
$tout .= ", ".nTimes($nmb);
|
|
Packit |
57988d |
$tout .= ", ".$size." Bytes" if defined $sizehash;
|
|
Packit |
57988d |
$tout .= "\n"."=" x length($tabletitle)."\n\n";
|
|
Packit |
57988d |
$out = $tout.$out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
return ($out, $nmb, $size);
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub max
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $ret = shift;
|
|
Packit |
57988d |
foreach my $val (@_)
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
$ret = $val if $val > $ret;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
return $ret;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub maketbl1
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $hash = shift;
|
|
Packit |
57988d |
my $sizehash = shift;
|
|
Packit |
57988d |
my $IP = shift || 0; #boolean
|
|
Packit |
57988d |
my $tablecolumns = shift; #LISTREF
|
|
Packit |
57988d |
my $tabletitle = shift;
|
|
Packit |
57988d |
my $uchar = shift || "=";
|
|
Packit |
57988d |
my @columnmax;
|
|
Packit |
57988d |
my $out = "";
|
|
Packit |
57988d |
my $inmb = 0;
|
|
Packit |
57988d |
my $size = 0;
|
|
Packit |
57988d |
foreach my $column (@{$tablecolumns})
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
push @columnmax, length("$column");
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
# Get the max length for column 1, ("main")
|
|
Packit |
57988d |
# column 2, ("number")
|
|
Packit |
57988d |
# column 3, ("size")
|
|
Packit |
57988d |
# TODO: Enhance; max can take any number of arguments, so make use of that
|
|
Packit |
57988d |
# (maybe it turns out to be a bad idea)
|
|
Packit |
57988d |
my %IPhash;
|
|
Packit |
57988d |
foreach my $key1 (keys %{$hash})
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
if ($IP) {
|
|
Packit |
57988d |
$IPhash{$key1} = LookupIP(LookupIPv46($key1));
|
|
Packit |
57988d |
$columnmax[0] = max ($columnmax[0], length($IPhash{$key1}));
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
$columnmax[0] = max ($columnmax[0], length("$key1"));
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$columnmax[1] = max ($columnmax[1], length($hash->{$key1}));
|
|
Packit |
57988d |
$inmb += $hash->{$key1};
|
|
Packit |
57988d |
$columnmax[2] = max ($columnmax[2], length($sizehash->{$key1})) if defined $sizehash;
|
|
Packit |
57988d |
$size += $sizehash->{$key1} if defined $sizehash;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
#for last line
|
|
Packit |
57988d |
$columnmax[1] = max $columnmax[1], length $inmb;
|
|
Packit |
57988d |
$columnmax[2] = max $columnmax[2], length $size;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (defined $tabletitle) {
|
|
Packit |
57988d |
$out .= "$tabletitle\n";
|
|
Packit |
57988d |
$out .= $uchar x length($tabletitle)."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
#first line
|
|
Packit |
57988d |
$out .= " " x ($columnmax[0] - length($tablecolumns->[0])).$tablecolumns->[0];
|
|
Packit |
57988d |
$out .= " | ";
|
|
Packit |
57988d |
$out .= " " x ($columnmax[1] - length($tablecolumns->[1])).$tablecolumns->[1];
|
|
Packit |
57988d |
$out .= " | " if defined $sizehash;
|
|
Packit |
57988d |
$out .= " " x ($columnmax[2] - length($tablecolumns->[2])).$tablecolumns->[2] if defined $sizehash;
|
|
Packit |
57988d |
$out .= "\n";
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#second line
|
|
Packit |
57988d |
$out .= "-" x $columnmax[0]. " | ".
|
|
Packit |
57988d |
"-" x $columnmax[1];
|
|
Packit |
57988d |
$out .= " | ". "-" x $columnmax[2] if defined $sizehash;
|
|
Packit |
57988d |
$out .= "\n";
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#tablebody
|
|
Packit |
57988d |
foreach my $key1 (sort keys %{$hash})
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $nmb = $hash->{$key1};
|
|
Packit |
57988d |
#col1
|
|
Packit |
57988d |
#whitespace
|
|
Packit |
57988d |
if ($IP) {
|
|
Packit |
57988d |
$out .= " " x ($columnmax[0] - length($IPhash{$key1}));
|
|
Packit |
57988d |
$out .= $IPhash{$key1};
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
$out .= " " x ($columnmax[0] - length($key1));
|
|
Packit |
57988d |
$out .= $key1;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$out .= " | ";
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#col2
|
|
Packit |
57988d |
$out .= " " x ($columnmax[1] - length($nmb)). $hash->{$key1};
|
|
Packit |
57988d |
if (defined $sizehash) {
|
|
Packit |
57988d |
$out .= " | ". " " x ($columnmax[2] - length($sizehash->{$key1})).$sizehash->{$key1};
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$out .= "\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#second line (copied from above, if someone has a better idea, tell me.)
|
|
Packit |
57988d |
$out .= "-" x $columnmax[0]. " | ".
|
|
Packit |
57988d |
"-" x $columnmax[1];
|
|
Packit |
57988d |
$out .= " | ". "-" x $columnmax[2] if defined $sizehash;
|
|
Packit |
57988d |
$out .= "\n";
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#last line
|
|
Packit |
57988d |
$out .= " " x ($columnmax[0] + 3 + $columnmax[1] - length($inmb)). $inmb;
|
|
Packit |
57988d |
$out .= " " x ($columnmax[2] + 3 - length($size) ). $size if defined $sizehash;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$out .= "\n\n";
|
|
Packit |
57988d |
|
|
Packit |
57988d |
return ($out, $inmb, $size);
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub MakeTblReason {
|
|
Packit |
57988d |
my $OrigReason = shift;
|
|
Packit |
57988d |
my $TblReason;
|
|
Packit |
57988d |
if (
|
|
Packit |
57988d |
(!(( $TblReason) = ( $OrigReason =~ /^(".*?").*/ )) and
|
|
Packit |
57988d |
(!(( $TblReason) = ( $OrigReason =~ /^(.*?): .*/ )))) or
|
|
Packit |
57988d |
!($RemoveAdditionalInfo)
|
|
Packit |
57988d |
) {
|
|
Packit |
57988d |
$TblReason = $OrigReason;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
return $TblReason;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
sub nTimes
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $nmb = shift;
|
|
Packit |
57988d |
if ($nmb == 1) {
|
|
Packit |
57988d |
return "1 Time";
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
return "$nmb Times";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( $Debug >= 5 ) {
|
|
Packit |
57988d |
print STDERR "\n\nDEBUG: Inside Courier Filter \n\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#List vars here to avoid case-sensitive typos
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $AuthdRestart;
|
|
Packit |
57988d |
my $BrokenPipe;
|
|
Packit |
57988d |
my %Connection;
|
|
Packit |
57988d |
my %ConnTimeout;
|
|
Packit |
57988d |
my $ConResetBP;
|
|
Packit |
57988d |
my %Deferred;
|
|
Packit |
57988d |
my %DeSu;
|
|
Packit |
57988d |
my %DeSuSz;
|
|
Packit |
57988d |
my %DeSuTbl;
|
|
Packit |
57988d |
my %DeSuTblSz;
|
|
Packit |
57988d |
my %DfrdTbl;
|
|
Packit |
57988d |
my %ErrorMsgs;
|
|
Packit |
57988d |
my %ErrorTbl;
|
|
Packit |
57988d |
my %ErrorTbl2;
|
|
Packit |
57988d |
my %Failed;
|
|
Packit |
57988d |
my %FailRe;
|
|
Packit |
57988d |
my $From;
|
|
Packit |
57988d |
my $Host;
|
|
Packit |
57988d |
my $ID;
|
|
Packit |
57988d |
my $LastSMTPErrCode;
|
|
Packit |
57988d |
my %Login;
|
|
Packit |
57988d |
my %LoginFailed;
|
|
Packit |
57988d |
my %Logout;
|
|
Packit |
57988d |
my %Logout2;
|
|
Packit |
57988d |
my %LogoutSize;
|
|
Packit |
57988d |
my %LogoutSize2;
|
|
Packit |
57988d |
my $RespawnCourier;
|
|
Packit |
57988d |
my $ShutdownCourier;
|
|
Packit |
57988d |
my $Size;
|
|
Packit |
57988d |
my $SSLstop;
|
|
Packit |
57988d |
my $StartCourier = 0;
|
|
Packit |
57988d |
my $Startpfilter;
|
|
Packit |
57988d |
my $StopCourier = 0;
|
|
Packit |
57988d |
my $Stoppfilter;
|
|
Packit |
57988d |
my $ThisLine;
|
|
Packit |
57988d |
my $To;
|
|
Packit |
57988d |
my $User;
|
|
Packit |
57988d |
my $service;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
while (defined($ThisLine = <STDIN>)) {
|
|
Packit |
57988d |
chomp $ThisLine;
|
|
Packit |
57988d |
my $Size2 = 0;
|
|
Packit |
57988d |
my $Size = 0;
|
|
Packit |
57988d |
#TODO: Make this more accurrate (expand to \d+ times)
|
|
Packit |
57988d |
if ( $ThisLine =~ /^... .. ..:..:.. \S+ last message repeated \d+ times/ ) {
|
|
Packit |
57988d |
$ThisLine = $LastLine;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
if (not (($service ) = ( $ThisLine =~ /^... .. ..:..:.. \S+ ([^\s:\[\]]+)(?:\[[0-9]+\]|): / ))) {
|
|
Packit |
57988d |
next;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$ThisLine = $'; #$POSTMATCH
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if (
|
|
Packit |
57988d |
($ThisLine =~ /^Initializing */) or
|
|
Packit |
57988d |
($ThisLine =~ /^Installing */) or
|
|
Packit |
57988d |
($ThisLine =~ /^Installed: */) or
|
|
Packit |
57988d |
($ThisLine =~ /^Installation complete: / ) or
|
|
Packit |
57988d |
($ThisLine =~ /^stopping authdaemond children/ ) or
|
|
Packit |
57988d |
($ThisLine =~ /^Started .\/courier.*, pid=.*, maxdels=.*, maxhost=.*, maxrcpt=.*1/ ) or
|
|
Packit |
57988d |
($ThisLine =~ /^Waiting\. shutdown time=.*, wakeup time=.*, queuedelivering=.*, inprogress=.*/) or
|
|
Packit |
57988d |
($ThisLine =~ /^Loading STATIC transport module libraries./) or
|
|
Packit |
57988d |
($ThisLine =~ /^Purging /) or
|
|
Packit |
57988d |
($ThisLine =~ /^completed,id=/) or
|
|
Packit |
57988d |
($ThisLine =~ /^queuelo=.*, queuehi=.*/) or
|
|
Packit |
57988d |
# Do we really want to ignore these?
|
|
Packit |
57988d |
# currently i'm too lazy to include this
|
|
Packit |
57988d |
($ThisLine =~ /^started,ip=.*/) or ##courieresmtpd
|
|
Packit |
57988d |
# example line:
|
|
Packit |
57988d |
# id=00081D7A.3E9E0C51.000037A4,from=<r@rrg.ac.at>,addr=<u.u@u.at>,size=53223,status: success: 1 Time(s)
|
|
Packit |
57988d |
|
|
Packit |
57988d |
($ThisLine =~ /id=.*?,from=<.*?>,addr=<.*?>,size=[0-9]*,status:.*/) ##courieresmtp
|
|
Packit |
57988d |
) {
|
|
Packit |
57988d |
# Don't care about these...
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
# ESMTP, including all delivery
|
|
Packit |
57988d |
elsif ( $service =~ /^(courierd|courieresmtpd|courieresmtp|courierlocal|courieruucp|courierfax|courierdsn)$/ ){
|
|
Packit |
57988d |
#First the don't cares
|
|
Packit |
57988d |
if ( $ThisLine =~ /^newmsg,id=/ ) {
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /started,id=.*?,from=<(.*?)>,module=(.*?),host=(.*?),addr=<(.*?)>/ ) {
|
|
Packit |
57988d |
#Now starting, restarting ...
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^Courier .* Copyright/ ) {
|
|
Packit |
57988d |
$StartCourier++;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^SHUTDOWN: respawnlo limit reached/ ) {
|
|
Packit |
57988d |
$RespawnCourier++;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^SHUTDOWN: Stopping.../ ) {
|
|
Packit |
57988d |
$StopCourier++;
|
|
Packit |
57988d |
#Now it's getting interesting
|
|
Packit |
57988d |
} elsif ( ($Host) = ( $ThisLine =~ /^error,relay=([^,]*?),/ ) ) {
|
|
Packit |
57988d |
##courieresmtpd
|
|
Packit |
57988d |
# example lines:
|
|
Packit |
57988d |
# error,relay=::ffff:209.214.170.188,from=<kuebabysus@netzero.net>,to=<amber3624@netzero.net>: 513 Relaying denied.
|
|
Packit |
57988d |
# error,relay=::ffff:218.70.112.124,from=<bss@fre.sg.co.nz>: 517 Invalid domain, see <URL:ftp://ftp.isi.edu/in-notes/rfc1035.txt>
|
|
Packit |
57988d |
# error,relay=::ffff:62.67.54.144,msg="502 ESMTP command error",cmd: DATA
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$ThisLine = $';
|
|
Packit |
57988d |
my ( $From ,$To, $Msg ) = (undef, undef, undef);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( $ThisLine =~ /^ident=[^,]*,/ ) {
|
|
Packit |
57988d |
$ThisLine = $';
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if ( ($From) = ( $ThisLine =~ /^from=<([^<>]*?)>(:?,|)/ )) {
|
|
Packit |
57988d |
$ThisLine = $';
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if (( $To ) = ( $ThisLine =~ /^to=<([^<>]*?)>/ ) ) {
|
|
Packit |
57988d |
$ThisLine = $';
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if (( $Msg ) = ( $ThisLine =~ /^msg=(.*)/ )) { }
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$ThisLine =~ s/^: //;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#Extract it
|
|
Packit |
57988d |
my ($SMTPErrCode) = ($ThisLine =~ /^([0-9]{3})/);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# next if already seen
|
|
Packit |
57988d |
if($ThisLine =~ /^[0-9]{3} / and $LastSMTPErrCode == $SMTPErrCode) {
|
|
Packit |
57988d |
$LastSMTPErrCode = 0;
|
|
Packit |
57988d |
next;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#next if already seen but not last line.
|
|
Packit |
57988d |
next if $LastSMTPErrCode == $SMTPErrCode and not defined $Msg;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $Reason = $ThisLine;
|
|
Packit |
57988d |
$Reason = $Msg if defined $Msg;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$ErrorMsgs{$Reason}{$Host}{$From || "-"}{$To || "-"}++ if not $Tables;
|
|
Packit |
57988d |
my $TblReason = MakeTblReason($Reason) if $Tables;
|
|
Packit |
57988d |
$ErrorTbl{$TblReason}{$Host}++ if $Tables;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$LastSMTPErrCode = $SMTPErrCode;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#zero it if done
|
|
Packit |
57988d |
$LastSMTPErrCode = 0 if $ThisLine =~ /^[0-9]{3} / or defined $Msg;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
} elsif ( ($From, $To, $Size) = ( $ThisLine =~
|
|
Packit |
57988d |
/^id=.*?,from=<(.*?)>,addr=<(.*?)>,size=([0-9]*),success: .*/ ) ) { ##courieresmtp, courierlocal
|
|
Packit |
57988d |
#example line:
|
|
Packit |
57988d |
#id=00081D7A.3E9E0B39.000036E4,from=<u@ttt.at>,addr=<aa@aa.at>,size=35861,success: delivered: ff.ff.at [111.111.111.111]
|
|
Packit |
57988d |
#DeliverSuccess = DeSu !!!!!!!!
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$DeSu{$From}{$To}++;
|
|
Packit |
57988d |
$DeSuSz{$From}{$To} += $Size;
|
|
Packit |
57988d |
$DeSuTbl{$To}++;
|
|
Packit |
57988d |
$DeSuTblSz{$To} += $Size;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
} elsif ( ($ID, $From, $To, my $status) = ( $ThisLine =~
|
|
Packit |
57988d |
/^id=(.*),from=<(.*?)>,addr=<(.*?)>,status: (deferred|failure)/ ) ) { ##courieresmtp
|
|
Packit |
57988d |
#example lines: deferred, failed delivery attempts
|
|
Packit |
57988d |
#id=00081D03.3E850D34.000076BD,from=<oo@oo.at>,addr=<uu@uu.at>,status: deferred
|
|
Packit |
57988d |
#id=00081D7B.3E9167E7.00002B27,from=<bb@bb.at>,addr=<rr@rr.at>,status: failure
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $Reason = $FailRe{$ID}{$From}{$To};
|
|
Packit |
57988d |
if ($Reason eq "") {
|
|
Packit |
57988d |
$Reason = "-";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
my $TblReason = MakeTblReason($Reason);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( $status =~ /deferred/ ){
|
|
Packit |
57988d |
$Deferred{$Reason}{$From}{$To}++;
|
|
Packit |
57988d |
$DfrdTbl{$TblReason}{$To}++;
|
|
Packit |
57988d |
} else { #failure
|
|
Packit |
57988d |
$Failed{$Reason}{$From}{$To}++;
|
|
Packit |
57988d |
$ErrorTbl2{$TblReason}{$To}++;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif ( ($ID, $From, $To, my $Reason) = ( $ThisLine =~ /^id=(.*?),from=<(.*?)>,addr=<(.*?)>:(.*)/ ) ) { ##courierd, courieresmtp
|
|
Packit |
57988d |
#example line:
|
|
Packit |
57988d |
#id=00079ED0.3E8A45E7.000042AF,from=<rr@rrr.at>,addr=<aaa@aaa.at>: Connection timed out
|
|
Packit |
57988d |
#id=00079ED0.3E975385.00005B66,from=<zz@zz.at>,addr=<ii@ii.at>: DNS lookup failed.
|
|
Packit |
57988d |
#This is for the following lines to have the reason for failed or deferred.
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$FailRe{$ID}{$From}{$To} = $Reason;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^Unexpected SSL connection shutdown./ ) {
|
|
Packit |
57988d |
$SSLstop++;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^writev: Broken pipe/ ) {
|
|
Packit |
57988d |
$BrokenPipe++;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^writev: Connection reset by peer/ ) {
|
|
Packit |
57988d |
$ConResetBP++;
|
|
Packit |
57988d |
} elsif ( ( $Host ) = ( $ThisLine =~ /^\[([^\]]*)\]: Connection timed out/ )) {
|
|
Packit |
57988d |
$ConnTimeout{$Host}++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
PushUnmatched $service, $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif ( $service =~ /^authdaemond/ ) {
|
|
Packit |
57988d |
if ( $ThisLine =~ /^modules="[^"]*", daemons=\d*$/ ) {
|
|
Packit |
57988d |
# Ignore
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^restarting authdaemond children/ ) {
|
|
Packit |
57988d |
$AuthdRestart++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
PushUnmatched $service, $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif ( $service =~ /^submit$/ ) {
|
|
Packit |
57988d |
if ( $ThisLine =~ /^Broken pipe/ ) {
|
|
Packit |
57988d |
$BrokenPipe++;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^Connection reset by peer/ ) {
|
|
Packit |
57988d |
$ConResetBP++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
PushUnmatched $service, $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif ( $service =~ /^courierfilter$/ ) {
|
|
Packit |
57988d |
if ( $ThisLine =~ /^Starting perlfilter/ ) {
|
|
Packit |
57988d |
$Startpfilter++;
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^Stopping perlfilter/ ) {
|
|
Packit |
57988d |
$Stoppfilter++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
PushUnmatched $service, $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif ( $service =~ /^(:?pop3login|imaplogin|courierpop3login|pop3d|pop3d-ssl|imapd|imapd-ssl)$/ ) {
|
|
Packit |
57988d |
my $proto = $service;
|
|
Packit |
57988d |
$proto =~ s/.*pop.*/POP3/i;
|
|
Packit |
57988d |
$proto =~ s/.*imap.*/IMAP/i;
|
|
Packit |
57988d |
if ( ($Host) = ( $ThisLine =~ /^Connection, ip=\[(.*?)\]/ ) ) { ##pop3login, imaplogin, courierpop3login, pop3d, imapd
|
|
Packit |
57988d |
#example line pop3, imapd??
|
|
Packit |
57988d |
#Connection, ip=[::ffff:192.168.0.24]
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$Connection{$proto}{$Host}++;
|
|
Packit |
57988d |
} elsif ( ($User, $Host) = ( $ThisLine =~ /^LOGIN, user=(.*?), ip=\[(.*?)\]/ ) ) { ##pop3login, imaplogin, courierpop3login, pop3d, imapd
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#example line
|
|
Packit |
57988d |
#LOGIN, user=xy, ip=[::ffff:192.168.0.12]
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$Login{$proto}{$User}{$Host}++;
|
|
Packit |
57988d |
} elsif (
|
|
Packit |
57988d |
( ( $User, $Host, $Size) = ( $ThisLine =~
|
|
Packit |
57988d |
/^LOGOUT, user=(.*?), ip=\[(.*?)\], (?:port=\[\d+\], )?(?:top|headers)=[0-9]*, (?:retr|body)=([0-9]*)/ ) ) ||
|
|
Packit |
57988d |
( ( $User, $Host, $Size, $Size2) = ( $ThisLine =~
|
|
Packit |
57988d |
/^DISCONNECTED, user=(.*?), ip=\[(.*?)\], headers=([0-9]*?), body=([0-9]*)/ ) )
|
|
Packit |
57988d |
) { ###pop3login, imaplogin, courierpop3login, pop3d, imapd
|
|
Packit |
57988d |
#example line
|
|
Packit |
57988d |
#LOGOUT, user=xy, ip=[::ffff:192.168.0.24], top=0, retr=0
|
|
Packit |
57988d |
#DISCONNECTED, user=zz@uu.ch, ip=[::ffff:192.168.0.1], headers=0, body=1100
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$Size += $Size2 if defined $Size2;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$Logout{$proto}{$User}{$Host}++;
|
|
Packit |
57988d |
$Logout2{$proto}{$User}++;
|
|
Packit |
57988d |
$LogoutSize{$proto}{$User}{$Host} += $Size;
|
|
Packit |
57988d |
$LogoutSize2{$proto}{$User} += $Size;
|
|
Packit |
57988d |
} elsif ( ($Host) = ( $ThisLine =~ /^LOGIN FAILED, ip=\[(.*?)\]/ ) ) { ## pop3login, imaplogin, courierpop3login, pop3d, imapd
|
|
Packit |
57988d |
#example line
|
|
Packit |
57988d |
#LOGIN FAILED, ip=[::ffff:192.168.200.199]
|
|
Packit |
57988d |
|
|
Packit |
57988d |
$LoginFailed{$proto}{$Host}++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
PushUnmatched $service, $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
# Report any unmatched entries...
|
|
Packit |
57988d |
|
|
Packit |
57988d |
PushUnmatched $service, $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
$LastLine = $ThisLine;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and ($PrintMailQueue ) ) {
|
|
Packit |
57988d |
print "\n\n\nCurrent State of the Mail Queue:\n".
|
|
Packit |
57988d |
"================================\n\n";
|
|
Packit |
57988d |
my $MailqPath = `which mailq` || "/usr/bin/mailq";
|
|
Packit |
57988d |
chomp $MailqPath;
|
|
Packit |
57988d |
if (-x $MailqPath) {
|
|
Packit |
57988d |
print `$MailqPath`;
|
|
Packit |
57988d |
print "\n\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#StartCourier ...
|
|
Packit |
57988d |
if ( $Detail >= 5 )
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
my $SelfRestart = $RespawnCourier;
|
|
Packit |
57988d |
print "Courier restarted itself ".nTimes($SelfRestart)."\n" if $SelfRestart;
|
|
Packit |
57988d |
my $HandStart = $StartCourier - $SelfRestart;
|
|
Packit |
57988d |
print "Courier was started by hand (or init) ".nTimes($HandStart)."\n" if $HandStart;
|
|
Packit |
57988d |
my $HandStop = $StopCourier;
|
|
Packit |
57988d |
print "Courier was stopped by hand (or init) ".nTimes($HandStop)."\n" if $HandStop;
|
|
Packit |
57988d |
print "The authdaemon was restarted ".nTimes($AuthdRestart)."\n" if $AuthdRestart;
|
|
Packit |
57988d |
print "\n" if $RespawnCourier + $StartCourier + $StopCourier > 0;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
print "Unexpected SSL connection shutdowns: ".nTimes($SSLstop)."\n" if $SSLstop;
|
|
Packit |
57988d |
print "Broken Pipes: ".nTimes($BrokenPipe)."\n" if $BrokenPipe;
|
|
Packit |
57988d |
print "Connection Reset by Peer: ".nTimes($ConResetBP)."\n" if $ConResetBP;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( keys %ConnTimeout ) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%ConnTimeout, 1, [ "Host" ], [1], 2, 2);
|
|
Packit |
57988d |
print "\nConnections timed out: ".nTimes($nmb)."\n";
|
|
Packit |
57988d |
print $out."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and (keys %Connection) and (!$Tables)) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%Connection, 2, [ "Protocol", "Host" ], [0,1], 2);
|
|
Packit |
57988d |
print "\nConnections: ".nTimes($nmb)."\n";
|
|
Packit |
57988d |
print $out."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and (keys %Connection) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%Connection, undef, 1, 1, "Connections", [ "Host", "#" ], "");
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %LoginFailed) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%LoginFailed, undef, 1, 1, "Login Failures", [ "Host", "#" ], "");
|
|
Packit |
57988d |
print "\n".$out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %LoginFailed) and (!$Tables)) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%LoginFailed, 2, [ "Protocol", "Host" ], [0,1], 2);
|
|
Packit |
57988d |
print "\nLogin Failed: ".nTimes($nmb)."\n";
|
|
Packit |
57988d |
print $out."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and (keys %Logout2) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%Logout2, \%LogoutSize2, 1, 1, "Logins", [ "Host", "#", "Size" ], "");
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and (keys %Logout) and (!$Tables)) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%Logout, 3, [ "Protocol", "User", "Host" ], [0,0,1], 2, undef, \%LogoutSize);
|
|
Packit |
57988d |
print "\nLogins: ".nTimes($nmb)."\n";
|
|
Packit |
57988d |
print $out."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
#Fixme why have login and logout has print 2 login reports -mgt
|
|
Packit |
57988d |
if ( ( $Detail >= 10 ) and (keys %Login) and (!$Tables)) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%Login, 3, [ "Protocol", "User", "Host" ], [0,0,1], 2, undef);
|
|
Packit |
57988d |
print "\nSuccessful Logins: ".nTimes($nmb)."\n";
|
|
Packit |
57988d |
print $out."\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %ErrorTbl) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%ErrorTbl, undef, 1, 1, "", [ "Host", "#" ], "Errors in remote to local connections");
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %ErrorMsgs) and (!$Tables) ) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1 ( \%ErrorMsgs, 4, [ "because", "Host", "From", "To" ], [0,1,0,0], 2);
|
|
Packit |
57988d |
print "\nErrors in remote to local connections: ".nTimes($nmb)."\n\n";
|
|
Packit |
57988d |
print "$out\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %DfrdTbl) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%DfrdTbl, undef, 1, 0, "", [ "Recipient", "#" ], "Deferred delivery attempts");
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %Deferred) and (!$Tables)) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%Deferred, 3, [ "because", "From", "To" ], undef, 2,4);
|
|
Packit |
57988d |
print "\nDeferred delivery attempts: ".nTimes($nmb)."\n";
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %ErrorTbl2) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%ErrorTbl2, undef, 1, 0, "", [ "Recipient", "#" ], "Failed delivery attempts");
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 0 ) and (keys %Failed) and (!$Tables)) {
|
|
Packit |
57988d |
my ($out, $nmb) = recprint1(\%Failed, 3, [ "because", "From", "To" ], undef, 2);
|
|
Packit |
57988d |
print "\nFailed delivery attempts: ".nTimes($nmb)."\n\n";
|
|
Packit |
57988d |
print "$out\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and (keys %DeSu) and (!$Tables) ) {
|
|
Packit |
57988d |
my ($out, $nmb, $size) = recprint1 ( \%DeSu, 2, [ "From", "To" ], [0,0], 2, undef, \%DeSuSz);
|
|
Packit |
57988d |
print "\n\nSuccessful deliveries: ".nTimes($nmb).", $size Bytes\n\n";
|
|
Packit |
57988d |
print "$out\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( ( $Detail >= 5 ) and (keys %DeSuTbl) and ($Tables)) {
|
|
Packit |
57988d |
my ( $out, $nmb, $size) = tblprint1(\%DeSuTbl, \%DeSuTblSz, 0, 0, "", [ "Recipient", "#", "Size" ], "Successful deliveries");
|
|
Packit |
57988d |
print $out;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %OtherList)
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
print "\n**Unmatched Entries**\n";
|
|
Packit |
57988d |
my $out = recprint1( \%OtherList, 2, undef,undef, 2);
|
|
Packit |
57988d |
print "$out\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# vi: shiftwidth=3 tabstop=3 syntax=perl et
|
|
Packit |
57988d |
# Local Variables:
|
|
Packit |
57988d |
# mode: perl
|
|
Packit |
57988d |
# perl-indent-level: 3
|
|
Packit |
57988d |
# indent-tabs-mode: nil
|
|
Packit |
57988d |
# End:
|