Donnerstag, Januar 14, 2010

Mac OS X Server, iCal Server Nirvana

iCal Server

Wer einen Mac OS X Server betreibt, hat die eigentlich bequeme Möglichkeit, einen iCal Server zu starten. Nur wenn man nicht die Dokumentation sorgfältig studiert und meint, ein Knopfdruck genügt, der wird eines besseren belehrt. Was nach einem fünf Minuten Job aussieht, wird zu einem Nirvana durch Foren verzweifelter Leidesgenossen, die ähnliches vorhaben.

Das Hauptproblem, an dem die meisten Leute verzweifen, ist die eingestellte Konfiguration: man muss zuvor einen Open Directory (OD) korrekt konfiguriert haben. Weiter muss der Hostname vom DNS vollständig auflösbar sein (vorwärts und rückwärts). Dann muss man die User in den Open Directory pflegen. In meinem Fall ging das nicht mehr, da ich den OpenLDAP Server schon für meine Zwecke konfiguriert habe. Falls man dies macht, erhält folgendes ausdrucksstarken Fehler:

calendar:error = "NO_VIRTUAL_HOST_ERR"

Lösung für Mac OS X

Dabei ist es ganz einfach. Okay, nicht so einfach, aber wesentlich einfacher. Der iCal Server ist ja OpenSource. Er besteht aus einem Python-Skript. Daher ist es besser, eine eigene Version zu erstellen:

  • CalendarServer herunterladen
  • ggf. Bugfix für Python Installer und subversion 1.5 lösen
  • Installieren
  • Konfigurieren
  • Fertig

CalendarServer herunterladen

Zunächst wird der Quellcode frisch ausgecheckt. Die Verzeichnisangaben sollten natürlich auf eigene Bedürfnisse geändert werden.

#> mkdir -p ~/Developer/CalendarServer
#> cd ~/Developer/CalendarServer
#> svn checkout http://svn.macosforge.org/repository/calendarserver/
CalendarServer/trunk CalendarServer

Jetzt müssen noch die zusätzlich benötigten Pakete erstellt bzw. heruntergeladen werden. Das erledigt ein Skript für uns.

#> cd CalendarServer
#> ./run -s

Das Skript erstellt jede Menge übergeordnete Verzeichnisse. Nun kann es vorkommen, dass bereits jetzt im Zusammenhang mit subversion 1.5 ein merkwürdiger Fehler gemeldet wird: NameError: global name 'log' is not defined. Abhilfe schafft ein from distutils import log in der Datei /System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib /python/setuptools/command/sdist.py
Hat man auch dieses Problem gelöst, kann es mit einer Test-Konfiguration losgehen:

#> cp ./conf/caldavd-test.plist ./conf/caldavd-dev.plist
#> ./run

Das Gute ist nun, man benötigt keinen OD mehr. Es reicht eine bloße xml-Datei. Scheinbar kann man auch eine sqlite3-Datenbank ansprechen. Nur, wenn man eine neue Person hinzufügt, bekommt caldacd dies nicht mit. Der Server muss einmal neugestartet werden. Will man das nicht, so muss man doch eine OD nehmen oder man programmiert das XML-Directory-Skript um.

CalendarServer installieren

Mit ./run -i ~/CalendarServer ist es möglich, den iCal Server an den Ort ~/CalendarServer zu installieren. Ist bei Mac OS X Server eine gute Idee, da wir dort bereits einen haben, der nicht läuft. (Ja, theoretisch können wir auch den benutzen. Wir müssen ja nur die Konfigurationsdatei /etc/caldavd/caldavd.plist anpassen. Aber wir sind jetzt schon soweit gegangen, jetzt machen wir den Rest auch noch! Außerdem merkert das Server-Admin-Programm beim Starten trotz allem für den nicht vorhandenen virtuellen Hostnamen). Hierbei stellen wir fest, dass nicht alle Pfade vom run Programm übernommen wurden. In Skript caldavd sind noch alte Pfade enthalten. Insbesondere die Umgebunsvariable PYTHONPATH muss noch per Hand angepasst werden. Ebenso wird beim Starten feststellen, dass memcached vom iCal Server zur Laufzeit nicht gefunden wird.

Das ganze löst man erfolgreich, in dem man die PYTHONPATH Variable in caldavd anpasst und zum Beispiel in PATH den Pfad zu memcached hinzufügt. memcached befindet sich im ~/Developer/CalendarServer Verzeichnis und wurde vom Setup-Skript zuvor dort abgelegt.

#> export PATH=/.../CalendarServer/usr/local/bin:$PATH
#> export PATH=/.../Developer/memcached-1.2.6/_root/bin:$PATH
#> caldavd -X -f /.../System/Library/Frameworks/Python.framework/Versions/2.5/
caldavd/caldavd.plist

Nun läuft der iCal Server mit der angegeben Konfigurationsdatei bis Control-C gedrückt wird...

Gruppen-Kalendar gibt es zur Zeit nicht!

Ja, einen Tag versucht, aber Gruppen werden nicht unterstützt. Ich hatte ja vor, einen Gruppenkalendar einzurichten, so dass jedes Gruppenmitglied dort eine Zeiten eintragen kann. Wurde aber abgeschafft, da scheinbar keiner diese Funktionalität benutzt:
http://trac.calendarserver.org/ticket/330