squatrunner.pl   [plain text]


#!/usr/bin/perl

use strict;
use warnings;

my $mboxlist = "/var/lib/imap/mboxlist.txt";
my $squatlist = "/var/lib/imap/squatlist.txt";
my $tempfile = "/var/lib/imap/squatlist.tmp";
my $stopfile = "/var/lib/imap/squat.stop";
my $adminstopfile = "/var/lib/imap/squat.adminstop";
my $squatlist_lines = 0;
my $mboxlist_lines = 0;
my $line_number = 0;
my $rest = 0;
my $current = "";
my $current_box = "";
my $first_iteration = 1;

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);

die "$0 administratively stopped" if -e $adminstopfile;

if (-e $stopfile) {
	unlink $stopfile or die "Couldn't unlink $stopfile\n";
	# die "$0: STOPPING";
}

die "$0: Intervention required - temp file exists" if -e $tempfile;

system ("/usr/libexec/cyrus/ctl_mboxlist -d | /bin/cut -f1 > $mboxlist");
die "$0: Mailbox list doesn't seem OK" unless -r $mboxlist && -s $mboxlist;

sub count_lines ($) {

	my $count = 0;

	open (TEMP, shift(@_)) or die "$!";
	while (<TEMP>) {
		$count++;
	}
	close TEMP;

	return $count;
}
		

if (-e $squatlist) {
	$squatlist_lines = count_lines($squatlist);
	# print "SQ: $squatlist_lines\n";
	$mboxlist_lines = count_lines($mboxlist);
	# print "MB: $mboxlist_lines\n";
	if ($squatlist_lines < $mboxlist_lines) {
		system ("/bin/cat $mboxlist >> $squatlist");
	}
}
else {
	system ("/bin/cp $mboxlist $squatlist");
}

system ("/bin/cp $squatlist $tempfile");

$squatlist_lines = count_lines($squatlist); # aktueller Wert!
# print "SQ: $squatlist_lines\n";

open (SQUAT, $squatlist) or die "$!";

while (<SQUAT>) {
	if (-e $stopfile) {
		close SQUAT;
		($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
		printf "Ende mit $current am $mday.$mon. um %.2d:%.2d\n", $hour, $min;
		open (CMD, "/bin/grep -n $current $squatlist|/bin/cut -d: -f1|") or die "$!";
		$line_number = <CMD>;
		chomp $line_number;
		# print "Line: $line_number\n";
		close CMD;
		$rest = $squatlist_lines - $line_number;
		# print "Rest: $rest\n";
		system ("/usr/bin/tail -$rest $squatlist > $tempfile");
		system ("/bin/mv $tempfile $squatlist");
		unlink $stopfile or die "Couldn't unlink $stopfile";
		exit 0;
	}
	chomp;
	if ($first_iteration) {
		printf "Beginne mit $_ am $mday.$mon. um %.2d:%.2d\n", $hour, $min;
		$first_iteration = 0;
	}
	$current_box = $_;
	$current_box =~ tr/\./\//;
	system ("/usr/libexec/cyrus/squatter $current_box");
	# print "Current: $current_box\n";
	$current = $_;
	# sleep 1;
}

close SQUAT;
unlink $tempfile or die "Couldn't unlink $tempfile";
unlink $squatlist or die "Couldn't unlink $squatlist";
exit 0;