feat: Trockenlauf als Standard-Aufruf, --execute/-e für echten Sync

Ohne Flags führt darktable_sync.sh jetzt einen Trockenlauf durch:
- Banner mit Hinweis und Bestätigungsabfrage vor dem Start
- rsync läuft mit --dry-run (keine Dateiänderungen)
- Keine destruktiven Operationen: kein Backup, kein Token-Schreiben,
  kein sync_pending entfernen
- Zusammenfassung nach Richtung (Upload/Download) und Aktion
  (neu/aktualisiert/gelöscht) aufgeschlüsselt
- Optionale Detailansicht: Dateien gruppiert nach Typ (Foto, XMP,
  Datenbank, Video, Sonstiges)

Mit --execute oder -e wird der echte Sync wie bisher ausgeführt.
Desktop-Entry und Systemd-Service auf --execute aktualisiert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 16:24:31 +02:00
parent 0c5774f695
commit c05f323605
6 changed files with 202 additions and 47 deletions
+45
View File
@@ -88,6 +88,51 @@ log_error() {
echo "FEHLER: $*" >&2
}
classify_filetype() {
local file="$1"
local ext="${file##*.}"; ext="${ext,,}"
case "$ext" in
jpg|jpeg|png|tif|tiff|dng|cr2|cr3|nef|arw|orf|rw2|raf|raw) echo "Foto" ;;
xmp) echo "XMP" ;;
db|bak) echo "Datenbank" ;;
mp4|mov|avi|mkv|mts|m2ts) echo "Video" ;;
*) echo "Sonstiges" ;;
esac
}
format_rsync_details() {
local log_file="$1" direction_label="$2" direction="$3"
[ -f "$log_file" ] || return 0
local prefix; [ "$direction" = "up" ] && prefix=">f" || prefix="<f"
local label pattern files
while IFS=: read -r label pattern; do
files=$(grep -E "$pattern" "$log_file" 2>/dev/null \
| sed 's/^[^ ]* *//' | sort) || true
[ -n "$files" ] || continue
local typ typed
for typ in Foto XMP Datenbank Video Sonstiges; do
typed=$(echo "$files" | while IFS= read -r f; do
[ "$(classify_filetype "$f")" = "$typ" ] && echo " $f"
done)
[ -n "$typed" ] || continue
log_step "$direction_label $typ ($label)"
echo "$typed"
done
done <<EOF
neu:^${prefix}[+]{9}
aktualisiert:^${prefix}[^+]
gelöscht:^\*deleting
EOF
}
confirm_dry_run() {
[ "${DRY_RUN_SKIP_CONFIRM:-0}" = "1" ] && return 0
ask_user "Darktable Sync Trockenlauf" \
"Trockenlauf starten?\n\nEs werden keine Dateien verändert oder übertragen."
}
ssh_server() {
ssh -o ConnectTimeout=5 -o BatchMode=yes \
-p "$SERVER_SSH_PORT" "$SERVER_USER@$SERVER_IP" "$@"