Kalender und Adressbücher zwischen Linux Konsole und Android synchronisieren

Geschrieben von Eric Scheibler am 14.10.2014

Kalender und Adressbücher enthalten zweifellos sehr sensible Daten. Wer Wert auf seine Privatsphäre legt, ist daher gut beraten, wenn er diese Daten nicht mit Firmen wie Google und Apple teilt. Um die Datensätze dennoch zwischen mehreren Endgeräten synchron zu halten, muss ein eigener Kalender- und Adressbuchserver betrieben werden.

Dieser Artikel geht zunächst auf die Einrichtung des Kalender- und Adressbuchservers ein und stellt anschließend Kalender- und Adressbuchanwendungen für die Linux Konsole und das Android Betriebssystem vor.

Inhaltsverzeichnis

Kalender- und Adressbuchserver

Bei der Wahl der Serveranwendung kann man sich unter anderem zwischen OwnCloud, Baïkal und Darwin Calendar Server entscheiden. Ich habe lange Zeit den zuletzt genannten verwendet und dessen Einrichtung an dieser Stelle beschrieben. Inzwischen bin ich allerdings auf Baikal umgestiegen. Baikal ist sehr einfach einzurichten und bringt auch eine Weboberfläche zum anlegen neuer Kalender und Adressbücher mit.

Baikal

Für den Betrieb von Baikal wird ein Webserver benötigt. Ich verwende LightTPD. Eine Installationsanleitung findet sich in diesem früheren Blogeintrag (ist allerdings nicht mehr taufrisch). Alternativ wird man bei ubuntuusers oder im ArchWiki fündig. Im weiteren Verlauf dieses Tutorials wird vorausgesetzt, dass der Webserver verschlüsselte Verbindungen via SSL akzeptiert. Dieser Artikel hilft beim Erstellen eines eigenen SSL Zertifikats.

Wenn der Webserver läuft, installiert man als nächstes SQLite:

sudo aptitude install sqlite php5-sqlite

Nun von der Baikal Webseite den aktuellen Release herunterladen und in das Webserververzeichnis kopieren:

cd /tmp
wget http://baikal-server.com/get/baikal-flat-0.2.7.zip
unzip baikal-flat-0.2.7.zip
sudo mv baikal-flat /var/www/baikal
sudo chown -R www-data:www-data /var/www/baikal

Um die Einrichtung des Kalenderservers starten zu können, muss noch die folgende Datei angelegt werden:

sudo touch /var/www/baikal/Specific/ENABLE_INSTALL
sudo chown www-data:www-data /var/www/baikal/Specific/ENABLE_INSTALL

Mit dem Besuch von https://example.org/baikal/admin/ startet man anschließend Baikal's Einrichtungsassistent und legt u. a. ein Admin Passwort fest. Nach Abschluss des Assistenten loggt man sich als Admin ein und legt einen neuen Benutzer an. Für diesen Benutzer lassen sich dann beliebig viele Adressbücher und Kalender erstellen.

DynDNS

Wenn der Server zu Hause betrieben wird, ist die Einrichtung einer DynDNS Domain von Vorteil. So ist der Server auch von unterwegs aus zu erreichen. Ich nutze dafür den kostenlosen Dienst von no-ip.com.

Wer hingegen keine Möglichkeit hat, einen eigenen Server zu betreiben, kann auf datenschutzfreundliche Anbieter wie beispielsweise Fastmail oder Posteo zurückgreifen.

Linux Konsole

In diesem Abschnitt folgen die Instruktionen für die Linux Konsole. Dieser Artikel bezieht sich dabei vornehmlich auf Debian aber die vorgestellten Programme sollten auch unter den meisten anderen Distributionen lauffähig sein.

Zunächst werden die Kalender und Adressbücher mit dem Programm vdirsyncer vom Server auf den Client übertragen. Anschließend folgt die Vorstellung einer Adressbuch-, sowie einer Kalenderanwendung. Beide Programme sind ausschließlich für die Konsole vorgesehen und benötigen keine GUI.

