/usevote

UseVoteGer is a voting software for usenet votes.

Primary LanguagePerlGNU General Public License v3.0GPL-3.0

UseVoteGer 4.13  (c) 2001-2022 Marc Langer

UseVoteGer is a voting software for usenet votes.

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.

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
  (e.g. UVtemplate.pm, UVformats.pm)
- Thomas Hochstein for some patches

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!
 
-------------------------------------------------------------------------------

UseVoteGer 4.13 - Usenet-Abstimmungssoftware
===========================================

von Marc Langer <uv@marclanger.de>

aktuelle Versionen: http://www.usevote.de


Inhaltsverzeichnis
==================

1.  Kurzbeschreibung
2.  Usevote fuer Ungeduldige
3.  Kompatibilitaet zu frueheren Versionen
4.  Liste der Dateien
5.  Anfangs-Konfiguration
6.  Konfiguration fuer einzelne Abstimmungen
7.  Wahlschein generieren
8.  Stimmen verarbeiten
9.  Unzustellbare Bestaetigungen
10. 2. CfV / Result
11. Datenschutz
12. Personalisierte Wahlscheine
13. Die einzelnen Programme
14. Die Konfigurationsdateien
15. Templates


1. Kurzbeschreibung
===================

Diese Software vereinfacht die Durchfuehrung von Usenet-Abstimmungen.
Usevote in der Urversion wurde von Ron Dippold fuer die Reorganisation
der Gruppe comp.sys.ibm.pc.games geschrieben und spaeter fuer die
allgemeine Verwendung verbessert.

Die deutsche Uebersetzung von Frederik Ramm diente jahrelang als
Grundlage fuer CfV-Auswertungen im deutschsprachigen Raum.
Wolfgang Behrens von den German Volunteer Votetakers (GVV) passte
es spaeter an neue Begebenheiten (z.B. personalisierte Wahlscheine)
an. Jedoch liefen die UseVoteGer 3.1beta-Versionen aufgrund eines
unbekannten Fehlers nicht auf jedem System (Segmentation Fault).

Um groessere Flexibilitaet und Plattformunabhaengigkeit zu bieten,
habe ich mich entschlossen, UseVoteGer in Perl neu zu implementieren.
Getestet wurde diese Version mit Perl 5.x unter Linux sowie
ActiveState Perl unter Windows 98.


2. Usevote fuer Ungeduldige
===========================

I. Einmalig bei der Usevote-Erstinstallation
   (1) usevote.cfg nach Bedarf anpassen (selbsterklaerend)
       ACHTUNG: Unter Windows gibt es das Programm "less" nicht, da "more"
       aber einigermassen broken ist, sollte man sich less fuer Windows
       herunterladen: http://www.greenwoodsoftware.com/less/less381d.zip
       Notfalls laesst sich auch in usevote.cfg die Einstellung "pager"
       auf "more" setzen, aber viel Freude hat man damit nicht...
   (2) Evtl. die Templates im gleichnamigen Unterverzeichnis fuer
       eigenen Geschmack anpassen. Die Templates enthalten saemtliche
       Texte fuer Bestaetigungs-/Fehlermails sowie die Ausgabeformate
       und Texte fuer die CfVs und das Result.
   (3) Perlmodule MIME::Parser, MIME::QuotedPrint, Digest::MD5,
       Date::Parse und Email::Date installieren, falls noch nicht vorhanden.
       Bei Benutzung von POP3 oder SMTP (siehe usevote.cfg) muss
       Libnet installiert sein (Net::POP3 und Net::SMTP).
       (Fuer Perl-Einsteiger: Unter Unix geht die Modul-Installation
       sehr einfach mit "perl -MCPAN -e shell", ActivePerl fuer
       Windows hat einen eigenen Paketmanager)


II. Fuer jedes Voting
   (1) usevote.cfg auf das durchzufuehrende Voting anpassen
       (selbsterklaerend)
   (2) bei Sonderregeln (Abhaengigkeiten der einzelnen Abstimmungspunkte)
       in usevote.rul Regeln definieren (selbsterklaerend)
   (3) CfV erstellen und Wahlschein mit uvballot.pl generieren
   (4) Fertigen CfV einreichen und auf Veroeffentlichung warten ;-)
   (5) Bis zum 2. CfV regelmaessig (an den ersten Tagen mehrmals taeglich,
       spaeter einmal taeglich) dies tun:
       - uvvote.pl durchlaufen lassen
       - im Verzeichnis tmp/ die Datei ergebnis.* (Ergebnis der Auswertung)
         und evtl. ack.* (Bestaetigungsmails an die Waehler) kontrollieren
       - Falls es Probleme gab: Bitte den Abschnit "Stimmen verarbeiten"
         weiter unten in dieser Datei genau durchlesen. Dort steht
         beschrieben, wie Fehler korrigiert werden koennen
       - "uvvote.pl clean" aufrufen, um die Bestaetigungen zu verschicken
         und das Ergebnis zu speichern/archivieren
       - Falls Wahlbestaetigungen als unzustellbar zurueckkommen, solltest
         Du diese zusammen in einer Datei speichern oder in ein spezielles
         POP3-Postfach leiten
   (6) Zwischenbestaetigung fuer den 2. CfV mit "uvcount.pl -l" erzeugen und
       veroeffentlichen. Falls Wahlbestaetigungen als unzustellbar
       zurueckkamen, kannst Du mit "uvbounce.pl dateiname" automatisch eine
       Liste der ungueltigen Adressen erzeugen ("dateiname" ist die Datei,
       in die Du zuvor die Bounces gespeichert hattest). Siehe auch Abschnitt
       "Unzustellbare Bestaetigungen" weiter unten in dieser Datei, dort
       ist auch erklaert, wie die Bounces aus einem POP3-Postfach gelesen
       werden koennen.
   (7) Bis zum Result wieder wie (5)
   (8) Zum vorgegebenen Zeitpunkt die Wahl abschliessen,
       mit "uvcount.pl -r -v" Endergebnis erzeugen und veroeffentlichen
       (zuvor wiederum Liste der ungueltigen Mailadressen erzeugen, siehe
       Punkt 6)

Weitere Details finden sich im Folgenden.
Jeder Nutzer dieser Software sollte sich diesen Text wenigstens einmal
komplett durchlesen.

Abschnitt 6 beschreibt, wie mehrere Abstimmungen gleichzeitig durchgefuehrt
werden koennen, ohne saemtliche Programmdateien zu kopieren.


3. Kompatibilitaet zu frueheren Versionen
=========================================

- englische Usevote-Versionen: keine Kompatibilitaet

- deutsche Usevote-Versionen (Usevote 3.0a, UseVoteGer 3.1):
  * Wahlscheine haben neue Markierungen zum sicheren Erkennen
    der Stimmen. Bisherige Wahlscheine sind mit dieser Version
    nicht mehr einsetzbar!

  * acktext.txt gibt es nicht mehr, statt dessen sind im Unterverzeichnis
    "templates" Vorlagen zu finden, die diese Texte enthalten.

  * usevote.cfg ist komplett inkompatibel

  * usevote.rul: voll kompatibel, ohne Einschraenkungen

  * Ergebnisdateien: Inhalt kompatibel, aber Namensgebung geaendert
    (obwohl irrelevant, da Umstieg auf diese Version waehrend
    einer laufenden Wahl nicht moeglich)

  * scheinkennungen: Dateiformat gaendert (aus selbigen Gruenden
    nicht weiter wichtig)

  * uvshell: integriert in uvvote.pl, ueber usevote.cfg steuerbar
    
  * uvvote.pl: Aufrufparameter geaendert / Zusammenfuehrung mit uvshell
  
  * uvcfv.pl: Alte Funktionalitaet ist nicht mehr implementiert,
    statt dessen dient das Tool jetzt zum Generieren der persoenlichen
    Wahlscheine und Verschicken des CfV an die Waehler
 
  * uvcount.pl: Beinhaltet auch uvack und uvdup. Drei Einzelprogramme
    schienen mir ineffizient.

  * uvbounce.pl: Ausgabeformat etwas anders


4. Liste der Dateien
====================

* Ausgelieferte Dateien:

