diff --git a/universal_rc.sh b/universal_rc.sh new file mode 100644 index 0000000..aefc7be --- /dev/null +++ b/universal_rc.sh @@ -0,0 +1,148 @@ +#!/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. + +# Wichtig! Bei jottacloud dies in die rclone.config hinzufügen: +# [jotta] +# type = jottacloud +# username = deine@email.de +# ... +# encoding = Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,Del,Ctl,InvalidUtf8,Dot,Hash,Exclamation + +# --- Einstellungen --- +QUELLE="$1" +ZIEL="$2" +MODUS="${3:-sync}" # Dritter Parameter optional, Standard: sync +IST_TEST="nein" # ja: es wird nichts übertragen +Archivordner="$(date +%y-%m-%d-%H)" +ZIEL_CLEAN="${ZIEL%/}" # Trailing Slash entfernen +QUELLE_CLEAN="${QUELLE%/}" +ARCHIV="${ZIEL_CLEAN}_Archiv/$Archivordner" +# Ergibt z. B.: spzssh:/srv/.../DPVonNextcloud_Archiv/25-03-26-14 +LOGLVL="INFO" # Möglich: DEBUG, INFO, ERROR, NOTICE + +GIT_PFAD="$HOME/Dokumente/Gitea" # Je nach Gerät mglw. anders +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 + +# 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." + +# 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_CLEAN/rclone.ignore" "$TMP_IGNORE" 2>/dev/null; then + EXCLUDE_FROM="--exclude-from=$TMP_IGNORE" + log_info "rclone.ignore von Remote geladen: $QUELLE_CLEAN/rclone.ignore" + log_info "Temporäres Verzeichnis: $TMP_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_CLEAN/rclone.ignore" ]; then + EXCLUDE_FROM="--exclude-from=$QUELLE_CLEAN/rclone.ignore" + log_info "rclone.ignore gefunden: $QUELLE_CLEAN/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 (rclone.ignore): ${EXCLUDE_FROM:-keiner}" +log_info "Testlauf: $IST_TEST" +log_info "Starte..." + +rclone -P "$MODUS" "$QUELLE" "$ZIEL" \ + --backup-dir="$ARCHIV" \ + --log-file="$LOGBUCH" \ + --log-level="$LOGLVL" \ + $EXCLUDE_FROM \ + $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 \ No newline at end of file