6.4.2005

Terminkalender

default

nosoftwarepatents

 

Kleines Terminkalender-CGI

Wer Outlook ohne Exchange-Server benutzt, hat vermutlich schon mindestens einmal alles verloren, die Mails, die Adressen, die Termine, den ganzen Kram. Wer einen Outlook-User mal so richtig ärgern möchte, kann ihm z.B. eine PGP-signierte Mail im Format "MIME-PGP" schicken. Dann stürzt Outlook ab und startet auch nicht mehr. Es sei denn, man hatte vorher schon den Vorschau-Modus abgewählt. Der Ausweg ist dann, eine zweite, nichtsignierte Mail hinterherzuschicken, oder auf den nächsten Spam zu warten (was heute ja nur noch Minuten dauert).

Dies hier soll nicht den ganzen Terminkalender ersetzen, sondern nur die Funktion, an Termine zu erinnern ("Eventmanager" heißt das, glaube ich). Mehr brauche ich selbst nämlich nicht. Auf das stundenplanartige Terminraster kann ich verzichten, so viele Termine habe ich nicht, aber die, die ich habe, muß ich einhalten.

Damit die Termine nicht auf dem Windowsrechner, sondern auf dem Linuxserver gespeichert werden, habe ich es als CGI gemacht. Voraussetzung ist also nur, daß man einen Linuxserver mit Apache laufen hat. Im Prinzip braucht man nicht einmal eine grafische Oberfläche auf den Clientrechnern, ein Textbrowser, der Tabellen unterstützt, genügt. Z.B. "Links" http://freshmeat.net/projects/links/

Jeder angeschlossene Rechner bekommt seine eigenen Termine. Es wird also nicht nach Usern, sondern nach IP-Adressen unterschieden. Der Nachteil ist: Jeder User braucht seinen eigenen, festen Arbeitsplatzrechner. Der Vorteil ist: Man braucht sich nicht einloggen. So wie ich kleinere Firmen und Privatnetze kenne, hat tatsächlich jeder seinen eigenen Rechner, und niemand hat Lust, sich für einen Blick auf den Terminkalender extra einzuloggen.

Die Sicherheitsstufe ist nicht sehr hoch: Alle Terminlisten werden in einem Verzeichnis gespeichert, auf das der User "www-data" Zugriff hat. Auch das hängt damit zusammen, daß man sich nicht einloggen muß. Es ist also nur für Umgebungen geeignet, wo die User sich untereinander trauen können. In kleinen Firmen und Privatnetzen wird das in der Regel der Fall sein.

Wer eine richtige Infrastruktur braucht, wird vermutlich lieber zu einer umfassenden Lösung greifen, wie z.B. "Kolab/Kroupware" http://kolab.org/ und http://www.kroupware.org/

 

Benutzung

Ich habe mich bemüht, die Bedienung so einfach und mit so wenig Mausklicks wie möglich zu machen. Man geht z.B. auf "http://192.168.17.41/cgi-bin/termin.cgi" und bekommt alle Termine der nächsten 366 Tage angezeigt. Termine mit Wiederholung (z.B. jeden Monat) werden auch mehrmals angezeigt.

  • "Aktuell" ist die Liste der Termine der nächsten 366 Tage.
  • "Liste" ist die Liste der tatsächlichen Eintragungen. Einen Eintrag in der Liste kann man anklicken und bekommt das Formular zum Ändern.
  • "Neu" ist ein leeres Formular.

Ein Termin (oder eine Vorwarnung oder eine Wiedervorlage) erzeugt zwei Minuten vor Fälligkeit eine Email an den User, der in der Konfigurationsdatei der IP-Adresse zugeordnet wurde. Wenn der Arbeitsplatzrechner jede Minute die Mails vom Server abholt, bleibt einem also gerade noch Zeit, sich die Krawatte zurechtzurücken.

Die Wiedervorlagen hören auf, sobald man eine der Mails beantwortet. Dafür braucht man ein Kapitel in /etc/procmailrc:

:0
* ^Subject: Re: Termin:
{
   :0 f
   | formail -A'X-Procmail: termin.cgi'
  
   :0
   | /usr/local/sbin/termincgi.sh
}

procmail ruft dann /usr/local/sbin/termincgi.sh auf:

#!/bin/bash
 
#Subject: Re: Termin: 21.10.2004 - 14:09 - asdfasdfsdfasdf ip:
 
while read LINE
do
  L2=`echo "$LINE" | grep 'Subject: Re: Termin: '`
  if [ -n "$L2" ]
  then
   datum=`echo "$LINE" | cut -c22-31`
   uhrzeit=`echo "$LINE" | cut -c35-39`
   txt=`echo "$LINE" | cut -c43-`
   txt=`echo "$txt" | sed -e 's/ ip: [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$//'`
   len=`echo "$LINE" | wc -c`
   ip=`echo "$LINE" | cut -c"$((len-20))"-"$len"`
   ip=`echo "$ip" | sed -e 's/^.*ip: //'`
   filename="/usr/lib/cgi-bin/WORLD_WRITABLE/termin${ip}.dat"
   linenum=`cat $filename \
    | egrep -n '^Datum.*'"$datum"'.*'"$uhrzeit"'.*'"$txt" \
    | sed -e 's/:.*$//'`
   cat $filename | sed -n "${linenum}p" \
    | sed -e 's/Wiedervorlage.[0-9]* [a-z,A-Z,.]*/Wiedervorlage|nein/' \
    >$filename.changed
   cat $filename | sed -e "${linenum}d" \
    >>$filename.changed
   cat $filename.changed >$filename
  fi
done

Wenn man einen Termin ändert oder neu einträgt (in dem Formular), muß man anschließend einen der vier Buttons drücken. Wenn man über einen Button des Browsers herausgeht, passiert zwar nichts Schlimmes, aber alte Termine werden bis zur nächsten Benutzung des CGIs nicht mehr automatisch gelöscht. Der Grund ist folgender: Wenn man das Formular in den Browser holt, wird eine Sperre gesetzt, so daß alte Termine nicht automatisch gelöscht werden. Das ist nötig, damit sich die Zeilennummern in der Liste nicht ändern können. Sonst kann es passieren, daß das CGI den Termin in die falsche Zeile steckt. Die Zeilennummer ist nämlich das einzige Merkmal, das man nicht ändern kann und woran das CGI den Termin wiedererkennt. Sobald man einen der vier Buttons drückt, oder wenn man das CGI neu aufruft, wird die Sperre wieder aufgehoben.

 

Download (ca. 150 K):

vom 25.12.2004: termincgi-0.2.7.tar.bz2 Signatur: termincgi-0.2.7.tar.bz2.sig

 

Abhängigkeiten:

  • ein CGI-fähiger Webserver, z.B. Apache
  • ein Cron-Dämon, z.B. cron oder fcron
  • ein Mailtransport-Agent, z.B. Exim oder Sendmail
  • das Berkeley-Mail-Utility (das Kommando "mail")
  • ein POP- bzw. IMAP-Server
  • procmail

(Bei Debian-Linux ist das dabei. Normalerweise hat man es auch ohnehin schon installiert, außer vielleicht Apache.)

 

Screenshots

termin1tn   termin2tn
termin3tn   Die Seite "Optionen"
ist noch nicht implementiert,
man muß die Optionen in die
Konfigurationsdatei eintragen.
abatz.de Jörn Abatz - Technische Software Impressum