CHANGES           Versionsaenderungen
COPYING           GNU General Public License
README            Diese Datei
UVconfig.pm       Routinen zum Einlesen und Pruefen der Konfiguration
UVformats.pm      Routinen zum Formatieren von Texten in Templates
UVmenu.pm         Routinen zur Interaktion mit dem Wahlleiter
UVmessage.pm      Routinen zum Parsen von Texten und Ersetzen von Platzhaltern
UVreadmail.pm     Routinen zum Einlesen und MIME-Decodieren der Mails
UVrules.pm        Routinen zur Regelverarbeitung (usevote.rul)
UVsendmail.pm     Routinen zum Erzeugen von Mails
UVtemplate.pm     Routinen zur Verarbeitung von Vorlagen (Templates)
bdsgtext.cfg      Spezieller Text fuer den Wahlschein (Hinweis auf
                  DSGVO), muss ausserhalb der EU ggfls. angepasst werden
                  oder kann dort ignoriert werden (bdsg=0 in usevote.cfg)
mailpatterns.cfg  Wildcards fuer verdaechtige Mailadressen
messages.cfg      Programm-Meldungen (Ressourcen-Datei)
scheinkennungen   Speicherung der Scheinkennungen bei personalisierten
                  Wahlscheinen. Muss zu Beginn der Abstimmung leer sein.
usevote.cfg       Konfigurationsdatei
usevote.rul       Abstimmungsregeln
uvballot.pl       Wahlschein aus Abstimmungsdaten erstellen
uvbounce.pl       Listen von unzustellbaren Bestaetigungen erzeugen
uvcfv.pl          Erstellen und Verschicken von personalisierten Wahlscheinen
uvcount.pl        Stimmenzaehlung, Erstellen von Waehlerlisten und
                  Aussortieren von doppelten Stimmabgaben
uvvote.pl         Stimmen verarbeiten (fuer die taegliche Arbeit)

templates/                Verzeichnis mit Templates (Vorlagen)
  ack-mail     	          Template fuer Bestaetigungsmails
  address-not-registered  Fehlermail: Noch keine Scheinkennung fuer Adresse
                          vergeben
  ballot                  Template fuer einen Wahlschein
  ballot-personal         Template fuer personalisierten Wahlschein
  ballot-request          Template fuer eine Wahlscheinanforderung
  bdsg-error              Fehlermail: Datenschutzklausel nicht akzeptiert
  bouncelist              Template fuer Liste der ungueltigen Mailadressen
  cancelled               Template fuer Bestaetigung der Stimmannullierung
  invalid-account         Fehlermail: Fragwuerdige Mailadresse (Role Account)
  invalid-name            Fehlermail: Kein gueltiger Name in Mail/Wahlschein
                          gefunden
  mailheader              Template fuer den Header von Mails an die Waehler
  multiple-votes          Fehlermail: Widerspruechliche Stimmen im Wahlschein
  no-ballot               Fehlermail: Kein Wahlschein in Mail gefunden
  no-ballotid             Fehlermail: Keine Wahlscheinkennung gefunden
  no-votes                Fehlermail: Keine Stimmen abgegeben
  result-multi            Template fuer ein Wahlergebnis mit mehreren Gruppen
  result-single           Template fuer ein Wahlergebnis mit einer Gruppe
  result-proportional     Template fuer ein Wahlergebnis, bei dem das Verhaeltnis
                          oder die Differenz von Ja- und Nein-Stimmen entscheidet
                          (z.B. Moderationsnachwahlen, "proportional=1" gesetzt)
  rule-violated           Fehlermail: Wahlregeln aus usevote.rul verletzt
  voterlist               Template fuer eine Waehlerliste (2. CfV)
  votes-multi             Template fuer eine Stimmenliste mit mehreren Gruppen
  votes-single            Template fuer eine Stimmenliste bei einer Gruppe
  wrong-ballotid          Fehlermail: Falsche Wahlscheinkennung angegeben

* Beim Programmlauf erstellte Dateien (Name ist konfigurierbar):

ergebnis.alle     Saemtliche Einzelergebnisse zusammengefasst (wird 
                  bei jedem Lauf von uvvote.pl neu erstellt)
errors.log        Fehlermeldungen, die beim Programmlauf auftauchen,
                  werden hier abgelegt. Normalerweise bleibt die Datei
                  leer, ansonsten wird beim Programmende eine Warnung
                  mit Verweis auf die Datei ausgegeben.
uidlcache         Eindeutige IDs der abgerufenen Mails (bei Benutzung
                  von POP3). Darf waehrend einer laufenden Abstimmung
                  keinesfalls geloescht werden, um Mehrfachzaehlung von
                  Stimmen zu verhindern.
uidlcache_req     dto, fuer die Mailbox mit den Wahlscheinanforderungen
                  (bei Verwendung von personalisierten Wahlscheinen)
uidlcache_bounce  dto, fuer die Mailbox mit den Bounces (wird von
                  uvbounce.pl ausgewertet)
usevote.lock      Temporaere Lockdatei, um gleichzeitiges Ausfuehren
                  mehrerer Instanzen zu verhindern. Kann (falls vorhanden)
                  gefahrlos geloescht werden, wenn gerade keines der
                  Usevote-Scripts laeuft.

* Folgende Unterverzeichnisse werden von Usevote im aktuellen
  Verzeichnis (CWD) angelegt:

fertig/           Verzeichnis fuer Archivierung verarbeiteter Dateien
tmp/              Verzeichnis fuer temporaere Dateien

* Von Usevote dort erstellte Dateien:

ack.*             Bestaetigungsmails (in tmp/)
ack.control       Steuerungsdatei fuer Bestaetigungsmails (in tmp/)
domail            Shellscript zum Verschicken der Mails (in tmp/)
ergebnis.*        Ergebnisdateien einzelner Durchlaeufe (zunaecht in tmp/,
                  spaeter nach fertig/ verschoben und archiviert)
stimmen.*         Archivierte Stimmendateien (dto.)


5. Anfangs-Konfiguration
========================
 
Zuerst solltest Du "usevote.cfg" fuer Dein System anpassen (Details
dort in den Kommentarzeilen und weiter hinten in dieser Dokumentation).
Unter Windows werden die Regular Expressions fuer die Stimmenerkennung
moeglicherweise lauter unlesbare Zeichen enthalten (anderer Zeichensatz),
dort sollten saemtliche in Namen vorkommende Umlaute und Buchstaben mit
Accents etc. aufgefuehrt werden. Weiter ist bei Nutzung von Windows zu
beachten, dass das Kommando zum Loeschen des Bildschirms "cls" und nicht
"clear" heisst. Dazu gibt es auch eine Einstellung in usevote.cfg. Den
standardmaessig eingestellten Pager "less" gibt es unter Windows zunaechst
nicht, more ist aber so buggy, dass man sich am besten "less" fuer
Windows herunterladen sollte:
http://www.greenwoodsoftware.com/less/less381d.zip

Im Unterverzeichnis "templates" findest Du Vorlagen, die fuer die
einzelnen Bestaetigungstexte, Mails, Wahlscheine und Waehlerlisten
verwendet werden. Hier kannst Du unter Beachtung der Syntax (siehe
gesonderte Dokumentation) alle Texte an Deinen Geschmack und Deine
Beduerfnisse anpassen.


6. Konfiguration fuer einzelne Abstimmungen
===========================================
 
Fuer jede Abstimmung muss eine eigene Konfigurationsdatei geschrieben
werden. Aendere einfach usevote.cfg entsprechend der Regeln fuer die
betreffende Abstimmung. Falls Du haeufiger Wahlleiter spielst, solltest
Du Dir eine globale Konfigurationsdatei mit Standardeinstellungen
(z.B. als ~/.usevote-defaults.cfg) anlegen und in der usevote.cfg nur
noch die Einstellungen setzen, die sich fuer jede Abstimmunge aendern.
Die globale Datei kann am Anfang der usevote.cfg mit folgender Zeile
eingebunden werden:

include ~/.usevote-defaults.cfg

Zu beachten ist aber, dass jeweils die letzte Definition einer Option
benutzt wird. Die usevote.cfg sollte daher wirklich nur noch
abstimmungsspezifische Einstellungen enthalten, um nicht versehentlich
die globalen Optionen zu überschreiben.

Ausserdem muss die Datei "usevote.rul" geprueft werden. Wenn Deine
Abstimmung irgendwelche speziellen Regeln enthaelt (z.B. man kann
nur fuer Gruppe x stimmen, wenn man auch fuer y gestimmt hat, oder man
muss fuer den .misc-Abschnitt stimmen, wenn man fuer irgendeinen
anderen Abschnitt gestimmt hat), dann solltest Du diese Datei lesen
und entsprechend aendern. Allerdings empfiehlt es sich, bereits im
RfD deutlich auf die Regeln hinzuweisen, die zur Anwendung kommen sollen.
Die eingegebenen Regeln koennen dann mit "uvvote -t" getestet werden.

