From a0e9e88448f3d18f996f463babe1c5ea0a87159d Mon Sep 17 00:00:00 2001 From: Elias Fierke Date: Thu, 5 Feb 2026 20:51:05 +0100 Subject: [PATCH] improved check() and implemented basic backup feature (untested) --- src/sub/transfer.sh | 197 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 183 insertions(+), 14 deletions(-) mode change 100644 => 100755 src/sub/transfer.sh diff --git a/src/sub/transfer.sh b/src/sub/transfer.sh old mode 100644 new mode 100755 index 4e3e9b0..e184688 --- a/src/sub/transfer.sh +++ b/src/sub/transfer.sh @@ -1,17 +1,17 @@ #!/bin/bash -check(){ +check_rsync(){ if command -v rsync &>/dev/null then echo "rsync is installed. Check passed. Bye." - exit 0; + HAD_BEST_SUCCESS="true" else echo "Please install rsync." while [[ -z "$HAD_BEST_SUCCESS" ]]; do read -p "Install now? [y/N] " QUESTION if [[ -z "$QUESTION" ]] || [[ "$QUESTION" = "n" ]] || [[ "$QUESTION" = "N" ]]; then echo "Alright, bye." - exit 0; + HAD_BEST_SUCCESS="true" fi if [[ "$QUESTION" = "y" ]] || [[ "$QUESTION" = "Y" ]]; then HAD_BEST_SUCCESS="true" @@ -21,7 +21,6 @@ check(){ sudo apt update sudo apt install rsync -y echo "Attempted to install rsync. Please execute the check again. Bye." - exit 0; fi if command -v dnf &>/dev/null @@ -29,14 +28,12 @@ check(){ sudo dnf update sudo dnf install rsync -y echo "Attempted to install rsync. Please execute the check again. Bye." - exit 0; fi if command -v pacman &>/dev/null then sudo pacman -S rsync echo "Attempted to install rsync. Please execute the check again. Bye." - exit 0; fi fi done @@ -46,10 +43,184 @@ check(){ fi } -backup(){ - exit 0; +check_openssl(){ + if command -v openssl &>/dev/null + then + echo "openssl is installed. Check passed. Bye." + HAD_BEST_SUCCESS_O="true" + else + echo "Please install openssl." + while [[ -z "$HAD_BEST_SUCCESS_O" ]]; do + read -p "Install now? [y/N] " QUESTION + if [[ -z "$QUESTION" ]] || [[ "$QUESTION" = "n" ]] || [[ "$QUESTION" = "N" ]]; then + echo "Alright, bye." + HAD_BEST_SUCCESS_O="true" + fi + if [[ "$QUESTION" = "y" ]] || [[ "$QUESTION" = "Y" ]]; then + HAD_BEST_SUCCESS_O="true" + echo "Trying to install openssl..." + if command -v apt &>/dev/null + then + sudo apt update + sudo apt install openssl -y + echo "Attempted to install openssl. Please execute the check again. Bye." + fi + + if command -v dnf &>/dev/null + then + sudo dnf update + sudo dnf install openssl -y + echo "Attempted to install openssl. Please execute the check again. Bye." + fi + + if command -v pacman &>/dev/null + then + sudo pacman -S openssl + echo "Attempted to install openssl. Please execute the check again. Bye." + fi + fi + done + + + + fi } +check_borg(){ + if command -v borg &>/dev/null + then + echo "borg is installed. Check passed. Bye." + HAD_BEST_SUCCESS_B="true" + else + echo "Please install borg." + while [[ -z "$HAD_BEST_SUCCESS_B" ]]; do + read -p "Install now? [y/N] " QUESTION + if [[ -z "$QUESTION" ]] || [[ "$QUESTION" = "n" ]] || [[ "$QUESTION" = "N" ]]; then + echo "Alright, bye." + HAD_BEST_SUCCESS_B="true" + fi + if [[ "$QUESTION" = "y" ]] || [[ "$QUESTION" = "Y" ]]; then + HAD_BEST_SUCCESS_B="true" + echo "Trying to install borg..." + if command -v apt &>/dev/null + then + sudo apt update + sudo apt install borg -y + echo "Attempted to install borg. Please execute the check again. Bye." + fi + + if command -v dnf &>/dev/null + then + sudo dnf update + sudo dnf install borg -y + echo "Attempted to install borg. Please execute the check again. Bye." + fi + + if command -v pacman &>/dev/null + then + sudo pacman -S borg + echo "Attempted to install borg. Please execute the check again. Bye." + fi + fi + done + + + + fi +} + +backup_encrypt(){ + echo "Creating encrypted backup..." + local GEN_PASSPHRASE="$1" # "gen" oder leer + + if [[ -z "$SOURCE" || -z "$DESTINATION" ]]; then + echo "SOURCE and DESTINATION must be set" + return 1 + fi + + if [[ ! -e "$SOURCE" ]]; then + echo "Source does not exist: $SOURCE" + return 1 + fi + + local PASSPHRASE="" + if [[ "$GEN_PASSPHRASE" == "gen" ]]; then + PASSPHRASE="$(openssl rand -base64 48)" + + echo "======================================================" + echo "BORG PASSPHRASE (please note down)" + echo + echo "$PASSPHRASE" + echo + echo "The phrase won't be shown again and will not be saved." + echo "======================================================" + echo + fi + + local ARCHIVE_NAME + ARCHIVE_NAME="backup-$(date +%F_%H-%M-%S)" + + BORG_PASSPHRASE="$PASSPHRASE" \ + borg create \ + --stats \ + --progress \ + --compression lz4 \ + "$DESTINATION::$ARCHIVE_NAME" \ + "$SOURCE" + + local RC=$? + unset BORG_PASSPHRASE + + if [[ $RC -eq 0 ]]; then + echo "Backup successful: $ARCHIVE_NAME" + else + echo "Backup failed (exit code $RC)" + fi + + exit 0; + return $RC +} + +backup(){ + if [[ -z "$ENCRYPT" ]]; then + backup_encrypt + exit 0; + fi + + echo "Creating unencrypted backup..." + + if [[ -z "$SOURCE" || -z "$DESTINATION" ]]; then + echo "SOURCE and DESTINATION must be set" + return 1 + fi + + if [[ ! -e "$SOURCE" ]]; then + echo "Source does not exist: $SOURCE" + return 1 + fi + + local ARCHIVE_NAME + ARCHIVE_NAME="backup-$(date +%F_%H-%M-%S)" + + borg create \ + --stats \ + --progress \ + --compression lz4 \ + "$DESTINATION::$ARCHIVE_NAME" \ + "$SOURCE" + + local RC=$? + + if [[ $RC -eq 0 ]]; then + echo "Unencrypted backup successful: $ARCHIVE_NAME" + else + echo "Backup failed (exit code $RC)" + fi + + return $RC +} + + transfer(){ exit 0; } @@ -61,21 +232,21 @@ show_help(){ echo " -s SOURCE | Source path (e.g. /srv/fileshare/main/)" echo " -d DESTINATION | Destination path (e.g. using ssh)" echo " -b | Transfer as backup" - echo " -e | encrypt destination using a key" + echo " -e | encrypt destination using a passphrase" echo " -h | Show this help text" echo " -v | Get Version Info" echo " -c | Check the usability of this tool" exit 0 } -while getopts ":s:d:Bvhyc" opt; do +while getopts ":s:d:Bvhyce" opt; do case $opt in s) SOURCE="$OPTARG";; d) DESTINATION="$OPTARG";; v) exit 0 ;; - c) check ;; + c) check_rsync; check_borg; check_openssl; exit 0 ;; e) ENCRYPT="1" ;; - b) backup ;; + B) backup ;; h) show_help ;; y) ALWAYS_YES="1" ;; \?) echo "Unknown option: -$OPTARG" >&2; exit 1 ;; @@ -83,7 +254,5 @@ while getopts ":s:d:Bvhyc" opt; do esac done -transfer - echo "Nothing to do." exit 0 \ No newline at end of file