Voraussetzungen

Bevor die Einrichtung der einzelnen Programme beginnen kann, müssen die folgenden Voraussetzungen erfüllt sein:

sudo aptitude install git python-setuptools
sudo easy_install pip
sudo pip install virtualenv

Setuptools wird vornehmlich zur Installation von pip benötigt. Mit pip werden im weiteren Verlauf die benötigten Python Pakete installiert. Mit virtualenv wird für jedes Programm eine eigene Python Umgebung erstellt. Auf diese Weise können auf einem System verschiedene Versionen eines Python Moduls verwendet werden, ohne dass sie sich gegenseitig stören. Des weiteren kann ein installiertes Programm rückstandslos entfernt werden. Dazu muss lediglich der Ordner mit der virtuellen Pyhton Umgebung gelöscht werden.

Zunächst wird ein Verzeichnis für die virtuellen Umgebungen angelegt:

mkdir ~/.virtualenvs

Außerdem wird ein Unterverzeichnis für die ausführbaren Dateien gebraucht:

mkdir ~/.virtualenvs/bin

Das Verzeichnis muss schließlich noch der Pfadvariable der Shell hinzugefügt werden. Beispiel für die ZSH:

vim ~/.zshrc
[...]
# add ~/.virtualenvs/bin to the path variable
if [ -d "$HOME/.virtualenvs/bin" ] ; then
    PATH="$HOME/.virtualenvs/bin:$PATH"
fi
[...]

Im weiteren Verlauf des Artikels wird für jedes installierte Programm eine eigene virtuelle Umgebung eingerichtet und ein Link von der ausführbaren Programmdatei in das angelegte bin Verzeichnis erstellt. Wer darüber hinaus an zusätzlichen Informationen über virtualenv interessiert ist, wird beispielsweise hier fündig.

Vdirsyncer

Vdirsyncer dient zur Synchronisation der Termine und Kontakte zwischen Client und Server. Die Installation erfolgt durch:

# wechsle in das virtualenv Verzeichnis
cd ~/.virtualenvs
# erstelle eine neue virtuelle Umgebung mit dem Namen vdirsyncer
virtualenv vdirsyncer
# installiere vdirsyncer unter Verwendung der lokalen pip Version
./vdirsyncer/bin/pip install vdirsyncer
# lege den symlink an
ln -s ~/.virtualenvs/vdirsyncer/bin/vdirsyncer ~/.virtualenvs/bin

Als nächstes muss die Beispielkonfigurationsdatei heruntergeladen:

mkdir ~/.config/vdirsyncer/
wget -O ~/.config/vdirsyncer/config https://github.com/untitaker/vdirsyncer/raw/master/example.cfg

und das Programm konfiguriert werden:

vim ~/.config/vdirsyncer/config

Der Inhalt der Config Datei sollte etwa folgendermaßen aussehen:

# An example configuration for vdirsyncer.

[general]
# A folder where vdirsyncer can store some metadata about each pair.
status_path = ~/.config/vdirsyncer/status/

# CARDDAV
[pair contacts]
a = contacts_local
b = contacts_remote
collections = ["familie", "freunde"]
conflict_resolution = a wins

[storage contacts_local]
type = filesystem
path = ~/.contacts/
fileext = .vcf

[storage contacts_remote]
type = carddav
url = https://example.org/baikal/card.php/addressbooks/YOURUSERNAME/
auth = digest
verify = /etc/ssl/local/example.org.pem
username = YOURUSERNAME
password = YOURPASSWORD

# CALDAV
[pair calendar]
a = calendar_local
b = calendar_remote
collections = ["calendar", "feiertage", "geburtstage"]
conflict_resolution = a wins

[storage calendar_local]
type = filesystem
path = ~/.calendars/
fileext = .ics

