diff --git a/linux/backup-boogie/backup-boogie.sh b/linux/backup-boogie/backup-boogie.sh deleted file mode 100755 index 3de078e..0000000 --- a/linux/backup-boogie/backup-boogie.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -# this one makes a copy of the whole /var/www/html from boogie to BFDS - -SCRIPTPATH=$(dirname `realpath $0`) -cd $SCRIPTPATH - -# rsync source -> destination -SOURCE_PATH=/var/www/virtual/boogie/html -DEST_PATH_FILES=/mnt/bfds/rob/backup/server/boogiedev.net/var_www - -# path of the database backups -DEST_PATH_DB=/mnt/bfds/rob/backup/server/boogiedev.net/db - -# EXCLUDE="--exclude-from exclude-list" - -# ### Get all databases - -# kick off DB dumping -curl --insecure --silent https://backup.boogiedev.net/dump_all_databases.php - -# download DB dumps -cd $DEST_PATH_DB -curl --insecure --silent https://backup.boogiedev.net/dumps.zip > dumps.zip -if [ -f dumps.zip ] -then - today=`date +%F` - mv dumps.zip all_databases_dump_$today.zip -else - echo "Datenbank Dump konnte nicht herunter geladen werden" -fi - -## aufräumen -curl --insecure --silent https://backup.boogiedev.net/dump_all_databases.php?cleanup_dump=1 \ No newline at end of file diff --git a/linux/backup-boogie/exclude-list b/linux/backup-boogie/exclude-list deleted file mode 100644 index 8503ae4..0000000 --- a/linux/backup-boogie/exclude-list +++ /dev/null @@ -1,7 +0,0 @@ -backup_all_databases_cMxNrCTVLBPrNo6qaonojeejCvCepekwssh -nextcloud/config/config.php -nextcloud/data/root/files/Extern -nextcloud/updater -nextcloud/backup -/nextcloud-data/updater-*/ -files_trashbin/ diff --git a/linux/backup-boogie/on_boogie_side/.gitignore b/linux/backup-boogie/on_boogie_side/.gitignore deleted file mode 100644 index 784098f..0000000 --- a/linux/backup-boogie/on_boogie_side/.gitignore +++ /dev/null @@ -1 +0,0 @@ -credentials.php \ No newline at end of file diff --git a/linux/backup-boogie/on_boogie_side/README b/linux/backup-boogie/on_boogie_side/README deleted file mode 100644 index 46b69af..0000000 --- a/linux/backup-boogie/on_boogie_side/README +++ /dev/null @@ -1,6 +0,0 @@ -The content of this folder hast to be on the Boogie server at: -/var/www/virtual/boogie/html/backup-boogie - -Its the server side enpoint of the backup script running on BFDS. - -The credentials.php has to be filled but never commited to the git \ No newline at end of file diff --git a/linux/backup-boogie/on_boogie_side/dump_all_databases.php b/linux/backup-boogie/on_boogie_side/dump_all_databases.php deleted file mode 100644 index 449db4b..0000000 --- a/linux/backup-boogie/on_boogie_side/dump_all_databases.php +++ /dev/null @@ -1,83 +0,0 @@ -&1", $output); - if(!empty($output)) - { - var_dump($output); - } -} - - -## Zip all dumps - -Cleanup($zipfile); -$zip = new ZipArchive; -if($zip -> open($zipfile, ZipArchive::CREATE ) === TRUE) -{ - $dir = opendir($dumps_path); - while($file = readdir($dir)) { - if(is_file($dumps_path.$file)) { - $zip -> addFile($dumps_path.$file, $file); - } - } - $zip ->close(); -} - -//eine funktion die auf den url parameter cleanup_dump=1 reagiert und dann alle dumps löscht -function Cleanup() -{ - global $zipfile; - - if(file_exists($zipfile)) - { - unlink($zipfile); - } -} \ No newline at end of file diff --git a/linux/backup-boogie/readme.md b/linux/backup-boogie/readme.md deleted file mode 100644 index 940e56a..0000000 --- a/linux/backup-boogie/readme.md +++ /dev/null @@ -1,4 +0,0 @@ -bfds soll sich regelmässig eine copy des wikis und aller scripte auf boogedev.net (uberspace) holen - - -Um keine hindernden Passwort-Eingaben zu haben, wird ein dezediertes keyfile ohne PW verwendet. diff --git a/linux/restic/backup-list-files.sh b/linux/restic/backup-list-files.sh deleted file mode 100755 index 72e3129..0000000 --- a/linux/restic/backup-list-files.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -# Hint: to exclude any directory (for example an cache dir) -# place the CACHEDIR.TAG file in there: https://bford.info/cachedir/ -# don't forget the signature in there and set the parameter: --exclude-caches - -export RESTIC_REPOSITORY=bfds:/mnt/bfds/rob-restic-backups/restic-repo-t520-user -export RESTIC_PASSWORD=kopenhagenhatsuperinternetwirklich - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" - -# backup the whole user dir to bfds -#restic -r sftp:${RESTIC_REPOSITORY} backup /home/rob --exclude-caches --exclude-file=${SCRIPT_DIR}/backup.excludes - -# find files in backup. $1 is the parameter from comand line. -# example: $ backup-list-files.sh /home/rob/Pictures > output.txt -# find all files containing Pictures path and out into output.txt -restic -r sftp:${RESTIC_REPOSITORY} find $1 - - -#restic -r sftp:bfds:/mnt/bfds/rob-restic-backups/restic-repo-t520-user backup /home/rob --exclude-caches diff --git a/linux/restic/backup-status.sh b/linux/restic/backup-status.sh deleted file mode 100755 index a8d42fd..0000000 --- a/linux/restic/backup-status.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -# Hint: to exclude any directory (for example an cache dir) -# place the CACHEDIR.TAG file in there: https://bford.info/cachedir/ -# don't forget the signature in there and set the parameter: --exclude-caches - -export RESTIC_REPOSITORY=bfds:/mnt/bfds/rob-restic-backups/restic-repo-t520-user -export RESTIC_PASSWORD=kopenhagenhatsuperinternetwirklich - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" - -# backup the whole user dir to bfds -# restic -r sftp:${RESTIC_REPOSITORY} backup /home/rob --exclude-caches --exclude-file=${SCRIPT_DIR}/backup.excludes - -#restic stats -r sftp:${RESTIC_REPOSITORY} -restic snapshots -r sftp:${RESTIC_REPOSITORY} diff --git a/linux/restic/backup.excludes b/linux/restic/backup.excludes deleted file mode 100644 index 1018f3e..0000000 --- a/linux/restic/backup.excludes +++ /dev/null @@ -1,21 +0,0 @@ -#Just Caches -**/.cache/ -**/cache/ -**/Cache/ - -#Logs -**/log/ -**/logs/ -**/Log/ -**/Logs/ -*.log - -# VSCode -/home/rob/.config/Code/Cache -/home/rob/.config/Code/CachedData -/home/rob/.config/Code/CachedExtensions -/home/rob/.config/Code/CachedExtensionVSIXs - -# Firefox und Co. -/home/rob/.mozilla -/home/rob/Downloads diff --git a/linux/restic/backup.sh b/linux/restic/backup.sh deleted file mode 100755 index 6f8c24a..0000000 --- a/linux/restic/backup.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -# Hint: to exclude any directory (for example an cache dir) -# place the CACHEDIR.TAG file in there: https://bford.info/cachedir/ -# don't forget the signature in there and set the parameter: --exclude-caches - -export RESTIC_REPOSITORY=bfds:/mnt/bfds/rob-restic-backups/restic-repo-t520-user -export RESTIC_PASSWORD=kopenhagenhatsuperinternetwirklich - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" - -# backup the whole user dir to bfds -restic -r sftp:${RESTIC_REPOSITORY} backup /home/rob --exclude-caches --exclude-file=${SCRIPT_DIR}/backup.excludes - - -#restic -r sftp:bfds:/mnt/bfds/rob-restic-backups/restic-repo-t520-user backup /home/rob --exclude-caches diff --git a/linux/restic/mount-backup.sh b/linux/restic/mount-backup.sh deleted file mode 100755 index 7e840fd..0000000 --- a/linux/restic/mount-backup.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -# mount the backup into the file system - -MOUNTPOINT="/mnt/restic-backup-me" - -echo Erstelle Ordner $MOUNTPOINT via sudo -sudo mkdir $MOUNTPOINT -sudo chown rob:rob $MOUNTPOINT - -echo Mount Backup -./restic-bfds.sh mount $MOUNTPOINT diff --git a/linux/restic/restic-bfds.sh b/linux/restic/restic-bfds.sh deleted file mode 100755 index 0e3d28f..0000000 --- a/linux/restic/restic-bfds.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -# Hint: to exclude any directory (for example an cache dir) -# place the CACHEDIR.TAG file in there: https://bford.info/cachedir/ -# don't forget the signature in there and set the parameter: --exclude-caches - -export RESTIC_REPOSITORY=bfds:/mnt/bfds/rob-restic-backups/restic-repo-t520-user -export RESTIC_PASSWORD=kopenhagenhatsuperinternetwirklich - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" - -# restic wrapper for use with command line arguments -restic -r sftp:${RESTIC_REPOSITORY} $1 $2 $3 $4 $5 $6 $7 $8 $9 diff --git a/linux/restic/restore.sh b/linux/restic/restore.sh deleted file mode 100755 index 5bbb2f7..0000000 --- a/linux/restic/restore.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -INCLUDE_FILES="/home/rob/Pictures/2022/*" -RESTORE_PATH="/home/rob/Pictures/from_restic/" -./restic-bfds.sh restore --target "$RESTORE_PATH" --include "$INCLUDE_FILES" latest diff --git a/linux/rsync-nextcloud/exclude-list b/linux/rsync-nextcloud/exclude-list deleted file mode 100644 index 8503ae4..0000000 --- a/linux/rsync-nextcloud/exclude-list +++ /dev/null @@ -1,7 +0,0 @@ -backup_all_databases_cMxNrCTVLBPrNo6qaonojeejCvCepekwssh -nextcloud/config/config.php -nextcloud/data/root/files/Extern -nextcloud/updater -nextcloud/backup -/nextcloud-data/updater-*/ -files_trashbin/ diff --git a/linux/rsync-nextcloud/on_sbz_side/README b/linux/rsync-nextcloud/on_sbz_side/README deleted file mode 100644 index 7b334ea..0000000 --- a/linux/rsync-nextcloud/on_sbz_side/README +++ /dev/null @@ -1,3 +0,0 @@ -This folder hast to be on the SBZ server - -The credentials.php has to be filled but never commited to the git \ No newline at end of file diff --git a/linux/rsync-nextcloud/on_sbz_side/dump_all_databases.php b/linux/rsync-nextcloud/on_sbz_side/dump_all_databases.php deleted file mode 100644 index ffe6a26..0000000 --- a/linux/rsync-nextcloud/on_sbz_side/dump_all_databases.php +++ /dev/null @@ -1,58 +0,0 @@ -&1", $output); - if(!empty($output)) - { - var_dump($output); - } -} - - -## Zip all dumps -$zipfile = "dumps.zip"; - -if(file_exists($zipfile)) -{ - unlink($zipfile); -} -$zip = new ZipArchive; -if($zip -> open($zipfile, ZipArchive::CREATE ) === TRUE) -{ - $dir = opendir($dumps_path); - while($file = readdir($dir)) { - if(is_file($dumps_path.$file)) { - $zip -> addFile($dumps_path.$file, $file); - } - } - $zip ->close(); -} diff --git a/linux/rsync-nextcloud/readme.md b/linux/rsync-nextcloud/readme.md deleted file mode 100644 index 19e2bcf..0000000 --- a/linux/rsync-nextcloud/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -bfds soll sich regelmässig eine copy der nextcloud instanz ziehen - -Dazu wird der home-rob container im /home/rob gemountet und dann auf file basis eine Kopie vom kompletten /var/www/html - -Nextcloud wird zu dem dazu in den maintenance mode versetzt. - -Um keoine Passwort-Eingaben zu verhindern, wird ein dezediertes keyfile ohne PW verwendet. diff --git a/linux/rsync-nextcloud/rsync-nextcloud.sh b/linux/rsync-nextcloud/rsync-nextcloud.sh deleted file mode 100755 index 887f6e5..0000000 --- a/linux/rsync-nextcloud/rsync-nextcloud.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -# this one makes a copy of the whole /var/www/html from sbz -# -# to recover nextcloud data see: https://docs.nextcloud.com/server/13/admin_manual/maintenance/restore.html -# -# rsync args: -# -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X) -# -r, --recursive recurse into directories -# -l, --links When symlinks are encountered, recreate the symlink on the destination. -# -h, --human-readable Output numbers in a more human-readable format. - -SCRIPTPATH=$(dirname `realpath $0`) -cd $SCRIPTPATH - -# rsync source -> destination -SOURCE_PATH=/var/www/ -DEST_PATH_FILES=/mnt/bfds/rob/backup/server/spaceboyz.net/var_www - -# ssh credentials -PORT="42523" -KEY="${SCRIPTPATH}/sbz_keyless" -USER_AT_HOST="rob@spaceboyz.net" - -# path of the database backups -DEST_PATH_DB=/mnt/bfds/rob/backup/server/spaceboyz.net/mariadb - -## path where home-rob container is mouted into host (on SBZ) -SBZ_MOUNT_PATH=/home/rob/tmp_mnt - -## path of the nextcloud instance (on SBZ) -NEXTCLOUD_PATH=/var/www/html/nextcloud - -EXCLUDE="--exclude-from exclude-list" - - -# mount my lxc container into my home on sbz -ssh -p $PORT -i $KEY $USER_AT_HOST "sudo mount /dev/mapper/vms-home--rob $SBZ_MOUNT_PATH" - -# grand read permissons if not given -ssh -p $PORT -i $KEY $USER_AT_HOST "sudo chmod -R +rx ${SBZ_MOUNT_PATH}/var/www/nextcloud-data" - -# put nextcloud into maintenance, outside the home-rob container -ssh -p $PORT -i $KEY $USER_AT_HOST "sudo sed -i \"s|'maintenance' => false|'maintenance' => true|g\" $SBZ_MOUNT_PATH$NEXTCLOUD_PATH/config/config.php" - -# rsync download from sbz -rsync --quiet -a -zz --progress $EXCLUDE -e "ssh -p $PORT -i $KEY" $USER_AT_HOST:${SBZ_MOUNT_PATH}${SOURCE_PATH} ${DEST_PATH_FILES} - -# turn off nextcloud maintenancThis rsync lacks old-style --compress due to its external zlibe, outside the home-rob container -ssh -p $PORT -i $KEY $USER_AT_HOST "sudo sed -i \"s|'maintenance' => true|'maintenance' => false|g\" $SBZ_MOUNT_PATH$NEXTCLOUD_PATH/config/config.php" - -# umount my container -ssh -p $PORT -i $KEY $USER_AT_HOST "sudo umount $SBZ_MOUNT_PATH" - - -### Get all databases - -cd $DEST_PATH_DB -# kick off DB dumping -curl --insecure --silent https://rob.spaceboyz.net/backup_all_databases_cMxNrCTVLBPrNo6qaonojeejCvCepekwssh/dump_all_databases.php -# download DB dumps -curl --insecure --silent https://rob.spaceboyz.net/backup_all_databases_cMxNrCTVLBPrNo6qaonojeejCvCepekwssh/dumps.zip > dumps.zip -if [ -f dumps.zip ] -then - today=`date +%F` - mv dumps.zip all_databases_dump_$today.zip -else - echo "Datenbank Dump konnte nicht herunter geladen werden" -fi diff --git a/linux/rsync-nextcloud/sbz_keyless b/linux/rsync-nextcloud/sbz_keyless deleted file mode 100755 index 044b4e0..0000000 --- a/linux/rsync-nextcloud/sbz_keyless +++ /dev/null @@ -1,49 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -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 ------END OPENSSH PRIVATE KEY----- diff --git a/linux/rsync-nextcloud/sbz_keyless.pub b/linux/rsync-nextcloud/sbz_keyless.pub deleted file mode 100644 index 6aec08d..0000000 --- a/linux/rsync-nextcloud/sbz_keyless.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCrW6mg83W/cdQuaB/G0kjV3rTRUv76sXvTlyyauli6SjEsemfeDoVTDAsPUXu6ql+aKeAIE70dbq8uYdmu0hwZvUHNVcwLKIV9vTvoeMBAfNX81aTw+koXfZ6SR6MW8vaNK+b4eUYvTa4bS7FwrUXMgQV3mlnUpPLGgS+0K47id1hyxwOolzbLtGTdR1ucVzE+ZitHt3Vn6/AJ1KJV2+TFSZZXKhUp7lidHwrQt2x0n/zkQ/BW8+sL5b7/2G4kUL++OfF+nZjQGFZgnVIU28fmK1izkYtni2PYPzResy8r3eAwrqv5/8w7FqI3Lx2BkBHxKZU3sEOwV4Y5BBZACv4zk39VTJDaz55Asf7g+cCOFY0zqr/sYWek0zlPP2ccs9gi5gH/oLeLLCBPGCgefH6az8qfwvDu+gN0ugUo4aH4HfWEzZpS5klx3F12txxV514Z1RKSxvImuCg03SYvMX1cluusbO2uRj9VJ0VnA9g+UiEm/UJf9GgB450fXEcjJUyUyQ8eFyD7TPIKBzCxv0GDclKKzJeeUbfGkxQockpl3he1cIISfyoxPETyzTwIz/LOQsScMpC4W9r1yc0MJcNy8e0K6h/Bwev6tEqV0qIHzv5bnjVdDkKbEMMJ7LaBeUQstgJ4w3tgVxN6QgvTesDCRg4oWuqb5d82eAvl/9k+dQ== rob@d3v.localdomain diff --git a/macos/Backup-Recordings/Library/LaunchAgents/com.backup-recordings-to-bfds.plist b/macos/Backup-Recordings/Library/LaunchAgents/com.backup-recordings-to-bfds.plist deleted file mode 100644 index 057910d..0000000 --- a/macos/Backup-Recordings/Library/LaunchAgents/com.backup-recordings-to-bfds.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Label - com.backup-recordings-to-bfds - - ProgramArguments - - /bin/bash - /Users/rob/code/lokale-scripte/macos/Backup-Recordings/backup-recordings-to-bfds.sh - - - StartCalendarInterval - - Hour - 12 - Minute - 0 - - - StandardOutPath - /Users/rob/code/lokale-scripte/macos/Backup-Recordings/run-backup-recordings_output.log - StandardErrorPath - /Users/rob/code/lokale-scripte/macos/Backup-Recordings/run-backup-recordings_error.log - - RunAtLoad - - - diff --git a/macos/Backup-Recordings/backup-recordings-to-bfds.sh b/macos/Backup-Recordings/backup-recordings-to-bfds.sh deleted file mode 100755 index 1b518e3..0000000 --- a/macos/Backup-Recordings/backup-recordings-to-bfds.sh +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/bash - -# Logfile definieren -LOGFILE="$HOME/Library/Logs/backup-recordings.log" -MAX_LOG_SIZE=$((3 * 1024 * 1024)) # 3MB in Bytes - -# Funktion zur Überprüfung und Rotation des Logfiles -rotate_log() { - if [ -f "$LOGFILE" ]; then - local size=$(stat -f%z "$LOGFILE" 2>/dev/null || echo 0) - if [ "$size" -ge "$MAX_LOG_SIZE" ]; then - # Behalte nur die letzten 50% des Logs - local keep_lines=$(($(wc -l < "$LOGFILE") / 2)) - tail -n "$keep_lines" "$LOGFILE" > "${LOGFILE}.tmp" - mv "${LOGFILE}.tmp" "$LOGFILE" - fi - fi -} - -# Funktion für Log-Ausgaben mit Zeitstempel -log() { - local message="[$(date '+%Y-%m-%d %H:%M:%S')] $1" - echo "$message" | tee -a "$LOGFILE" -} - -# Funktion für macOS Benachrichtigungen -notify() { - local subtitle="$1" - local message="$2" - 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/" -SERVER="bfds" -REMOTE_PATH="/mnt/bfds-nix/rob/recordings/Progress/Work/00_MacOS/" -TARGET="$SERVER:$REMOTE_PATH" - -# 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 -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) -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 - -# 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 - 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" - -# 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" - -# Optional: Notification für macOS anzeigen -notify "Abgeschlossen" "$TOTAL_FILES Dateien übertragen ($TOTAL_SIZE)" \ No newline at end of file diff --git a/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh b/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh deleted file mode 100755 index 40e3446..0000000 --- a/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh +++ /dev/null @@ -1,253 +0,0 @@ -#!/bin/bash - -# Sichert die Freigaben von bfds auf die OFFSITE-Platte (VeraCrypt-Partition). -# macOS-Portierung von robocopy-bfds-offsite/bfds-offsite-backup.cmd. -# Kompatibel mit dem mit macOS ausgelieferten Bash 3.2. -# -# Ablauf: VeraCrypt-Partition entschluesseln und einbinden, SMB-Freigaben von -# bfds per rsync kopieren, Partition wieder aushaengen. -# -# Voraussetzung: VeraCrypt (+ macFUSE) installiert. -# Optional vorab setzen: DEVICE=/dev/disk4s1 ./backup-bfds-storage-offsite.sh - -PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/homebrew/bin" -export PATH - -# Schlaf verhindern, solange dieses Script laeuft (-w $$ endet mit dem Script). -# -i Idle-Sleep, -m Platten-Sleep, -s System-Sleep (nur am Netzteil wirksam). -# Der Bildschirm darf ausgehen. -caffeinate -i -m -s -w $$ & - -SHARES=( - photos - rob - movies - music - peggy - ebooks - ) - - -VOLUME_LABEL="${VOLUME_LABEL:-NASOFFSITE1}" -VERACRYPT="${VERACRYPT:-/Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt}" -MOUNT_POINT="${MOUNT_POINT:-/Volumes/$VOLUME_LABEL}" -SOURCE_HOST="${SOURCE_HOST:-bfds}" -DEVICE="${DEVICE:-}" - - -MOUNTED_BY_US=0 - -# Run-Protokoll: pro Lauf eine JSON-Zeile, aus der das Dashboard den letzten -# durchgehenden Run (alle Freigaben fehlerfrei) abliest. -RUN_LOG_FILE="${RUN_LOG_FILE:-}" -RUN_START="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" -SHARE_RESULTS="" - -log() { - printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" -} - -die() { - log "FEHLER: $*" - exit 1 -} - -unmount_volume() { - [ "$MOUNTED_BY_US" = "1" ] || return 0 - log "Partition wird ausgehaengt" - "$VERACRYPT" --text --dismount "$MOUNT_POINT" --non-interactive \ - || log "WARNUNG: Aushaengen fehlgeschlagen, bitte in VeraCrypt manuell trennen" - MOUNTED_BY_US=0 -} - -# Ergebnis einer Freigabe merken: ok, source_missing, unreadable oder rsync_ -record_share() { - SHARE_RESULTS="${SHARE_RESULTS:+$SHARE_RESULTS,}\"$1\":\"$2\"" -} - -# Haengt am Ende jedes Laufs (auch bei Fehler oder Abbruch) eine JSON-Zeile an -# ~/Library/Logs/bfds-offsite-backup.jsonl an. "complete" ist nur wahr, wenn das -# Script mit 0 endete und jede Freigabe "ok" war. -write_run_record() { - local rc="$1" end ok total="${#SHARES[@]}" complete=false home - end="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" - ok="$(printf '%s' "$SHARE_RESULTS" | grep -o ':"ok"' | wc -l | tr -d ' ')" - [ "$rc" -eq 0 ] && [ "$ok" -eq "$total" ] && complete=true - if [ -z "$RUN_LOG_FILE" ]; then - home="$HOME" - if [ -n "${SUDO_USER:-}" ]; then - home="$(dscl . -read "/Users/$SUDO_USER" NFSHomeDirectory 2>/dev/null | awk '{print $2}')" - [ -n "$home" ] || home="$HOME" - fi - RUN_LOG_FILE="$home/Library/Logs/bfds-offsite-backup.jsonl" - fi - mkdir -p "$(dirname "$RUN_LOG_FILE")" 2>/dev/null - printf '{"start":"%s","end":"%s","exit_code":%s,"complete":%s,"shares":{%s}}\n' \ - "$RUN_START" "$end" "$rc" "$complete" "$SHARE_RESULTS" >> "$RUN_LOG_FILE" \ - || { log "WARNUNG: Run-Protokoll konnte nicht geschrieben werden: $RUN_LOG_FILE"; return 0; } - # Unter sudo gehoert die Datei sonst root - if [ -n "${SUDO_USER:-}" ]; then chown "$SUDO_USER" "$RUN_LOG_FILE" 2>/dev/null || true; fi -} - -# Die Disk-Nummer wechselt (disk4, disk6, ...). Gesucht wird daher die -# Partition 1 auf externen, physischen Platten, die >= MIN_SIZE_GB gross sind -# und nicht von macOS eingebunden werden koennen (Typ "Microsoft Basic Data", -# verschluesselt). Nur bei genau einem Treffer wird sie verwendet. -MIN_SIZE_GB="${MIN_SIZE_GB:-3000}" - -find_offsite_partition() { - local disk part bytes - local found=() - for disk in $(diskutil list external physical | awk '/^\/dev\/disk/ {gsub(/[:]/,"",$1); sub("/dev/","",$1); print $1}'); do - part="${disk}s1" - diskutil info "$part" >/dev/null 2>&1 || continue - diskutil list "$disk" | grep -q "Microsoft Basic Data.*${part}\$" || continue - bytes="$(diskutil info "$disk" | sed -n 's/.*Disk Size:.*(\([0-9]*\) Bytes).*/\1/p' | head -1)" - [ -n "$bytes" ] && [ "$bytes" -ge $((MIN_SIZE_GB * 1000000000)) ] || continue - # Schon eingebundene Partition (normales Dateisystem) ist nicht die gesuchte - [ -z "$(diskutil info "$part" | sed -n 's/^ *Mount Point: *\(.\+\)$/\1/p')" ] || continue - found+=("/dev/$part") - done - if [ "${#found[@]}" -ne 1 ]; then - log "FEHLER: Keine eindeutige OFFSITE-Partition gefunden (Treffer: ${#found[@]})" >&2 - return 1 - fi - log "OFFSITE-Partition erkannt: ${found[0]}" >&2 - echo "${found[0]}" -} - -trap 'rc=$?; unmount_volume; write_run_record "$rc"' EXIT -trap 'log "Abgebrochen"; exit 130' INT TERM - -# ************************************************** -# Einbinden der VeraCrypt Partition -# ************************************************** -[ -x "$VERACRYPT" ] || die "VeraCrypt nicht gefunden: $VERACRYPT" - -if [ -d "$MOUNT_POINT" ] && mount | grep -q " on $MOUNT_POINT "; then - log "Festplatte $VOLUME_LABEL ist bereits eingebunden: $MOUNT_POINT" -else - if [ -z "$DEVICE" ]; then - DEVICE="$(find_offsite_partition)" || exit 1 - fi - # "disk4s1" und "/dev/disk4s1" akzeptieren - case "$DEVICE" in - disk*) DEVICE="/dev/$DEVICE" ;; - esac - [ -e "$DEVICE" ] || die "Device nicht gefunden: $DEVICE" - - read -r -s -p "Bitte geben Sie das Passwort fuer die Festplatte $VOLUME_LABEL ein: " VOLUME_PASSWORD - echo - - log "Festplatte $VOLUME_LABEL wird entschluesselt und eingebunden" - "$VERACRYPT" --text --non-interactive --mount "$DEVICE" "$MOUNT_POINT" \ - --password="$VOLUME_PASSWORD" --pim=0 --keyfiles="" --protect-hidden=no \ - || die "Einbinden mit VeraCrypt fehlgeschlagen" - unset VOLUME_PASSWORD - MOUNTED_BY_US=1 -fi - -[ -d "$MOUNT_POINT" ] || die "Festplatte $VOLUME_LABEL nicht gefunden unter $MOUNT_POINT" - -# ************************************************** -# Kopieren der SMB-Freigaben -# ************************************************** -EXIT_CODE=0 -PROBE_TIMEOUT="${PROBE_TIMEOUT:-20}" -RSYNC_TIMEOUT="${RSYNC_TIMEOUT:-60}" -RSYNC_RETRIES="${RSYNC_RETRIES:-3}" - -# Fuehrt einen Befehl mit Zeitlimit (Sekunden) aus; macOS hat kein timeout. -# Ein haengender Prozess (z.B. ls auf toter SMB-Verbindung) wird nicht -# abgewartet, sondern abgeschossen und zurueckgelassen. -run_with_timeout() { - local secs="$1" pid ticks=0 - shift - "$@" >/dev/null 2>&1 & - pid=$! - while kill -0 "$pid" 2>/dev/null; do - if [ "$ticks" -ge $((secs * 10)) ]; then - kill -9 "$pid" 2>/dev/null - return 124 - fi - sleep 0.1 - ticks=$((ticks + 1)) - done - wait "$pid" -} - -# Prueft, ob die Freigabe wirklich gemountet ist, Verzeichnisse listbar sind -# und sich Dateiinhalt lesen laesst (Listing allein kann aus dem Cache kommen). -probe_source() { - local dir="$1" file - mount | grep -q " on $dir (smbfs" || return 1 - ls -A "$dir" >/dev/null || return 1 - file="$(find "$dir" -maxdepth 3 -type f ! -name '.*' -print -quit)" || return 1 - [ -z "$file" ] || head -c 1 "$file" >/dev/null || return 1 -} - -run_rsync() { - local share="$1" - local source="/Volumes/$share" - - if [ ! -d "$source" ]; then - log "Binde SMB-Freigabe smb://$SOURCE_HOST/$share ein" - # Unter sudo als eigentlicher Benutzer oeffnen, damit dessen Keychain/Finder genutzt wird - if [ -n "${SUDO_USER:-}" ]; then - sudo -u "$SUDO_USER" open "smb://$SOURCE_HOST/$share" - else - open "smb://$SOURCE_HOST/$share" - fi - local i - for i in 1 2 3 4 5 6 7 8 9 10; do - [ -d "$source" ] && break - sleep 1 - done - fi - if [ ! -d "$source" ]; then - log "WARNUNG: Quelle nicht gefunden, bitte SMB-Freigabe oeffnen: smb://$SOURCE_HOST/$share" - EXIT_CODE=1 - record_share "$share" source_missing - return - fi - - log "Pruefe Lesbarkeit von $source (Timeout ${PROBE_TIMEOUT}s)" - if ! run_with_timeout "$PROBE_TIMEOUT" probe_source "$source"; then - log "WARNUNG: $source nicht lesbar (haengt oder Fehler), ueberspringe $share. Freigabe im Finder trennen und neu verbinden." - EXIT_CODE=1 - record_share "$share" unreadable - return - fi - - log "Sichere $share" - # -r Unterverzeichnisse inkl. leerer, -l Symlinks, -t Zeitstempel (wie /COPY:DAT), - # --partial setzt abgebrochene Uebertragungen fort (wie /z). Kein --delete: - # robocopy /E spiegelt ebenfalls nicht. --timeout bricht bei SMB-Haengern ab. - # Bei Abbruch (z.B. SMB-Timeout) bis zu RSYNC_RETRIES mal weiter; --partial und - # der Zeitstempelvergleich sorgen dafuer, dass Fertiges nicht neu kopiert wird. - local rc attempt=1 - while :; do - rsync -rlt -h -v --progress --partial --stats --timeout="$RSYNC_TIMEOUT" --exclude=".DS_Store" --exclude="._.DS_Store" "$source/" "$MOUNT_POINT/$share/" - rc=$? - [ "$rc" -eq 0 ] && break - [ "$attempt" -lt "$RSYNC_RETRIES" ] || break - attempt=$((attempt + 1)) - log "rsync fuer $share endete mit Code $rc, neuer Versuch $attempt/$RSYNC_RETRIES in 15s" - sleep 15 - run_with_timeout "$PROBE_TIMEOUT" probe_source "$source" || { log "WARNUNG: $source weiterhin nicht lesbar"; break; } - done - if [ "$rc" -ne 0 ]; then - log "WARNUNG: rsync fuer $share endete mit Code $rc" - EXIT_CODE=1 - record_share "$share" "rsync_$rc" - else - record_share "$share" ok - fi -} - -for share in "${SHARES[@]}"; do - run_rsync "$share" -done - -log "Backupprozess beendet" -exit "$EXIT_CODE" diff --git a/macos/backup-bfds-storage-offsite/install-spotlight-app.sh b/macos/backup-bfds-storage-offsite/install-spotlight-app.sh deleted file mode 100755 index 29872f5..0000000 --- a/macos/backup-bfds-storage-offsite/install-spotlight-app.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -# Erstellt ~/Applications/BFDS Offsite Backup.app, damit das Backup per -# Spotlight ("bfds offsite backup") gestartet werden kann. Die App oeffnet -# ein Terminal-Fenster und startet dort launch-backup.sh (Header, dann sudo-Start) -# (Passwort-Abfragen und Ausgabe brauchen ein Terminal). -# Kompatibel mit dem mit macOS ausgelieferten Bash 3.2. - -set -euo pipefail - -APP_NAME="${APP_NAME:-BFDS Offsite Backup}" -APP_DIR="${APP_DIR:-$HOME/Applications}" -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -BACKUP_SCRIPT="$SCRIPT_DIR/launch-backup.sh" -APP_PATH="$APP_DIR/$APP_NAME.app" - -[ -x "$BACKUP_SCRIPT" ] || { echo "FEHLER: $BACKUP_SCRIPT nicht ausfuehrbar" >&2; exit 1; } - -mkdir -p "$APP_DIR" -rm -rf "$APP_PATH" - -# Pfad fuer AppleScript-String und Shell quoten -SHELL_CMD="$(printf '%q' "$BACKUP_SCRIPT")" -SHELL_CMD="${SHELL_CMD//\\/\\\\}" -SHELL_CMD="${SHELL_CMD//\"/\\\"}" - -/usr/bin/osacompile -o "$APP_PATH" < 0 then exit repeat - delay 0.1 - end repeat - if (count of windows) > 0 then - do script "$SHELL_CMD" in window 1 - else - do script "$SHELL_CMD" - end if - end if -end tell -EOF - -echo "Installiert: $APP_PATH" -echo "Spotlight: \"bfds offsite backup\" eintippen (Indexierung kann kurz dauern)." - -# Standardmaessig heisst die App intern "applet" (so erscheint sie auch in den -# Datenschutz-Listen). Ausfuehrbare Datei, Bundle-Name und -ID umbenennen und neu signieren. -PLIST="$APP_PATH/Contents/Info.plist" -EXEC_NAME="BFDS-Offsite-Backup" -mv "$APP_PATH/Contents/MacOS/applet" "$APP_PATH/Contents/MacOS/$EXEC_NAME" -PB=/usr/libexec/PlistBuddy -"$PB" -c "Set :CFBundleExecutable $EXEC_NAME" "$PLIST" -"$PB" -c "Set :CFBundleName $APP_NAME" "$PLIST" -"$PB" -c "Add :CFBundleIdentifier string de.streber24.bfds-offsite-backup" "$PLIST" 2>/dev/null \ - || "$PB" -c "Set :CFBundleIdentifier de.streber24.bfds-offsite-backup" "$PLIST" -"$PB" -c "Add :CFBundleDisplayName string $APP_NAME" "$PLIST" 2>/dev/null \ - || "$PB" -c "Set :CFBundleDisplayName $APP_NAME" "$PLIST" -/usr/bin/codesign --force --deep --sign - "$APP_PATH" - -# Voller Festplattenzugriff laesst sich nicht per Script erteilen (macOS schuetzt -# die Freigabe, nur MDM oder der Nutzer selbst kann sie setzen). Deshalb: Einstellungen -# oeffnen und die App im Finder markieren, zum Hineinziehen in die Liste. -echo -echo "Bitte jetzt einmalig 'Voller Festplattenzugriff' fuer die App erteilen:" -echo " App aus dem Finder-Fenster in die Liste ziehen (oder + klicken) und Schalter aktivieren." -open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles" -open -R "$APP_PATH" diff --git a/macos/backup-bfds-storage-offsite/launch-backup.sh b/macos/backup-bfds-storage-offsite/launch-backup.sh deleted file mode 100755 index de83030..0000000 --- a/macos/backup-bfds-storage-offsite/launch-backup.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Startet das Backup aus der Spotlight-App: zeigt zuerst einen Willkommens- -# Header samt Hinweis auf die sudo-Passwortabfrage, dann das eigentliche Script. -# Kompatibel mit dem mit macOS ausgelieferten Bash 3.2. - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" - -clear -cat <<'BANNER' -##################################################### -## ## -## BFDS OFFSITE BACKUP ## -## ## -## NAS-Freigaben -> verschluesselte Platte ## -## ## -##################################################### - -Willkommen! - - 1. Zuerst wird jetzt Dein MAC-PASSWORT (sudo) abgefragt, - damit das Programm gestartet werden kann. - Beim Tippen erscheinen keine Zeichen. - 2. Danach folgt das Passwort der VeraCrypt-Festplatte. - -BANNER - -sudo "$SCRIPT_DIR/backup-bfds-storage-offsite.sh" -status=$? - -echo -read -r -n 1 -s -p "Fertig (Exit-Code $status). Taste druecken zum Schliessen... " -echo -exit "$status" diff --git a/macos/backup-paperless-ngx/README.md b/macos/backup-paperless-ngx/README.md deleted file mode 100644 index be8d5f5..0000000 --- a/macos/backup-paperless-ngx/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Paperless-ngx-Backup von TrueNAS auf macOS - -Das Script ist fuer die auf `bfds` erkannte Installation vorbereitet: - -- TrueNAS 25.04.2.6 -- TrueNAS-App `paperless-ngx` 1.6.37 -- Paperless-ngx 3.0.2 -- Container `ix-paperless-ngx-paperless-1` - -Es pflegt einen dauerhaften Paperless-Export und synchronisiert ihn ungezippt -auf den Mac. Nach dem ersten vollstaendigen Lauf werden nur neue, geaenderte -oder geloeschte Dateien abgeglichen. Es entstehen keine Archive und keine -taeglichen Vollkopien. - -Der lokale Stand befindet sich hier: - -```text -~/Backups/paperless-ngx/current/ -├── backup-info.txt -├── paperless-export/ -│ ├── manifest.json -│ ├── metadata.json -│ ├── archive/ -│ ├── originals/ -│ └── thumbnails/ -└── truenas-app-config/ -``` - -`paperless-export` enthaelt Dokumente, Thumbnails, Metadaten, Benutzer und die -exportierten Datenbankinhalte. `truenas-app-config` enthaelt zusaetzlich die -TrueNAS-App-Einstellungen und die Konfiguration frueherer App-Versionen. - -## Testen und ausfuehren - -```bash -./backup-paperless-ngx.sh --check -./backup-paperless-ngx.sh -``` - -`--check` prueft SSH, Container und Mounts. Ausserdem wird ein kleiner -temporaerer `document_exporter --data-only`-Lauf ausgefuehrt und dessen -Manifest kontrolliert. Der Testexport wird sofort wieder entfernt. - -Alle Werte lassen sich ueber `~/.config/paperless-backup/config` aendern; -siehe `config.example`. Voraussetzung ist, dass -`ssh -o BatchMode=yes bfds true` ohne Passwortdialog funktioniert. - -## Taeglich um 03:00 Uhr ausfuehren - -```bash -./install-launchagent.sh -``` - -Der Installer kopiert das Script nach -`~/Library/Application Support/PaperlessBackup`, legt bei Bedarf die -Konfiguration an und registriert einen LaunchAgent. Ein manueller Lauf des -installierten Jobs ist mit folgendem Befehl moeglich: - -```bash -launchctl kickstart -k gui/$(id -u)/de.rob.paperless-ngx-backup -``` - -Logs stehen in `~/Library/Logs/paperless-ngx-backup.log` sowie in den beiden -`paperless-ngx-launchd.*.log`-Dateien. - -## Wiederherstellung - -1. Eine frische Paperless-Instanz mit derselben Paperless-Version wie in - `backup-info.txt` bereitstellen. -2. Den Inhalt von `current/paperless-export` in das Export-Volume der neuen - Instanz kopieren und dort `document_importer` ausfuehren. -3. `current/truenas-app-config` dient als Referenz fuer Ports, Storage, - Umgebungswerte und Secrets. Diese Dateien nicht blind in eine laufende - TrueNAS-App zurueckkopieren. - -Der Paperless-Exporter sichert keine API-Tokens; sie muessen nach einem Import -neu erzeugt werden. - -## Verhalten und Sicherheit - -Das ist ein Spiegel des aktuellen Paperless-Stands. Wird ein Dokument in -Paperless geloescht, wird es beim naechsten erfolgreichen Lauf auch aus diesem -Export entfernt. Fuer historische Staende sollte der Ordner zusaetzlich durch -Time Machine oder ein anderes versionierendes Backup gesichert werden. - -Der Export enthaelt alle Dokumente und moegliche Klartext-Secrets aus der -TrueNAS-App-Konfiguration. Das uebergeordnete Zielverzeichnis ist nur fuer den -aktuellen macOS-Benutzer zugaenglich. FileVault sollte aktiviert sein. - -Auf dem TrueNAS-Apps-Pool bleibt ebenfalls ein ungezipptes Exportverzeichnis -`macos-backup-current` bestehen. Es wird von Paperless bei jedem Lauf -inkrementell aktualisiert. - -Bereits mit einer aelteren Scriptversion erzeugte `.tar.gz`-Archive werden -nicht automatisch geloescht. Sie koennen nach erfolgreicher Kontrolle des -neuen `current`-Ordners manuell entfernt werden. diff --git a/macos/backup-paperless-ngx/backup-paperless-ngx.sh b/macos/backup-paperless-ngx/backup-paperless-ngx.sh deleted file mode 100755 index b3c57dc..0000000 --- a/macos/backup-paperless-ngx/backup-paperless-ngx.sh +++ /dev/null @@ -1,290 +0,0 @@ -#!/bin/bash - -# Unkomprimierter, inkrementell aktualisierter Paperless-Export auf diesen Mac. -# Kompatibel mit dem mit macOS ausgelieferten Bash 3.2. - -set -euo pipefail - -PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/homebrew/bin" -export PATH - -SERVER="${SERVER:-bfds}" -APP_NAME="${APP_NAME:-paperless-ngx}" -PAPERLESS_CONTAINER="${PAPERLESS_CONTAINER:-ix-paperless-ngx-paperless-1}" -BACKUP_DIR="${BACKUP_DIR:-$HOME/Backups/paperless-ngx}" -SSH_CONNECT_TIMEOUT="${SSH_CONNECT_TIMEOUT:-10}" -NOTIFY="${NOTIFY:-1}" - -CONFIG_FILE="${PAPERLESS_BACKUP_CONFIG:-$HOME/.config/paperless-backup/config}" -LOG_FILE="${PAPERLESS_BACKUP_LOG:-$HOME/Library/Logs/paperless-ngx-backup.log}" - -if [ -f "$CONFIG_FILE" ]; then - # Die Datei ist eine benutzereigene Shell-Konfiguration (KEY=WERT). - # shellcheck disable=SC1090 - . "$CONFIG_FILE" -fi - -SSH=(/usr/bin/ssh -o BatchMode=yes -o ConnectTimeout="$SSH_CONNECT_TIMEOUT") -RSYNC_RSH="/usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=$SSH_CONNECT_TIMEOUT" -APP_CONFIG_DIR="/mnt/.ix-apps/app_configs/$APP_NAME" -REMOTE_CURRENT_DIR="/usr/src/paperless/export/macos-backup-current" -LOCAL_CURRENT_DIR="$BACKUP_DIR/current" - -LOCK_DIR="${TMPDIR:-/tmp}/paperless-ngx-backup-${UID}.lock" -LOCAL_CHECK_DIR="" -REMOTE_EXPORT_DIR="" -REMOTE_EXPORT_HOST_DIR="" -BACKUP_SUCCEEDED=0 - -usage() { - cat <<'EOF' -Aufruf: backup-paperless-ngx.sh [--check | --help] - - ohne Option Lokalen Paperless-Export inkrementell aktualisieren - --check Zusaetzlich einen temporaeren Datenbankexport testen - --help Diese Hilfe anzeigen - -Optionale Konfiguration: ~/.config/paperless-backup/config -EOF -} - -log() { - local message - message="[$(date '+%Y-%m-%d %H:%M:%S')] $*" - printf '%s\n' "$message" | /usr/bin/tee -a "$LOG_FILE" -} - -warn() { - log "WARNUNG: $*" -} - -notify() { - [ "$NOTIFY" = "1" ] || return 0 - /usr/bin/osascript - "$1" "$2" >/dev/null 2>&1 <<'APPLESCRIPT' || true -on run argv - display notification (item 2 of argv) with title "Paperless-ngx Backup" subtitle (item 1 of argv) -end run -APPLESCRIPT -} - -die() { - log "FEHLER: $*" - exit 1 -} - -cleanup() { - local exit_code=$? - trap - EXIT INT TERM - set +e - - if [ -n "$REMOTE_EXPORT_DIR" ]; then - case "$REMOTE_EXPORT_DIR" in - /usr/src/paperless/export/macos-backup-check-*) - "${SSH[@]}" "$SERVER" \ - "docker exec '$PAPERLESS_CONTAINER' rm -rf -- '$REMOTE_EXPORT_DIR'" \ - >/dev/null 2>&1 || true - ;; - esac - fi - - if [ -n "$LOCAL_CHECK_DIR" ] && [ -d "$LOCAL_CHECK_DIR" ]; then - case "$LOCAL_CHECK_DIR" in - "$BACKUP_DIR"/.check.*) /bin/rm -rf -- "$LOCAL_CHECK_DIR" ;; - esac - fi - - /bin/rmdir "$LOCK_DIR" >/dev/null 2>&1 || true - - if [ "$exit_code" -ne 0 ] && [ "$BACKUP_SUCCEEDED" -ne 1 ]; then - notify "Fehlgeschlagen" "Details: $LOG_FILE" - fi - exit "$exit_code" -} - -validate_configuration() { - case "$SERVER" in - *[!A-Za-z0-9_.:@-]*|'') die "Ungueltiger SERVER-Wert: $SERVER" ;; - esac - case "$APP_NAME" in - *[!A-Za-z0-9_.-]*|'') die "Ungueltiger APP_NAME-Wert: $APP_NAME" ;; - esac - case "$PAPERLESS_CONTAINER" in - *[!A-Za-z0-9_.-]*|'') die "Ungueltiger Containername: $PAPERLESS_CONTAINER" ;; - esac - case "$SSH_CONNECT_TIMEOUT" in - *[!0-9]*|'') die "SSH_CONNECT_TIMEOUT muss eine ganze Zahl sein" ;; - esac - case "$BACKUP_DIR" in - /*) ;; - *) die "BACKUP_DIR muss ein absoluter Pfad sein" ;; - esac - [ "$BACKUP_DIR" != "/" ] || die "Das Wurzelverzeichnis darf nicht BACKUP_DIR sein" -} - -check_remote() { - local running - - log "Pruefe SSH-Verbindung zu $SERVER ..." - "${SSH[@]}" "$SERVER" true >/dev/null 2>&1 || \ - die "SSH-Verbindung fehlgeschlagen (fuer launchd ist ein SSH-Key ohne Rueckfrage erforderlich)" - - running=$("${SSH[@]}" "$SERVER" \ - "docker inspect --format='{{.State.Running}}' '$PAPERLESS_CONTAINER' 2>/dev/null") || \ - die "Paperless-Container $PAPERLESS_CONTAINER wurde nicht gefunden" - [ "$running" = "true" ] || die "Paperless-Container laeuft nicht" - - "${SSH[@]}" "$SERVER" "test -d '$APP_CONFIG_DIR' && test -r '$APP_CONFIG_DIR'" || \ - die "TrueNAS-App-Konfiguration ist nicht lesbar: $APP_CONFIG_DIR" - - REMOTE_EXPORT_HOST_DIR=$("${SSH[@]}" "$SERVER" \ - "docker inspect --format='{{range .Mounts}}{{if eq .Destination \"/usr/src/paperless/export\"}}{{.Source}}{{end}}{{end}}' '$PAPERLESS_CONTAINER'") - case "$REMOTE_EXPORT_HOST_DIR" in - /mnt/.ix-apps/docker/volumes/*/_data) ;; - *) die "Export-Mount des Paperless-Containers konnte nicht sicher ermittelt werden" ;; - esac - - # document_exporter wird vom Container-Wrapper von root auf den Benutzer - # paperless heruntergestuft. Daher muessen Check und Ordnererstellung mit - # genau diesem Benutzer erfolgen. - "${SSH[@]}" "$SERVER" \ - "docker exec --user paperless:paperless '$PAPERLESS_CONTAINER' test -w /usr/src/paperless/export" || \ - die "Paperless-Exportverzeichnis ist nicht beschreibbar" - - log "Paperless-Container und TrueNAS-Speicherorte sind bereit" -} - -write_backup_info() { - local info_file="$1" - - { - printf 'Backup created on Mac: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" - printf 'SSH server: %s\n' "$SERVER" - printf 'TrueNAS app name: %s\n' "$APP_NAME" - printf 'Paperless container: %s\n' "$PAPERLESS_CONTAINER" - "${SSH[@]}" "$SERVER" "printf 'TrueNAS version: '; cat /etc/version; printf '\nContainer image (Paperless version): '; docker inspect --format='{{.Config.Image}}' '$PAPERLESS_CONTAINER'" - } > "$info_file" -} - -check_capacity() { - local source_kb remote_current_kb local_current_kb - local remote_needed_kb local_needed_kb remote_free_kb local_free_kb - - source_kb=$("${SSH[@]}" "$SERVER" \ - "du -sk /mnt/.ix-apps/app_mounts/'$APP_NAME'/media /mnt/.ix-apps/app_mounts/'$APP_NAME'/data 2>/dev/null | awk '{s+=\$1} END {print s+0}'") || source_kb=0 - remote_free_kb=$("${SSH[@]}" "$SERVER" \ - "df -Pk '$REMOTE_EXPORT_HOST_DIR' | awk 'NR==2 {print \$4}'") || remote_free_kb=0 - local_free_kb=$(/bin/df -Pk "$BACKUP_DIR" | /usr/bin/awk 'NR==2 {print $4}') - remote_current_kb=$("${SSH[@]}" "$SERVER" \ - "du -sk '$REMOTE_EXPORT_HOST_DIR/macos-backup-current' 2>/dev/null | awk '{print \$1+0}'") || remote_current_kb=0 - local_current_kb=$(/usr/bin/du -sk "$LOCAL_CURRENT_DIR/paperless-export" 2>/dev/null | /usr/bin/awk '{print $1+0}') || local_current_kb=0 - - if [ "$source_kb" -gt 0 ]; then - log "Geschaetzte Paperless-Datenmenge: $((source_kb / 1024)) MB" - remote_needed_kb=$((source_kb - remote_current_kb)) - local_needed_kb=$((source_kb - local_current_kb)) - [ "$remote_needed_kb" -gt 0 ] || remote_needed_kb=0 - [ "$local_needed_kb" -gt 0 ] || local_needed_kb=0 - [ "$remote_free_kb" -gt "$remote_needed_kb" ] || \ - warn "Auf dem TrueNAS-Apps-Pool koennte der Platz fuer den Export knapp sein" - [ "$local_free_kb" -gt "$local_needed_kb" ] || \ - warn "Auf dem Mac koennte der Platz fuer den lokalen Export knapp sein" - fi -} - -check_document_exporter() { - local check_id check_host_dir - - check_id="$(date '+%Y-%m-%d_%H-%M-%S')-$$" - REMOTE_EXPORT_DIR="/usr/src/paperless/export/macos-backup-check-$check_id" - check_host_dir="$REMOTE_EXPORT_HOST_DIR/macos-backup-check-$check_id" - LOCAL_CHECK_DIR=$(/usr/bin/mktemp -d "$BACKUP_DIR/.check.XXXXXX") - - log "Teste document_exporter und inkrementelle Aktualisierung ..." - if ! "${SSH[@]}" "$SERVER" \ - "docker exec --user paperless:paperless '$PAPERLESS_CONTAINER' mkdir -p '$REMOTE_EXPORT_DIR' && docker exec '$PAPERLESS_CONTAINER' document_exporter --no-progress-bar --data-only --compare-json --delete --use-folder-prefix '$REMOTE_EXPORT_DIR' && docker exec '$PAPERLESS_CONTAINER' document_exporter --no-progress-bar --data-only --compare-json --delete --use-folder-prefix '$REMOTE_EXPORT_DIR' && docker exec '$PAPERLESS_CONTAINER' test -s '$REMOTE_EXPORT_DIR/manifest.json'" \ - 2>&1 | /usr/bin/tee -a "$LOG_FILE"; then - die "Test des document_exporter ist fehlgeschlagen" - fi - - log "Teste inkrementelle rsync-Uebertragung auf den Mac ..." - /usr/bin/rsync -a --delete --no-owner --no-group -e "$RSYNC_RSH" \ - "$SERVER:$check_host_dir/" "$LOCAL_CHECK_DIR/" \ - >> "$LOG_FILE" 2>&1 || die "Test der rsync-Uebertragung ist fehlgeschlagen" - [ -s "$LOCAL_CHECK_DIR/manifest.json" ] || \ - die "Der rsync-Test hat kein gueltiges Manifest uebertragen" - - "${SSH[@]}" "$SERVER" \ - "docker exec '$PAPERLESS_CONTAINER' rm -rf -- '$REMOTE_EXPORT_DIR'" \ - >/dev/null 2>&1 || die "Temporaerer Testexport konnte nicht entfernt werden" - REMOTE_EXPORT_DIR="" - /bin/rm -rf -- "$LOCAL_CHECK_DIR" - LOCAL_CHECK_DIR="" - log "document_exporter, Aktualisierung, Manifest und rsync erfolgreich getestet" -} - -main() { - local mode="backup" export_size remote_current_host - - case "${1:-}" in - '') ;; - --check) mode="check" ;; - --help|-h) usage; exit 0 ;; - *) usage >&2; exit 2 ;; - esac - - case "$BACKUP_DIR" in - /*) ;; - *) printf 'FEHLER: BACKUP_DIR muss ein absoluter Pfad sein\n' >&2; exit 1 ;; - esac - [ "$BACKUP_DIR" != "/" ] || { printf 'FEHLER: Ungueltiger BACKUP_DIR\n' >&2; exit 1; } - - /bin/mkdir -p "$(dirname "$LOG_FILE")" "$BACKUP_DIR" - /bin/chmod 700 "$BACKUP_DIR" 2>/dev/null || true - validate_configuration - - if ! /bin/mkdir "$LOCK_DIR" 2>/dev/null; then - die "Ein Paperless-Backup laeuft bereits (Lock: $LOCK_DIR)" - fi - trap cleanup EXIT - trap 'exit 130' INT - trap 'exit 143' TERM - - check_remote - if [ "$mode" = "check" ]; then - check_document_exporter - write_backup_info /dev/stdout - log "Pruefung erfolgreich; temporaerer Testexport entfernt und kein Backup auf dem Mac gespeichert" - exit 0 - fi - - check_capacity - /bin/mkdir -p "$LOCAL_CURRENT_DIR/paperless-export" "$LOCAL_CURRENT_DIR/truenas-app-config" - remote_current_host="$REMOTE_EXPORT_HOST_DIR/macos-backup-current" - - log "Aktualisiere den dauerhaften Paperless-Export ..." - if ! "${SSH[@]}" "$SERVER" \ - "docker exec --user paperless:paperless '$PAPERLESS_CONTAINER' mkdir -p '$REMOTE_CURRENT_DIR' && docker exec '$PAPERLESS_CONTAINER' document_exporter --no-progress-bar --compare-json --delete --use-folder-prefix '$REMOTE_CURRENT_DIR'" \ - 2>&1 | /usr/bin/tee -a "$LOG_FILE"; then - die "document_exporter ist fehlgeschlagen" - fi - - log "Synchronisiere neue und geaenderte Dokumente auf den Mac ..." - /usr/bin/rsync -a --delete --no-owner --no-group -e "$RSYNC_RSH" \ - "$SERVER:$remote_current_host/" "$LOCAL_CURRENT_DIR/paperless-export/" \ - >> "$LOG_FILE" 2>&1 || die "Uebertragung des Paperless-Exports ist fehlgeschlagen" - [ -s "$LOCAL_CURRENT_DIR/paperless-export/manifest.json" ] || \ - die "Der lokale Export enthaelt kein gueltiges manifest.json" - - log "Sichere die TrueNAS-App-Konfiguration ..." - /usr/bin/rsync -a --delete --no-owner --no-group -e "$RSYNC_RSH" \ - "$SERVER:$APP_CONFIG_DIR/" "$LOCAL_CURRENT_DIR/truenas-app-config/" \ - >> "$LOG_FILE" 2>&1 || die "Uebertragung der App-Konfiguration ist fehlgeschlagen" - - write_backup_info "$LOCAL_CURRENT_DIR/backup-info.txt" - export_size=$(/usr/bin/du -sh "$LOCAL_CURRENT_DIR" | /usr/bin/awk '{print $1}') - BACKUP_SUCCEEDED=1 - log "Backup erfolgreich aktualisiert: $LOCAL_CURRENT_DIR ($export_size)" - notify "Erfolgreich aktualisiert" "$LOCAL_CURRENT_DIR – $export_size" -} - -main "$@" diff --git a/macos/backup-paperless-ngx/config.example b/macos/backup-paperless-ngx/config.example deleted file mode 100644 index 458a143..0000000 --- a/macos/backup-paperless-ngx/config.example +++ /dev/null @@ -1,12 +0,0 @@ -# Diese Datei nach ~/.config/paperless-backup/config kopieren und anpassen. -# Die Standardwerte passen bereits zur untersuchten Installation auf "bfds". - -SERVER="bfds" -APP_NAME="paperless-ngx" -PAPERLESS_CONTAINER="ix-paperless-ngx-paperless-1" -BACKUP_DIR="$HOME/Backups/paperless-ngx" - -# 1 = macOS-Mitteilung bei Erfolg/Fehler, 0 = keine Mitteilung. -NOTIFY=1 - -SSH_CONNECT_TIMEOUT=10 diff --git a/macos/backup-paperless-ngx/install-launchagent.sh b/macos/backup-paperless-ngx/install-launchagent.sh deleted file mode 100755 index 35205d6..0000000 --- a/macos/backup-paperless-ngx/install-launchagent.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -SOURCE_DIR=$(cd "$(dirname "$0")" && pwd) -INSTALL_DIR="$HOME/Library/Application Support/PaperlessBackup" -CONFIG_DIR="$HOME/.config/paperless-backup" -PLIST="$HOME/Library/LaunchAgents/de.rob.paperless-ngx-backup.plist" -LOG_DIR="$HOME/Library/Logs" -UID_VALUE=$(id -u) - -mkdir -p "$INSTALL_DIR" "$CONFIG_DIR" "$(dirname "$PLIST")" "$LOG_DIR" -install -m 700 "$SOURCE_DIR/backup-paperless-ngx.sh" "$INSTALL_DIR/backup-paperless-ngx.sh" - -if [ ! -f "$CONFIG_DIR/config" ]; then - install -m 600 "$SOURCE_DIR/config.example" "$CONFIG_DIR/config" - echo "Konfiguration angelegt: $CONFIG_DIR/config" -else - echo "Vorhandene Konfiguration bleibt unveraendert: $CONFIG_DIR/config" -fi - -cat > "$PLIST" < - - - - Label - de.rob.paperless-ngx-backup - ProgramArguments - - $INSTALL_DIR/backup-paperless-ngx.sh - - StartCalendarInterval - - Hour - 3 - Minute - 0 - - ProcessType - Background - StandardOutPath - $LOG_DIR/paperless-ngx-launchd.out.log - StandardErrorPath - $LOG_DIR/paperless-ngx-launchd.err.log - - -EOF - -chmod 600 "$PLIST" -plutil -lint "$PLIST" -launchctl bootout "gui/$UID_VALUE" "$PLIST" >/dev/null 2>&1 || true -launchctl bootstrap "gui/$UID_VALUE" "$PLIST" - -echo "LaunchAgent installiert: taeglich um 03:00 Uhr" -echo "Vor dem ersten echten Lauf bitte pruefen:" -echo " $INSTALL_DIR/backup-paperless-ngx.sh --check" diff --git a/robocopy-bfds-offsite/bfds-offsite-backup.cmd b/robocopy-bfds-offsite/bfds-offsite-backup.cmd deleted file mode 100644 index 98f63fd..0000000 --- a/robocopy-bfds-offsite/bfds-offsite-backup.cmd +++ /dev/null @@ -1,71 +0,0 @@ -@ECHO OFF -CHCP 65001 >NUL -REM ************************************************** -REM Dieser command sichert die Inhalt von bfds in windows -REM auf der OFFSITE platte (Veracrypt Partition) mittels -REM SMB Freigaben von bfds und xcopy. -REM ************************************************** -SETLOCAL - - -REM ************************************************** -REM Einbinden der Veracrypt Partition -REM ************************************************** -echo Festplatte NASOFFSITE1 wird entschlüsselt und eingebunden -SET VOLUME_LABEL=NASOFFSITE1 -SET VERACRYPT_PATH="C:\Program Files\VeraCrypt\VeraCrypt.exe" -SET VOLUME_MOUNT_PATH="B:\" -SET VOLUME_PASSWORD=123456 -REM get the Password for the volume from the user -SET /P VOLUME_PASSWORD=Bitte geben Sie das Passwort für die Festplatte %VOLUME_LABEL% ein: -%VERACRYPT_PATH% /q /v "\Device\Harddisk2\Partition1" /l B /p "%VOLUME_PASSWORD%" - -SET SOURCE=\\bfds -SET DESTINATION="B:\\" - -echo Festplatte NASOFFSITE1 wird gesucht -IF NOT EXIST %DESTINATION% ( - echo Festplatte NASOFFSITE1 nicht gefunden, bitte in Veracrypt als Laufwerk B:\ einbinden! - PAUSE - exit /B -) - -CALL :RunRobocopy "photos" -CALL :RunRobocopy "rob" -CALL :RunRobocopy "peggy" -CALL :RunRobocopy "ebooks" -CALL :RunRobocopy "movies" -CALL :RunRobocopy "music" -exit /B %ERRORLEVEL% - -REM ************************************************** -REM Funktion zum Ausführen von robocopy -:RunRobocopy - SET COPYPATH=%~1 - IF NOT EXIST %SOURCE%\%COPYPATH% ( - echo Quelle nicht gefunden! Bitte öffne die SMB Freigbe: %SOURCE%\%COPYPATH% - PAUSE - exit /B %ERRORLEVEL% - ) - SET SCRIPT_PATH=%~dp0 - SET TODAY=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2% - SET LOGFILE="%SCRIPT_PATH%robocopy_log_%COPYPATH%_%TODAY%.txt" - echo LOGFILE: %LOGFILE% - robocopy %SOURCE%\%COPYPATH% %DESTINATION%\%COPYPATH% /E /mt /z /J /COPY:DAT /R:3 /W:5 /LOG+:%LOGFILE% /TEE - REM Erklärung der Parameter: - REM /E: Kopiert Unterverzeichnisse inklusive leerer Verzeichnisse - REM /mt: Multithreaded copying - REM /z: Kopiert Dateien im Restart-Modus (d.h. kopiert Dateien, die bereits existieren) - REM /COPY:DAT: Kopiert Dateiattribute, Zeitstempel und Sicherheitsinformationen - REM /R:3: Anzahl der Wiederholungsversuche bei Fehlern - REM /W:5: Wartezeit zwischen den Wiederholungsversuchen - REM /J: Kopiert mit unbuffered I/O (empfohlen für große Dateien) - REM /LOG+: Protokolliert den Kopiervorgang in eine Datei - REM /TEE: Protokolliert den Kopiervorgang auch in der Konsole -GOTO :EOF -REM ************************************************** - -REM ************************************************** -REM Partiton wieder aushängen -REM ************************************************** -%VERACRYPT_PATH% /d B /q \ No newline at end of file diff --git a/rsync-bfds-offsite/readme.md b/rsync-bfds-offsite/readme.md deleted file mode 100644 index 74a1182..0000000 --- a/rsync-bfds-offsite/readme.md +++ /dev/null @@ -1,8 +0,0 @@ -bfds soll ein funktionierendes off-site backup bekommen - -Dazu sollte am besten eine USB-HDD direkt an bfds gehangen werdn das automatisch überspielt wird. - -Oder die Platte kommt an den Lappi und ein rsync zieht sich alle Änderungen von bfds:/mnt/bfds nach /run/media/rob/BFDS-OFFSITE-1/ - -Label HDD1: BFDS-OFFSITE-1 -Label HDD2: BFDS-OFFSITE-2 diff --git a/rsync-bfds-offsite/rsync_bfds_offsite.sh b/rsync-bfds-offsite/rsync_bfds_offsite.sh deleted file mode 100755 index 8b92a52..0000000 --- a/rsync-bfds-offsite/rsync_bfds_offsite.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -# FIRST Encrypt! -## von Hand und mit Dolphin - -# only run when BFDS-OFFSITE-1 or BFDS-OFFSITE-2 is attached -# find correct drive `ls -l /dev/disk/by-label/BFDS-OFFSITE-1` or `lsblk -o name,mountpoint,label,size,uuid /dev/sdb1 | grep BFDS-OFFSITE-` -# BFDS-OFFSITE-1 UUID: 45f76efd-1cb0-4ade-b610-0443eb8079e9 - -# find correct drive `ls -l /dev/disk/by-label/BFDS-OFFSITE-1` or `lsblk -o name,mountpoint,label,size,uuid /dev/sdb1 | grep BFDS-OFFSITE-` - -echo "#####################################################" -echo "## ##" -echo "## BFDS-OFFSITE BACKUP ##" -echo "## ##" -echo "#####################################################" -echo "## FIRST Encrypt HDD! von Hand und mit Dolphin ##" -echo "#####################################################" - -string=`ls -l /dev/disk/by-label/BFDS-OFFSITE-*` -if [[ $string != *"BFDS-OFFSITE-"* ]]; then - echo "\n ABBRUCH! Keine angeschlossene OFFSITE Festplatte gefunden." - exit 0 -fi - -# run backup -sourceDir="bfds:/mnt/bfds/" # on BFDS -destinationDir="/run/media/rob/BFDS-OFFSITE-1/BFDS" -rsync -a -zz --stats --progress $sourceDir $destinationDir - - -read -p "Backupprozess beendet. Taste drücken für weiter.." \ No newline at end of file