41f2ce85cc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.6 KiB
3.6 KiB
darktable-sync — Projektdokumentation für Claude
Zweck
Bash-Skripte zur bidirektionalen Synchronisation der Darktable-Datenbank und Fotobibliothek zwischen lokalem Rechner und einem Server via rsync/SSH. Entwickelt für Linux mit systemd.
Architektur
darktable_wrapper.sh → Startet Pre-/Post-Sync, dann Darktable
darktable_sync.sh → Hauptsync-Engine (Upload + Download)
darktable_common.sh → Gemeinsame Hilfsfunktionen (wird per source eingebunden)
Ablauf darktable_sync.sh
- Dependencies prüfen (rsync, ssh, notify-send, darktable)
- Config laden und validieren
- Lock erwerben (atomares
mkdir) - Dry-Run-Modus prüfen (Standard: Trockenlauf;
--execute/-efür echten Sync) - Darktable-Prozess prüfen (Sync verboten wenn darktable läuft)
- Server-Erreichbarkeit prüfen →
sync_pendingbei Fehler - Active-Marker prüfen (verhindert gleichzeitige Clients)
- Darktable-Versionen abgleichen (Major.Minor müssen übereinstimmen)
- Sync-Token prüfen (Konflikterkennung bei mehreren Clients)
- DB-Backup erstellen (library.db.bak, data.db.bak) — nur bei
--execute - Backup-Verzeichnisse anlegen (
${LOCAL_PHOTO_DIR}-bak,${LOCAL_DARKTABLE_DB_DIR}-bak) - Upload: DB und Fotos mit
--delete(lokal gelöscht → Server gelöscht) - Download: DB und Fotos mit
--delete --backup --backup-dir(lokal gelöscht → ins-bak-Verzeichnis) - Sync-Token und Versionsdatei speichern
- Alte Backups bereinigen (
cleanup_old_backups, >730 Tage)
Konfiguration
- Datei:
~/.config/darktable-sync/.env(Permissions: 600) - Wichtige Variablen:
SERVER_IP,SERVER_USER,SERVER_SSH_PORT,SERVER_DB_DIR,SERVER_PHOTO_DIR,LOCAL_DARKTABLE_DB_DIR,LOCAL_PHOTO_DIR,DARKTABLE_BIN,SYNC_BIN - Vorlage:
.env.example
rsync-Flags
| Operation | Flags |
|---|---|
| Upload DB | -uavh --itemize-changes --delete --exclude '*.lock' --exclude 'darktable_version' |
| Upload Fotos | -uavh --itemize-changes --delete --exclude '*.lock' |
| Download DB | -uavh --itemize-changes --delete --backup --backup-dir="${LOCAL_DARKTABLE_DB_DIR}-bak" |
| Download Fotos | -uavh --itemize-changes --delete --backup --backup-dir="${LOCAL_PHOTO_DIR}-bak" |
Dry-Run: RSYNC_DRY_FLAG=(--dry-run) wird zu allen Aufrufen hinzugefügt.
itemize-changes Format
>f+++++++++— neue Datei (Upload)<f+++++++++— neue Datei (Download)>f/<fohne+— aktualisiert*deleting— gelöscht
Sicherheitsmechanismen
validate_path: Blockiert' " ; | & \$ ( ) ` und..in Pfaden (Server- UND lokale Pfade)load_config: Blockiert `; | & `` in der .env vor dem source- Leeres Quellverzeichnis vor Upload → Abbruch (Schutz vor falschem Mount)
- Atomares Locking via
mkdir - SSH immer mit
BatchMode=yesundConnectTimeout=5
Test-Infrastruktur
- Framework: BATS (
tests/*.bats) - Stubs in
tests/stubs/:rsync,ssh,darktable,notify-send,pgrep,zenity,kdialog - Stub-Aktivierung:
run_with_stubssetzttests/stubs/vorne in PATH - Steuerung via Env-Variablen:
RSYNC_STUB_FAIL,RSYNC_STUB_DRY_LINES,RSYNC_STUB_ARGS_FILE,SSH_STUB_FAIL,SSH_STUB_OUTPUT,PGREP_STUB_FOUND - Setup:
create_valid_envintests/helpers/setup.bash; jeder Test bekommt isoliertes$HOMEin$BATS_TMPDIR - Tests ausführen:
bats tests/
Installation
install.sh — interaktiv, prüft Dependencies, kopiert Skripte nach ~/.local/bin/, richtet systemd-Service ein.
Bekannte offene Punkte
- M1 (Security, niedrig):
validate_pathsieht$VARnicht, da bash beimsource .envbereits expandiert. Angreifer braucht Schreibzugriff auf.env— begrenzter Schaden.