Es ist auch moeglich, mehrere Abstimmungen gleichzeitig durchzufuehren,
ohne die .pl und .pm Dateien jedesmal mitzukopieren. Folgende Dateien
sollten im Abstimmungsverzeichnis vorhanden sein (notwendig ist nur
usevote.cfg, darin können alle anderen Pfade angepasst werden):

ballot.sample
bdsgtext.cfg
mailpatterns.cfg
messages.cfg
scheinkennungen
usevote.cfg
usevote.rul

Ggf. sollte das "templates"-Verzeichnis kopiert werden, falls
individuelle Templates fuer einzelne Abstimmungen verwendet werden.

Außerdem muessen i.d.R. einige Pfade in der usevote.cfg angepasst
werden. Dadurch ist auch die Angabe eines anderen Verzeichnisses
fuer einige der oben genannten Konfigurationsdateien moeglich,
falls diese zentral gepflegt werden sollen (z.B. messages.cfg und
mailpatterns.cfg).

Damit die Usevote-Perlmodule gefunden werden, sollten sie im
selben Verzeichnis wie die Programmdateien liegen bleiben. Ansonsten
muss eine Umgebungsvariable gesetzt werden:

PERL5LIB=..

.. steht für das übergeordnete Verzeichnis. Ggf. muss hier ein
absoluter Pfad eingetragen werden, wenn das Abstimmungsverzeichnis
kein Unterverzeichnis des Usevote-Verzeichnisses ist.

Je nach Betriebssystem kann die obige Zeile etwas anders aussehen,
unter Windows sollte z.B. "SET PERL5LIB=C:\PERL\USEVOTE" in die
autoexec.bat aufgenommen oder sonstwie ausgeführt werden (Pfad
natürlich entsprechend anpassen).


7. Wahlschein generieren
========================
 
Der Wahlschein ist ein Abschnitt des CfV, den die Leute zur Stimmabgabe
ausfuellen und zurueckschicken sollen. Am einfachsten erzeugst Du
diesen nach Anpassung der Konfiguration und ggfls. des Templates
mit "uvballot.pl". Folgendes Format ist erforderlich:

#1  [ Stimme ]  
#2  [ Stimme ]
[...]

Eine zusaetzliche Beschreibung rechts daneben macht es dem Waehler
einfacher, ist aber fuer Usevote nicht zwingend erforderlich. Wichtig
sind nur die fortlaufenden Nummern, die entsprechend der Eintraege
in usevote.cfg zugeordnet werden.

Je nach Konfiguration koennen weitere Zeilen noetig sein, dazu spaeter.

Als Stimme in den eckigen Klammern werden diverse Strings erkannt,
die in usevote.cfg definiert werden koennen. JA, NEIN und ENTHALTUNG
sind Standard, einige Abwandlungen sind ebenfalls moeglich.
Zusaetzlich kann ANNULLIERUNG verwendet werden, um eine schon abgegebene
Stimme zu loeschen und somit nicht im Result aufzutauchen.

Bei der Verwendung von persoenlichen Wahlscheinen (Abschnitt 6a der
Wahlregeln fuer de.*) ist das Vorgehen etwas anders, siehe hierzu
den gesonderten Abschnitt weiter hinten.


8. Stimmen verarbeiten
======================

Falls POP3 nicht benutzt werden soll (siehe usevote.cfg), werden alle
Wahlmails zu einer Abstimmung aus einer Mailboxdatei gelesen
(Name/Pfad der Datei in usevote.cfg einstellbar). Standardmaessig
wird das Unix-Mailboxformat erkannt, dieses ist aber ueber "mailstart"
in usevote.cfg konfigurierbar (bei komplett anderen Formaten muesste
der Quellcode geaendert werden).

Wechsele nun in das Verzeichnis, in dem die passenden
Konfigurationsdateien liegen (normalerweise werden diese aus
dem aktuellen Verzeichnis gelesen, was mehrere gleichzeitige
Verfahren moeglich macht) und starte uvvote.pl. Bei Problemen
mit einzelnen Stimmen wirst Du interaktiv durch Menues gefuehrt.
Meistens gibt es folgende Moeglichkeiten, die durch die
eingeklammerten Buchstaben und Zahlen aufgerufen werden koennen:

(0) Wahlschein mit Original vergleichen (diff)
(1) Anzeigen der Wahlmail

Bestaetigen oder Aendern von Wahlschein-Eigenschaften:
(2) Mailadresse
(3) Waehlername
(4) Stimmen
(5) Scheinkennung
(6) Datenschutzklausel
(7) Abstimmung

(i) Diese Stimme ignorieren (ohne Benachrichtigung verwerfen)
(w) Weiter

Teilweise gibt es Unteroptionen:
  (a) OK (Zweifel sind unbegründet, ist alles in Ordnung)
  (b) Aendern (z.B. wenn der Realname von Usevote nicht vollstaendig
      erkannt wurde)
  (c) Ungueltig (es handelt sich nach Deinem Ermessen nicht um
      eine gueltige Stimmabgabe)

Nun solltest Du zunaechst mit (1) die Mail ansehen und anhand
der bemaengelten Punkte entscheiden, ob der Wahlschein gueltig
oder ungueltig ist bzw. welche Maengel tatsaechlich zutreffen.
Mit (0) kannst Du einen Dateivergleich zu einem vorher hinterlegten
Musterwahlschein ausfuehren ("diff"), um Aenderungen/Fehler schneller
zu sehen.

Mit den Optionen (2) bis (7) kannst Du einzelne Eigenschaften
des Wahlscheins nachbessern (wenn Usevote z.B. einen Namen oder
eine Stimme nicht korrekt erkannt hat) oder auch einfach die
Korrektheit bestaetigen.

Wenn Du alle oben auf der Seite aufgelisteten Maengel beseitigst,
indem Du die entsprechenden Optionen waehlst, wird die Stimme
akzeptiert. Bleiben Zweifel unausgeraeumt, wird eine entsprechende
Fehlermail verschickt (Du erhaeltst dann noch eine gesonderte
Warnung).

Zum Schluss kannst Du (w) wählen, um fortzufahren. Möchtest Du,
dass eine Stimme komplett ignoriert wird (weil es sich z.B.
um Spam handelt), kannst Du (i) waehlen und die folgende
Sicherheitsfrage mit "JA" beantworten.

Ist uvvote.pl durchgelaufen, koennen im Unterverzeichnis tmp/
(wird ebenfalls aktuellen Verzeichnis angelegt!) die ermittelten
Ergebnisse und erzeugten Mails an die Waehler noch einmal geprueft
werden. Ist alles in Ordnung, werden mittels "uvvote.pl clean"
die Mails verschickt und die Ergebnisse gespeichert sowie die
Originalmails archiviert. Hierzu wird das Verzeichnis fertig/
verwendet.

Falls der komplette uvvote-Lauf verworfen werden soll, kann
die Datei mit den Waehlermails (stimmen-xyz im tmp-Verzeichnis,
xyz entspricht der aktuellen Unixtime waehrend des Durchlaufs)
wieder an den urspruenglichen Platz zurueckkopiert werden
(bei POP3: fuer den Neuversuch POP3 abschalten und die 
Maildatei einlesen lassen, da auf dem Server die Mails
moeglicherweise geloescht wurden) und das komplette tmp-Verzeichnis
geloescht werden. Anschliessend den uvvote-Lauf erneut durchfuehren.
Wichtig ist nur, dass das Verzeichnis fertig/ waehrend der ganzen
Abstimmung mitsamt seines Inhaltes erhalten bleibt.

Noch ein kurzes Wort zum Verschicken der Mails: Jede Mail wird
in einer gesonderten durchnummerierten Datei (ack.1, ack.2, ...)
gespeichert, zusaetzlich wird eine Steuerungsdatei ("ack.control")
erzeugt, welche zu jeder Mail Dateinamen und Empfaenger auflistet.
Je nach Einstellung werden die Mails dann per SMTP verschickt oder
es wird ein Shellscript ("domail") erzeugt, welches nach und 
nach die Mails in Sendmail einspeist. Zwecks Serialisierung ist
in usevote.cfg die Einstellung "sleepcmd" konfigurierbar,
normalerweise wird ein "sleep 1" nach jeder Mail ausgefuehrt.
Das Verschicken der Mails (und damit ggfls. der Aufruf von "domail")
erfolgt automatisch mit "uvvote.pl clean".