[storage calendar_remote]
type = caldav
url = https://example.org/baikal/cal.php/calendars/YOURUSERNAME/
auth = digest
verify = /etc/ssl/local/example.org.pem
username = YOURUSERNAME
password = YOURPASSWORD

In der obigen Beispielkonfiguration wurden neben dem Standardkalender bereits zwei weitere Kalender (Feiertage und Geburtstage) angelegt. Bei den URL's müssen lediglich noch der Hostname und der verwendete Benutzername ersetzt werden. Ein abweichender Kalender- und Adressbuchserver benötigt gegebenenfalls auch ein etwas anderes URL Schema.

Sofern ein selbst signiertes SSL Zertifikat für die Absicherung des Kalenderservers verwendet wird, muss dieses clientseitig bereitgestellt werden. Dazu wird das Zertifikat auf den Client kopiert und im Ordner /etc/ssl/local abgelegt (siehe "verify" Option in der vdirsyncer Konfigurationsdatei). Der Ordner ist gegebenenfalls zuvor zu erstellen.

Nach der Konfiguration erfolgt die manuelle Synchronisation mittels:

vdirsyncer sync

Schließlich empfiehlt es sich, einen Cronjob anzulegen, der die Kalender und Adressbücher stündlich synchronisiert:

crontab -e
[...]
0   *   *   *   * $HOME/.virtualenvs/bin/vdirsyncer sync

Weitere Informationen über vdirsyncer sind hier zu finden.

Khard

Khard ist eine Konsolenanwendung zur Verwaltung von Kontaktinformationen im vCard-Format. Mit khard können neue Kontakte angelegt und bisherige Kontakte angezeigt, bearbeitet und gelöscht werden. Des weiteren kann khard als externes Adressbuch in die E-Mail Programme Mutt und Alot sowie in den SIP Client Twinkle integriert werden.

Khard wird folgendermaßen installiert:

cd ~/.virtualenvs
virtualenv khard
./khard/bin/pip install khard
ln -s ~/.virtualenvs/khard/bin/khard ~/.virtualenvs/bin

Als nächstes muss khard's Beispielkonfigurationsdatei in den Ordner ~/.config/khard/ kopiert und bearbeitet werden:

mkdir ~/.config/khard/
wget -O ~/.config/khard/khard.conf https://github.com/scheibler/khard/raw/master/khard.conf.example

Die "addressbooks" Sektion enthält die Pfade zu allen, in der vdirsyncer Config spezifizierten Adressbüchern. Zusätzlich muss u. a. der Pfad zu einem häufig verwendeten Texteditor angegeben werden. Dieser wird für die Bearbeitung der Kontakte benötigt.

Mit dem folgenden Befehl können nun alle verfügbaren Kontakte in einer Übersicht angezeigt werden:

khard list

Ohne weitere Parameter werden die Kontakte aus allen Adressbüchern angezeigt. Eine Filterung ist folgendermaßen möglich:

khard list -a familie,freunde

Auch eine Suche ist möglich:

khard list -s max

Die Übersicht zeigt nur die erste Telefonnummer und E-Mail Adresse an. Mit dem Details-Befehl lassen sich alle unterstützten Informationen abrufen

khard details

Ein neuer Kontakt ist wie folgt anzulegen:

khard new -a freunde

Das Formular für das Erstellen des neuen Kontakts öffnet sich im angegebenen Texteditor. Nach dem Ausfüllen und Speichern wird der neue Kontakt angelegt. Um den Vorgang abzubrechen müssen die Felder Vorname, Nachname und Organisation leer gelassen werden. Mit den Befehlen

khard modify

und

khard remove

kann der erstellte Kontakt bearbeitet bzw. gelöscht werden. Nach jeder Änderung muss die Synchronisation mittels vdirsyncer sync manuell ausgeführt werden.

