# rcloning_param.sh Ein Bash-Script zum flexiblen Synchronisieren oder Kopieren von Dateien zwischen rclone-Remotes — mit Quelle und Ziel als Aufrufparameter, automatischer Archivierung geänderter Dateien, dynamischem Exclude-Handling und strukturiertem Logging. --- ## Funktionsweise Das Script führt folgende Schritte in Sequenz aus: 1. **Validierung** — Prüft Parameter, Modus-Angabe, Remote-Syntax von ZIEL und dessen Erreichbarkeit per `rclone lsd`. 2. **rclone.ignore laden** — Sucht in QUELLE nach einer `rclone.ignore`-Datei und übergibt sie als `--exclude-from`, falls vorhanden. 3. **Synchronisation / Kopieren** — Überträgt Dateien von `QUELLE` nach `ZIEL` per `rclone sync` oder `rclone copy`. 4. **Archivierung** — Dateien, die am Ziel überschrieben oder gelöscht werden, landen vorher automatisch in einem stündlich benannten Archivordner neben dem Zielverzeichnis. 5. **ZIP-Erstellung** — Das Archivverzeichnis wird als `.zip` gepackt. 6. **Aufräumen** — Das Archivverzeichnis wird nach erfolgreichem Packen gelöscht. --- ## Voraussetzungen | Anforderung | Hinweis | |---|---| | `rclone` | Installiert und konfiguriert (`~/.config/rclone/rclone.conf`) | | `logger.sh` | Eigenes Logging-Modul aus dem selben Gitea-Repository | | `GIT_PFAD` | Umgebungsvariable in `.bashrc` gesetzt (z. B. `export GIT_PFAD="$HOME/Dokumente/Gitea"`) | | ZIEL-Remote | Muss in rclone konfiguriert und erreichbar sein | --- ## Verwendung ```bash bash rcloning_param.sh [sync|copy] ``` | Parameter | Pflicht | Beschreibung | |---|---|---| | `QUELLE` | ✓ | rclone-Remote **oder** lokaler Pfad | | `ZIEL` | ✓ | rclone-Remote (zwingend, wegen `--backup-dir`) | | `Modus` | – | `sync` (Standard) oder `copy` | ### Beispiele ```bash # Remote nach Remote, sync (Standard) bash rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ # Lokales Verzeichnis nach Remote bash rcloning_param.sh /home/richard/Dokumente spzssh:/srv/.../Backup/ # Aktuelles Verzeichnis nach Remote bash rcloning_param.sh . spzssh:/srv/.../Backup/ # Explizit copy statt sync bash rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ copy ``` > **Hinweis:** Als ZIEL ist ausschließlich ein rclone-Remote erlaubt, da `--backup-dir` zwingend auf demselben Remote wie ZIEL liegen muss. Für rein lokale Transfers (Quelle und Ziel lokal) ist `rsync` die bessere Wahl. > **Hinweis zu `sync`:** Im Sync-Modus werden Dateien am Ziel gelöscht, die in der Quelle nicht mehr existieren. Alle betroffenen Dateien werden vorher ins Archiv verschoben. --- ## Archiv-Logik Der Archivpfad wird automatisch aus dem Zielpfad abgeleitet — kein zusätzlicher Parameter nötig: ``` ZIEL → spzssh:/srv/.../DPVonNextcloud/ ARCHIV → spzssh:/srv/.../DPVonNextcloud_Archiv/25-03-26-14/ ZIP → spzssh:/srv/.../DPVonNextcloud_Archiv/25-03-26-14.zip ``` Der Ordnername entspricht dem Startzeitpunkt des Transfers im Format `JJ-MM-TT-HH`. | Exit-Code `rclone archive create` | Verhalten | |---|---| | `0` | Erfolg → temporäres Verzeichnis wird gelöscht | | `3` | Kein Archiv erstellt (keine geänderten/gelöschten Dateien) → Info-Meldung | | Sonstige | Fehler → Fehlermeldung im Log, Verzeichnis bleibt erhalten | --- ## Exclude-Handling Das Script kombiniert zwei Mechanismen zum Ausschließen von Dateien: **1. Fest im Script kodiert:** ``` .git/ ``` **2. Dynamisch per `rclone.ignore`:** Liegt in der QUELLE eine Datei namens `rclone.ignore`, wird sie automatisch als `--exclude-from` übergeben. Das Script erkennt dabei selbstständig, ob QUELLE lokal oder ein Remote ist: | QUELLE-Typ | Vorgehen | |---|---| | Lokal | Direkter Zugriff auf `$QUELLE/rclone.ignore` | | Remote | Temporärer Download per `rclone copyto`, Datei wird nach Transfer gelöscht | Ist keine `rclone.ignore` vorhanden, läuft das Script ohne `--exclude-from` weiter — kein Abbruch. ### Format der `rclone.ignore` Die Datei folgt dem rclone-Filterformat, ein Muster pro Zeile: ``` # Kommentare sind erlaubt .DS_Store Thumbs.db tmp/ *.log ``` Weitere Informationen: [rclone filtering](https://rclone.org/filtering/) --- ## Interne Einstellungen Folgende Variablen können direkt im Script angepasst werden: | Variable | Beschreibung | Standard | |---|---|---| | `IST_TEST` | Testlauf ohne Übertragung (`--dry-run`) | `nein` | | `LOGLVL` | Detailgrad des rclone-Logs | `INFO` | | `IGNORE` | Optionaler rclone-Parameter (z. B. `--ignore-existing`) | leer | | `EXCLUDE` | Fest ausgeschlossene Pfade | `--exclude=.git/` | --- ## Logging Das Script nutzt `logger.sh` für strukturiertes Logging. Die Logdatei liegt unter: ``` $GIT_PFAD/logger/Logs/rcloning.log ``` rclone schreibt ebenfalls direkt in diese Datei (`--log-file`). Vor dem Transfer werden alle relevanten Parameter ins Log geschrieben. --- ## Validierungen beim Start Das Script bricht mit einer Fehlermeldung ab, wenn: - `QUELLE` oder `ZIEL` fehlen - der Modus weder `sync` noch `copy` ist - `ZIEL` nicht dem Format `remotename:/pfad` entspricht - `ZIEL` per `rclone lsd` nicht erreichbar ist --- ## Als Cronjob ```bash # Täglich um 02:00 Uhr 0 2 * * * /bin/bash /pfad/zu/rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ ``` --- ## Bekannte Einschränkungen - `rclone archive` ist ein experimenteller Subcommand — nicht in allen rclone-Versionen standardmäßig verfügbar. - ZIEL muss zwingend ein Remote sein. Ein lokales Verzeichnis als ZIEL wird vom Script abgelehnt. - Bei Remote-QUELLE wird `rclone.ignore` temporär nach `/tmp` heruntergeladen und danach automatisch gelöscht.