Unter Windows ist nur SMTP moeglich, es sei denn, es gibt
die Befehle sendmail, sleep und rm ;-)


9. Unzustellbare Bestaetigungen
===============================

Leider kommt es immer mal wieder vor, dass jemand bei der Abstimmung
eine ungueltige Mailadresse angegeben hat. In diesem Fall erhaeltst Du
einen Bounce an die Absenderadresse zurueck (diese laesst sich in
usevote.cfg mit der Option "envelopefrom" einstellen bzw. bei 
direkten Aufruf eines Mailers über die entsprechende Kommandozeilenoption
in der mailcmd-Einstellung, z.B. bei Sendmail -f). Du solltest
solche Fehlermails in einer gesonderten Datei speichern oder in
einem gesonderten POP3-Postfach halten und beim Erstellen
des 2. CfVs und des Results uvbounce.pl aufrufen.

Ausgegeben wird von uvbounce.pl eine Liste mit ungueltigen Adressen,
die einfach an den Abschnitt "ungueltige Stimmen" des 2. CfVs bzw.
Results angehaengt werden kann. Nicht vergessen, die Stimmen manuell
aus der Liste der gueltigen Stimmen zu loeschen (falls Du die
Policy verfolgst, nur Stimmen mit gueltiger Absenderadresse zu werten,
was empfehlenswert ist) und bei Bedarf das Ergebnis zu korrigieren!


10. 2.CfV / Result
===================

Zum Erstellen des 2. CfVs kannst Du erst einmal den 1. CfV als Vorlage
benutzen. Am Ende sollte allerdings eine Liste der Personen folgen,
die bereits abgestimmt haben. Diese laesst sich mit "uvcount.pl -l"
erzeugen. Moeglicherweise fragt uvcount.pl wegen scheinbar doppelter
Stimmabgaben nach und bietet an, eine oder beide Stimmen zu ignorieren.
Du solltest das dann genauer untersuchen und die passende Wahl treffen.

Vorsicht bei doppelten Namen: Es gibt einige doppelt vorkommende
Namen, hinter denen sich voellig unterschiedliche Personen
verbergen! Die Mailadresse sollte in solchen Faellen Auskunft
geben koennen, notfalls einmal nachfragen.

Das Endergebnis kannst Du mit "uvcount.pl -r" ausgeben lassen.
Bei Verfahren mit mehreren Abstimmungspunkten wird automatusch
das folgende tabellarische Format verwendet:

 Ja  Nein : 2/3? >=15? : ang.? : Gruppe
==== ==== : ==== ===== : ===== : =======================================
 100   70 : Nein   Ja  :  Nein : Einrichtung von xyz

Bei Abstimmungen ueber nur einen Punkt gibt es auch die Moeglichkeit,
einen einfachen beschreibenden Text zu verwenden:
"Es gab 100 JA und 70 NEIN-Stimmen ...".

Falls in usevote.cfg die Einstellung "multigroup = 1" gesetzt ist,
wird immer die tabellarische Form gewaehlt, bei "multigroup = 0"
benutzt uvcount.pl bei nur einem Abstimmungspunkt den beschreibenden
Text. Überschreiben laesst sich dieses mit Aufrufparametern:

uvcount.pl -r -m     = Tabellarisch (m = multigroup)
uvcount.pl -r -o     = Text (o = onegroup)

Falls in usevote.cfg die Option "proportional = 1" aktiviert ist,
wird standardmaessig folgendes Ausgabeformat angewandt:

 Ja  Nein : J>=N? Ja/Nein : ang.? : Gruppe
==== ==== : ===== ======= : ===== : ====================================
 100   70 :  Ja    1.429  :       : Einrichtung von abc
  80   90 : Nein   0.888  :       : Einrichtung von xyz

Das genaue Aussehen ist im Template "result-proportional" aenderbar,
die Bedingungen und Auswertungsformeln sind ueber usevote.cfg
einzustellen (prop_formula und condition1). Die Spalte "ang.?" muss
in diesem Fall manuell ausgefüllt werden, da manchmal auch mehrere
Abstimmungsgegenstände angenommen werden, z.B. bei Moderationsnachwahlen
für verschiedene Posten.

Die Waehlerliste mit abgegebenen Stimmen erzeugst Du mit
"uvcount -v". Diese Option laesst sich auch mit -r kombinieren,
so dass Du Dir das doppelte Aussortieren von Duplikaten sparst.
Wichtig: Diese Liste darf erst im Result veroeffentlicht werden,
nicht im 2. CfV!

Falls ein trivialer Schutz vor Spammern gewuenscht ist, koennen durch
eine Aenderung in den Template "voterlist", "votes-single", "votes-multi"
und "bouncelist" alle Mailadressen verfremdet werden. Entweder Du fuegst
folgende Definition ein:

mail            := value mail | replace '@' ' -at - '

Oder Du veraenderst direkt die vorgegebenen Formate, indem Du
die Mailadresse mit Hilfe des Pipe-Symbols durch die replace-Funktion
schickst:

multi-line := value mail | replace '@' ' -at- ' | justify-behind name 72

Die Replace-Funktion erwartet wie im Beispiel gezeigt zwei Werte,
die zu ersetztende Zeichenfolge (hier das '@') und eine neue Zeichenfolge,
die statt dessen eingesetzt werden soll und frei gewaehlt werden kann.

Wie bereits beschrieben, sollte am Ende des 2. CfVs bzw. Results noch die
Liste der gebouncten Mailadressen angehaengt werden (z.B. mit dem Programm
uvbounce.pl) und bei Bedarf die urspruenglichen Stimmen geloescht und das
Ergebnis korrigiert werden.


11. Datenschutz
===============

Zum Schutz der deutschen Wahlleiter wurden spezielle Klauseln
aufgenommen, die vom Waehler die Erlaubnis zur Verarbeitung
der Stimme verlangen. Die Option "bdsg" in usevote.cfg schaltet
diese Sonderbehandlung ein oder aus. Folgende Besonderheiten
gelten bei Aktivierung:

- Im Wahlschein ist ein spezieller Hinweistext enthalten, der
  aus der Datei bdsgtext.cfg genommen wird. Beim Verarbeiten
  abgegebener Stimmen wird der Abschnitt wieder mit der Datei
  verglichen. Fehlt er oder wurde er veraendert, wird der
  Wahlschein dem Wahlleiter zur Kontrolle vorgelegt.
  Die Fehlerpruefung ignoriert Quote- und Leerzeichen sowie
  Zeilenumbrueche, kann aber versagen, wenn dem Quotezeichen
  Initialen vorangestellt sind (wie in manchen Mailboxnetzen
  ueblich) oder eine Silbentrennung ueber den Text gelaufen ist.

- Ausserdem enthaelt der Wahlschein eine spezielle Frage,
  die mit JA zu beantworten ist. Anderenfalls muss ebenfalls
  Kontrolle durch den Wahlleiter erfolgen. Der Text dieser
  Frage ist ueber usevote.cfg einzustellen.

Erfolgt eine derartige Kontroll-Vorlage beim uvvote.pl-Lauf,
sollte der Wahlleiter sich den Wahlschein genau anschauen
und dann entweder im Menue die Option (6)(a) waehlen oder
mit (w) fortfahren. Im letzteren Fall wird die Stimme
verworfen und eine Hinweismail zurueckgeschickt.

Wenn eine Wahlbestaetigung veraendert und zurueckgeschickt
wird, fehlt der entsprechende Datenschutzhinweis. Da in
diesem Fall die Zustimmung aber bereits bei der ersten
Stimmabgabe gegeben wurde, kann der Wahlleiter beruhigt
die Korrektheit wie oben beschrieben bestaetigen.


12. Personalisierte Wahlscheine
===============================

Die Wahlregeln fuer de.* sehen im Abschnitt 6a ein Verfahren
mit persoenlichen Wahlscheinen vor, die mit einer speziellen
Kennung versehen mehr Sicherheit vor Manipulation bieten.

