Files
universalrclone/README.md
2026-03-26 08:52:15 +00:00

169 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 <QUELLE> <ZIEL> [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.