backup-automation/duplicati/duplicati-backup.sh
ZoopaMario 0005432b69
Some checks failed
Check Commit Messages / check-commit-message (pull_request) Successful in 15s
Lint Bash Scripts / lint-bash (pull_request) Failing after 24s
Refactor code to make linter runs succeed
This commit refactors the codebase in order to make the shellcheck
workflow pass.

It also makes shellcheck ignore common info messages, specifically:
- https://www.shellcheck.net/wiki/SC1091 -- Not following: ./../logger.sh: op...
- https://www.shellcheck.net/wiki/SC2015 -- Note that A && B || C is not if-t...
2024-12-29 15:18:41 +01:00

54 lines
2.2 KiB
Bash
Executable file

#!/bin/bash
SCRIPT_ABS_LOCATION=$(realpath "$(dirname "${0}")")
source "$SCRIPT_ABS_LOCATION/duplicati-backup.env"
source "$SCRIPT_ABS_LOCATION/../logger.sh"
SOURCE_DIR="/mnt/data/duplicati"
# Set default values for parameters
MAX_BACKUPS=7
BACKUP_FOLDER=""
# Override default values with command-line arguments
while getopts ":f:h:u:p:m:b:" opt; do
case $opt in
f) SOURCE_DIR="$OPTARG";;
h) SSH_DESTINATION="$OPTARG";;
u) SSH_USERNAME="$OPTARG";;
p) SSH_KEY="$OPTARG";;
m) MAX_BACKUPS="$OPTARG";;
b) BACKUP_FOLDER="$OPTARG";;
\?) echo "Invalid option: -$OPTARG"; exit 1;;
esac
done
# Create a temporary file for the encrypted archive
TMP_FILENAME=duplicati_db-$(date +"%Y%m%d").bak &&
TMP_FILEPATH="$SCRIPT_ABS_LOCATION" || { log "Error: Failed to create a temporary file."; exit 1; }
# Create the encrypted archive using tar and openssl
log "Compressing and excrypting the Duplicati Databases"
sudo tar -czf - "$SOURCE_DIR" | openssl enc -aes-256-cbc -pbkdf2 -pass "pass:$BACKUP_ENCR_PASSPHRASE" > "$TMP_FILEPATH/$TMP_FILENAME" || { log "Error: Failed to create encrypted archive."; exit 1; }
# Connect to the backup host and count the number of existing backups
log "Fetching number of backups in destination folder"
EXISTING_BACKUPS=$(ssh "$SSH_USERNAME@$SSH_DESTINATION" -p 23 -i "$SSH_KEY ls" | sudo wc -l) || { log "Error: Failed to count existing backups."; exit 1; }
# Remove old backups if there are too many
if (( EXISTING_BACKUPS > MAX_BACKUPS )); then
log "Removing old backups in order to save space"
ssh "$SSH_USERNAME@$SSH_DESTINATION" -p 23 -i "$SSH_KEY ls -t $BACKUP_FOLDER | tail -n +$((MAX_BACKUPS+1)) | xargs rm" || { log "Error: Failed to remove old backups."; exit 1; }
fi
# Transfer the encrypted archive to the backup host using scp
log "Transfering archive to SSH Destination"
scp -v -P 23 -i "$SSH_KEY" "$TMP_FILEPATH/$TMP_FILENAME" "$SSH_USERNAME@$SSH_DESTINATION:$BACKUP_FOLDER$TMP_FILENAME" || { log "Error: Failed to transfer the encrypted archive."; exit 1; }
# Remove the temporary file
log "Cleaning up files"
rm "$TMP_FILEPATH/$TMP_FILENAME" || { log "Error: Failed to remove the temporary file."; exit 1; }
log "Backup completed successfully."