Um dieses Verfahren einzuschalten, muss zunaechst die Option
"personal = 1" in usevote.cfg gesetzt werden und das Template
"ballot-personal" im Unterverzeichnis "templates" um den Text
des CfVs erweitert werden (einfach statt des von Sternchen
umrandeten Kommentars in der Datei einfuegen). Bitte eventuell
im Text vorkommende eckige Klammern wie folgt unschaedlich
machen: \[Text\] (Backslash voranstellen), da in den Templates
diese Klammern spezielle Bedeutungen haben (siehe gesonderten
Abschnitt zu dem Thema in dieser Datei).

Der gepostete CfV enthaelt i.d.R. nur einen Dummy-Abschnitt
mit Hinweis auf die gesonderte Wahlscheinanforderung. So ein
Abschnitt kann mit uvballot.pl generiert werden.

Der dana-Moderation sollte beim Einreichen des CfVs auch
ein Dummy-Wahlschein mitgesendet werden, wie er bei der
Wahlscheinanforderung verschickt wird. Dieser laesst sich mit
"uvcfv.pl -t" erzeugen.

Die eingehenden Wahlscheinanforderungen sollten an eine
spezielle Mailadresse gehen und dann mit uvcfv.pl verarbeitet
werden. Je nach Konfiguration in usevote.cfg werden die
Mails aus einer Mailboxdatei oder per POP3 eingelesen und jeweils
mit einem personalisierten Wahlschein beantwortet. Bitte vor
dem Posten des CfVs einen Test durchfuehren, um sicherzustellen,
dass die generierten Wahlscheine korrekt sind und auch bei
der Auswertung akzeptiert werden (hierbei wird die speziell
eingefuegte Wahlscheinkennung in Verbindung mit der Absenderadresse
geprueft).


13. Die einzelnen Programme
===========================

uvballot.pl
  Generiert den Wahlschein fuer den CfV. Bei personalisierten
  Wahlscheinen (personal = 1 in usevote.cfg) wird nur ein Dummy-
  Abschnitt mit Hinweisen zur Wahlscheinanforderung ausgegeben.

  Die Vorlage fuer den Wahlschein ist im templates-Unterverzeichnis
  konfigurierbar:
  - ballot               Standard-Wahlschein (personal=0)
  - ballot-request       Dummy-Abschnitt mit Hinweisen zur
                         Wahlscheinanforderung (personal=1)
  - ballot-personal      Wahlschein mit Scheinkennung, wird von
                         uvcfv.pl verwendet

  Aufrufparameter:

  -c config_file         liest die Konfiguration aus config_file
                         (usevote.cfg falls nicht angegeben)
  -h                    
  --help                 zeigen einen Hilfetext an


uvbounce.pl
  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.

  Die Mails werden aus den uebergebenen Mailboxdateien geloescht
  und statt dessen in einer neuen Datei mit der Erweiterung ".processed"
  gespeichert.

  Die Vorlage fuer die ausgegebene Liste ist im templates-
  Unterverzeichnis konfigurierbar (Datei "bouncelist").

  Aufrufparamter:

  -c config_file         liest die Konfiguration aus config_file
  -f dateiname(n)   
  --file dateiname(n)    lesen 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.
                         Die Dateinamen werden durch Leerzeichen getrennt.
  -h
  --help                 zeigen einen Hilfetext an


uvcfv.pl

  Liest Mailboxen ein und beantwortet alle Mails mit personalisierten
  CfVs (falls personal=1 in usevote.cfg).

  Die Vorlage fuer die ausgegebene Liste ist im templates-
  Unterverzeichnis konfigurierbar (Datei "ballot-personal").

  Aufrufparamter:

  -c config_file        liest die Konfiguration aus config_file
                        (usevote.cfg falls nicht angegeben)
  -t
  --test                gibt einen Dummy-Wahlschein mit Scheinkennung
                        an der Standardausgabe aus, zur Pruefungszwecken
  -h
  --help                zeigen einen Hilfetext an


uvcount.pl

  Zaehlt Stimmen und gibt Waehlerlisten aus. Dient zur Erstellung
  von 2.CfV und Result.

  Es werden die folgenden Vorlagen aus dem templates-Unterverzeichnis
  benutzt:

  - result-multi       Ergebnisauszaehlung bei mehreren Gruppen
  - result-single      Ergebnisauszaehlung bei nur einem Abstimmungs-
                       gegenstand (nicht tabellarisch, sondern im
                       Fliesstext), falls in usevote.cfg multigroup=0
                       gesetzt ist oder die Option -o verwendet wird
                       (siehe unten)
  - voterlist          Reine Auflistung der bisherigen Waehler ohne
                       Stimmen (fuer 2. CfV)
  - votes-multi        Stimmenliste im Mehrgruppenformat (eine Liste
                       mit allen Waehlern, rechts daneben die jeweils
                       abgegebenen Stimmen)
  - votes-single       Stimmenliste im Eingruppenformat (getrennte
                       Listen mit Ja-, Nein- und Enthaltungsstimmen)

  Aufrufparamter:

  -c config_file      liest die Konfiguration aus config_file
                      (usevote.cfg falls nicht angegeben)
  -f result_file      liest die Stimmen aus result_file (ueberschreibt
                      die "resultfile"-Angabe aus der Konfigurationsdatei)
  -l
  --list              Geben eine Liste aller Waehler aus (ohne Stimmen).
  -v
  --voters            Wie --list, aber mit Angabe der abgegebenen Stimmen.
  -r
  --result            Ausgabe des Endergebnisses (kann mit --list oder
                      --voters kombiniert werden).
  -m
  --multigroup        Benutzt auch bei Eingruppenabstimmungen das
                      Mehrgruppenformat beim Endergebnis (ueberschreibt
                      die Einstellung aus usevote.cfg).
                      Nur in Kombination mit --result verwendbar,
                      schliesst --onegroup aus.
  -o
  --onegroup          Benutzt bei Eingruppenabstimmungen immer das
                      Eingruppenformat beim Endergebnis (ueberschreibt
                      die Einstellung aus usevote.cfg).
                      Nur in Kombination mit --result verwendbar,
                      schliesst --multigroup aus.
  -n
  --nodup             Verzichtet auf das Aussortieren von doppelten
                      Stimmabgaben. Nicht empfohlen!
  -h
  --help              zeigen einen Hilfetext an



uvvote.pl

  Liest Mailboxen aus einer Datei oder per POP3 ein wertet die Mails
  als Stimmzettel aus. Erst beim Aufruf mit der Option "clean" werden
  die Ergebnisse endgueltig gespeichert und die Bestaetigungsmails
  verschickt.

  Es werden diverse Vorlagen aus dem templates-Unterverzeichnis
  benutzt, um Bestaetigungs- und Fehlermails zu generieren.

  Aufrufparameter:

  -c config_file       liest die Konfiguration aus config_file
                       (usevote.cfg falls nicht angegeben)
  -t
  --test               fuehrt einen Test der Konfiguration durch und
                       gibt das ermittelte Ergebnis aus.
  -h
  --help               zeigen einen Hilfetext an



14. Die Konfigurationsdateien
=============================

mailpatterns.cfg
----------------

Diese Datei enthaelt einen regulaeren Ausdruck (Perl-Syntax) pro
Zeile. Passt die Mailadresse eines Abstimmenden auf eines der Muster,
wird dem Wahlleiter bei der Auswertung eine Warnung angezeigt.
In der Regel kann man diese ignorieren, weil heutzutage viele
Privatleute ihre eigene Domain haben und Role-Accounts wie news@
benutzen. Sieht man aber so etwas wie news@t-online.de ist
Vorsicht angebracht und man sollte durch Auswahl von "(W)eiter" 
die Stimme ungueltig werten und eine entsprechende Fehlermail
zurueckschicken lassen.


messages.cfg
------------

Hier sind alle kuerzeren Texte enthalten, die Usevote ausgibt,
unabhaengig davon, ob sie nur dem Wahlleiter bei der Programmausfuehrung
ausgegeben werden oder in persoenlichen Mails bzw. dem Result
auftauchen. Laengere Textpassagen sind als eigene Dateien im
"templates"-Verzeichnis zu finden und bieten weitergehende
Formatierungsmoeglichkeiten.

Jede Zeile in der messages.cfg besteht aus einem Identifier, einem
Gleichheitszeichen und dem eigentlichen Text. Der Identifier ist
grundsaetzlich in Grossbuchstaben gehalten und vom Programmcode fest
vorgegeben. Aenderungen duerfen nur rechts vom Gleichzeichen vorgenommen
werden, wenn Dir z.B. Formulierungen nicht gefallen oder Du anders-
sprachige Ausgaben haben moechtest.

