#! /sw/bin/perl -T use strict; #--------------------------------------------------------------# # This script scans through the mail box $MAIL_IN, using formail. # It handles requests automatically. # This script deals with reading the mail box and dispatching the separate # mails to the program that treats one mail. # It takes care that there is only one program doing so, by means of locking. #--------------------------------------------------------------# # the mail boxes my $Scripts_directory='/projects/CGAL/admin_scripts'; my $Data_directory='/projects/CGAL/submissions/autohandle/data'; my $LOCKFILE="$Data_directory/collect_submission.lock"; my $Mail_directory='/users/geert/PUBLIC/CGAL-submit'; my $MAIL_IN="$Mail_directory/incoming-mail"; #my $MAIL_OUT="$Mail_directory/handled-mail"; my $MAIL_TMP="$Mail_directory/temp-mail"; my $SCRIPT="$Scripts_directory/collect_submissions"; my $MAIL_PROG="$Scripts_directory/send_cgal_mail"; my $treat_one_mail_program="$Scripts_directory/treat_submit_mail"; # program locations my $FORMAIL="/sw/bin/formail"; my $LOCKCMD="/sw/bin/lockfile"; # the log file my $LOGFILE="$Data_directory/collect_submissions.log"; # my $seconds_between_invocations=300; my $max_tries_between_warning= int 21600/$seconds_between_invocations; $ENV{PATH}='/sbin:/usr/sbin:/usr/bsd:/bin:/usr/bin'; # variable that is set when there is an attempt to kill this process. my $please_die=0; my $invoker = $ENV{USER}; if ($invoker =~ /^\s*([-\@\w]+)\s*$/) { $invoker = "$1\@cs.uu.nl"; } else { print STDERR <<"TOTHIER"; The script $SCRIPT did not start because the USER environment value has a strange value. TOTHIER exit 1; } my $hostname = $ENV{HOST}; if ($hostname =~ /^\s*([-\@\w.]+)\s*$/) { $hostname = $1; } else { print STDERR <<"TOTHIER"; The script $SCRIPT did not start because the HOST environment value has a strange value ($hostname). TOTHIER exit 1; } sub termination_signal_handler { $please_die=1; } sub initialisation() { # # Disable signals that kill this process. # $SIG{INT} = \&termination_signal_handler; $SIG{TERM} = \&termination_signal_handler; # # Try to acquire the lock. # Quit with a message if it fails. # if ( system("$LOCKCMD", "-r", '10', "$LOCKFILE") != 0) { open NOTICE, "|$MAIL_PROG \"collect_submissions notice\" $invoker"; print NOTICE <<"TOTHIER"; The script $SCRIPT could not proceed because it could not acquire the needed lock on file $LOCKFILE. TOTHIER close NOTICE; exit 1; } # # Now that you have the lock, check to see if there is another process # executing this program. If so, quit. # my $logline = `tail -1 $LOGFILE`; if ($logline !~ /stopped/) { unlink $LOCKFILE; open NOTICE, "|$MAIL_PROG \"collect_submissions notice\" $invoker"; print NOTICE <<"TOTHIER"; The script $SCRIPT did not proceed because there seems to be another process collecting the mail messages. The file $LOGFILE says: $logline TOTHIER close NOTICE; exit 1; } # # We can proceed. Record a message to the log file that this process # takes control of dealing with the mail box. # open LOGFILE, ">>$LOGFILE"; print LOGFILE "$hostname $$: started executing on ", `date`; close LOGFILE; unlink $LOCKFILE; } sub new_untreated_mail_file() { my $filename; my $n=1; for ($n=1; $n<1000; ++$n) { $filename="$Mail_directory/untreated_mail_$n"; last if (! -f $filename); } return $filename; } sub treat_current_mail() { if ( -f $MAIL_IN ) { if ( system("$LOCKCMD", "-r", '10', "$MAIL_IN.lock") == 0) { rename($MAIL_IN, $MAIL_TMP); unlink "$MAIL_IN.lock"; if (system("$FORMAIL -ns $treat_one_mail_program < $MAIL_TMP")== 0 ) { unlink $MAIL_TMP; } else { my $Save_file = new_untreated_mail_file(); rename($MAIL_TMP, $Save_file) or die; open NOTICE, "|$MAIL_PROG \"collect_submissions notice\" $invoker"; print NOTICE <<"TOTHIER"; The script $SCRIPT could not treat incoming mail. This mail was saved in $Save_file. TOTHIER } } } } sub main_loop() { my $tries_to_go = $max_tries_between_warning; while (! $please_die) { if ( system("$LOCKCMD", "-r", '10', "$LOCKFILE") != 0) { --$tries_to_go; if ($tries_to_go < 0) { open NOTICE, "|$MAIL_PROG \"collect_submissions notice\" $invoker"; print NOTICE <<"TOTHIER"; The script $SCRIPT could not proceed because it could not acquire the needed lock on file $LOCKFILE. TOTHIER close NOTICE; $tries_to_go = $max_tries_between_warning; } } else { $tries_to_go = $max_tries_between_warning; if ( -f $MAIL_TMP ) { open NOTICE, "|$MAIL_PROG \"collect_submissions notice\" $invoker"; print NOTICE <<"TOTHIER"; The script $SCRIPT has been stopped, because the temporary mail box $MAIL_TMP was not emptied. TOTHIER close NOTICE; unlink $LOCKFILE; $please_die = 1; } else { treat_current_mail; } unlink $LOCKFILE; } sleep $seconds_between_invocations unless $please_die; } } sub finalisation() { open LOGFILE, ">>$LOGFILE"; print LOGFILE "$hostname $$: stopped executing at ", `date`; close LOGFILE; } initialisation(); main_loop(); finalisation(); exit 0;