#!/usr/bin/perl -w # # $Id: pks-queue-run.pl,v 1.2 2003/02/25 23:05:52 rlaager Exp $ # # reads files from an incoming directory and gives them to pksd # for processing # configuration is read from pksd.conf # # Can be freely used - no warranties # hash array with all interesting information for easy global access my %parameters; sub main { if (checkArguments() ne 'ok') { # exit immediatly exit 1; } readConfigFile(); my $incpath= $parameters{'perl_inc_path'}; if (defined $incpath) { push @INC, $incpath; } require PKSFileReader; my $reader= PKSFileReader->new($parameters{'mail_dir'}); $reader->setMaxFilesInBuffer(&getSecureParameter('max_files_in_buffer', 1000)); $reader->setMinSizeForLargeFiles(&getSecureParameter('min_size_for_large_files', 5000)); process($reader); } # endless loop for processing all files sub process() { my ($reader)= @_; my $file= ''; my $counter_smallfiles= 0; my $filetype= ''; my $smallfiles_per_largefile= &getSecureParameter('smallfiles_per_largefile', 10); my $socket_name= $parameters{'socket_name'}; if (! defined $socket_name) { die "socket_name must be defined in the config file\n"; } my $pks_mail_cmd= $parameters{'pks_bin_dir'}; if (! defined $pks_mail_cmd) { die "pks_bin_dir must be defined in the config file\n"; } $pks_mail_cmd.= '/pksdctl ' . $socket_name . ' "mail '; while (1==1) { $file= undef; my $trysmall= $counter_smallfiles < $smallfiles_per_largefile; if ($trysmall) { $file= $reader->getSmallFile(); } if (defined $file) { $filetype= 'small'; $counter_smallfiles++; } else { $counter_smallfiles= 0; $file= $reader->getLargeFile(); if (defined $file) { $filetype= 'large'; } else { if ($trysmall) { $filetype= 'none'; } else { $filetype= 'skip'; } } } if ($filetype ne 'skip') { if (defined $file) { $cmd= $pks_mail_cmd . $file . '"'; if (system($cmd)) { pksdError($file, $cmd); } else { my $t= localtime(); # print $t, " $file\n"; } } afterPKSDCall($filetype); } } } # this is called if the system call to pksdctl fails sub pksdError() { my ($file, $cmd)= @_; print STDERR "Warning: Could not execute $cmd\n"; my $bad_dir= $parameters{'bad_dir'}; if (defined $bad_dir) { my $filename= $file; $filename=~ s/(.*)\/(.*?)/$2/; my $dst= $bad_dir . '/' . $filename; # if rename does not work: if (system("mv $file $dst")) { if (! rename $file, $dst) { print STDERR "Warning: could not move file $file to $dst\n"; } } } sub afterPKSDCall() { my ($filetype)= @_; if ($filetype eq 'none') { sleep &getSecureParameter('sleep_after_nofile', 10); } else { if ($filetype eq 'small') { sleep &getSecureParameter('sleep_after_smallfile', 3); } else { sleep &getSecureParameter('sleep_after_largefile', 10); } } } sub getSecureParameter() { my ($name, $default)= @_; my $res= $parameters{$name}; if (! defined $res) { $res= $default; if ($name ne 'warn_notset_values' && &getSecureParameter('warn_notset_values', 0) == 1) { print STDERR "Warning: using default value ($default) for $name\n"; } } return $res; } # read pksd.conf and get interesting values sub readConfigFile() { my $file= $parameters{'config_file'}; open(IN, '<' . $file) || die "could not read config file $file\n"; my $maildir= undef; foreach $line () { chomp($line); next if $line =~ /^#/; next if $line =~ /^\s*$/; if ($line =~ /^(.*?)\s+(.*)$/) { $parameters{$1}= $2; } } if (! defined $parameters{'mail_dir'}) { die "could not get mail_dir from config file\n"; } close(IN); } # checks arugments, give hints and returns 'ok' if arguments are acceptabla sub checkArguments() { $res= 'ok'; if ($#ARGV != 0) { print STDERR "need config filename as one and only argument\n"; $res= 'bad'; } else { $parameters{'config_file'}= $ARGV[0]; } return $res; } &main();