From 98ad2f0f6b3fcfa8ca1fac4dc9e42c3b55897469 Mon Sep 17 00:00:00 2001 From: alf Date: Thu, 26 Mar 2026 08:55:17 +0000 Subject: [PATCH] rcloning.sh aktualisiert --- rcloning.sh | 139 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 114 insertions(+), 25 deletions(-) diff --git a/rcloning.sh b/rcloning.sh index 0cd55b1..69b7d29 100644 --- a/rcloning.sh +++ b/rcloning.sh @@ -1,27 +1,97 @@ +#!/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. - -source $GIT_PFAD/logger/logger.sh +GIT_PFAD="$HOME/Dokumente/Gitea" +source "$GIT_PFAD/logger/logger.sh" LOGBUCH="$GIT_PFAD/logger/Logs/rcloning.log" -log_init $LOGBUCH +log_init "$LOGBUCH" log_start -# Einstellungen # -IST_TEST="nein" # ja: es wird nichts übertragen -REPO="jotta:/" -QUELLE="/srv/MEDIEN/Audio" -ZIEL="$REPO/Audio" -ARCHIV="$REPO/Archiv/Audio/$(date +%Y-%m-%d-%H-%M)" -MODUS="sync" # Modus kann sync oder copy sein -LOGLVL="INFO" # Möglich: DEBUG, INFO, ERROR, NOTICE -IGNORE="" # leeren, wenn nicht ignoriert werden soll, sonst --ignore-existing (dann werden aber keine Änderungen archiviert) -EXCLUDE=".git/" # Auszuschließende Dateien und Verzeichnisse z. B. ".git/ .Trash1000/" +# --- 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 +} -# Programm # +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 +if [ "$IST_TEST" = "ja" ]; then DRYRUN="--dry-run" else DRYRUN="" @@ -31,25 +101,44 @@ log_info "Quelle: $QUELLE --> Ziel: $ZIEL" log_info "Archiv: $ARCHIV" log_info "Modus: $MODUS" log_info "Log-Level: $LOGLVL" -log_info "Ignoriert: $EXCLUDE" +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 $IGNORE $DRYRUN +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 +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: $?" + +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 +log_end \ No newline at end of file