Neue Konfigurationsdatei für mein Android-Sync-Skript

Um mein Android-Smartphone mit meinem Laptop zu synchronisieren, habe ich auf diesem einen SSH-Server installiert und nutze meine Skripte um Dateien zu synchronisieren. Per SSH-FS wird das /sdcard Dateisystem in meinen Rechner eingebunden, Python-Skripte verschieben dann Dinge aus dem Download-Ordner auf mein Laptop und kopieren meine Passwortliste auf das Gerät.

Irgendwie ist allerdings die Konfiguration ziemlich inkonsistent gewesen. Für die Liste der Geräte hatte ich eine INI-Datei:

[martin-mia1]
path = /sdcard/
host = martin-mia1
user = mu

Das war so ganz okay, aber so richtig überzeugend ist das Format nicht. Und für die Spezifikation der Ordner hatte ich dann JSON genutzt.

{
    "bins": [
        "ClearScanner/share",
        "DCIM/Camera",
        "Documents/Adobe Scan",
        "Documents/Office Lens",
        "Android/data/net.osmand/files/tracks/rec",
        "SmartMob/SmartRecorder",
        "bluetooth",
        "Download",
        "Pictures",
        "SimpleScanner/Documents",
        "TODO"
    ],
    "todofiles": []
}

JSON ist nicht so schön mit der Hand zu schreiben. Ich weiß auch gar nicht, warum ich da überhaupt dieses Chaos mit den verschiedenen Formaten geschaffen hatte.

Ich wollte es dann vereinheitlichen, und habe TOML genommen. Das war noch für mich neu, erschien cool. Und so sah die Konfiguration dann aus:

[device.martin-mia1]
path = "/sdcard/"
host = "martin-mia1"
user = "mu"

[device.mu-tab-a8]
path = "/sdcard/"
host = "mu-tab-a8"
user = "mu"

[[tasks.CopyToHost]]
source = "ClearScanner/share"

[[tasks.CopyToHost]]
source = "DCIM/Camera"
destination = "~/TODO/"

[[tasks.CopyToDevice]]
source = "~/Dokumente/Karten/Routen"
destination = "Android/data/net.osmand/files/tracks/Routen"
delete = true

Diese Syntax mit den doppelten eckigen Klammern für Listen finde ich wirklich sehr merkwürdig. Das ist in YAML wirklich hübscher gemacht.

Ich war jetzt kurz davor, das ganze wieder zurück nach YAML zu packen. Allerdings ist TOML inzwischen Teil der Standardbibliothek von Python 3.11. Und damit bekommt es den gleichen Rang wie JSON und INI. Für YAML braucht man allerdings noch externe Bibliotheken. Ich versuche die Abhängigkeiten möglichst klein zu halten, daher werde ich versuchen mich mit TOML zu arrangieren.

Umstrukturierung der Konfiguration

Wenn die aktuelle Konfiguration in TOML unübersichtlich ist, dann liegt das vielleicht auch an der Struktur. Wenn man die device Sektionen anschaut, dann sehen die ja okay aus. Die Geräte haben dann auch Namen. Aber bei den tasks Sektionen ist das nicht schön, weil die keine Namen haben. Das andere Problem ist auch, dass beide Geräte die gleichen Aufgaben haben. Das ergibt auch keinen Sinn. Die Lösung sind also Namen für die Aufgaben.

Jede Aufgabe muss jetzt noch ihren Typ angeben und kann dann weitere Argumente haben. Dazu habe ich jetzt die inline table genutzt, um das ganze kompakter zu machen. Zwei Aufgaben mit langen Pfaden habe ich allerdings noch als separate table geführt. Die Geräte haben jetzt auch eine Liste mit den Aufgaben, die sie bearbeiten sollen.

[device.martin-mia1]
path = "/sdcard/"
host = "martin-mia1"
user = "mu"
tasks = ["bluetooth", "camera", "download", "pictures", "todo", "osmand_rec", "osmand_routes"]

[device.mu-tab-a8]
path = "/sdcard/"
host = "mu-tab-a8"
user = "mu"
tasks = ["bluetooth", "camera", "download", "pictures", "todo"]

[tasks]
bluetooth = {type = "CopyToHost", source = "bluetooth"}
camera = {type = "CopyToHost", source = "DCIM/Camera", destination = "~/TODO/"}
download = {type = "CopyToHost", source = "Download"}
pictures = {type = "CopyToHost", source = "Pictures"}
todo = {type = "CopyToHost", source = "TODO"}

[tasks.osmand_rec]
type = "CopyToHost"
source = "Android/data/net.osmand/files/tracks/rec"
destination = "~/Dokumente/Karten/Tracks/"

[tasks.osmand_routes]
type = "CopyToDevice"
source = "~/Dokumente/Karten/Routen"
destination = "Android/data/net.osmand/files/tracks/Routen"
delete = true

Das sieht jetzt nach idiomatischerem TOML aus und gefällt mir deutlich besser.

Nachdem ich den Python Code entsprechend aktualisiert hatte und tomli durch tomllib ersetzt hatte, habe ich keine Abhängigkeiten jenseits der Python Standardbibiliothek mehr gehabt. Click hatte schon durch Argparse ersetzt, sodass auch das nicht mehr drin war.

Mir gefällt das jetzt viel besser. YAML und TOML bietet glänzen bei leicht anderen Strukturen, die man abbilden möchte. Daher muss man manchmal die Struktur einer Konfigurationsdatei verändern, damit sie in TOML idiomatischer erscheint. Das Format an sich ist aber besser, als es mir zuerst schien.