#!/bin/bash ################################################################################ # Backup Borg # --------------------------- # # TODO # # Author: Robin Meier - robin@meier.si ################################################################################ # Import logging functionality script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) logfile=${script_dir}/log/backup.log log_identifier="BORG" source ${script_dir}/functions/logging.sh # Input parameters BORG_NAME=$1 TIMESTAMP=$2 BORG_DIRS=$3 BORG_OPTS=$4 if [[ -z "$BORG_NAME" || -z "$TIMESTAMP" || -z "$BORG_DIRS" ]]; then log_echo "[ERROR] Positional parameter missing! (name, timestamp, directories (, borg options))" exit 40 fi # Check if required env vars are set if [[ -z "$BORG_REPO" || -z "$BORG_PASSPHRASE" ]]; then log_echo "[ERROR] Repo location or passphrase env var missing!" exit 42 fi # Automated negative response to these questions export BORG_RELOCATED_REPO_ACCESS_IS_OK=no export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=no # Error handling # trap 'log "Backup interrupted"; exit 2' INT TERM # untested trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM # Output current version log_echo "Backup borg version: $(borg --version)" # Create backup log_echo "Creating backup..." borg create $BORG_BACKUP_OPTS $BORG_OPTS \ --stats \ --verbose \ --filter AME \ --list \ --show-rc \ --compression lz4 \ --exclude-caches \ ::"{hostname}-${BORG_NAME}-${TIMESTAMP}" \ $BORG_DIRS backup_exit=$? log_echo "Finished creating backup ($backup_exit)" # Prune no longer needed backups log "Pruning backups from repository" borg prune \ --list \ --glob-archives "{hostname}-${BORG_NAME}-*" \ --show-rc \ --keep-daily 7 \ --keep-weekly 4 \ --keep-monthly 6 prune_exit=$? log "Finished pruning backups from repository ($prune_exit)" # Compact repository log "Compacting repository" # TODO: Maybe first check if compacting is supported by the client? (Older versions) borg compact compact_exit=$? log "Finished compacting repository ($compact_exit)" # Calculate global exit code global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit )) global_exit=$(( compact_exit > global_exit ? compact_exit : global_exit )) if [ ${global_exit} -eq 0 ]; then log "Backup, Prune, and Compact finished successfully" elif [ ${global_exit} -eq 1 ]; then log_echo "Backup, Prune, and/or Compact finished with warnings" else log_echo "Backup, Prune, and/or Compact finished with errors" fi log "Backup Finished ($global_exit)" exit ${global_exit}