| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 
							- #!/usr/bin/perl
 - #
 - # by Petr Znojemsky (c) 2004
 - # Mailbox remover 0.1a 23/10/2004 - the very first version for MySQL
 - # removes maildirs from disk when they are not found in a database
 - #
 - # Added subdir support and pause --- Alan Batie 2007
 - # Lists directories to be deleted then pauses for 5 seconds for chance to abort
 - # $Id: mailbox_remover.pl 211 2007-11-11 23:36:46Z christian_boltz $
 - #
 - # All your maildirs or other directories could be accidentally removed.
 - # Use it at own risk. No warranties!
 - 
 - use strict;
 - use DBI;
 - use File::Path;
 - 
 - ##########
 - # Set these variables according to your configuration
 - 
 - # when mailboxes are removed, save their tarballs here
 - my $archdir="/var/archive/mailboxes";
 - 
 - # expected to support z option, tweak invocation if you want different
 - my $archcmd="/usr/bin/tar";
 - 
 - # trailing slash not needed
 - my $maildir_path="/var/mail";
 - # find out if we need to check subdirs for mailboxes or just maildir_path
 - # $CONF['domain_path'] = 'YES';
 - my $pfadmin_config="/usr/local/www/postfixadmin/config.inc.php";
 - 
 - # database information
 - my $host="localhost";
 - my $port="3306";
 - my $userid="dbuser";
 - my $passwd="dbpw";
 - my $db="dbname";
 - ############
 - 
 - my $connectionInfo="DBI:mysql:database=$db;$host:$port";
 - # make connection to database
 - my $dbh = DBI->connect($connectionInfo,$userid,$passwd);
 - # prepare and execute query
 - my $query = "SELECT maildir FROM mailbox";
 - my $sth = $dbh->prepare($query);
 - $sth->execute();
 - 
 - # assign fields to variables
 - my ($db_maildir, %db_maildirs);
 - $sth->bind_columns(\$db_maildir);
 - 
 - # load up directory list
 - while($sth->fetch()) {
 -     $db_maildirs{$db_maildir} = 1;
 - }
 - 
 - $sth->finish();
 - # disconnect from database
 - $dbh->disconnect;
 - 
 - # 
 - # find out if we need to check subdirs for mailboxes or just maildir_path
 - # $CONF['domain_path'] = 'YES';
 - #
 - my $use_subdirs = 0;
 - open(CONFIG, "<$pfadmin_config") || die "Can't open '$pfadmin_config': $!\n";
 - while(<CONFIG>) {
 -     if (/\$CONF\['domain_path'\] *= *'([^']*)'/) {
 - 	$use_subdirs = ($1 =~ /yes/i);
 -     }
 - }
 - close(CONFIG);
 - 
 - # store maildir list to %directories
 - # key is path, value is username to use in archive file
 - my %directories;
 - opendir(DIR, $maildir_path) || die "Cannot open dir $maildir_path: $!\n";
 - foreach my $name (readdir(DIR)) {
 -     next if ($name eq '.' || $name eq '..' || ! -d "$maildir_path/$name");
 - 
 -     if ($use_subdirs) {
 - 	opendir(SUBDIR, "$maildir_path/$name") || die "Cannot open dir $maildir_path/$name: $!\n";
 - 	foreach my $subname (readdir(SUBDIR)) {
 - 	    next if ($subname eq '.' || $subname eq '..' || ! -d "$maildir_path/$name/$subname");
 - 	    # db entry has trailing slash...
 - 	    if (!defined($db_maildirs{"$name/$subname/"})) {
 - 	        print "marking $maildir_path/$name/$subname for deletion.\n";
 - 		$directories{"$name/$subname"} = "$name-$subname";
 - 	    }
 - 	}
 - 	closedir(SUBDIR);
 -     } else {
 - 	# db entry has trailing slash...
 - 	if (!defined($db_maildirs{"$name/"})) {
 - 	    print "marking $maildir_path/$name for deletion.\n";
 - 	    $directories{"$name"} = $name;
 - 	}
 -     }
 - }
 - closedir(DIR);
 - 
 - print "Ctrl-C in 5 seconds to abort before removal starts...\n";
 - sleep 5;
 - 
 - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
 - # yyyymmddhhmm
 - my $tstamp = sprintf("%04d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min);
 - 
 - # compare two arrays and erase maildirs not found in database
 - chdir $maildir_path || die "Can't change to maildir '$maildir_path': $!\n";;
 - my @args;
 - foreach my $maildir (keys(%directories)) {
 -     my $archive = "$archdir/$directories{$maildir}-$tstamp.tgz";
 -     # quick permissions check
 -     open(TOUCH, ">$archive") || die "Can't create archive file $archive: $!\n";
 -     close(TOUCH);
 -     print "Archiving $maildir\n";
 -     @args = ($archcmd, "cvzf", $archive, $maildir);
 - 	system(@args) == 0 or die "Creating archive for $maildir failed: $?"
 - 
 -     rmtree($maildir);
 -     print localtime() . " $maildir has been deleted.\n";
 - }
 
 
  |