#!/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;

