#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: backup [-v] [-C COMMENT] ARCHIVE_TAG backup -h EOF } help() { cat <<-'EOF' Options: -v enable verbose mode, useful for 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: "cronjob") 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 from cronjob: $ backup cronjob Create backup with comment, and verbose mode active: $ backup -vC 'The backup has a comment' my-backup EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done VERBOSE_FLAGS='' COMMENT='' while getopts 'vC:h' flag; do case "$flag" in v) VERBOSE_FLAGS='--verbose --progress' ;; C) COMMENT="$OPTARG" ;; h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) assert_arg() { if [ -z "$1" ]; then printf 'Missing %s\n' "$2" >&2 usage >&2 exit 2 fi } ARCHIVE_TAG="${1:-}" assert_arg "$ARCHIVE_TAG" 'ARCHIVE_TAG' finish() { STATUS=$? printf '\n>>>\n>>> exit status: %s\n>>>\n\n' "$STATUS" >&2 } trap finish EXIT run() { borg create \ $VERBOSE_FLAGS \ --comment "$COMMENT" \ --exclude ~/.cache/ \ --exclude ~/Downloads/ \ --stats \ --compression lzma,9 \ "::{hostname}-{now}-$ARCHIVE_TAG" \ ~/ STATUS=$? if [ "$STATUS" = 0 ] || [ "$STATUS" = 1 ]; then echo 'WARNING, but no ERROR.' >&2 return 0 else return "$STATUS" fi } run || exit $?