#!/bin/bash set -eu set -o pipefail # file='/digital-assets/ancient-backups/dans-homedir/dans-homedir/backup.1.complete/Maildir/.outbox/dovecot.index' file='' save_directory=/backshift-production/save-directory backup_id='' subset='' hostname='' function usage { retval="$1" case "$retval" in 0) ;; *) exec 1>&2 ;; esac echo "$(basename "$0") - verify that 'file' looks correct" echo "Usage: $0 --file /path/to/file --backup-id backup-id --subset subset --hostname hostname --save-directory savedir" echo echo "You must specify one of --backup-id and --subset" echo -- "--hostname will default to the name of the machine this script is run on" exit "$retval" } while [ "$#" -ge 1 ] do case "$1" in --file) file="$2" shift ;; --backup-id) backup_id="$2" shift ;; --subset) subset="$2" shift ;; --hostname) hostname="$2" shift ;; --save-directory) save_directory="$2" shift ;; -h|--help) usage 0 ;; *) echo "$0: Unrecognized option: $1" 1>&2 usage 1 ;; esac shift done case "$backup_id" in '') # We don't have a backup_id, so we need $hostname and $subset. case "$hostname" in '') # Default to the current machine's hostname. hostname="$(hostname)" ;; esac case "$subset" in '') # Do not default to anything. Error out. echo "$0: --subset is required if you do not specify --backup-id" 1>&2 usage 1 ;; esac backup_id=$(backshift-recent-backup-id --hostname "$hostname" --subset "$subset") ;; *) # We have a backup_id, so we refuse --hostname case "$hostname" in '') ;; *) echo "$0: --hostname is allowed only if you do not specify --backup-id" 1>&2 usage 1 ;; esac # We have a backup_id, so we refuse --subset case "$subset" in '') ;; *) echo "$0: --subset is allowed only if you do not specify --backup-id" 1>&2 usage 1 ;; esac ;; esac case "$file" in '') echo "$0: --file is a required option" 1>&2 usage 1 ;; /*) # Cool, we have an absolute path. ;; *) # We could probably do something with $(pwd), but... Nah. Not right now anyway. echo "$0: --file argument must start with a /" 1>&2 usage 1 ;; esac if ! [ -f "$file" ] then echo "$0: --file argument $file does not exist or is not a regular file" 1>&2 usage 1 fi file_dir="$(dirname "$file")" # shellcheck disable=SC2001 file_sans_leading_slash="$(echo "$file" | sed 's#^/##')" backshift \ --save-directory "$save_directory" \ --starting-directory "$file_dir" \ --backup-id "$backup_id" \ --produce-tar \ --nonrecursive \ | (cd / && tar --diff "$file_sans_leading_slash")