#!/bin/bash set -e ### Standardkonfiguration (kann durch .env ueberschrieben werden) SERVER_USER="${SERVER_USER:-$USER}" SERVER_SSH_PORT="${SERVER_SSH_PORT:-22}" SERVER_IP="${SERVER_IP:-192.168.1.100}" SERVER_DB_DIR="${SERVER_DB_DIR:-/volume1/Darktable/darktable_db}" SERVER_PHOTO_DIR="${SERVER_PHOTO_DIR:-/volume1/Darktable/photo_library}" LOCAL_PHOTO_DIR="${LOCAL_PHOTO_DIR:-$HOME/Pictures/raw}" LOCAL_DARKTABLE_DB_DIR="${LOCAL_DARKTABLE_DB_DIR:-$HOME/.config/darktable}" BIN_DIR="${BIN_DIR:-$HOME/.local/bin}" DARKTABLE_BIN="${DARKTABLE_BIN:-darktable}" SYNC_BIN="${SYNC_BIN:-$HOME/.local/bin/darktable_sync.sh}" APPLICATIONS_DIR="$HOME/.local/share/applications" CONFIG_DIR="$HOME/.config/darktable-sync" SYNC_SCRIPT="$BIN_DIR/darktable_sync.sh" WRAPPER_SCRIPT="$BIN_DIR/darktable_wrapper.sh" COMMON_SCRIPT="$BIN_DIR/darktable_common.sh" DESKTOP_SHORTCUT="$APPLICATIONS_DIR/darktable-with-sync.desktop" SYNC_ONLY_SHORTCUT="$APPLICATIONS_DIR/darktable-sync-only.desktop" ### Verzeichnisse anlegen mkdir -p "$BIN_DIR" mkdir -p "$APPLICATIONS_DIR" mkdir -p "$CONFIG_DIR" ### .env laden falls vorhanden ENV_FILE=".env" CONFIG_ENV="$CONFIG_DIR/.env" if [[ -f "$ENV_FILE" ]]; then echo "Hinweis: .env im Projektverzeichnis gefunden." read -r -p " Jetzt nach $CONFIG_ENV verschieben? [J/n]: " MOVE_ENV if [[ "${MOVE_ENV,,}" != "n" ]]; then mkdir -p "$CONFIG_DIR" cp "$ENV_FILE" "$CONFIG_ENV" chmod 600 "$CONFIG_ENV" rm "$ENV_FILE" echo " Erledigt: .env wurde verschoben." else echo " Nicht verschoben. Bitte manuell ausfuehren:" echo " cp .env $CONFIG_ENV && chmod 600 $CONFIG_ENV" fi fi if [[ -f "$CONFIG_ENV" ]]; then echo "Konfiguration laden aus $CONFIG_ENV..." set -a # shellcheck source=/dev/null . "$CONFIG_ENV" set +a fi ### Lokales Foto-Verzeichnis interaktiv abfragen echo "" if [[ -d "$LOCAL_PHOTO_DIR" ]]; then read -r -p "Lokales Foto-Verzeichnis [${LOCAL_PHOTO_DIR}] (Verzeichnis existiert bereits): " INPUT_PHOTO_DIR else read -r -p "Lokales Foto-Verzeichnis [${LOCAL_PHOTO_DIR}]: " INPUT_PHOTO_DIR fi if [[ -n "$INPUT_PHOTO_DIR" ]]; then LOCAL_PHOTO_DIR="$INPUT_PHOTO_DIR" fi ### Konfiguration anzeigen echo "" echo "Aktive Konfiguration:" echo " SERVER_USER: $SERVER_USER" echo " SERVER_IP: $SERVER_IP" echo " SERVER_SSH_PORT: $SERVER_SSH_PORT" echo " SERVER_DB_DIR: $SERVER_DB_DIR" echo " SERVER_PHOTO_DIR: $SERVER_PHOTO_DIR" echo " LOCAL_PHOTO_DIR: $LOCAL_PHOTO_DIR" echo " LOCAL_DARKTABLE_DB_DIR: $LOCAL_DARKTABLE_DB_DIR" echo " BIN_DIR: $BIN_DIR" echo "" ### Abhaengigkeiten pruefen echo "Abhaengigkeiten pruefen..." REQUIRED_CMDS=("rsync" "notify-send" "darktable" "systemctl" "ssh") for cmd in "${REQUIRED_CMDS[@]}"; do if ! command -v "$cmd" >/dev/null 2>&1; then echo "Fehler: '$cmd' ist nicht installiert." echo " Installieren mit: sudo apt install $cmd" exit 1 fi done if ! command -v zenity >/dev/null 2>&1 && ! command -v kdialog >/dev/null 2>&1; then echo "Warnung: Weder 'zenity' noch 'kdialog' gefunden." echo " Mindestens eines installieren fuer GUI-Dialoge:" echo " sudo apt install zenity # GNOME" echo " sudo apt install kdialog # KDE" echo " (Ohne Dialog-Tool wird ein Text-Fallback verwendet)" fi ### Verzeichnisse pruefen if [ ! -d "$LOCAL_PHOTO_DIR" ]; then echo "Fehler: Lokales Foto-Verzeichnis existiert nicht: $LOCAL_PHOTO_DIR" echo " Anlegen mit: mkdir -p \"$LOCAL_PHOTO_DIR\"" exit 1 fi if [ ! -d "$LOCAL_DARKTABLE_DB_DIR" ]; then echo "Fehler: Darktable-Datenbank-Verzeichnis existiert nicht: $LOCAL_DARKTABLE_DB_DIR" echo " Darktable einmal starten oder manuell anlegen." exit 1 fi ### Server-Erreichbarkeit pruefen if ssh -o ConnectTimeout=5 -o BatchMode=yes \ -p "$SERVER_SSH_PORT" "$SERVER_USER@$SERVER_IP" true 2>/dev/null; then echo "Server erreichbar: $SERVER_IP" if ! ssh -o ConnectTimeout=5 -o BatchMode=yes \ -p "$SERVER_SSH_PORT" "$SERVER_USER@$SERVER_IP" \ "[ -d '$SERVER_DB_DIR' ]"; then echo "Fehler: Server-Verzeichnis fehlt: $SERVER_DB_DIR" exit 1 fi if ! ssh -o ConnectTimeout=5 -o BatchMode=yes \ -p "$SERVER_SSH_PORT" "$SERVER_USER@$SERVER_IP" \ "[ -d '$SERVER_PHOTO_DIR' ]"; then echo "Fehler: Server-Verzeichnis fehlt: $SERVER_PHOTO_DIR" exit 1 fi else echo "Warnung: Server nicht erreichbar ($SERVER_IP)." echo " Sync wird fehlschlagen bis der Server online ist." fi ### Alte Systemd-Dateien entfernen (Unterstrich-Varianten) SYSTEMD_USER_DIR="$HOME/.config/systemd/user" OLD_SERVICE="$SYSTEMD_USER_DIR/darktable_sync.service" OLD_TIMER="$SYSTEMD_USER_DIR/darktable_sync.timer" if systemctl --user is-active darktable_sync.timer &>/dev/null; then echo "Alten Timer deaktivieren..." systemctl --user disable --now darktable_sync.timer || true fi for old_file in "$OLD_SERVICE" "$OLD_TIMER"; do if [ -f "$old_file" ]; then echo "Alte Datei entfernen: $old_file" rm -f "$old_file" fi done ### Scripts installieren SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cp "$SCRIPT_DIR/scripts/darktable_common.sh" "$COMMON_SCRIPT" cp "$SCRIPT_DIR/scripts/darktable_sync.sh" "$SYNC_SCRIPT" cp "$SCRIPT_DIR/scripts/darktable_wrapper.sh" "$WRAPPER_SCRIPT" chmod +x "$COMMON_SCRIPT" "$SYNC_SCRIPT" "$WRAPPER_SCRIPT" ### Systemd Service installieren (kein Timer mehr) mkdir -p "$SYSTEMD_USER_DIR" cp "$SCRIPT_DIR/systemd/darktable-sync.service" "$SYSTEMD_USER_DIR/darktable-sync.service" systemctl --user daemon-reload ### .env anlegen falls noch nicht vorhanden if [ ! -f "$CONFIG_ENV" ]; then cp "$SCRIPT_DIR/.env.example" "$CONFIG_ENV" chmod 600 "$CONFIG_ENV" echo "" echo "==========================================================" echo "WICHTIG: Konfiguration anpassen, bevor du Darktable startest" echo "==========================================================" echo "" echo "Eine Vorlage wurde angelegt:" echo " $CONFIG_ENV" echo "" echo "Mindestens diese Felder musst du eintragen:" echo " SERVER_USER - dein SSH-Benutzer auf dem Server" echo " SERVER_IP - IP-Adresse oder Hostname des Servers" echo " SERVER_DB_DIR - Pfad zur Darktable-Datenbank auf dem Server" echo " SERVER_PHOTO_DIR - Pfad zum Fotoverzeichnis auf dem Server" echo "" echo "LOCAL_PHOTO_DIR ist bereits auf '${LOCAL_PHOTO_DIR}' gesetzt." echo "" echo "Jetzt bearbeiten:" echo " nano $CONFIG_ENV" echo "" echo "Danach install.sh erneut ausfuehren, damit die Verbindung" echo "zum Server geprueft wird." echo "==========================================================" fi ### Desktop-Shortcuts installieren cp "$SCRIPT_DIR/desktop/darktable-with-sync.desktop" "$DESKTOP_SHORTCUT" cp "$SCRIPT_DIR/desktop/darktable-sync-only.desktop" "$SYNC_ONLY_SHORTCUT" update-desktop-database "$APPLICATIONS_DIR" 2>/dev/null || true echo "" echo "Installation abgeschlossen." echo " Konfiguration: $CONFIG_ENV" echo " Sync-Script: $SYNC_SCRIPT" echo " Wrapper-Script: $WRAPPER_SCRIPT" echo "" echo "Darktable ueber den Desktop-Shortcut 'Darktable (mit Sync)' starten" echo "oder direkt: $WRAPPER_SCRIPT"