Khard kann auch als externes Adressbuch für dem E-Mail Client Mutt und den SIP Client Twinkle dienen. Weitere diesbezügliche Informationen sind der Readme-Datei von khard zu entnehmen.

Khal

Khal ist eine Kalenderanwendung für die Linux Konsole. Mit khal können Termine im CalDAV-Format angezeigt, erstellt und gelöscht werden. Khal greift auf die lokalen Dateien im .ics Format zu, welche zuvor von vdirsyncer übertragen wurden.

Installation:

cd ~/.virtualenvs
virtualenv khal
./khal/bin/pip install khal
ln -s ~/.virtualenvs/khal/bin/khal ~/.virtualenvs/bin

Config Datei kopieren und anpassen:

mkdir ~/.config/khal
wget -O ~/.config/khal/khal.conf https://github.com/geier/khal/raw/master/khal.conf.sample

Der Aufbau der Konfigurationsdatei ähnelt dem von khard und sollte selbsterklärend sein. Nach erfolgreicher Konfiguration können die Termine für die nächste Woche wie folgt angezeigt werden:

khal agenda --days=7

Oder auch nur ein Kalender:

khal agenda --days=7 -a feiertage

Mit dem folgenden Befehl wird ein einmaliger Termin am 09.11. des aktuellen Jahres angelegt, welcher um 14:00 beginnt und 16:00 endet:

khal new -a calendar -l "optionaler Ort" 09.11. 14:00 16:00 Titel des Termins

Dies erstellt einen ganztägigen, sich jährlich wiederholenden Termin am 19.02.,

khal new -a geburtstage -r yearly 19.02. Geburtstag von Max

Weitere Informationen über khal gibt's hier.

Kalender importieren

Einige Webseiten bieten ihre Kalender im CalDAV-Format als Abonnement an. Diese können dann beispielsweise unter Android oder iOS hinzugefügt werden. Dann werden sie allerdings nicht vom heimischen Kalenderserver verwaltet und stehen somit nicht unter Linux zur Verfügung. Der folgende Abschnitt beschreibt anhand eines Feiertage-Kalenderabonnements für Deutschland den Import ganzer Kalender unter Verwendung der Linux Konsole.

Unter www.ifeiertage.de können alle deutschen Feiertage für die nächsten Jahre im CalDAV-Format heruntergeladen werden. Das Ergebnis ist allerdings eine einzelne Textdatei, welche alle Termine enthält. Da der calendarserver nur einen Termin pro Datei unterstützt muss die heruntergeladene Datei zunächst aufgeteilt werden. Dazu wird das Skript split_vcalendar.py benötigt:

cd ~/.local/bin
wget http://eric-scheibler.de/downloads/split_vcalendar.py
chmod +x split_vcalendar.py

Nun gegebenenfalls einen neuen Kalender anlegen und in der vdirsyncer Datei eintragen. Als nächstes wird der Feiertage-Kalender für das jeweilige Bundesland heruntergeladen und aufgeteilt. Die einzelnen Dateien werden schließlich in den Kalenderordner verschoben. Als Beispiel dient an dieser Stelle der Feiertage-Kalender des Bundeslandes Sachsen:

