CardDAV – 6 Jahre später

Auch am Beispiel CardDAV sieht man, dass der Lifecycle von vielen Produkten – auch Software – eher zu- als abnimmt. Die mittlerweile erreichte Komplexität lässt schnelle Lebenszyklen eher nicht mehr zu, schon gar nicht, wenn es sich um kollaborative Werkzeuge handelt die nur auf einem Standard basieren und dementsprechend mannigfaltig implementiert werden.

Heute wird der aktuelle CardDAV Stand anhand von 3 Tools beleuchtet, die einige Überraschungen bieten.

Seit meinem Umstieg von iOS auf Android bei den mobilen Plattformen suchte ich dort nach einer guten CalDAV/CardDAV Implementation, da es auf Android (und übrigens auch nicht auf Samsung Adaptionen) keine Referenzimplementation gibt.

Fündig – und mittlerweile auch glücklich – wurde ich mit DavDroid von Bitfire , das nur eine DAV Datenschnittstelle bereitstellt, die beliebige Kalender oder Kontakttools bedient.

Mittlerweile glücklich, da das Tool anfänglich bei mir auch nicht fehlerfrei arbeitete. Die Synchronisierung hing sich teilweise auf, was aber schon lange her ist. Zudem wurde ein Feature eingebaut, welches die Synchronisation auf ein bestimmtes Netzwerk (WLAN SSID) beschränkt. Dann gab es lange einen Fehler mit doppelten Einträgen, was allerdings spätestens mit Version 1.9.1 gelöst wurde. Der derzeitige Stand ist 1.10 und in all den Versionen seit 1.0 floßen eine Menge Bugfixes und Verbesserungen in akzeptabler Zeit ein.

Auf den Linux Plattformen kommt benötigt Thunderbird ein Plugin für CardDAV – was bisher der sog. SOGO-Connector darstellte.  Prinzipiell funktionierte er ordentlich, konnte aber während einer laufenden Thunderbird Instanz nicht resynchronisieren. Außerdem ist in dieser Konstellation auch das native Thunderbird Adressbuch, welches durch den Connector beliefert wird nicht ideal, da es mit dem CardDAV Standard RFC6352 nicht unbedingt harmoniert.

Glücklicherweise kommt mit dem CardBook Plugin für Thunderbird eine tolle neue Alternative ins Spiel, die parallel zum nativen Adressbuch ein zweites Adressbuch – voll auf CardDAV Basis – anbietet. Dieses Plugin lässt kaum Wünsche offen und läuft sehr stabil…

..so stabil, dass nun Thunderbird mit dem CardBook Plugin auch auf macOS zum bevorzugten Setup wird, denn das Apple-eigene Adressbuch (Contacts) ist schlechter als je zuvor.

Apple hat es tatsächlich geschafft die CardDAV Funktionalität seines Adressbuchs völlig zu ruinieren. Es ist seit Version 10.10 nicht mehr möglich mehr als ein Adressbuch von einem Server abzurufen. Desweiteren ist die eigenen Benennung fehlerhaft implementiert und die Synchronisation bricht immer wieder ab ohne einen konkreten Fehler zu bennenen. Das hinterlässt ein unvollständiges Adressbuch mit fehlenden Einträgen – an eine Synchronisation in Serverrichtung ist daher gar nicht mehr zu denken, zumal obendrein das Programm seit 10.12 auch gerne mal abstürzt.

Wer dennoch einen Blick in das schwarze Loch werfen will, dem sei folgende Links als Einstieg angeraten (es gibt viel viel mehr davon):

  • https://discussions.apple.com/thread/6815546
  • https://userforum.mailbox.org/topic/kontakte-sync-mit-carddav-und-el-capitan-macos
  • https://www.mactechnews.de/forum/discussion/carddav-sync-voellig-kaputt-nach-macOS-upgrade-330937.html

Fazit: Es geht – wenn auch langsam – voran. CardDAV hat sich zu einer festen Größe entwickelt, die man auch abseits von Google oder anderen Cloud-Anbietern benutzen kann.

Kerberos KDC replication mit systemd units

Um eine automatische Replikation des primären Kerberos KDC mit dem sekundären zu erzielen, müssen auf beiden Rechner systemd service units eingerichtet werden. Zumindest unter Ubuntu 16.04 LTS sind diese in keinster Weise vorhanden, weswegen hier auf die Einrichtung eingangen wird.

