#!/usr/bin/perl use DBI; while($in = shift) { push(@args,$in); } parse_args(@args); if($db) { $dbh = DBI->connect("dbi:mysql:db=$db_arg","$dbuser_arg","$dbpass_arg") || die "Failed to connect to database"; } $SIGNAL['int'] = sigint; if(!$folder_arg) { usage(); exit; } if(-d "Maildir/$folder_arg") { $folder_arg = "Maildir/" . $folder_arg; } if(-d "Maildir/$target_arg") { $target_arg = "Maildir/" . $target_arg; } if(-d "Maildir/\.$folder_arg") { $folder_arg = "Maildir/." . $folder_arg; } if(-d "Maildir/\.$target_arg") { $target_arg = "Maildir/." . $target_arg; } # strip trailing slash @expanded = split(//,$folder_arg); $index = @expanded; $tail = pop(@expanded); push (@expanded, $tail) if($tail ne "/"); $folder_arg = ""; foreach $letter (@expanded) { $folder_arg.= $letter; } @expanded = split(//,$target_arg); $index = @expanded; $tail = pop(@expanded); push(@expanded,$tail) if ($tail ne "/"); $target_arg = ""; foreach $letter (@expanded) { $target_arg.= $letter; } if(-d "$folder_arg/cur") { $folder_arg .= "/cur"; } if(-d "$target_arg/cur") { $target_arg .= "/cur"; } die "I wasn't able to find your maildir" if(! -d $folder_arg); if($make_target && (! -d $target_arg)) { $res = system("maildirmake $target_arg"); die "--maildirmake specified but unable to make $target_arg" if($res); } die "I wasn't able to find the target dir ($target_arg) " if (! -d $target_arg); $root_folder = `pwd`; chop($root_folder); open(LS,"ls $folder_arg|"); while($in = ) { chop $in; $spam_folder = $root_folder . "/" . $folder_arg; print "Trying: $spam_folder/$in ... "; if($db) { ($already_did) = $dbh->selectrow_array("SELECT spam_id FROM spam WHERE spam_folder = '$spam_folder' AND spam_file = '$in'"); } else { $already_did = 0; } if($already_did) { print "Already done ($already_did)\n"; next; } if(! -f "$folder_arg/$in") { print "Deleted from inbox\n"; next; } $start_time = time(); $ret = system("cat $folder_arg/$in | spamc -s 150000 -E > /tmp/spam.$$ 2>/tmp/spam-err.$$"); open(CONTENTS,") { $contents .= $inf; } if($db) { $contentsq = $dbh->quote($contents); } $processing_time = time() - $start_time; if($ret == 33280) { cleanup(); } if(($ret != 0) && -f "$folder_arg/$in" ) { $new_path = "$target_arg/$in"; $move_ret = system("mv $folder_arg/$in $target_arg"); die "Couldn't move spam!" if($move_ret); print "Spam! ($ret)\n"; $spam = 1; } else { print "Not spam.\n"; $spam = 0; $contentsq = "null"; } if($db) { $dbh->do("INSERT INTO spam (spam_folder,spam_file,new_path,is_spam,return_code,ts,spam_contents,processing_time,root_folder) VALUES ('$spam_folder','$in','$new_path',$spam,$ret,now(),$contentsq, $processing_time, '$root_folder')") || die("sql error"); } } sub sigint { cleanup(); } sub cleanup { system("rm /tmp/spam.$$"); system("rm /tmp/spam-err.$$"); exit(0); } sub usage { print "cleanup-spam [opts] (source maildir) (target maildir)\n"; print "Options:\n"; print "--make-target - make target dir if doesn't exist\n"; print "--db=(database) - specify mysql database for spam logging\n"; print "--dbuser=(user) - specify mysql user for spam logging\n"; print "--dbpass=(password) - specify mysql password for spam logging\n"; exit(0); } sub parse_args { $state = 0; $make_target = 0; $debug = 0; $db = 0; $target_arg = "Maildir/.Spam-Offline/cur"; while($arg = shift) { if(($rarg) = $arg =~ /--(.*)/) { ($r1, $r2) = split(/=/,$rarg); if($r1 eq "source") { $folder_arg = $r2; } elsif ($r1 eq "target") { $target_arg = $r2; } elsif ($r1 eq "make-target") { $make_target = 1; } elsif ($r1 eq "debug") { $debug = $r2 || 0xFFFF; } elsif ($r1 eq "db") { $db_arg = $r2; } elsif ($r1 eq "dbuser") { $dbuser_arg = $r2; } elsif ($r1 eq "dbpass") { $dbpass_arg = $r2; } } else { # if not a -- arg if($state == 0) { $folder_arg = $arg; } elsif($state == 1) { $target_arg = $arg; } else { print "Error: I don't know what to do with $arg\n"; usage(); } } # end of if arg print "arg: $arg\n" if($debug & 64); } # end of arg loop $db = 1 if($dbuser_arg && $dbpass_arg && $db_arg); if($debug & 128) { print "make-target: $make_target\n"; print "db: $db\n"; print "db_user: $dbuser_arg\n"; print "db_pass: $dbpass_arg\n"; print "db: $db_arg\n"; } }