cd /tmp
wget -O feiertage.ics http://www.ifeiertage.de/calendar.php\?bl\=sn\&o\=o1\&o2\=sonder\&o4\=zeitum\&t\=dnl
split_vcalendar.py feiertage.ics feiertage
mv feiertage/*.ics ~/.calendars/feiertage/
vdirsyncer sync

Android

Android bringt von Haus aus keinen CalDAV und CardDAV Support mit. Dazu müssen zunächst die Apps CalDAV-Sync und CardDav-Sync aus dem Play Store installiert werden. Erstere kostet etwa 2 Euro. Von der zweiten App gibt's auch eine kostenlose Version. Beide Apps integrieren sich als Sync-Adapter in das Android System und können somit problemlos innerhalb anderer Kalender- und Adressbuchapps verwendet werden. Für Android 4.1 und 4.4 werden zusätzlich noch JB Workaround CalDAV-Sync und JB Workaround CardDAV-Sync benötigt. Diese beheben lediglich einen Bug in Android, wonach die angelegten Adressbuch- und Kalenderkonten vom System nach einem App-Update gelöscht werden. Die Apps müssen nach der Installation lediglich einmal gestartet werden.

Als nächstes muss das SSL Zertifikat des Kalenderservers importiert werden. Dazu loggt man sich zunächst auf dem Server ein und konvertiert das Zertifikat in's Binärformat:

openssl x509 -in /etc/ssl/local/example.org.pem -outform DER -out /tmp/example.org.crt

Dann wird es auf die SD-Karte des Smartphones kopiert, zum Beispiel mit adb:

adb push /tmp/example.org.crt /sdcard/

Schließlich importiert man es in den Android Einstellungen unter "Sicherheit" -> "Von SD-Karte installieren".

Nach der Installation wird in den Einstellungen unter Konto hinzufügen -> CalDAV -> CalDAV ein neues CalDAV-Konto angelegt. Im folgenden Dialog müssen die Eingabefelder für die Serveradresse im Format https://example.org/baikal/cal.php, sowie Benutzername und Passwort ausgefüllt werden. SSL ist bereits aktiviert. Nach erfolgreicher Verbindung müssen die zu synchronisierenden Kalender ausgewählt und in einem letzten Schritt die zugeordnete E-Mail Adresse eingetragen werden. Des weiteren kann durch das Anhaken einer Checkbox eingestellt werden, dass Termine nur vom Server zum Gerät synchronisiert werden. Dies vermeidet zwar Konflikte, ist aber nicht zu empfehlen, wenn neue Termine auch auf dem Smartphone angelegt werden sollen.

Die Synchronisationseinstellungen können später entweder über Einstellungen -> CalDAV -> Kontoeinstellungen bearbeiten oder durch den Start der CalDAV-Sync App geöffnet werden. Dort kann u. a. auch die Liste der abonierten Kalender angepasst werden. Für das Anzeigen der synchronisierten Termine eignet sich die bereits installierte Kalender App. Für die optimale Nutzung mit dem Screen Reader Talkback empfhielt sich der Wechsel des Kalenderlayouts auf "Terminübersicht". Dies ist in der Combobox am oberen Rand der Kalender App einstellbar.

Die Einrichtung der CardDAV-Synchronisation gestaltet sich ähnlich. Das CardDAV Konto wird unter Einstellungen -> Konto hinzufügen -> CardDAV -> CardDAV angelegt. Als Serveradresse ist dieses Mal https://example.org/baikal/card.php einzutragen. Ansonsten werden die gleichen Daten wie bei der Einrichtung des CalDAV Kontos verwendet. Anschließend folgt die Auswahl eines Adressbuchs und daraufhin die Eingabe von dessen E-Mail Adresse. Die Zweiwege-Synchronisation der Kontaktdaten wird vom Entwickler der App momentan als beta eingestuft und ist somit standardmäßig nicht aktiviert. Ich habe sie allerdings in Verwendung und inzwischen sowohl Kontakte auf dem Telefon wie auch unter der Linux Konsole erstellt. Bisher gab es mit deren Synchronisation noch keine Probleme

Um ein weiteres Adressbuch hinzuzufügen, muss der beschriebene Prozess allerdings im Gegensatz zur CalDAV Einrichtung erneut komplett durchlaufen werden. Anschließend sind die synchronisierten Kontaktdaten in der mitgelieferten Kontakte App zu finden. Dort ist es auch möglich, neue Kontakte anzulegen und zu bearbeiten.

Vor einem Neustart des Systems müssen die beiden installierten Workaround-Apps noch einmalig gestartet und direkt wieder geschlossen werden, um das Löschen der zuvor angelegten Konten zu verhindern.