#!/bin/bash # rcloning_param.sh # Verwendung: bash rcloning_param.sh [sync|copy] # Beispiel: bash rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ sync # Voraussetzungen: rclone installiert # und GIT_PFAD wurde in .bashrc gesetzt. GIT_PFAD="$HOME/Dokumente/Gitea" source "$GIT_PFAD/logger/logger.sh" LOGBUCH="$GIT_PFAD/logger/Logs/rcloning.log" log_init "$LOGBUCH" log_start # --- Parameter-Auswertung --- usage() { echo "Verwendung: $(basename "$0") [sync|copy]" echo "" echo " QUELLE rclone-Remote und Pfad, z. B. ptv-nextcloud:/DPV" echo " ZIEL rclone-Remote und Pfad, z. B. spzssh:/srv/.../Ziel/" echo " Modus Optional: sync (Standard) oder copy" echo "" echo "Beispiel:" echo " $(basename "$0") ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ sync" exit 1 } if [ -z "$1" ] || [ -z "$2" ]; then log_error "Fehler: QUELLE und ZIEL müssen als Parameter übergeben werden." usage fi QUELLE="$1" ZIEL="$2" MODUS="${3:-sync}" # Dritter Parameter optional, Standard: sync # Validierung Modus if [ "$MODUS" != "sync" ] && [ "$MODUS" != "copy" ]; then log_error "Fehler: Ungültiger Modus '$MODUS'. Erlaubt: sync oder copy." usage fi # Prüfen ob ZIEL ein rclone-Remote ist (Muster: "remotename:/pfad") if ! echo "$ZIEL" | grep -qE '^[A-Za-z0-9_][A-Za-z0-9_.-]*:'; then log_error "Fehler: ZIEL '$ZIEL' ist kein gültiger rclone-Remote. Erwartet: 'remotename:/pfad'." log_error "Hinweis: Als ZIEL sind nur rclone-Remotes erlaubt (wegen --backup-dir)." exit 1 fi # Erreichbarkeit des Remotes testen log_info "Prüfe Erreichbarkeit von ZIEL: $ZIEL" if ! rclone lsd "$ZIEL" > /dev/null 2>&1; then log_error "Fehler: ZIEL '$ZIEL' ist nicht erreichbar. Remote offline oder Pfad ungültig." exit 1 fi log_info "ZIEL erreichbar." # --- Einstellungen --- IST_TEST="nein" # ja: es wird nichts übertragen Archivordner="$(date +%y-%m-%d-%H)" ZIEL_CLEAN="${ZIEL%/}" # Trailing Slash entfernen ARCHIV="${ZIEL_CLEAN}_Archiv/$Archivordner" # Ergibt z. B.: spzssh:/srv/.../DPVonNextcloud_Archiv/25-03-26-14 LOGLVL="INFO" # Möglich: DEBUG, INFO, ERROR, NOTICE IGNORE="" # leeren, wenn nicht ignoriert werden soll EXCLUDE="--exclude=.git/" # Fest ausgeschlossene Pfade # rclone.ignore aus QUELLE laden (lokal oder Remote) EXCLUDE_FROM="" TMP_IGNORE="" if echo "$QUELLE" | grep -qE '^[A-Za-z0-9_][A-Za-z0-9_.-]*:'; then # QUELLE ist ein Remote → Datei temporär herunterladen TMP_IGNORE="$(mktemp)" if rclone copyto "$QUELLE/rclone.ignore" "$TMP_IGNORE" 2>/dev/null; then EXCLUDE_FROM="--exclude-from=$TMP_IGNORE" log_info "rclone.ignore von Remote geladen: $QUELLE/rclone.ignore" else log_info "Keine rclone.ignore in Quelle gefunden, wird übersprungen." rm -f "$TMP_IGNORE" TMP_IGNORE="" fi else # QUELLE ist lokal → direkt prüfen if [ -f "$QUELLE/rclone.ignore" ]; then EXCLUDE_FROM="--exclude-from=$QUELLE/rclone.ignore" log_info "rclone.ignore gefunden: $QUELLE/rclone.ignore" else log_info "Keine rclone.ignore in Quelle gefunden, wird übersprungen." fi fi # --- Programm --- log_info "Starte Cloning..." if [ "$IST_TEST" = "ja" ]; then DRYRUN="--dry-run" else DRYRUN="" fi log_info "Quelle: $QUELLE --> Ziel: $ZIEL" log_info "Archiv: $ARCHIV" log_info "Modus: $MODUS" log_info "Log-Level: $LOGLVL" log_info "Ignoriert (fest): $EXCLUDE" log_info "Ignoriert (rclone.ignore): ${EXCLUDE_FROM:-keiner}" log_info "Bestehende Dateien überspringen: $IGNORE" log_info "Testlauf: $IST_TEST" log_info "Starte..." rclone -P "$MODUS" "$QUELLE" "$ZIEL" \ --backup-dir="$ARCHIV" \ --log-file="$LOGBUCH" \ --log-level="$LOGLVL" \ $EXCLUDE \ $EXCLUDE_FROM \ $IGNORE \ $DRYRUN log_error "ERR: $?" # Temporäre ignore-Datei aufräumen (falls Remote-Quelle) [ -n "$TMP_IGNORE" ] && rm -f "$TMP_IGNORE" log_info "Archiv packen..." rclone archive create "$ARCHIV/" "$ARCHIV.zip" -P \ --log-level="$LOGLVL" \ --log-file="$LOGBUCH" ERR="$?" log_info "Fertig. ERR: $ERR" if [ "$ERR" = "0" ]; then log_info "Archiv-Verzeichnis löschen..." rclone purge "$ARCHIV/" -P --log-file="$LOGBUCH" --log-level=DEBUG log_info "Fertig. ERR: $?" else if [ "$ERR" = "3" ]; then log_error "Es wurde kein Archiv erstellt. Wahrscheinlich keine zu archivierenden Dateien vorhanden." else log_error "Beim Erstellen des Archivs kam es zu einem Problem." fi fi log_end