#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: backup [-q] [-C COMMENT] [ARCHIVE_TAG] backup -h EOF } help() { cat <<-'EOF' Options: -q disable verbose mode, useful for non-interactive sessions -C COMMENT the comment text to be attached to the archive -h, --help show this message ARCHIVE_TAG the tag used to create the new backup (default: "manual") The repository is expected to have been created with: $ borg init -e repokey-blake2 The following environment variables are expected to be exported: $BORG_PASSCOMMAND $BORG_REPO $BORG_REMOTE_PATH Password-less SSH access is required, usually done via adding ~/.ssh/id_rsa.pub to suyin:.ssh/authorized_keys. Examples: Run backup manually: $ backup Create backup with comment, and verbose mode active: $ backup -qC 'The backup has a comment' my-backup EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done VERBOSE_FLAGS='--verbose --progress' COMMENT='' while getopts 'qC:h' flag; do case "$flag" in q) VERBOSE_FLAGS='' ;; C) COMMENT="$OPTARG" ;; h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) ARCHIVE_TAG="${1:-manual}" run() { set -x # The contents of $VERBOSE_FLAGS doesn't involve user input: # shellcheck disable=2086 borg create \ $VERBOSE_FLAGS \ --comment "$COMMENT" \ --exclude "$XDG_CACHE_HOME" \ --exclude ~/Downloads/ \ --stats \ --compression lzma,9 \ "::{hostname}-{now}-$ARCHIVE_TAG" \ ~/ STATUS=$? set +x if [ "$STATUS" = 0 ]; then return 0 elif [ "$STATUS" = 1 ]; then printf 'WARNING, but no ERROR.\n' >&2 return 0 else return "$STATUS" fi } run || exit $?