blob: 8ef752d33891875f387be6e4f27f03ea0e564b32 [file] [log] [blame]
#!/usr/bin/perl
# WARNING: This script is VERY rough and provided only as a template
# for moving a DB based autowhitelist to a SQL based one. You should
# do backups and that sort of thing before attempting to use this
# script.
use strict;
use Fcntl;
use Getopt::Long;
use DBI;
use DB_File;
my ( %h $k $v );
sub usage {
print "This program takes the following required arguments:\n";
print "--username <username> - This is who's whitelist you are loading.\n";
print " It should match exactly what spassassin or\n";
print " spamd will be using.\n";
print "--dsn <dsn> - This is the database DSN. It should be in the form:\n";
print " DBI:driver:database:hostname[:port]\n";
print " Consult your database drivers docs for more info.\n";
print "--ok - Basically a sanity check that you understand how dangerous this script is.\n";
print "\n";
print "This program take the following optional arguments:\n";
print "--dbautowhitelist <path> - path to the auto-whitelist you wish to\n";
print " convert. Default is to use \n";
print " \$ENV{HOME}/.spamassassin/auto-whitelist\n";
print "--sqlusername <username> - Needed if your DBI driver requires a username.\n";
print "--sqlpassword <password> - Needed if your DBI driver requires a password.\n";
print "\n\n";
print "WARNING: This script is VERY rough and not well tested. You should\n";
print "use extreme caution when working with it. Including backing up your\n";
print "data and all that other good stuff.\n";
print "Passing of the --ok flag means you read this warning.\n";
print "\n";
exit;
}
my %opt;
GetOptions('dsn=s' => \$opt{'dsn'},
'sqlusername=s' => \$opt{'sqlusername'},
'sqlpassword=s' => \$opt{'sqlpassword'},
'dbautowhitelist=s' => \$opt{'dbautowhitelist'},
'username=s' => \$opt{'username'},
'help' => \$opt{'help'},
'ok' => \$opt{'ok'},
);
if ($opt{'help'}) {
usage();
}
if (!$opt{'ok'}) {
usage();
}
if (!$opt{'username'} || !$opt{'dsn'}) {
usage();
}
my $db;
if ($opt{'dbautowhitelist'}) {
$db = $opt{'dbautowhitelist'};
}
else {
$db = $ENV{HOME}."/.spamassassin/auto-whitelist";
}
tie %h, "DB_File",$db, O_RDONLY,0600
or die "Cannot open file $db: $!\n";
my $dbh = DBI->connect($opt{'dsn'}, $opt{'sqlusername'}, $opt{'sqlpassword'})
or die $DBI::errstr;
my $sth = $dbh->prepare("DELETE FROM awl WHERE username = ?");
$sth->execute($opt{'username'});
my $sth = $dbh->prepare("INSERT INTO awl (username,email,ip,count,totscore) VALUES (?,?,?,?,?)");
my @k = grep(!/totscore$/,keys(%h));
for my $key (@k) {
my $totscore = $h{"$key|totscore"};
my $count = $h{$key};
if(defined($totscore)) {
my ($email, $ip) = split(/\|ip=/, $key);
if ($email && $ip) {
my $rc = $sth->execute($opt{'username'}, $email, $ip, $count, $totscore);
printf "% 8.1f %15s -- %s\n", $totscore/$count, (sprintf "(%.1f/%d)",$totscore/$count, $count), $key;
}
}
}
untie %h;
$dbh->disconnect();