AusweisApp2 als Snap (Update 15.01.19)

Da ich im Moment Urlaub und viel Zeit habe, habe ich mich mal daran gemacht ein Projekt zu vollenden, welches ich schon seit ein paar Monaten in die Augen gefasst habe:

Das Paketieren der AusweisApp2.

Falls jemand nicht weiß, wozu dieses Programm dient, hier mal der Link zum passenden Wikipedia-Artikel:

https://de.wikipedia.org/wiki/AusweisApp2

Offiziell unterstützen die Entwickler Linux nicht, dadurch dass der Quellcode aber unter Github und unter einer freien Lizenz verfügbar ist, kann man wenigstens den Versuch wagen das Programm unter Linux zum Laufen zu bekommen.

Kompilieren der Anwendung

Solange eine Distribution Qt 5.9 oder höher enthält, ist das Kompilieren ziemlich einfach:

  • Github-Code klonen.
  • CMake aufrufen und Schritt für Schritt alle notwendigen Abhängigkeiten nachinstallieren, da diese nicht direkt dokumentiert sind.
  • „make && make install“ aufrufen. Das fertige Programm liegt dann unter „dist“.

Der Teufel steckt leider im Detail. Dadurch, dass die Entwickler Linux nicht offiziell unterstützen gibt es ein paar kleinere Probleme:

  • Das Terminal und auch das Log werden mit unzähligen Debug-Meldungen zugespammt. Selbst wenn man den RELEASE-Build bauen lässt, bleiben die Meldungen. Das Programm installiert zwar die Datei „qtlogging.ini“, welche man nachbearbeiten kann. Diese muss man händisch nach „.config/QtProjects“ verschieben. Leider gelten die Einstellungen in der Datei dann für alle Qt-Programme.
  • Die deutsche Übersetzung funktioniert nicht, da sie im falschen Ordner liegt.
  • Die Verzeichnisstruktur ist generell nicht so wie unter Linux bzw. Ubuntu üblich.

Ich habe mich mal an den Quellcode gesetzt und alle diese Probleme direkt dort beseitigt:

  • Ein paar „qDebug()“-Meldungen sind per „ifdef“-Makros ausgeblendet, da es beim Setzen der Option „-DQT_NO_DEBUG_OUTPUT“ in „CMakeList.txt“ zu mehreren Kompilierfehlern kommt. Die Datei „qtlogging.ini“ ist dadurch überflüssig und wird nicht mehr installiert.
  • Das Programm-Icon im SVG-Format wird ins korrekte Verzeichnis installiert und die desktop-Datei wurde entsprechend angepasst.
  • Die deutsche Übersetzung wurde in ein anderes Verzeichnis verschoben und die Loader-Klasse im Code angepasst.
  • Die Resourcen-Datei und die JSON-Datei, welche das Programm installiert, wurden ebenfalls in ein anderes Verzeichnis gelegt und die Loader entsprechend angepasst.

Mit diesen Änderungen läuft das Programm komplett fehlerfrei unter Ubuntu 18.04 und höher und mit ziemlicher Sicherheit auch unter anderen Distributionen.

Warum ein Snap-Paket?

Ich wollte das Programm auf jeden Fall paketieren. Nur ist das Erstellen eines guten Debian-Pakets mit allen Abhängigkeiten ein ziemlicher Aufwand. Da ich in den letzten Wochen Snap zu schätzen gelernt habe (In meinen Augen funktioniert der Snap-Store sehr gut), wollte ich mich mal an einem eigenen Snap-Paket versuchen. Das Programm schien mir ein guter Kandidat zu sein, da es hinreichend komplex ist um den Aufbau der Syntax der YAML-Datei zu lernen.

Grundsätzlich ist der Bau eines Snap-Pakets sehr einfach. Das Minimal-Beispiel bzw. das Beispiel zum Bauen von DOSBOX sind eine gute Basis um den Aufbau der YAML-Datei für den Bau mit Hilfe von „snapcraft“ schnell nachvollziehen zu können. Leider muss man dann doch etwas tiefer in die Materie einsteigen, da manches nicht 100% dokumentiert ist.

So gibt es zwar ein Plugin zum Bauen von „CMake“-basierten Projekten, nur funktioniert dieses nicht 100% automatisch, da ich dem Original-Quellcode vor dem Bauen noch patche und nach dem Bauen einige überflüssige Dateien entferne um die Snap-Größe zu verkleinern. Um alle Klippen zu umschiffen müsste ich mir einige Beispiele und Foreneinträge zu Gemüte führen.

Jedenfalls habe ich es nach zwei Tagen herumbasteln und ausprobieren geschafft ein Snap-Paket zu bauen, welches sich 100% wie ein „normales“ Paket verhält. Das Ergebnis kann man im Snap-Store herunterladen:

https://snapcraft.io/ausweisapp2-ce

Das Snap-Paket benötigt noch den PC/SC-Daemon (Paketname „pcscd“ unter Ubuntu), damit ein Card-Reader angesprochen werden kann.

Das YAML zum Bauen des Snaps kann man in meinem Github-Repo finden:

https://github.com/glasen/snaps/tree/master/AusweisApp2

Update 03.01.19:

Leider funktioniert das Confinement bzw. die Sandbox nicht richtig im Snap. Mir ist das nicht aufgefallen, da ich auf meinen beiden Rechnern einen Kernel aus dem Mainline-PPA einsetze und dort anscheinend nicht alle Apparmor-Features vorhanden sind. Benutzt man den Standard-Kernel kann das Snap den PC/SC-Daemon und kann deshalb keine Card-Reader finden. Bis ich eine richtige Lösung gefunden habe, muss das Snap im leider „classic“-Modus ohne Sandbox-Features installiert werden:

sudo snap refresh ausweisapp2-ce --classic

Update 15.01.19:

Ich habe es endlich geschafft die Version 1.16.1 zu bauen. Leider bin ich dadurch mit dem Confinement nicht weitergekommen. Um keine Probleme mit dem fehlerhaften Confinement zu bekommen, sollte das Snap entweder von Hand aktualisiert bzw. deinstalliert und dann gleich wieder neu installiert werden:

Aktualisieren mit deaktiviertem Confinement:

sudo snap refresh ausweisapp2-ce --classic

Neuinstallation:

sudo snap remove ausweisapp2-ce && sudo snap install ausweisapp2-ce --classic