Variablen sind ueber ${VARIABLE} einzubauen, allerdings sind die
Variablennamen und deren Inhalte vom Programmcode vorgegeben und
sollten beibehalten werden. Es gibt keine vordefinierten Variablen,
die Du selbst einbauen kannst, es sei denn, Du erweiterst den
Programmcode an der entsprechenden Stelle.

Die einzigen Texte, die fest im Programmcode stehen, sind die
Hilfetexte der einzelnen Programme (ueber die Option -h oder --help
aufrufbar) sowie die Startmeldungen (Copyright etc.) und initiale
Fehlermeldungen (usevote.cfg oder messages.cfg nicht gefunden,
ungueltige oder falsch kombinierte Aufrufparameter).


usevote.rul
-----------

Mit dieser Datei koennen spezielle Regeln fuer eine gueltige Stimmabgabe
bei Mehrgruppenabstimmungen erstellt werden, z.B. dass man Punkt 3 oder 4
waehlen muss, wenn man fuer Punkt 2 gestimmt hat (quasi als weitergehende
Auswahlmoeglichkeit). Solche Regeln verkomplizieren aber die Abstimmung
und sollten nur in Ausnahmefaellen benutzt werden. Urspruenglich gedacht
war diese Moeglichkeit z.B. fuer .misc Gruppen, die zwangsweise bei einer
Aufteilung mit angelegt werden mussten. Dadurch, dass das in den
Wahlregeln fuer de.* als Automatismus eingebaut ist, kann man sich
so etwas meistens sparen. Fuer den Fall, dass bei einer vorgeschlagenen
neuen Gruppe der Name noch unklar ist, gibt ebenfalls das Benutzen
von speziellen Wahlregeln wenig Sinn, da man auch eine Meinung ueber
den Gruppennamen haben kann, wenn man eigentlich gegen die Gruppe ist.

Wenn Du aber ein Verfahren betreust, in dem Du solche Sonderregeln
benoetigst, kannst Du eine Regel pro Zeile in der folgenden Syntax schreiben:

if .jjjjj then J....

Eine Regel beginnt immer mit "if", und danach folgen eine Anzahl Symbole;
diese Anzahl muss gleich der Anzahl der Gruppen sein, ueber die abgestimmt
wird. Oben geht es also um eine Abstimmung ueber sechs Gruppen.
Die Symbole hinter "if" geben an, in welchem Fall diese Regel Anwendung
finden soll. Falls sie zutrifft, wird die Bedingung hinter "then"
geprueft (dort muessen nochmal so viele Symbole folgen, wie Gruppen
im Wahlschein vorkommen). Ist diese Bedingung nicht erfuellt, wird
der Wahlschein dem Wahlleiter als regelverletzend vorgelegt, und
wenn diese mit "(w)eiter" den Fehler bestaetigt, wird eine entsprechende
Fehlermeldung zurueckgeschickt und die Stimme als ungueltig gewertet.

Folgende Symbole sind erlaubt:

   J   eine JA-Stimme
   N   eine NEIN-Stimme
   E   eine Enthaltung
   S   eine JA- oder NEIN-Stimme
   H   eine Enthaltung oder JA-Stimme
   I   eine Enthaltung oder NEIN-Stimme
   .   egal (Ja, nein oder Enthaltung)
   j   eine oder mehrere der markierten Gruppen hat JA-Stimme
   n    ""   ""    ""     ""     ""       ""    ""  NEIN-Stimme
   e    ""   ""    ""     ""     ""       ""    ""  Enthaltung
   s    ""   ""    ""     ""     ""       ""    ""  Ja- oder Nein-Stimme
   h    ""   ""    ""     ""     ""       ""    ""  Enthaltung oder Ja-Stimme
   i    ""   ""    ""     ""     ""       ""    ""  Enthaltung oder Nein-Stimme

Hier noch ein Beispiel:
    if S... then .ss.
    if .S.. then ..E.
    if ..S. then .E..

Diese Regeln sagen: Wer fuer die erste Gruppe abstimmt, der muss auch
fuer die zweite und dritte Gruppe abstimmen - egal wie. Ausserdem muss er
(Regeln 2 und 3) sich bei 3 enthalten, wenn er bei 2 eine Stimme abgibt
und umgekehrt. Die vierte Gruppe wird hier gar nicht betroffen.


usevote.cfg
-----------

Dieses ist die zentrale Konfigurationsdatei fuer Usevote. Einige
Einstellungen sind nur einmal auf das System und Deine Gewohnheiten
anzupassen, andere muessen fuer jede Abstimmung geaendert werden.
Alle Einstellungen sind mit mehr oder weniger sinnvollen
Standardwerten vorgegeben, die sich bei leerer usevote.cfg mittels
"uvvote.pl -t" ermitteln lassen.

Es lassen sich durch eine Zeile "include dateiname" weitere 
Konfigurationsdateien einbinden. Die Stelle, an der dieses geschieht,
ist dabei wichtig, da die usevote.cfg von oben nach unten gelesen
wird (zusätzlich eingebundene Konfigurationsdateien werden an der
Stelle der "include"-Zeile eingefügt) und bei mehrmals vorkommenen
Optionen der jeweils letzte gesetzte Wert benutzt wird.
Daher sollte eine Datei mit systemweiten Defaults am besten am
Anfang der usevote.cfg eingebunden werden, die dort gesetzten
Optionen sollten aber unbedingt aus der usevote.cfg geloescht werden,
damit die systemweiten Einstellungen nicht gleich wieder ueberschrieben
werden.

Das Format ist allgemein:

Option = Wert

Der Wert muss in manchen Faellen 0 (=aus) oder ungleich 0 (=an) sein,
in anderen Faellen muss eine exakte Zahl oder Zeichenkette eingegeben
werden. 

Alles, was hinter einem # Zeichen steht, wird als Kommentar gewertet
und ignoriert. Steht hinter einem Wert so ein Kommentar, wird
normalerweise alles bis zum Kommentarzeichen noch in den String
einbezogen. In so einem Fall sollte der Wert von Anfuehrungszeichen
umschlossen werden. Im folgenden Beispiel wird ein Dateiname
definiert:

# Der Dateiname endet mit 10 Leerzeichen (bis zum Kommentarzeichen):
tpl_mailheader = mailheader          # Kommentar

# Der Dateiname enthaelt keine Leerzeichen, da mit Anfuehrungsstrichen
# begrenzt:
tpl_mailheader = "mailheader"        # Kommentar

Folgt kein Kommentar in der selben Zeile, koennen die Anfuehrungsstriche
weggelassen werden.

Hier eine Auflistung der immer anzupassenden Optionen
(BOOL bedeutet, dass 0 (aus) oder 1 (an) eingetragen werden muss):

votename         Name der Abstimmung
group1           Erster Abstimmungsgegenstand
group2           Zweiter (und so weiter durchnummerieren)
sampleballotfile Datei mit Musterwahlschein aus dem CfV fuer Dateivergleich (diff)
votefile         Mailbox mit eingehenden Stimmen (falls POP3 ausgeschaltet)
mailboxtype      Typ der Mailbox (mbox, maildir)
personal         Personalisierte Wahlscheine verwenden? [BOOL]
                 (siehe gesonderten Abschnitt weiter oben)
voteaccount      Mailadresse, unter der abgestimmt werden kann
                 (Reply-To im CfV auf diese Adresse setzen)
requestfile      Datei mit Anforderungsmails bei "personal=1", falls
                 POP3 ausgeschaltet ist
bdsg             Datenschutzklausel generieren und auf deren Existenz 
                 pruefen? [BOOL] (siehe gesonderten Abschnitt weiter oben)
replyto          Reply-To Header auswerten? [BOOL] (nicht empfohlen und in
                 de.* von den GVV nicht praktiziert)
voteack          Jede Stimme mit einer Bestaetigungsmail beantworten? [BOOL]
                 (in de.* so ueblich)
mailcc           weitere Mailadresse, an die eine Kopie jeder Bestaetigungs-
                 oder Fehlermail geschickt wird (fuer Archivzwecke)
onestep          Mails direkt verschicken und Ergebnisse speichern? [BOOL]
                 ("uvvote clean" Aufruf entfaellt)
multigroup       Fuer das Ergebnis auch bei Eingruppenabstimmung des
                 Mehrgruppenformat waehlen? [BOOL]
