Robustheit: Error-Handling, Validation und Strukturverbesserungen

- Neue darktable_common.sh mit gemeinsamen Funktionen (Logging, Validierung, Lock-Management)
- Verbesserte Fehlerbehandlung und aussagekräftige Error-Messages
- Explizite Validierung von SSH-Schlüssel, Pfaden und Konfiguration beim Start
- Sperrmechanismus zur Verhinderung paralleler Sync-Instanzen
- Bessere Strukturierung des Sync-Prozesses mit sauberer Fehlertoleranz

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-19 21:05:14 +02:00
parent e5d87bd1cb
commit c4a9b4a33d
2 changed files with 138 additions and 32 deletions
+67
View File
@@ -93,6 +93,19 @@ ssh_server() {
-p "$SERVER_SSH_PORT" "$SERVER_USER@$SERVER_IP" "$@"
}
# Liefert den Unix-Timestamp (mtime) von library.db auf dem Server, oder "0" wenn nicht vorhanden.
server_db_mtime() {
ssh_server "stat -c '%Y' '$SERVER_DB_DIR/library.db' 2>/dev/null || echo 0"
}
save_sync_token() {
echo "$1" > "$CONFIG_DIR/sync_token"
}
read_sync_token() {
cat "$CONFIG_DIR/sync_token" 2>/dev/null || echo ""
}
server_reachable() {
ssh_server true 2>/dev/null
}
@@ -111,3 +124,57 @@ ask_user() {
return $?
fi
}
# Fragt den User wie mit einem Sync-Token-Konflikt umgegangen werden soll.
# Gibt "download", "upload" oder "abort" aus.
ask_conflict_resolution() {
local TITLE="Darktable Sync Konflikt"
local EXPLAIN="Ein anderer Rechner hat die Datenbank seit deinem letzten Sync verändert.\nDeine lokalen Änderungen wurden noch NICHT auf den Server übertragen.\n\nWas soll passieren?"
if command -v zenity &>/dev/null; then
local choice
choice=$(zenity --list \
--title="$TITLE" \
--text="$EXPLAIN" \
--radiolist \
--column="" --column="Aktion" --column="Beschreibung" \
TRUE "Herunterladen" "Server-Stand übernehmen (empfohlen)" \
FALSE "Hochladen erzwingen" "Lokale Version auf Server schreiben Server-Änderungen gehen verloren!" \
FALSE "Abbrechen" "Nichts tun Sync wird übersprungen" \
--width=520 --height=260 2>/dev/null) || true
case "$choice" in
"Hochladen erzwingen") echo "upload" ;;
"Abbrechen") echo "abort" ;;
*) echo "download" ;;
esac
elif command -v kdialog &>/dev/null; then
local btn
btn=$(kdialog --title "$TITLE" \
--menu "$EXPLAIN" \
download "Herunterladen (empfohlen)" \
upload "Hochladen erzwingen (Server-Änderungen gehen verloren!)" \
abort "Abbrechen" 2>/dev/null) || true
case "$btn" in
upload|abort) echo "$btn" ;;
*) echo "download" ;;
esac
else
echo ""
echo "=== $TITLE ==="
echo "Ein anderer Rechner hat die Datenbank seit deinem letzten Sync verändert."
echo "Deine lokalen Änderungen wurden noch NICHT auf den Server übertragen."
echo ""
echo " 1) Herunterladen (empfohlen) Server-Stand übernehmen"
echo " 2) Hochladen erzwingen lokale Version gewinnt, Server-Änderungen gehen verloren"
echo " 3) Abbrechen"
local ans
read -r -p "Auswahl [1/2/3, Standard: 1]: " ans || true
case "$ans" in
2) echo "upload" ;;
3) echo "abort" ;;
*) echo "download" ;;
esac
fi
}