Hi,
as nobody seems to have a working solution I built a little Perl script
that adds the IP of the server receiving outgoing mail to
postgrey_clients.db
It's still a little unfinished but working fine on my server. There's
room for improvement though (IPv6 missing, rsyslog spawning and lastline
fetching is non-optimal). Maybe I will improve this with piping and a fifo.
If somebody wants to help/try it, here it is:
Requirements:
* A log file containing only postfix/smtp delivery success messages
* Method to start the script when a new delivery is logged
For these I used rsyslog like that:
rsyslog.conf:
if $syslogtag contains 'postfix/smtp' and $msg contains 'status=sent'
then /var/log/mail.outgoing
& ^/root/postgrey_clients_add.pl
Perl Script (works on debian):
postgrey_clients_add.pl:
#!/usr/bin/perl -w
# Add IPs to postgrey's auto-whitelist
use BerkeleyDB;
use Socket;
my $dbdir = '/var/lib/postgrey';
my $logfile = '/var/log/mail.outgoing';
sub main()
{
my %db;
my $dbenv = BerkeleyDB::Env->new(
-Home => $dbdir,
-Flags => DB_INIT_TXN|DB_INIT_MPOOL|DB_INIT_LOG,
) or die "ERROR: can't open DB environment: $!\n";
tie(%db, 'BerkeleyDB::Btree',
-Filename => "postgrey_clients.db",
-Env => $dbenv,
) or die "ERROR: can't open database $dbdir/postgrey_clients.db: $!\n";
my $lastlogline = `tail -n1 $logfile`;
my($lastip) = $lastlogline =~ /.*relay=.*\[([0-9\.]+)\]/;
exit(1) if (!$lastip);
open LOGFILE, '>>', $logfile;
print LOGFILE "postgrey whitelister: ";
if (exists $db{$lastip}){
print LOGFILE "$lastip exists: $db{$lastip}\n";
}else{
#default purge time is 35days give client 5 days and 4 tries
my $tstamp = time - 30*24*60*60;
$db{$lastip} = "4,$tstamp";
print LOGFILE "$lastip added: $db{$lastip}\n";
}
close LOGFILE;
untie %db;
}
main;
# vim: sw=4
--
Claudius