#!/usr/bin/perl -w
#
# Postgreystats - a simple and incorrect statistics package for Postgrey.
# Use at your own risk.
# Distributable under the terms of GNU General Public License, version 2.
# Written by Jan "Yenya" Kasprzak, http://www.fi.muni.cz/~kas/, 2006-11-10
#
# Usage: postgreystats.pl /var/log/maillog
#
my %clients;
my ($delay_total, $delay_msgs);
my ($msgs_gray, $msgs_in);
my ($fromtime, $totime);
my $prev;
$msgs_in = 0;
$msgs_gray = 0;
$delay_total = 0;
$delay_msgs = 0;
while(<>) {
$prev = $_;
if (!defined $fromtime) {
($fromtime) = m{^(... .. ..:..:..)};
}
if (my ($client) = m{postfix/smtpd\S+: [0-9A-F]{10,12}: client=\S+\[(\d+\.\d+\.\d+\.\d+)\]}) {
$clients{$client}->{in}++;
$msgs_in++;
next;
}
if (my ($client) = m{postfix/smtpd\S+: NOQUEUE: reject: RCPT from \S+\[(\d+\.\d+\.\d+\.\d+)\]:.* 450 .*seconds}i) {
$clients{$client}->{grey}++;
$msgs_gray++;
}
}
($totime) = ($prev =~ m{^(... .. ..:..:..)});
print "\nGreylisting stats from $fromtime\n",
" till $totime\n\n";
$msgs_in -= $delay_msgs;
$msgs_gray -= $delay_msgs;
my $msgs_total = $msgs_gray + $msgs_in + $delay_msgs;
printf "Messages\n"
."total: %10d\n"
."accepted immediately: %10d (%5.1f%%)\n"
."blocked: %10d (%5.1f%%)\n\n",
$msgs_total,
$msgs_in, 100*$msgs_in / $msgs_total,
$msgs_gray, 100*$msgs_gray / $msgs_total;
my ($zero_in, $zero_grey, $grey_pos, $grey_neg);
my ($zero_in_msgs, $zero_grey_msgs, $grey_pos_msgs_in, $grey_pos_msgs_gr,
$grey_neg_msgs_in, $grey_neg_msgs_gr);
$zero_in=0;
$zero_grey=0;
$grey_pos=0;
$grey_neg=0;
$zero_in_msgs=0;
$zero_grey_msgs=0;
$grey_pos_msgs_in=0;
$grey_pos_msgs_gr=0;
$grey_neg_msgs_in=0;
$grey_neg_msgs_gr=0;
for my $client (keys %clients) {
my $in = $clients{$client}->{in} || 0;
my $gr = $clients{$client}->{grey} || 0;
if ($in == 0) {
$zero_in++;
$zero_in_msgs+=$gr;
} elsif ($gr == 0) {
$zero_gr++;
$zero_gr_msgs += $in;
} elsif ($gr <= $in) {
$grey_pos++;
$grey_pos_msgs_in += $in;
$grey_pos_msgs_gr += $gr;
} else {
$grey_neg++;
$grey_neg_msgs_in += $in;
$grey_neg_msgs_gr += $gr;
}
}
my ($grey_pos_msgs, $grey_neg_msgs) = (
$grey_pos_msgs_in - $grey_pos_msgs_gr,
$grey_neg_msgs_gr - $grey_neg_msgs_in
);
printf "SMTP servers:\n"
." hosts messages\n"
."No message accepted: %10d %10d\n"
."No message graylisted: %10d %10d\n"
."All accepted (maybe delayed): %10d %10d = %d-%d\n"
."More blocked than accepted: %10d %10d = %d-%d\n\n",
$zero_in, $zero_in_msgs,
$zero_gr, $zero_gr_msgs,
$grey_pos, $grey_pos_msgs_in-$grey_pos_msgs_gr, $grey_pos_msgs_in,
$grey_pos_msgs_gr,
$grey_neg, $grey_neg_msgs_gr-$grey_neg_msgs_in, $grey_neg_msgs_gr,
$grey_neg_msgs_in;
-f.