Robuste Darktable-Synchronisation: sequenzieller Ablauf, Versions- und Concurrent-Schutz
- Race Condition behoben: Pre-Sync wird vollstaendig abgewartet bevor Darktable startet - Post-Sync nach Schliessen von Darktable eingefuehrt (bisher fehlend) - .env aus festem Pfad ~/.config/darktable-sync/.env geladen (nicht mehr relativ) - Server-Erreichbarkeit per SSH statt ping (Firewall-sicher) - Darktable-Versionscheck (Major.Minor) vor Download mit Abbruch bei Konflikt - DB-Backup vor jedem Download (library.db.bak, data.db.bak) - sync_pending-Marker bei Offline/Fehler, Hinweis beim naechsten Start - darktable.active-Marker auf Server fuer Concurrent-Erkennung - Lock-Dateien vom Sync ausgeschlossen - systemd-Timer entfernt, Service bleibt als manueller Trigger - Gemeinsame Hilfsfunktionen in darktable_common.sh extrahiert - 20 BATS-Tests mit vollstaendigem Stub-System ohne GUI-Dialoge Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env bash
|
||||
# Gemeinsame Hilfsfunktionen fuer darktable-sync Scripts.
|
||||
# Dieses Script wird per `source` eingebunden, nicht direkt ausgefuehrt.
|
||||
|
||||
CONFIG_DIR="$HOME/.config/darktable-sync"
|
||||
|
||||
load_config() {
|
||||
local env_file="$CONFIG_DIR/.env"
|
||||
if [ ! -f "$env_file" ]; then
|
||||
echo "Fehler: Konfiguration nicht gefunden: $env_file" >&2
|
||||
echo "Vorlage kopieren mit: cp .env.example $env_file" >&2
|
||||
exit 1
|
||||
fi
|
||||
# shellcheck source=/dev/null
|
||||
. "$env_file"
|
||||
}
|
||||
|
||||
require_var() {
|
||||
local var_name="$1"
|
||||
if [ -z "${!var_name:-}" ]; then
|
||||
echo "Fehler: Variable '$var_name' ist nicht gesetzt in $CONFIG_DIR/.env" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
validate_config() {
|
||||
require_var SERVER_IP
|
||||
require_var SERVER_USER
|
||||
require_var SERVER_SSH_PORT
|
||||
require_var SERVER_DB_DIR
|
||||
require_var SERVER_PHOTO_DIR
|
||||
require_var LOCAL_DARKTABLE_DB_DIR
|
||||
require_var LOCAL_PHOTO_DIR
|
||||
require_var SYNC_BIN
|
||||
require_var DARKTABLE_BIN
|
||||
}
|
||||
|
||||
check_dependency() {
|
||||
local cmd="$1" pkg="${2:-$1}"
|
||||
if ! command -v "$cmd" &>/dev/null; then
|
||||
echo "Fehler: '$cmd' ist nicht installiert." >&2
|
||||
echo "Installieren mit: sudo apt install $pkg" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
server_reachable() {
|
||||
ssh -o ConnectTimeout=5 -o BatchMode=yes \
|
||||
-p "$SERVER_SSH_PORT" "$SERVER_USER@$SERVER_IP" true 2>/dev/null
|
||||
}
|
||||
|
||||
ask_user() {
|
||||
local title="$1" text="$2" ans
|
||||
if command -v zenity &>/dev/null; then
|
||||
zenity --question --title="$title" --text="$text" 2>/dev/null
|
||||
return $?
|
||||
elif command -v kdialog &>/dev/null; then
|
||||
kdialog --title "$title" --yesno "$text" 2>/dev/null
|
||||
return $?
|
||||
else
|
||||
read -r -p "$text [j/N] " ans || true
|
||||
[[ "$ans" =~ ^[jJyY] ]]
|
||||
return $?
|
||||
fi
|
||||
}
|
||||
Reference in New Issue
Block a user