diff options
| author | EuAndreh <eu@euandre.org> | 2022-04-24 12:49:06 -0300 |
|---|---|---|
| committer | EuAndreh <eu@euandre.org> | 2022-04-24 12:50:01 -0300 |
| commit | 032b28d363288f937cf3355d8ab3e578c97a6ed7 (patch) | |
| tree | a845eb06cbfaf2beaf3fe6d3c73effe320250cbc | |
| parent | ~/.config/guix/home.scm: Point ~/.bashrc to ~/.config/bash/rc (diff) | |
| download | dotfiles-032b28d363288f937cf3355d8ab3e578c97a6ed7.tar.gz dotfiles-032b28d363288f937cf3355d8ab3e578c97a6ed7.tar.xz | |
~/.local/bin/backup: Add polished backup script
| -rwxr-xr-x | .local/bin/backup | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/.local/bin/backup b/.local/bin/backup new file mode 100755 index 00000000..cd7b5ad5 --- /dev/null +++ b/.local/bin/backup @@ -0,0 +1,127 @@ +#!/bin/sh +. ~/.bash_profile +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 + + Password-less SSH access is required, and remote configuration + via $BORG_REMOTE_PATH can be done at will. + + + 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' + +set -x + + +finish() { + STATUS=$? + printf '\n>>>\n>>> exit status: %s\n>>>\n\n' "$STATUS" >&2 +} +trap finish EXIT + +borg create \ + $VERBOSE_FLAGS \ + --comment "$COMMENT" \ + --exclude ~/.cache \ + --stats \ + --compression lzma,9 \ + "::{hostname}-{now}-$ARCHIVE_TAG" \ + ~/ ||: + +borg check \ + --verbose + +borg prune \ + --verbose \ + --list \ + --keep-within=6m \ + --keep-weekly=52 \ + --keep-monthly=24 |
