1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #!/usr/bin/env bash
- set -euo pipefail # bash strict mode
- set -x
- # Setting this, so the repo does not need to be given on the commandline:
- export BORG_REPO="$BACKUPS"
- # some helpers and error handling:
- info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
- trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM
- info "Starting backup"
- # Backup the most important directories into an archive named after
- # the machine this script is currently running on:
- script_dir="${0%/*}" # directory with this script
- exclude_file="${script_dir}/excluded_files.txt"
- borg create \
- --verbose \
- --filter AME \
- --list \
- --stats \
- --show-rc \
- --compression lz4 \
- --exclude-caches \
- --exclude-from "$exclude_file" \
- ::'{hostname}-{user}-{now:%Y-%m-%dT%H:%M:%S}' \
- /home
- backup_exit=$?
- info "Pruning repository"
- # Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
- # archives of THIS machine. The '{hostname}-' prefix is very important to
- # limit prune's operation to this machine's archives and not apply to
- # other machines' archives also:
- borg prune \
- --list \
- --glob-archives '{hostname}-' \
- --show-rc \
- --keep-daily 7 \
- --keep-weekly 4 \
- --keep-monthly 6
- prune_exit=$?
- # actually free repo disk space by compacting segments
- info "Compacting repository"
- borg compact
- compact_exit=$?
- # use highest exit code as 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
- info "Backup, Prune, and Compact finished successfully"
- elif [ ${global_exit} -eq 1 ]; then
- info "Backup, Prune, and/or Compact finished with warnings"
- else
- info "Backup, Prune, and/or Compact finished with errors"
- fi
- exit ${global_exit}
|