Service Unit auf dem sekundären (slave) KDC

Auf dem slave KDC muss eigentlich lediglich der kpropd service als stand-alone Instanz gestartet werden. Ursprünglich war der kpropd service auf den (x)inetd master-daemon ausgelegt. Da dieser mittlerweile fast obsolet wurde benutzen wir den stand-alone service, der ab Version 1.11 des kpropd automatisch erkannt wird.
Für das automatische Starten während des Boot-Vorgangs benötigt man mittlerweile ein systemd service unit file, das in unserem Fall folgendermaßen aussieht.


[Unit]
Description=Krb5-KDC replication service
Requires=krb5-kdc.service
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/sbin/kpropd
Type=forking
ReadOnlyDirectories=/
ReadWriteDirectories=/var/tmp /tmp /var/lib/krb5kdc /var/run /run /var/log


[Install]
WantedBy=multi-user.target

Ein Verifikation mit dem systemd hauseigenen Tool sollte keine syntaktischen Fehler ergeben.

systemd-analyze verify kpropd.service

Auf dem Weg zu der hier abgebildeten service unit, gab es zwei große Stolpersteine, welche syntaktisch aber einwandfrei waren, weswegen das verificiation Tool hierbei keine Hilfestellung leisten konnte.
Der erste war die Direktive
Type=forking
Nur damit kann der systemd erkennen, dass es ein typischer geforkter UNIX daemon ist, der nicht sofort als dead (vom Startprozess her) markiert wird. Die Alternative wäre das Setzen des -d (debug) flags, der den Startprozess permanent als ein foreground Prozess behält.
Der zweite, noch größere Stolperstein, kommt von den unterschiedlichen After/Wants Direktiven. In den meisten Tutorials über systemd wird immer auf
After=network.target
verwiesen, was in diesem Fall zu einem gescheiterten Start von kpropd führt, beispielhaft ausgeführt an folgendem syslog Eintrag.


Mar 18 21:57:30 aurora systemd[1]: Started Light Display Manager.
Mar 18 21:57:30 aurora systemd[1]: Started Raise network interfaces.
Mar 18 21:57:30 aurora systemd[1]: Reached target Network.
Mar 18 21:57:30 aurora systemd[1]: Started Unattended Upgrades Shutdown.
Mar 18 21:57:30 aurora systemd[1]: Started Krb5-KDC replication service.
Mar 18 21:57:30 aurora systemd[1]: Started BIND Domain Name Server.
Mar 18 21:57:30 aurora kpropd[1073]: ready
Mar 18 21:57:30 aurora systemd[1]: Reached target Host and Network Name Lookups.
Mar 18 21:57:30 aurora kpropd[1073]: getaddrinfo: Der Name oder der Dienst ist nicht bekannt
Mar 18 21:57:30 aurora systemd[1]: Starting OpenBSD Secure Shell server...
Mar 18 21:57:30 aurora systemd[1]: kpropd.service: Main process exited, code=exited, status=1/FAILURE
Mar 18 21:57:30 aurora systemd[1]: kpropd.service: Unit entered failed state.
Mar 18 21:57:30 aurora systemd[1]: kpropd.service: Failed with result 'exit-code'.

Das Netzwerk ist „irgendwie“ schon vorhanden, aber es scheint der resolver Mechanismus (getaddrinfo) noch nicht richtig zu Arbeiten.
Die Lösung hält dieser systemd Eintrag von freedesktop.org bereit. Entscheidend ist die Änderung in:
After=network-online.target
Pikanterweise gab es unter Ubuntu aber auch hier wohl einige Zeit eine Unstimmigkeit, bzgl. des resolver Mechanismus unter diesem (passiven) Target, wie man hier nachlesen kann.
Erwähnenswert ist noch, dass man den Dienst theoretisch auch ohne root-Rechte starten könnte, wenn man das Capability Feature von Linux nutzt. Dazu setzt man im [Service] Block des unit files folgende Direktive – in diesem Fall handelt es sich im das Portbinding, welches beim kpropd übrigens auf TCP-Port 754 stattfindet.

CapabilityBoundingSet=CAP_NET_BIND_SERVICE

Service Unit auf dem primären (master) KDC

Auf dem primary KDC muss kontinuierlich ein aktueller Dump dem secondary geschickt werden. Das erzeugen des dumps sowie der transmit Befehl sind in folgenden script (kprop.sh) verpackt:

