usevote/uvbounce.pl
Thomas Hochstein bb61da3743 Release of upstream version 4.10.
Signed-off-by: Thomas Hochstein <thh@inter.net>
2012-09-19 22:12:44 +02:00

195 lines
5.9 KiB
Perl

#!/usr/bin/perl -w
###############################################################################
# UseVoteGer 4.10 Bounce-Verarbeitung
# (c) 2001-2012 Marc Langer <uv@marclanger.de>
#
# This script package is free software; you can redistribute it and/or
# modify it under the terms of the GNU Public License as published by the
# Free Software Foundation.
#
# Use this script to process bounce messages and generate a list of
# undeliverable voter adresses.
#
# Many thanks to:
# - Ron Dippold (Usevote 3.0, 1993/94)
# - Frederik Ramm (German translation, 1994)
# - Wolfgang Behrens (UseVoteGer 3.1, based on Frederik's translation, 1998/99)
# - Cornell Binder for some good advice and code fragments
#
# This is a complete rewrite of UseVoteGer 3.1 in Perl (former versions were
# written in C). Not all functions of Usevote/UseVoteGer 3.x are implemented!
###############################################################################
use strict;
use Getopt::Long;
use FindBin qw($Bin);
use lib $Bin;
use UVconfig;
use UVreadmail;
use UVtemplate;
my %opt_ctl = ();
my %bounces = ();
my $pop3 = 0;
print STDERR "\n$usevote_version Bounce-Verarbeitung - (c) 2001-2005 Marc Langer\n\n";
# unknown parameters remain in @ARGV (for "help")
Getopt::Long::Configure(qw(pass_through bundling));
# Put known parameters in %opt_ctl
GetOptions(\%opt_ctl, qw(h|help f|file config-file=s c=s));
# Get name auf config file (default: usevote.cfg) and read it
my $cfgfile = $opt_ctl{'config-file'} || $opt_ctl{c} || "usevote.cfg";
UVconfig::read_config($cfgfile);
# check POP3 settings in usevote.cfg and combination with -f parameter
$pop3 = 1 if ($config{pop3} && !$opt_ctl{f});
# Additional parameters or invalid options? Show help and exit.
help() if ($opt_ctl{h} || !(@ARGV || $pop3));
# check for lock file
if (-e $config{lockfile}) {
my $lockfile = $config{lockfile};
# don't delete lockfile in END block ;-)
$config{lockfile} = '';
# exit
die UVmessage::get("ERR_LOCK", (FILE=>$lockfile)) . "\n\n";
}
# safe exit (delete lockfile)
$SIG{QUIT} = 'sighandler';
$SIG{INT} = 'sighandler';
$SIG{KILL} = 'sighandler';
$SIG{TERM} = 'sighandler';
$SIG{HUP} = 'sighandler';
# create lock file
open (LOCKFILE, ">$config{lockfile}");
close (LOCKFILE);
# read and process mails
# for each mail pass a reference to the sub to be called
if ($pop3) {
unless (-d $config{archivedir}) {
mkdir ($config{archivedir}, 0700)
or die UVmessage::get("ERR_MKDIR", (DIR => $config{archivedir})) . "$!\n\n";
}
# mails are saved in file
# normally unixtime is sufficient for a unique file name, else append PID
my $ext = time;
opendir (ARCHIVE, $config{archivedir});
my @fertigfiles = readdir (ARCHIVE);
closedir (ARCHIVE);
# append PID if file name already exists
$ext .= "-$$" if (grep (/$ext/, @fertigfiles));
my $file = "$config{archivedir}/bounces-" . $ext;
UVreadmail::process($file, \&process_bounce, 2); # 2 = POP3
} else {
foreach my $file (@ARGV) {
UVreadmail::process($file, \&process_bounce, 3); # 3 = existing file
}
}
my $template = UVtemplate->new();
foreach my $address (sort keys %bounces) {
my $name = $bounces{$address};
my $request = 0;
my $text;
if ($name eq '***request***') {
$name = '';
$text = UVmessage::get ("BOUNCE_BALLOT") . "\n";
} else {
$text = UVmessage::get ("BOUNCE_ACKMAIL") . "\n";
}
$name = ' ' unless($name);
$template->addListItem('bounces', name=>$name, mail=>$address, bouncetext=>$text);
}
print $template->processTemplate($config{'tpl_bouncelist'});
exit 0;
##############################################################################
# Evaluate a bounce #
# This sub is called from UVreadmail::process() for every mail #
# Parameters: voter address and name, date header (strings) #
# complete header and body (references to strings) #
##############################################################################
sub process_bounce {
# last element of @_ is the body, other stuff not needed here
my $body = pop;
my ($address, $name);
# search body for voter name and address
if ($$body =~ /$config{addresstext}\s+(\S+@\S+)/) {
$address = $1;
if ($$body =~ /$config{nametext2}\s+(.*)$/m) {
$name = $1;
$bounces{$address} = $name;
} elsif ($$body =~ /$config{nametext}/) {
# Text from this config option does only appear in ballots,
# not in acknowledge mails. So this has to be a bounced ballot request
$bounces{$address} = '***request***';
} else {
$bounces{$address} = '';
}
}
}
END {
# delete lockfile
unlink $config{lockfile} if ($config{lockfile});
}
sub sighandler {
my ($sig) = @_;
die "\n\nSIG$sig: deleting lockfile and exiting\n\n";
}
##############################################################################
# Print help text (options and syntax) on -h or --help #
##############################################################################
sub help {
print <<EOF;
Usage: uvbounce.pl [-c config_file] [-f] DATEI1 [DATEI2 [...]]
uvbounce.pl -h
Liest Bounces aus den uebergebenen Dateien oder aus einer POP3-Mailbox ein
(Verhalten haengt von usevote.cfg ab) und generiert eine Liste von
unzustellbaren Adressen, die an den 2. CfV oder das Result angehaengt
werden kann. Falls POP3 in usevote.cfg eingeschaltet und die Option -f
(siehe unten) nicht benutzt wurde, werden die uebergebenen Dateinamen
ignoriert.
-c config_file liest die Konfiguration aus config_file
(usevote.cfg falls nicht angegeben)
-f, --file liest die Bounces aus den uebergebenen Dateien, auch
wenn in der Konfigurationsdatei POP3 eingeschaltet ist.
Diese Option wird benoetigt, falls zwar die Stimmzettel
per POP3 eingelesen werden sollen, nicht aber die Bounces.
-h, --help zeigt diesen Hilfetext an
EOF
exit 0;
}