Migration von Mac OS X Server mit iChat zu Openfire

Wer die Kontaktlisten (Roster) der Nutzer von Apples iChat-Server nach Openfire übertragen möchte, findet hier ein möglicherweise nützliches Programm. Achtung: Dieses Programm bitte nur dann benutzen, wenn eine externe Datenquelle für das Usermanagement genutzt wird (z.B. ein Active Directory) und User- und Group-Settings daher auf „read-only“ gesetzt sind! Ansonsten werden unter Umständen andere Userdaten wie z.B. das Passwort überschrieben.

Mac OS X Server bringt von Haus aus einen internen Chat-Dienst mit, der auf dem bekannten „jabberd“ beruht und das XMPP-Protokoll benutzt. Damit bietet er die Möglichkeit, mit einer relativ breiten Palette von Clients auf allen Betriebssystemen an diesem Chat teilzunehmen, nicht nur mit dem iChat-Client, bzw. in der neuesten Version dem Programm „Nachrichten“. Leider ist die Administration des Dienstes mit dem Server-Admin-Tool ziemlich rudimentär. Obwohl er sehr gut in die OpenDirectory-Umgebung eingebunden ist, so dass keine wirkliche Userverwaltung anfällt, gibt es nur wenig Möglichkeiten, das Chat-System selbst zu administrieren (Konferenzräume, Policies u.ä.).

Da wir sowieso das OpenDirectory aus diversen Gründen gerade gegen einen echten AD austauschen, waren wir auch auf der Suche nach einem unabhängigen XMPP-Server und sind dabei auf Openfire gestoßen.

Openfire lässt sich auf einem passenden Linux-System in wenigen Minuten sehr einfach aufsetzen. Eine JRE bringt er mit, als weitere Voraussetzung ist eigentlich nur eine Datenbank sinnvoll (aber nicht zwingend notwendig). Unterstützt werden z.B. MySQL und PostgreSQL. Auf die Installation möchte ich an dieser Stelle auch nicht im Detail eingehen, genauere Informationen findet man auf der Webseite von „ignite realtime„.

Wir betreiben Openfire mit einer Anbindung an ein Active Directory. Damit sind sofort alle User in Openfire verfügbar, allerdings fehlen noch alle Informationen, die ein User zu den Kontakten gespeichert hatte (z.B. die Kontaktliste, Aliasnamen, Gruppen usw.). Da ich nichts gefunden habe, wie man diese Informationen aus iChat nach Openfire überträgt, habe ich selber was geschrieben. 🙂

Der iChat-Server von Mac OS X Server beruht auf dem jabberd. Zur Speicherung der Nutzerdaten benutzt er eine Dateibasierte SQLite3-Datenbank (/private/var/jabberd/sqlite/jabberd2.db), die man mit Python und dem sqlite3-Modul bequem öffnen und über den DBAPI-Treiber befragen kann. Das Programm „export_ichat_user.py“ macht genau dieses und erzeugt daraus eine XML-Datei, die sich mit dem „User Import Export“-Plugin verarbeiten lässt. Beim Betrieb an einem AD werden nur die Daten der Kontaktliste (Roster) verarbeitet, so dass alle anderen Tags zwar vorhanden aber leer sind (beim Fehlen der Tags weigert sich das Plugin, die Datei zu verarbeiten). Zusätzlich kann man dem Programm noch eine Liste von aktiven Usern mitgeben (in der Datenbank von iChat sind auch alle User enthalten, die schon längst nicht mehr existieren). Diese Liste besteht aus den Loginnamen (wie sie in <loginname>@<jabber-server> vorkommen und sind flach in einer Datei zu speichern (ein Name pro Zeile). Man kann auch einen einzelnen User angeben, für den man eine Import-XML erzeugen möchte.

Der ebenfalls genutzte XML-Parser wurde mit „generateDS“ erzeugt.

Das Programm befindet sich aktuell im Status „works for me“. 🙂 Ich gebe es also gerne weiter, kann aber nicht garantieren, dass es bei jedem läuft. Die benutzte Python-Version ist 2.7 (MacPorts).

Der Aufruf ist wie folgt (-h für Hilfe):

export_ichat_user.py [-dhnv] [-a active_users.lst] [-u user] [-r service] [-o file] sqlite-db

Die Datei „active_users.lst“ enthält eine Liste von Usern, die übertragen werden sollen (optional). Der Schalter „-u user“ führt den Export nur für den User „user“ aus. Wenn man den Servicenamen (z.B. example.com in user@example.com) ändern möchte, so kann man mit „-r john.doe“ die JID’s in der Kontaktliste nach „user@john.doe“ konvertieren. Die erzeugte XML-Datei wird mit dem Schalter „-o filename“ nach „filename“ geschrieben, sonst nach StdOut. „sqlite-sb“ ist die von iChat verwendete Datenbank (immer auf Kopien arbeiten!!).

Eine Liste aktiver User aus dem OpenDirectory kann man sich auf der Kommandozeile des Mac OS X Server mit folgendem kleinen Script holen:

#!/bin/bash

for i in `dscl /LDAPv3/127.0.0.1 -list /Users`
do
      pol=`pwpolicy -u $i -getpolicy 2>/dev/null`
      echo „$pol“ | grep -q „isDisabled=1“
      if [ $? -ne 0 ]
      then
            echo „$i“
      fi
done

Download: export_ichat_user.tar.gz