#!/bin/bash

# starts the krb5kdc propagation to the secondary KDC
# location of dumpfile and secondary KDC are taken from the
# following variables

dumpfile=/var/lib/krb5kdc/kdb_repldata
kdcslave=aurora

kdb5_util dump $dumpfile
if [ $? == 0 ]; then
kprop -f $dumpfile $kdcslave
fi


exit $?

Um diese Aktion frequentiert aufzurufen, kann man natürlich die globale crontab bemühen. Es geht aber auch mit kleinen Vorteilen im systemd Ökosystem. Dazu braucht man allerdings dann 2 files.
Wieder ein systemd service file (kprop.service)

[Unit]
Description=kprop KDC propagation


[Service]
Type=simple
ExecStart=/root/bin/kprop.sh

und ein systemd timer file (kprop.timer)…

[Unit]
Description=Run kprop daily

[Timer]
OnCalendar=4:50
Persistent=true


[Install]
WantedBy=timers.target

..welches in unserem File täglich um 04:50 aufgerufen wird.
Beide files landen in /etc/systemd/system. Aber nur das timer file wird via
sudo systemctl enable kprop.timer
aktiviert.
Vorteil dieser Lösung ist, dass man einerseits mit systemctl auch manuell die Synchronisation anstoßen kann, aber auch schnell eine übersichtliche Darstellung der Logeinträge bekommt, welches man mit
journalctl -u kprop
auf dem primary KDC, bzw.
journalctl -u kpropd
auf dem secondary KDC abfrägt.

Key table entry not found while getting initial credentials

Wenn die Kerberos Replizierung mit kprop unter Linux (Ubuntu) folgendes Problem aufwirft

kprop: Key table entry not found while getting initial credentials

dann lohnt es sich ein Blick in die /etc/hosts Datei zu werfen. Falls dort der aktuelle hostname – welcher auch im service principal host/<HOSTNAME>@REALM der/etc/krb5.keytab verwendet wird – eingetragen ist und dort auch noch über localhost aufgelöst wird, dann tritt o.g. Fehler auf. In diesem Fall in der /etc/hosts den Eintrag mit dem hostname entfernen.

Das o.g. Problem ist übrigens nicht gleichzusetzen mit einer fehlenden /etc/krb5.keytab Datei. In diesem Fall würde folgender Fehler erscheinen:
kprop: Client not found in Kerberos database while getting initial credentials

Ubuntu 16.04 workspace switching via shortcuts funktioniert nicht mehr

Von einem auf den anderen Tag funktionierten die Shortcuts

STRG + ALT + Pfeiltasten

zum Umschalten der Workspaces auf Ubuntu 16.04 nicht mehr. Der Grund ist mir nicht klar – beim Guest-Account funktionierte es auch weiterhin.
Abhilfe schafft ein Workaround:

sudo apt install compizconfig-settings-manager

installiert den Compiz Config Settings Manager. Diesen ruft man nach der Installation mit dem Kommando

ccsm

auf und aktiviert in der GUI die Option Desktop Wall in der Sektion Schreibtisch.

Die Quelle dieses Tipps kommt wie so oft von askubuntu

There is also (at least) this Ubuntu Launchpad Bug report
https://bugs.launchpad.net/ubuntu/+source/unity/+bug/1627472

Kein Speicherplatz mehr bei Ubuntu 12.04 / 14.04 LTS

Die Long Term Support Varianten von Ubuntu sind angetreten den alljährlichen Distributions-Upgrade Wahnsinn zu beenden – bringen sich selber aber durch einen Bug in Bedrängnis.

Durch Security Updates kommen aber regelmäßig neue Kernel-Builds auf das System. Dabei geht es nicht nur um das Kernel-image Paket, sondern auch um das image-extra Paket welche die Kernelmodule beinhaltet und oftmals auch um die header Pakete, die dann richtig viel Platz benötigen.

Eigentlich sollten Kernel Pakete die durch ein Update obsolet wurden automatisch vom System mit
apt-get autoremove
deinstalliert werden. Durch einen Bug in Ubuntu System vor 15.10 (siehe auch diesen Artikel auf den Thomas Krenn Seiten) funktioniert das nicht, da die betreffenden Pakete fälschlicherweise als manuell installiert gekennzeichnet sind anstatt als automatisch installiert.

