RadicaleCalDAVServer
Radicale CalDAV Server
CalDAV ist eine Erweiterung des WebDAV- (und damit des HTTP-) Protokolls, um Kalenderdaten (Termine und Aufgaben) auf einem Server zu speichern.
Apple nutzt diese Protokoll für seine Clients (iCal-Anwendung und Kalender-App auf dem iPhone) und bietet einen entsprechenden Server an. Dadurch gewinnt CalDAV zunehmende Bedeutung.
Wenn man freie Software einsetzen will, bieten sich folgende Anwendungen an:
- Das Lightning-Plugin für Thunderbird (unter Linux und Windows)
- aCal als Android-App
In diesem Artikel wird die Installation eines CalDAV-Server in einem normalen Hostsharing-Paket beschrieben, als leichtgewichtigen Server nutze ich den Radicale CalDAV Server. Der Server kann mit Hilfe von Flup als FastCGI Server betrieben werden.
Installation
Vorbereitung
Ich lege mit HSAdmin einen User xyz00-cal an und schalte eine Domain cal.example.org auf.
Download und Entpacken der Pakete
- Radicale Download: [1], die aktuelle Version beim Schreiben des Artikel: 0.6.3
- Flup Download: [2], aktuell ist heute: 1.0.2
als User xyz00-cal:
wget http://www.saddi.com/software/flup/dist/flup-1.0.2.tar.gz wget http://pypi.python.org/packages/source/R/Radicale/Radicale-0.6.3.tar.gz tar xzf flup-1.0.2.tar.gz tar xzf Radicale-0.6.3.tar.gz
Installation der Python Eggs
Die Eggs sollen jeweils im Verzeichnis des aktuellen Users installiert werden. Der Aufruf des Setup-Skripts dazu:
cd ~/flup-1.0.2 python setup.py install --user cd ~/Radicale-0.6.3 python setup.py install --user
Danach sollten sich im Unterverzeichnis ~/.local/ die entsprechenden Python-Skripte finden:
ls -l ~/.local/bin/ ~/.local/lib/python2.6/site-packages/
/home/pacs/xyz00/users/cal/.local/bin/: total 4 -rwxr-xr-x 1 xyz00-cal xyz00 1001 Dec 28 12:04 radicale /home/pacs/xyz00/users/cal/.local/lib/python2.6/site-packages/: total 12 -rw-r--r-- 1 xyz00-cal xyz00 1797 Dec 28 12:04 Radicale-0.6.3.egg-info -rw-r--r-- 1 xyz00-cal xyz00 208 Dec 28 12:01 easy-install.pth drwxr-xr-x 4 xyz00-cal xyz00 32 Dec 28 12:01 flup-1.0.2-py2.6.egg drwxr-xr-x 3 xyz00-cal xyz00 4096 Dec 28 12:04 radicale
FastCGI Konfiguration
Wir wechseln in das Domain-Verzeichnis ~/doms/cal.example.org/. Dort legen wir folgende Dateien an:
~/doms/cal.example.org/fastcgi/radicale.fcgi bzw. ~/doms/cal.example.org/fastcgi-ssl/radicale.fcgi
#!/usr/bin/env python from flup.server.fcgi import WSGIServer import radicale radicale.log.start() app = radicale.Application() WSGIServer(app).run()
ACHTUNG: Nicht vergessen, die fcgi-Skripte ausführbar zu machen!
~/doms/cal.example.org/htdocs/.htaccess bzw. ~/doms/cal.example.org/htdocs-ssl/.htaccess
AuthType Basic AuthName "Radicale Calendar Server" require valid-user AuthUserFile /home/pacs/xyz00/users/cal/.htpasswd RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} radicale.fcgi$ RewriteRule ^(.*)$ /fastcgi-bin/radicale.fcgi [QSA,L]
Es fehlt noch das Anlegen der ~/.htpasswd-Datei mit den verschlüsselten Passworten der User. Dazu rufen wir (für die User hans und franz) folgendes Kommando auf (htpasswd -c erzeugt die Datei):
htpasswd -c ~/.htpasswd hans htpasswd ~/.htpasswd franz ...
An dieser Stelle sollte ein Aufruf von http://cal.example.org im Browser nach Eingabe des Passwortes für hans oder franz die folgende Seite liefern: Radicale works!
Radicale Konfiguration
Zuletzt bleibt noch die Erstellung einer Konfigurationsdatei für den Radicale-Server. Ein Template für die Datei findet Ihr in ~/Radicale-0.6.3/config.
Hier der Inhalt meiner ~/.config/radicale/config:
# Config file for Radicale - A simple calendar server # Place it into ~/.config/radicale/config (user) [encoding] request = utf-8 stock = utf-8 [acl] # Value: None | htpasswd | LDAP type = None [storage] # Folder for storing local calendars, created if not present folder = ~/.config/radicale/calendars [logging] # Logging configuration file # For more information about the syntax of the configuration file, see: # http://docs.python.org/library/logging.config.html config = ~/.config/radicale/logging # Set the default logging level to debug debug = False # Store all environment variables (including those set in the shell) full_environment = False
Hier der Inhalt meiner ~/.config/radicale/logging:
[loggers] keys = root [handlers] keys = file [formatters] keys = full [logger_root] level = INFO handlers = file [handler_file] class = FileHandler args = ('/home/pacs/xyz00/users/cal/var/radicale.log',) formatter = full [formatter_full] format = %(asctime)s - %(levelname)s: %(message)s
Nutzung der Kalender
Zugriffsrechte
Zu diesem Zeitpunkt können die User hans und franz jeweils auf alle Kalender zugreifen. In einer größeren Organisation ist das sicher nicht ausreichend.
Im der oben beschriebenen Konfiguration überlässt man die Zugriffskontrolle am besten dem Apache-Webserver. Das kann man einfach über die bereits vorhandene .htaccess-Datei regeln:
AuthType Basic AuthName "Radicale Calendar Server" AuthUserFile /home/pacs/peh06/users/cal/.htpasswd <FilesMatch "^hans"> require user hans </FilesMatch> <FilesMatch "^franz"> require user franz </FilesMatch> <FilesMatch "^team"> require valid-user </FilesMatch> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} radicale.fcgi$ RewriteRule ^(.*)$ /fastcgi-bin/radicale.fcgi [QSA,L]
So können beide User jeweils eigene Kalender anlegen, z.B:
- /hans/privat
- /hans/aufgaben
- /franz/kalender
Unter dem Pseudouser team können gemeinsame Kalender verwaltet werden:
- /team/meetings
- /team/seminarraum
Mit einer zusätzlichen Datei .htgroups kann man auch komplexere Szenarien implementieren.
Client Konfiguration
Ich selbst verwende das Lightning-Plugin zu Thunderbird und aCal als Android-App.
Lightning
Hier kann man jeden einzelnen Kalender mit seiner vollständigen URL abonnieren.
Über die Funktion "Create Calendar":
- "On the Network"
- "CalDAV" mit "Location": http://cal.example.org/franz/privat
- Namen vergeben und Farbe wählen
- ggf. noch User und Passwort angeben
- das war's
aCal
Bei den Einstellungen "erweitert" auswählen.
- Benutzername
- Passwort
- Servername: cal.example.org
- ServerPfad: /franz/
- Authentifizierungsmethode: Basic
- SSL verwenden: Ja, falls passendes Zertifikat für HTTPS installiert
- Serverport: 80 bzw. 443