condition1       Bedingungen fuer einen Erfolg der Abstimmung in Perl-Syntax
condition2       (normalerweise "$yes>=2*$no" und "$yes>=15"
resultfile       Datei fuer Gesamtergebnis (normalerweise ergebnis.alle)
idfile           Datei mit Scheinkennungen (bei "personal=1")
pop3             POP3 benutzen? [BOOL] (andernfalls Stimmen aus Datei lesen)
pop3server       POP3-Server fuer eingehende Wahlscheine
pop3port         POP3-Serverport (normalerweise 110)
pop3user         Benutzername
pop3pass         Passwort
pop3delete       Mails nach Abruf vom Server loeschen? [BOOL]
pop3uidlcache    Dateiname zum Speichern bereits abgerufener Mail-IDs (UIDL)
pop3*_req        entsprechende Optionen fuer Mailbox mit eingehenden
                 Wahlscheinanforderungen (bei "personal=1")
pop3*_bounce     entsprechende Optionen fuer Mailbox mit Bounces (Fehlermails)
                 fuer die Verarbeitung durch uvbounce.pl
smtp             SMTP zum Verschicken von Mails benutzen? [BOOL]
                 Andernfalls wird direkt an den MTA uebergeben (nur Unix)
smtpserver       SMTP-Server
smtpport         SMTP-Serverport (normalerweise 25)
smtpauth         SMTP-Authentication nach RFC 2554 benutzen? [BOOL]
smtpuser         SMTP-Benutzername
smtppass         SMTP-Passwort
smtphelo         String fuer die HELO-Greeting bei SMTP (Default: Hostname)
fqdn             String fuer den Host-Teil der Message-ID
                 (Fully Qualified Domain Name) (Default: Hostname)
archivedir       Verzeichnis fuer Archivierung von verarbeiteten Stimmen
tmpdir           temporaeres Verzeichnis
templatedir      Verzeichnis mit Templates (Vorlagen) fuer diverse Zwecke
                 (normalerweise "templates", dort liegen bereits vordefinierte
                 Templates, die i.d.R. nicht angepasst zu werden brauchen)
formats          Konvertierungsfunktionen fuer die Templates, mit Komma getrennt
                 (mitgelieferte UVformats.pm muss hier aufgefuehrt werden,
                 desweiteren koennen eigene Module mit weiteren Funktionen
                 hier eingebunden werden)
controlfile      Name der Steuerungsdatei fuer den Mailversand (tmp/ack.control)
domailfile       Name des Shellscripts zum Versenden der Bestaetigungsmails
                 (falls smtp=0, normalerweise tmp/domail)
mailcmd          Aufruf des Mail Transfer Agents (MTA) zum Verschicken der
                 Bestaetigungsmails (falls smtp=0), z.B.
                 "sendmail -oi -oem -femail@adresse --"
sleepcmd         Weiteres Kommando, welches nach jeder Mail aufgerufen werden
                 soll (falls smtp=0). Sinnvoll ist ein "sleep x", wobei x bei
                 langsamen Systemen hoeher gewaehlt werden sollte.
clearcmd         Shellbefehl zum Loeschen des Bildschirms (Standard: clear),
                 muss unter Windows auf "cls" geaendert werden. Falls Shell
                 oder Betriebssystem keinen solchen Befehl bereitstellen,
                 sollte ein Kommando verwendet werden, welches eine Trennlinie
                 oder aehnliches auf dem Bildschirm ausgibt, z.B. mit "echo"
diff             Shellbefehl zum Dateivergleich (diff); es koennen auch 
                 Parameter angegeben werden, z.B. "diff -u". Das verwendete
                 Programm muss das Lesen einer Datei von STDIN erlauben
                 ("-" statt Dateinamen fuer Einlesen von Standardeingabekanal)
pager            Shellbefehl zum seitenweisen Darstellen von Mails auf dem
                 Bildschirm (normalerweise "less"). Unter Windows muss "more"
                 benutzt werden, unter Unix hingegen gibt es moeglicherweise
                 bei "more" Probleme mit der Umleitung von STDERR in eine Datei
                 (wie es z.B. von uvvote.pl benoetigt wird), daher ist "less"
                 der Standardwert.
mailfrom         Absender fuer den From-Header der Bestaetigungsmails. Wird
                 auch in Bestaetigungsmails als Unterschrift eingefuegt und
                 sollte daher am besten in folgendem Format sein:
                 Vorname Nachname <gvv@foo.bar>
                 (ohne Anfuehrungsstriche, falls rfc-konform moeglich)
envelopefrom     Absender fuer den Envelope (Return-Path) der Bestaetigungsmails
                 bei Verwendung von SMTP (bitte nur die Adresse eintragen, ohne
                 Klammern und Zusaetze). Wenn SMTP ausgeschaltet ist, muss
                 diese Einstellung entsprechend der Mailer-Doku in "mailcmd"
                 gesetzt werden (z.B. bei Sendmail und kompatiblen mit -f)
messagefile      Datei mit diversen Meldungen und Textfragmenten (messages.cfg)
rulefile         Datei mit Wahlregeln (usevote.rul)
badaddrfile      Datei mit verdaechtigen Mailadressen (mailpatterns.cfg)
errorfile        Datei fuer Fehlermeldungen beim Programmlauf (errors.log)
mailstart        Einleitungszeile fuer naechste Mail (RegExp), falls Mails
                 aus einer Datei eingelesen werden (smtp=0), normalerweise
                 "^From"
begin_divider    Trennlinien vor und nach dem Wahlschein
end_divider      ("Alles vor/nach dieser Zeile bitte loeschen")
nametext         Text fuer die Namens-Angabe im Wahlschein. Muss im
                 Wahlschein genauso stehen und wird beim Standardtemplate
                 auch aus dieser Einstellung uebernommen. Beispieltext:
                 "Dein Realname, falls nicht im FROM-Header:"
nametext2        Text fuer Namens-Angabe in Bestaetigungsmails
                 (dito, Standardwert "Waehlername:")
addresstext      Text fuer die Adress-Angabe im Wahlschein
                 (dito, Standardwert "Waehleradresse:")
ballotidtext     Text für die Angabe der Wahlscheinkennung (falls personal=1)
                 (dito, Standardwert "Wahlscheinkennung:")
bdsgtext         Text fuer Datenschutzklausel (falls bdsg=1),  erscheint als
                 Abstimmungspunkt (z.B. "Datenschutzklausel - Zustimmung: Ich
                 bin mit der Verarbeitung meiner Daten wie oben beschrieben
                 einverstanden")
bdsgfile         Datei mit Erklaerungstext fuer BDSG-Klausel (bdsgtext.cfg)
rightmargin      Zeilenbreite bei Ausgaben, die nicht durch Templates
                 gesteuert werden. Hat vor allem auf Bildschirmausgaben
                 Auswirkung.
name_re          Regulaerer Ausdruck fuer Erkennung eines gueltigen Realnamens.
                 Beispiel: "[a-zA-ZäöüáàâéèêíìîóòôúùûÄÖÜÁÁÂÉÈÊÍÌÎÓÒÔÚÙÛß-]{2,} +
                 .*[a-zA-ZäöüáàâéèêíìîóòôúùûÄÖÜÁÁÂÉÈÊÍÌÎÓÒÔÚÙÛß]{2,}"
                 (muss ohne Umbruch in eine Zeile)

Regulaere Ausdruecke fuer Erkennung der Stimmen
(Gross-/Kleinschreibung spielt keine Rolle):

ja_stimme        Standardwert: (J\s*A|J|(D\s*A\s*)?F\s*U\s*E\s*R)
nein_stimme      Standardwert: (N\s*E\s*I\s*N|N|(D\s*A\s*)?G\s*E\s*G\s*E\s*N)
enth_stimme      Standardwert: (E|E\s*N\s*T\s*H\s*A\s*L\s*T\s*U\s*N\s*G)
ann_stimme       Standardwert: A\s*N\s*N\s*U\s*L\s*L\s*I\s*E\s*R\s*U\s*N\s*G

Definition der verwendeten Templatedateien
(werden im Unterverzeichnis "templates" mitgeliefert):

tpl_mailheader      "mailheader"         # generally used mail header
tpl_bouncelist      "bouncelist"         # used by uvbounce.pl
tpl_result_multi    "result-multi"       # used by uvcount.pl -r -m
tpl_result_single   "result-single"      # used by uvcount.pl -r -o
tpl_votes_multi     "votes-multi"        # used by uvcount.pl -v (multiple groups)
tpl_votes_single    "votes-single"       # used by uvcount.pl -v (single group only)
tpl_voterlist       "voterlist"          # used by uvcount.pl -l (2nd CfV)
tpl_ballot          "ballot"             # used by uvballot.pl (personal = 0)
tpl_ballot_request  "ballot-request"     # used by uvballot.pl (personal = 1)
tpl_ballot_personal "ballot-personal"    # used by uvcfv.pl    (personal = 1)
tpl_addr_reg        "address-not-registered"  # used by uvvote.pl   (personal = 1)
tpl_no_ballotid     "no-ballotid"        # used by uvvote.pl   (personal = 1)
tpl_wrong_ballotid  "wrong-ballotid"     # used by uvvote.pl   (personal = 1)
tpl_bdsg_error      "bdsg-error"         # used by uvvote.pl   (bdsg = 1)
tpl_ack_mail        "ack-mail"           # used by uvvote.pl   (voteack = 1)
tpl_cancelled       "cancelled"          # used by uvvote.pl
tpl_invalid_account "invalid-account"    # used by uvvote.pl
tpl_invalid_name    "invalid-name"       # used by uvvote.pl
tpl_multiple_votes  "multiple-votes"     # used by uvvote.pl
tpl_no_ballot       "no-ballot"          # used by uvvote.pl
tpl_no_votes        "no-votes"           # used by uvvote.pl
tpl_rule_violated   "rule-violated"      # used by uvvote.pl  (siehe usevote.rul)


15. Templates
=============

Die mitgelieferten Templates befinden sich im Verzeichnis "templates".
In usevote.cfg koennen weitere Verzeichnisse definiert werden, in
denen auch nach Templates gesucht wird ("templatedir", kommaseparierte
Liste mit Verzeichnissen). Außerdem koennen dort die Dateinamen der einzelnen
Templates eingestellt werden, wodurch es moeglich ist, in einzelnen
Abstimmungen andere, selbst definierte Templates zu verwenden, die in
einem gesonderten Verzeichnis abgelegt sind.

Eine Templatedatei besteht aus zwei Teilen. Am Anfang werden die
Formatierungen bestimmter Schluessel definiert und nach einem Trenner
folgt der eigentlich Template-Koerper, der dann von Programm bearbeitet
und ausgegeben wird.

   format-key := function1 param | function2 param

   == TEMPLATE ====================================

   Ich bin nun das eigentliche Template:

   format-key: [$format-key]

Der Trenner beginnt mit den Zeichen '== TEMPLATE' danach koennen beliebige
Zeichen folgen um die beiden Sektionen optisch voneinander abzugrenzen.

Wenn es keine Formatierungsanweisungen gibt, kann der Trenner auch
weggelassen werden. D.h. wenn kein Trenner gefunden wird, wird der
komplette Text als Template-Koerper betrachtet.


Template-Koerper
----------------

Im Template-Koerper werden die zu ersetzenden Token durch eckige
Klammern abgegrenzt. Sollen eckige Klammern im Text ausgegeben werden,
muessen diese durch einen Backslash freigestellt werden.

   [$termersetzung] [@schleife] nur eine \[ Klammer


Termersetzung:

    Ersetzt den Token durch den Wert des angegeben Schluessels:

      [$formatierung] [$schluessel]

    Es wird zuerst nach einer Formatierung mit den entsprechenden
    Bezeichner gesucht. Ist diese vorhanden, werden die entsprechenden
    Funktionen ausgefuehrt (siehe folgender Abschnitt).

    Kann kein Format gefunden werden, wird direkt in der im Programmcode
    gefuellten Datenstruktur nach einem Schluessel mit dem angegeben
    Bezeichner gesucht und sein Wert eingesetzt. Alle Einstellungen
    aus der usevote.cfg sind automatisch als Schluessel definiert, es
    kann also z.B. [$nametext] jederzeit verwendet werden. Eingesetzt
    wird an der Stelle der mit "nametext = " definierte Text aus
    usevote.cfg.

    Schlussendlich ist es noch moeglich einen default-Wert zu
    definieren, der eingesetzt wird, wenn keiner der obigen Wege
    erfolgreich war:

      Hallo [$name|Unbekannter]!

    Diese Zeile gibt, wenn kein Name definiert wurde, das Wort
    "Unbekannter" aus.


Bedingte Verzeigung:

    Ueberprueft ob der Wert des angegebenen Formats/Schluessel boolsch
    WAHR ist. Dementsprechend wird der then oder else Block eingefuegt:

      [?if|then|else] oder auch nur [?if|then]

    Die then/else Bloecke werden natuerlich auch auf Tokens geparst und
    diese dementsprechend ersetzt.


Schleifen/Listen:

    Der nachfolgende Textblock wird fuer alle Elemente des durch den
    Schluessel bezeichneten Arrays ausgefuehrt und eingefuegt.

      [@schluessel|block] oder [@schluessel|block|sep]

    Als zweiter Parameter kann ein Separtor definiert werden, mit dem
    sich z.B. kommaseparierte Listen erzeugen lassen, da der Separator
    eben nur zwischen den Elementen eingefuegt wird.

    Auch fuer Schleifen koennen Formatierungen genutzt werden.Allerdings
    darf kein String zurueckgegeben werden, sondern ein Array mit einer
    Menge von UVtemplate-Objekten.


Kommentare:

    Token die nach der Bearbeitungen entfernt werden:

       [# mich sieht man nicht]


Sonstiges:

    Um in Listen einen Zeilenumbruch zu erzwingen, muss lediglich ein
    '\n' eingefuegt werden, falls eine kompakte Definition der Liste
    erfolgen soll.

       [@names|[name] [email]\n]


Formatierungen
--------------

Eine Formatierung besteht eigentlich nur aus dem entsprechenden
Namen und einer beliebigen Anzahl von Funktionsaufrufen:

   format := funktion param1 "param 2" | funktion param

Aehnlich der Unix-Shell-Funktionalitaet, wird dabei die Ausgabe
einer Funktion an die folgende weitergeleitet. So ist es moeglich,
verschiedenste simple Formatierungen zu kombinieren um nicht fuer
jeden Spezialfall eine neue Funktion schreiben zu muessen.

Die jeweilige Formatierungsfunktion erhaelt als Input die
Datenstruktur, den Output der vorherigen Funktion und die definierten
Parameter in der entsprechenden Reihenfolge.  

Zahlen und einfache Bezeichner koennen direkt definiert werden.
Sollen Sonderzeichen oder Leerzeichen uebergeben werden, muessen
diese gequotet werden. Dazu kann ' oder " verwendet werden.

Die Funktionen geben im Allgemeinen einen String zurueck. Im Rahmen
von Listen können auch Arrays uebergeben werden.

Die erste Funktion duerfte ueblicherweise 'value' sein. Sie gibt
den Wert des angegeben Schluessel zurueck, der dann von den
folgenden Funktionen definiert wird:

   name-60 := value name | fill-right 60

Das Format "name-60" definiert also den Wert des Schluessel "name",
der um Leerzeichen aufgefuellt wird, bis eine Laenge von 60 Zeichen
erreicht wird.

   name-email := value name | justify-behind mail 72

"name-email" resultiert in einem String, der zwischen den Werten von
"name" und "email" genau so viele Leerzeichen enthaelt, damit der
gesamte String 72 Zeichen lang ist.

Wird dieses Format in einer Liste angewandt, erhaelt man eine Tabelle
in der die linke Spalte linksbuendig und die rechte Spalte
entsprechend rechtsbuendig ist.

Soweit ein kleiner Ueberblick ueber die Formatierungen. Ausfuehrliche
Funktionsbeschreibungen und weitere Beispiele finden sich in der
POD-Dokumentation des Moduls UVformat ("perldoc UVformat.pm").

Es ist moeglich, selbst eigene Module mit Formatierungsfunktionen
zu schreiben und ueber die Option "formats" in usevote.cfg einzubinden.
Am besten kann dazu UVformats.pm als Vorlage genommen werden.
Wichtig: der Name einer Formatierungsfunktionen darf nur aus
Gross- und Kleinbuchstaben, Zahlen und Minuszeichen bestehen.
Unterstriche, Punkte etc. sind nicht erlaubt!

Falls eine elementare Funktion fehlt, kannst Du Dich auch gerne
bei mir melden und ich pruefe, wie sie sich einbauen laesst.

Marc Langer, im Oktober 2005