Wenigsten hat Ubuntu in Ihrem (deutschsprachigem) Wiki einen Eintrag über das Problem und ein recht einfachen Workaround. Dabei listet ein kryptisch anmutendes sed Kommando alle Kernel Pakete auf, die dann einer Löschung zugeführt wurde.
Zu beachten ist, dass die eine sog. One-Shot Lösung ist. Das Problem geht weiter, solange man noch nicht auf bspw. Ubuntu 16.04 LTS upgedatet hat.

Ubuntu Unity Menu style für Qt Programme

Ubuntu und die globale Menubar in Unity – ich mag sie. Die alte Begründung – schneller Navigation durch Menübar on Top – gilt immer noch.

QtCreator 4.2.1
QtCreator integrated into Ubuntu’s menubar

Aber nicht immer spielen alle mit. Qt Programme die über Ubuntu’s Paketmanagement laufen, stellen kein Problem dar. Vor kurzem installierte ich allerdings ein eigenes Qt, bei dem dann prompt die Menu’s nicht mehr on Top, sondern altbacken am MainWindow plaziert waren.

Der Grund ist – dass die Qt SDK über den Online-Installer fertig kompilierte binaries (=libraries) für Linux 64bit lieferte.

Wenn man allerdings die Qt SDK selber kompiliert – was übrigens durch die filigrane configure Steuerung auch Sinn macht, sofern man eine eigene Qt Version möchte – gibt es keine Probleme. Irgendwo in den Untiefen des X-Systems (package appmenu-qt5) scheint es eine Ubuntu-modifizierte Komponente zu geben, gegen die man linkt um das globale Menu zu erhalten. Allerdings nimmt die lokale Qt-Installation (Sourcen, Kompilate und fertige Binaries) sehr viel Speicher in Beschlag – bspw. umfasst mein Ordner qt-everywhere-opensource-src-5.8.0 nach erfolgreichem Kompilieren immerhin 21GB!

Das gleiche Phänoment kann man auch mit 3rd party Qt Applikationen beobachten – linken sie gegen die Qt-Systemlibraries hat man das globale Menü – liefern sie eigene Qt-Bibliotheken mit, gibt es kein globales Menü.

PDF Dateien von MS Word und die falsche Schriftarten

Text_if_Arial_is_installed_on_Linux

Seitdem MS Word die Option anbietet Dateien auch als .pdf Datei zu speichern, treten vermehrt Anzeigeprobleme zu Tage. Um genau zu sein: Auf Plattformen, welche die typischen MS FontsArial und Times New Roman nicht installiert haben.

Text_if_no_Arial_is_installed_on_Linux

So ergibt sich in diesen Fällen aus einem einfachen Text, der in der Schriftart Arial geschrieben wurde, ein ziemlich anderes Erscheinungsbild auf dem Adobe Reader unter Linux oder Solaris

ActualFont in Adobe Reader if no Arial is installed

Der Grund dafür ist, dass die Speichern unter.. Funktion von MS Word diese Schriftarten nicht einbettet, sondern nur darauf referenziert. Das Anzeigeprogramm muss dann eine Ersetzungstabelle anwenden, bei der die Originalschriftart durch eine – möglichst ähnliche – ersetzt wird. Das dies mit Adobe Sans MM nicht unbedingt gelingt, dürfte bei der obigen Darstellung klar sichtbar sein.

Wir reden übrigens von Einsparung von 50kB. Das ist marginal, vor allem angesichts der Tatsache, dass gerade Microsoft eher als Ressourcenfresser bekannt ist.

Der Grund liegt eher darin, dass die Tradition sich der Interoperabilität zu verschließen, auch heutzutage weitergeführt wird. Glücklicherweise lässt sich das Einbinden der Schriften erzwingen wenn man in den Optionen des Speichern unter.. Dialog den Modus ISO 19005 – PDF/A anwählt. Dieser Standard zur Langzeitarchivierung von pdf Dateien schreibt das Einbetten der Schriften vor.

ActualFont in Adobe Reader on OS X

Unter Mac OS X tritt das Problem nicht auf. Der Grund hierfür ist, dass zwar die Original Truetype Schriftart Arial auch nicht installiert ist, aber sehr wohl die Type 1 Schriftart ArialMT, die Zeichenkompatibel zu der originalen Arial Schriftart ist.

CalibriFont is embedded as a subset

