#!/usr/bin/perl -w # run only with Postfix stopped! use strict; use DB_File::Lock; use Fcntl qw(O_RDWR O_CREAT); my $database_name = '/var/mta/greylist.db'; my $newdatabase = $database_name.'.new'; my $greylist_delay = 300; my $expire_period = 30*86400; my($key, $value, $ctime, $atime, $count, $now, %db, %newdb); my $expired = 0; my $retained = 0; $now = time(); tie %db, 'DB_File::Lock', $database_name, O_RDWR, 0644, $DB_BTREE, 'write' or die; tie %newdb, 'DB_File::Lock', $newdatabase, O_CREAT|O_RDWR, 0644, $DB_BTREE, 'write' or die; while(($key, $value) = each %db) { ($ctime, $atime, $count) = split '/', $value; if(($atime>$ctime+$greylist_delay || $ctime>$now-$greylist_delay ) && $now-$atime<$expire_period) { # save this record $newdb{$key} = $value; $retained++; } else { $expired++; } } untie %newdb; untie %db; printf "Expired %d, retained %d records.\n", $expired, $retained; exit 0;