Subversion Repositories sysadmin_scripts

Rev

Blame | Last modification | View Log | Download | RSS feed

#! /usr/bin/perl -w

# getMailFoldersToProcess
# Author: R. W. Rodolico
# 20131031
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
# 
# script will update two files, CLEANUP_FILE and $SA_LEARN_FILE
# $CLEANUP_FILE contains directories to be processed by clean_old_files script
#    you should have a script that will go through these directories and removes
#    old files. One possibility is the cleanup script available with this
#    program.
# $SA_LEARN_FILE contains directories to be processed by sa_learn script
#    At a minimum, you should run the following command to process these files
#    sa-learn --spam --progress -f $SA_LEARN_FILE
#    where $SA_LEARN_FILE is the same file as defined here and
#    --progress is used only for interactive processing (shows progress)

print "Getting folders to process\n";

my $ROOT_DIR = '/var/vmail';
my @SPAM_FOLDER_NAME = ( '.thisisspam' );
my @HAM_FOLDER_NAME = ( '.thisisnotspam' );
my @JUNK_FOLDER_NAME = ( '.junk', '.trash', '.deleted items' );
my $CONTROL_FOLDER = '/opt/mailmanage/data';
my $CLEANUP_FILE = 'mail_cleanup.list';
my $SA_LEARN_FILE = 'sa_learn.list';
my @SUBDIRS_TO_PROCESS = ( 'new', 'cur' );
my $CONFIG_FILE_NAME = 'mailmanage.cfg';

my @IGNORE_ROOT = ( 'somedomain.com' );

sub getScriptLocation {
   use strict;
   use File::Spec::Functions qw(rel2abs);
   use File::Basename;
   return dirname(rel2abs($0));
}

sub readConfig {
   my $scriptLocation = &getScriptLocation();
   my $return = '';
   if ( -e "$scriptLocation/$CONFIG_FILE_NAME" ) {
      open CFG,"<$scriptLocation/$CONFIG_FILE_NAME" or die "Could not read $scriptLocation/$CONFIG_FILE_NAME: $!\n";
      $return = join ( '', <CFG> );
      close CFG;
   }
   return $return;
}

$config = &readConfig();
eval( $config );

# now we have all the variables set, calculate full path to files
$CLEANUP_FILE = "$CONTROL_FOLDER/$CLEANUP_FILE";
$SA_LEARN_FILE = "$CONTROL_FOLDER/$SA_LEARN_FILE";

# build our ignore regex. this should build a string similar to
# ((client1)|(client2)|(client3))
my $ignore_regex = '((' . join( ')|(', @IGNORE_ROOT ) . '))';

# make sure the control folder exists
`mkdir -p $CONTROL_FOLDER` unless -e $CONTROL_FOLDER;

my @spam_dirs = ();
my @ham_dirs = ();
my @junk_dirs = ();
# find all the directories we want
foreach my $folder ( @SPAM_FOLDER_NAME ) {
   my @temp = `find $ROOT_DIR -type d -iname "$folder"`;
   chomp @temp;
   @temp = grep  !/$ignore_regex/,  @temp;
   @spam_dirs = ( @spam_dirs, @temp );
}
foreach my $folder ( @HAM_FOLDER_NAME ) {
   my @temp = `find $ROOT_DIR -type d -iname "$folder"`;
   chomp @temp;
   @temp = grep  !/$ignore_regex/,  @temp;
   @ham_dirs = ( @ham_dirs, @temp );
}
foreach my $folder ( @JUNK_FOLDER_NAME ) {
   my @temp = `find $ROOT_DIR -type d -iname "$folder"`;
   chomp @temp;
   @temp = grep  !/$ignore_regex/,  @temp;
   @junk_dirs = ( @junk_dirs, @temp );
}

# now, find all the ones that need to be processed by sa-learn as spam
my @output = ();
foreach my $dir ( @spam_dirs ) { # do all the spam folders
   foreach my $subdir ( @SUBDIRS_TO_PROCESS ) { # create a separate entry for each subfolder
      push @output, "spam:dir:$dir/$subdir";
   }
}

# find all the ham folders for sa-learn
foreach my $dir ( @ham_dirs ) {
   foreach my $subdir ( @SUBDIRS_TO_PROCESS ) { # create a separate entry for the subfolders
      push @output, "ham:dir:$dir/$subdir";
   }
}
# dump the sa-learn stuff to the correct file
open OUT, ">$SA_LEARN_FILE" or die "Could not write to $SA_LEARN_FILE: $!\n";
#print OUT "# List of directories to be processed by sa-learn\n";
print OUT join( "\n", @output ) . "\n";
close OUT;

# every so often, we will clean up some directories. In this case, we are 
# cleaning up the junk folder, the found spam folder and the found ham folder
@output = ();
foreach my $dir ( @spam_dirs, @ham_dirs, @junk_dirs ) { # join all the directories we found
   foreach my $subdir ( @SUBDIRS_TO_PROCESS ) { # add the subfolders to it
      push @output, "$dir/$subdir";
   }
}

# dump the output to the cleanup file
open OUT, ">$CLEANUP_FILE" or die "Could not write to $CLEANUP_FILE: $!\n";
print OUT "# List of directories to be auto-cleaned\n";
print OUT join( "\n", @output ) . "\n";
close OUT;

print "# List of directories to be auto-cleaned\n";
print join( "\n", @output ) . "\n";

1;