Interessanterweise tritt das Phänomen wirklich nur mit den klassichen MS Fonts auf. Ist der Text mit einem von den neueren, von Microsoft progragierten, Fonts, wie Calibri formatiert wird die Schriftart eingebetten. Zumindest alle Gylphen (Zeichen) die im Text vorkommen, daher Embedded Subset.

Ubuntu Update von 12.04(.5) auf 14.04(.3)

Eigentlich war der Plan den 5 jährigen Long Term Support von Ubuntu 12.04 (Precise Pangolin) auf meiner Power-Workstation bis zum Ende auszukosten. Doch das Samsung Handy lies sich auf 12.04 trotz LTSEnablementStack nicht richtig mounten. Auf den neueren Android Handys wird schon seit einiger Zeit der Flash-Speicher nicht mehr als Massenspeicher gemountet, sondern mit dem Media Transfer Protocol (MTP).
Und genau dieses Protokoll verhält sich, zumindest was das Samsung Galaxy S6 angeht, sehr gut bei 14.04 (Trusty Thar) und sehr schlecht (kaum brauchbar) bei 12.04

Nach Abwägung der Alternativen – man hätte auch eine 3rd Party SW für den Zugriff auf das Handy via MTP einsetzen können – habe ich mich dann doch für den Distributionsupgrade auf 14.04 entschieden. Nach Ausführung des Kommandos

sudo do-release-upgrade

und dem Befolgen einiger Anweisungen und Beantworten einiger Fragen wurde das Upgrade in ca. 90min. absolut zuverlässig ausgeführt. Die Art und Weise, sowie die Stabilität erinnert einen sehr stark an Major-Versions Upgrades unter Sun Solaris.
Bei Abweichungen der Standard Konfigurationsfiles im Gegensatz zu den gerade aktuell gültigen kommt die Nachfrage, ob das File ersetzt oder behalten werden soll. Wenn man seine Konfiguration behält wird die neue Standardkonfiguration mit einer Endung a la „.dist“ angelegt, bspw.

/etc/logrotate.de/postgresql-common

wurde behalten, die neue Standardkonfiguration wurde unter

/etc/logrotate.de/postgresql-common.ucf-dist

abgelegt. Im anderen Fall – die aktuelle Konfiguration wurde durch die neue Standardkonfiguration ersetzt, verbleibt die aktuelle im System unter bspw.

/etc/NetworkManager/NetworkManager.conf.dpkg-old

Mit gphoto2 Kameradaten auslesen

Vielleicht für viele Fotofreunde ein alter Hut – ich entdeckte allerdings erst gestern, dass man mit der gphoto2 Applikation unter Linux (auch Mac OS X) einige Daten der digitalen Spiegelreflexkamera auslesen kann, an die man anderweitig nicht so einfach (sprich ohne spezialisierte Tools) herankommt.

Der Befehl

gphoto2 --list-config

lisstet für die angeschlossene (und aktivierte) Kamera alle auslesbaren Optionen an (in einer Art Filestruktur-Nomenklatur). Hier sind 2 Beispiele um die Anzahl der Auslösungen, bzw. die Geräteversion auszulesen

gphoto2 --get-config /main/status/shuttercounter

gphoto2 --get-config /main/status/deviceversion

OpenJDK vs. Oracle Java auf Ubuntu Applikationen

Seltene spontane Abstürze des X.org servers während der Anwendung eines Java Programms, lassen sich unter Ubuntu (12.04 als auch 14.04) auf die standardmässige verwendete Java Virtual Machine OpenJDK zurückführen.
Zumindest deuten dies mehrfach durchgeführte Tests an, die wahlweise OpenJDK und Oracle Java nutzten

Am einfachsten lässt sich Oracle Java über das PPA von webupd8team installieren.

sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

Mit der Installation wird auch das sog. alternative-framework unter

/etc/alternatives/

angepasst, so dass sofort der Befehl

java -version

die neuinstallierte Version, bspw.

java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

ausgibt.

Machen Programmen – allen voran freemind – ist das aber nicht genug. Dessen Startskript startet nicht einfach das java Programm, sondert wertet u.a. die Umgebungsvariable $JAVA_HOME aus. Eine pragmatische Lösung lautet daher in ~/.profile

export JAVA_HOME=/usr

einzutragen. Seit dem kompletten Swicht auf Oracle Java 8 hatte ich keinen X-Crash mehr im Zusammenhang mit Java Programmen.