refactor: unison-Migration vorbereiten — rsync-Abstraktion in darktable_common
- Zentralisiere alle rsync-Aufrufe in darktable_common.sh mit perform_rsync() - Trockenlauf-Flag-Handling in Gemeinsam-Funktionen - perform_rsync() gibt Zeilenanzahl zurück für Trockenlauf-Zählwerte - darktable_sync.sh nutzt nur noch perform_rsync(), reduziert Duplikation - Testabdeckung für perform_rsync() + rsync-Fehlerbehandlung erweitert - CLAUDE.md mit unison-Migration-Absicht dokumentiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# 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.
|
||||
Bash-Skripte zur bidirektionalen Synchronisation der Darktable-Datenbank und Fotobibliothek zwischen lokalem Rechner und einem Server via Unison/SSH. Entwickelt für Linux mit systemd.
|
||||
|
||||
## Architektur
|
||||
|
||||
@@ -12,42 +12,45 @@ darktable_common.sh → Gemeinsame Hilfsfunktionen (wird per source eingebund
|
||||
```
|
||||
|
||||
### Ablauf darktable_sync.sh
|
||||
1. Dependencies prüfen (rsync, ssh, notify-send, darktable)
|
||||
1. Dependencies prüfen (unison, ssh, notify-send, darktable)
|
||||
2. Config laden und validieren
|
||||
3. Lock erwerben (atomares `mkdir`)
|
||||
4. Dry-Run-Modus prüfen (Standard: Trockenlauf; `--execute`/`-e` für echten Sync)
|
||||
5. Darktable-Prozess prüfen (Sync verboten wenn darktable läuft)
|
||||
6. Server-Erreichbarkeit prüfen → `sync_pending` bei Fehler
|
||||
7. Active-Marker prüfen (verhindert gleichzeitige Clients)
|
||||
8. Darktable-Versionen abgleichen (Major.Minor müssen übereinstimmen)
|
||||
9. Sync-Token prüfen (Konflikterkennung bei mehreren Clients)
|
||||
10. DB-Backup erstellen (library.db.bak, data.db.bak) — nur bei `--execute`
|
||||
11. Backup-Verzeichnisse anlegen (`${LOCAL_PHOTO_DIR}-bak`, `${LOCAL_DARKTABLE_DB_DIR}-bak`)
|
||||
12. Upload: DB und Fotos mit `--delete` (lokal gelöscht → Server gelöscht)
|
||||
13. Download: DB und Fotos mit `--delete --backup --backup-dir` (lokal gelöscht → ins `-bak`-Verzeichnis)
|
||||
14. Sync-Token und Versionsdatei speichern
|
||||
15. Alte Backups bereinigen (`cleanup_old_backups`, >730 Tage)
|
||||
7. Unison-Versionen abgleichen (exakt gleiche Version auf beiden Seiten erforderlich)
|
||||
8. Active-Marker prüfen (verhindert gleichzeitige Clients)
|
||||
9. Darktable-Versionen abgleichen (Major.Minor müssen übereinstimmen)
|
||||
10. Sync-Token prüfen (Konflikterkennung bei mehreren Clients) → `-force local`/`-force remote`/`-prefer newer`
|
||||
11. DB-Backup erstellen (library.db.bak, data.db.bak) — nur bei `--execute`
|
||||
12. Backup-Verzeichnisse anlegen (`${LOCAL_PHOTO_DIR}-bak`, `${LOCAL_DARKTABLE_DB_DIR}-bak`)
|
||||
13. DB-Sync: bidirektional via Unison (lokal gelöscht + im Archiv → Server löschen; nie lokal vorhanden → herunterladen)
|
||||
14. Foto-Sync: bidirektional via Unison mit `-prefer newer`
|
||||
15. Sync-Token und Versionsdatei speichern
|
||||
16. 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
|
||||
## Unison-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"` |
|
||||
| DB-Sync | `-batch -times -auto -prefer newer -ignore "Name *.lock" -ignore "Name darktable_version" -backup "Name *" -backupdir "${LOCAL_DARKTABLE_DB_DIR}-bak"` |
|
||||
| Foto-Sync | `-batch -times -auto -prefer newer -ignore "Name *.lock" -backup "Name *" -backupdir "${LOCAL_PHOTO_DIR}-bak"` |
|
||||
| Bei DB-Konflikt (upload) | `-force local` statt `-prefer newer` |
|
||||
| Bei DB-Konflikt (download) | `-force remote` für DB und Fotos |
|
||||
|
||||
Dry-Run: `RSYNC_DRY_FLAG=(--dry-run)` wird zu allen Aufrufen hinzugefügt.
|
||||
Dry-Run: `UNISON_DRY_FLAG=(-dryrun)` wird zu allen Aufrufen hinzugefügt.
|
||||
|
||||
## itemize-changes Format
|
||||
- `<f+++++++++` — neue Datei (Upload, an Remote gesendet)
|
||||
- `>f+++++++++` — neue Datei (Download, lokal empfangen)
|
||||
- `<f` / `>f` ohne `+` — aktualisiert
|
||||
- `*deleting` — gelöscht
|
||||
## Unison-Output-Format (Dryrun)
|
||||
- `new file ----> path` — neue Datei (Upload, an Server)
|
||||
- `<---- new file path` — neue Datei (Download, lokal)
|
||||
- `changed ----> path` — aktualisiert (Upload)
|
||||
- `<---- changed path` — aktualisiert (Download)
|
||||
- `deleted ----> path` — gelöscht (Upload)
|
||||
- `<---- deleted path` — gelöscht (Download)
|
||||
|
||||
## Sicherheitsmechanismen
|
||||
- `validate_path`: Blockiert `' " ; | & \` $ ( ) \` und `..` in Pfaden (Server- UND lokale Pfade)
|
||||
@@ -58,9 +61,9 @@ Dry-Run: `RSYNC_DRY_FLAG=(--dry-run)` wird zu allen Aufrufen hinzugefügt.
|
||||
|
||||
## Test-Infrastruktur
|
||||
- Framework: **BATS** (`tests/*.bats`)
|
||||
- Stubs in `tests/stubs/`: `rsync`, `ssh`, `darktable`, `notify-send`, `pgrep`, `zenity`, `kdialog`
|
||||
- Stubs in `tests/stubs/`: `unison`, `ssh`, `darktable`, `notify-send`, `pgrep`, `zenity`, `kdialog`
|
||||
- Stub-Aktivierung: `run_with_stubs` setzt `tests/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`
|
||||
- Steuerung via Env-Variablen: `UNISON_STUB_FAIL`, `UNISON_STUB_DRY_LINES`, `UNISON_STUB_ARGS_FILE`, `SSH_STUB_FAIL`, `SSH_STUB_OUTPUT`, `UNISON_SERVER_VERSION`, `PGREP_STUB_FOUND`
|
||||
- Setup: `create_valid_env` in `tests/helpers/setup.bash`; jeder Test bekommt isoliertes `$HOME` in `$BATS_TMPDIR`
|
||||
- Tests ausführen: `bats tests/`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user