rsync via ssh and set permissions via ssh afterwards

This commit is contained in:
trnq1ll0 committed 2026-01-27 13:21:51 +01:00
1 parent eeac807158
commit 8ed8b69c7e
1 file changed
+69 -27
@@ -30,54 +30,96 @@ notify() {
osascript -e "display notification \"$message\" with title \"Backup Recordings\" subtitle \"$subtitle\""
}
# Funktion zum Formatieren von Bytes in menschenlesbare Größe
format_bytes() {
local bytes=$1
if [ "$bytes" -lt 1024 ]; then
echo "${bytes} B"
elif [ "$bytes" -lt 1048576 ]; then
awk "BEGIN {printf \"%.1f KB\", $bytes/1024}"
elif [ "$bytes" -lt 1073741824 ]; then
awk "BEGIN {printf \"%.1f MB\", $bytes/1048576}"
else
awk "BEGIN {printf \"%.2f GB\", $bytes/1073741824}"
fi
}
# Log rotieren falls nötig
rotate_log
# Quelle und Ziel definieren
SOURCE="/Users/rob/Recordings/Work/00_MacOS"
TARGET="/Volumes/rob/recordings/Progress/Work/"
MOUNT_POINT="/Volumes/rob"
SERVER_ADDRESS="smb://bfds/rob"
SOURCE="/Users/rob/Recordings/Work/00_MacOS/"
SERVER="bfds"
REMOTE_PATH="/mnt/bfds-nix/rob/recordings/Progress/Work/00_MacOS/"
TARGET="$SERVER:$REMOTE_PATH"
# Prüfen, ob das Netzlaufwerk gemountet ist
if mount | grep -q "$MOUNT_POINT"; then
log "Netzlaufwerk ist gemountet. Backup startet..."
else
log "Netzlaufwerk nicht gefunden. Versuche zu mounten..."
osascript -e "mount volume \"$SERVER_ADDRESS\""
# Nach dem Mounten erneut prüfen
if mount | grep -q "$MOUNT_POINT"; then
log "Netzlaufwerk erfolgreich gemountet."
else
log "Fehler: Netzlaufwerk konnte nicht gemountet werden."
notify "Fehler" "Server nicht erreichbar!\nRecordings -> BFDS"
# Prüfen, ob SSH-Verbindung zum Server möglich ist
log "Prüfe SSH-Verbindung zu $SERVER..."
if ! ssh -o ConnectTimeout=5 -o BatchMode=yes "$SERVER" "exit" 2>/dev/null; then
log "Fehler: SSH-Verbindung zu $SERVER fehlgeschlagen"
notify "Fehler" "Server $SERVER nicht erreichbar!"
exit 1
fi
fi
log "SSH-Verbindung erfolgreich"
# Prüfen, ob das Remote-Zielverzeichnis existiert
log "Prüfe Remote-Zielverzeichnis..."
if ! ssh "$SERVER" "test -d \"$REMOTE_PATH\""; then
log "Fehler: Remote-Verzeichnis existiert nicht: $REMOTE_PATH"
notify "Fehler" "Zielverzeichnis nicht gefunden!\n$REMOTE_PATH"
exit 1
fi
# Prüfen, ob Schreibrechte vorhanden sind
if ! ssh "$SERVER" "test -w \"$REMOTE_PATH\""; then
log "Fehler: Keine Schreibrechte für Remote-Verzeichnis: $REMOTE_PATH"
notify "Fehler" "Keine Schreibrechte!\n$REMOTE_PATH"
exit 1
fi
log "Remote-Verzeichnis ist bereit für Backup"
# Sicherung starten
log "Starte rsync..."
RSYNC_OUTPUT=$(mktemp)
rsync -v -r -l -t -D --stats "$SOURCE" "$TARGET" 2>&1 | tee -a "$LOGFILE" > "$RSYNC_OUTPUT"
log "Befehl: rsync -av --stats --no-owner --no-group \"$SOURCE\" > \"$RSYNC_OUTPUT\" \"$TARGET\""
rsync -av --stats --no-owner --no-group "$SOURCE" "$TARGET" > "$RSYNC_OUTPUT" 2>&1
# -r → Rekursiv kopieren (alle Unterordner & Dateien)
# -l → Symbolische Links kopieren
# -t → Zeitstempel beibehalten
# -D → Geräte- und Sonderdateien kopieren
# Rsync-Output komplett ins Logfile schreiben
cat "$RSYNC_OUTPUT" >> "$LOGFILE"
# -a → Archive-Modus (erhält Zeitstempel, Links, etc.)
# -v → Verbose
# --stats → Statistiken anzeigen
# --no-owner → Besitzer nicht übertragen
# --no-group → Gruppe nicht übertragen
# Statistiken auslesen
TOTAL_FILES=$(grep "Number of regular files transferred:" "$RSYNC_OUTPUT" | awk '{print $6}' | tr -d ',')
TOTAL_SIZE=$(grep "Total transferred file size:" "$RSYNC_OUTPUT" | awk '{print $5, $6}')
# Statistiken auslesen - rsync gibt mehrere Formate aus, teste beide
TOTAL_FILES=$(grep -E "Number of (regular )?files transferred:" "$RSYNC_OUTPUT" | awk '{print $NF}' | tr -d ',')
if [ -z "$TOTAL_FILES" ]; then
# Alternativer Versuch
TOTAL_FILES=$(grep "files transferred:" "$RSYNC_OUTPUT" | awk '{print $(NF)}' | tr -d ',')
fi
# Dateigröße in Bytes auslesen
# macOS rsync gibt aus: "Total transferred file size: 86137390 B"
TOTAL_BYTES=$(grep "Total transferred file size:" "$RSYNC_OUTPUT" | awk '{print $5}')
# Konvertiere String in Integer
TOTAL_BYTES=$((TOTAL_BYTES))
# Formatiere Größe in menschenlesbares Format
TOTAL_SIZE=$(format_bytes "$TOTAL_BYTES")
# Fallback falls keine Werte gefunden wurden
[ -z "$TOTAL_FILES" ] && TOTAL_FILES="0"
[ -z "$TOTAL_SIZE" ] && TOTAL_SIZE="0 bytes"
# Temporäre Datei löschen
rm -f "$RSYNC_OUTPUT"
# Setze Besitzer und Rechte auf dem Server
log "Setze Besitzer und Rechte..."
ssh "$SERVER" "chown -R smbuser:smbuser \"$REMOTE_PATH\" && chmod -R 777 \"$REMOTE_PATH\" && find \"$REMOTE_PATH\" -type f -exec chmod 666 {} \;" 2>&1 | tee -a "$LOGFILE"
# Erfolgsmeldung ausgeben
log "Backup abgeschlossen: $TOTAL_FILES Dateien, $TOTAL_SIZE übertragen"