rcloning.sh aktualisiert

This commit is contained in:
alf
2026-03-26 08:55:17 +00:00
parent c3f982609a
commit 98ad2f0f6b

View File

@ -1,27 +1,97 @@
#!/bin/bash
# rcloning_param.sh
# Verwendung: bash rcloning_param.sh <QUELLE> <ZIEL> [sync|copy]
# Beispiel: bash rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ sync
# Voraussetzungen: rclone installiert # Voraussetzungen: rclone installiert
# und GIT_PFAD wurde in .bashrc gesetzt. # und GIT_PFAD wurde in .bashrc gesetzt.
GIT_PFAD="$HOME/Dokumente/Gitea"
source $GIT_PFAD/logger/logger.sh source "$GIT_PFAD/logger/logger.sh"
LOGBUCH="$GIT_PFAD/logger/Logs/rcloning.log" LOGBUCH="$GIT_PFAD/logger/Logs/rcloning.log"
log_init $LOGBUCH log_init "$LOGBUCH"
log_start log_start
# Einstellungen # # --- Parameter-Auswertung ---
IST_TEST="nein" # ja: es wird nichts übertragen usage() {
REPO="jotta:/" echo "Verwendung: $(basename "$0") <QUELLE> <ZIEL> [sync|copy]"
QUELLE="/srv/MEDIEN/Audio" echo ""
ZIEL="$REPO/Audio" echo " QUELLE rclone-Remote und Pfad, z. B. ptv-nextcloud:/DPV"
ARCHIV="$REPO/Archiv/Audio/$(date +%Y-%m-%d-%H-%M)" echo " ZIEL rclone-Remote und Pfad, z. B. spzssh:/srv/.../Ziel/"
MODUS="sync" # Modus kann sync oder copy sein echo " Modus Optional: sync (Standard) oder copy"
LOGLVL="INFO" # Möglich: DEBUG, INFO, ERROR, NOTICE echo ""
IGNORE="" # leeren, wenn nicht ignoriert werden soll, sonst --ignore-existing (dann werden aber keine Änderungen archiviert) echo "Beispiel:"
EXCLUDE=".git/" # Auszuschließende Dateien und Verzeichnisse z. B. ".git/ .Trash1000/" 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..." log_info "Starte Cloning..."
if [ $IST_TEST = "ja"] if [ "$IST_TEST" = "ja" ]; then
then
DRYRUN="--dry-run" DRYRUN="--dry-run"
else else
DRYRUN="" DRYRUN=""
@ -31,25 +101,44 @@ log_info "Quelle: $QUELLE --> Ziel: $ZIEL"
log_info "Archiv: $ARCHIV" log_info "Archiv: $ARCHIV"
log_info "Modus: $MODUS" log_info "Modus: $MODUS"
log_info "Log-Level: $LOGLVL" 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 "Bestehende Dateien überspringen: $IGNORE"
log_info "Testlauf: $IST_TEST" log_info "Testlauf: $IST_TEST"
log_info "Starte..." 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: $?" log_error "ERR: $?"
# Temporäre ignore-Datei aufräumen (falls Remote-Quelle)
[ -n "$TMP_IGNORE" ] && rm -f "$TMP_IGNORE"
log_info "Archiv packen..." 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="$?" ERR="$?"
log_info "Fertig. ERR: $ERR" log_info "Fertig. ERR: $ERR"
if [ $ERR = 0 ]
then if [ "$ERR" = "0" ]; then
log_info "Archiv-Verzeichnis löschen..." log_info "Archiv-Verzeichnis löschen..."
rclone purge $ARCHIV/ -P --log-file=$LOGBUCH --log-level=DEBUG rclone purge "$ARCHIV/" -P --log-file="$LOGBUCH" --log-level=DEBUG
log_info "Fertig. ERR: $?" log_info "Fertig. ERR: $?"
else
if [ "$ERR" = "3" ]; then
log_error "Es wurde kein Archiv erstellt. Wahrscheinlich keine zu archivierenden Dateien vorhanden."
else else
log_error "Beim Erstellen des Archivs kam es zu einem Problem." log_error "Beim Erstellen des Archivs kam es zu einem Problem."
fi fi
fi
log_end log_end