aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSilvio Rhatto <rhatto@riseup.net>2018-05-23 08:59:27 -0300
committerSilvio Rhatto <rhatto@riseup.net>2018-05-23 08:59:27 -0300
commitda0ec3522804ae7148f7617314cffa36ab0499e1 (patch)
tree7a46f6f0b3c15b5f41d50dc5e1ad6f9a4e14b143
parentac48b0fa468c47ff5ac878191f2de37a9b76a49e (diff)
downloadscripts-da0ec3522804ae7148f7617314cffa36ab0499e1.tar.gz
scripts-da0ec3522804ae7148f7617314cffa36ab0499e1.tar.bz2
Borger: borg script for home folder backups
-rwxr-xr-xborger125
1 files changed, 125 insertions, 0 deletions
diff --git a/borger b/borger
new file mode 100755
index 0000000..33c313c
--- /dev/null
+++ b/borger
@@ -0,0 +1,125 @@
+#!/bin/bash
+#
+# Borg script for home folder backups.
+# Adapted from https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups
+#
+# Stuff to put in your config:
+#
+# Backup destination
+#export SSH_SERVER="user@host"
+#export SSH_PORT="2202"
+# Setting this, so you won't be asked for your repository passphrase:
+#export BORG_PASSPHRASE='HACKME'
+# or this to ask an external program to supply the passphrase:
+#export BORG_PASSCOMMAND='pass show backup'
+#export BORG_PASSCOMMAND='keyringer default decrypt pessoal/backups/borg 2> /dev/null'
+
+# Parameters
+CONFIG="$HOME/.config/borger"
+HOSTNAME=`cat /etc/hostname`
+
+if [ -z "$USER" ]; then
+ USER="`whoami`"
+fi
+
+# In case your home folder is a symlink
+if [ ! -z "`readlink $HOME`" ]; then
+ ORIG="`readlink $HOME`"
+else
+ ORIG="$HOME"
+fi
+
+# Default backup config
+keepdaily="7"
+keepweekly="4"
+keepmonth="3"
+encryption="keyfile"
+
+# Config
+if [ -e "$CONFIG" ] ; then
+ source $CONFIG
+fi
+
+# Setting this, so the repo does not need to be given on the commandline:
+export BORG_REPO="ssh://$SSH_SERVER:$SSH_PORT//var/backups/users/$USER/borg"
+
+# Some helpers and error handling:
+info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
+fatal() { info $*; exit 1; }
+trap 'info $( date ) Backup interrupted >&2; exit 2' INT TERM
+
+# Check
+if [ "$1" == "--check" ]; then
+ borg list
+ exit $?
+fi
+
+# Initialize
+if ! ssh $SSH_SERVER -p $SSH_PORT test -f /var/backups/users/$USER/borg/config; then
+ info "Initializing borg repository at ssh://$SSH_SERVER:$SSH_PORT//var/backups/users/$USER/borg..."
+ borg init --encryption=$encryption ssh://$SSH_SERVER:$SSH_PORT//var/backups/users/$USER/borg
+
+ init_exit=$?
+
+ if [ "$init_exit" != "0" ]; then
+ fatal "Error initializing repository"
+ fi
+fi
+
+# Backup the most important directories into an archive named after
+# the machine this script is currently running on:
+
+info "Starting backup..."
+
+borg create \
+ --verbose \
+ --filter AME \
+ --list \
+ --stats \
+ --show-rc \
+ --compression lz4 \
+ --exclude-caches \
+ ::'{now}' \
+ $ORIG
+
+ backup_exit=$?
+
+if [ "$backup_exit" != "0" ]; then
+ fatal "Error creating snapshot"
+fi
+
+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 \
+ --prefix '{hostname}-' \
+ --show-rc \
+ --keep-daily $keepdaily \
+ --keep-weekly $keepweekly \
+ --keep-monthly $keepmonthly \
+
+ prune_exit=$?
+
+if [ "$prune_exit" != "0" ]; then
+ fatal "Error pruning repository"
+fi
+
+# use highest exit code as global exit code
+#global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
+#
+#if [ ${global_exit} -eq 1 ];
+#then
+# info "Backup and/or Prune finished with a warning"
+#fi
+#
+#if [ ${global_exit} -gt 1 ];
+#then
+# info "Backup and/or Prune finished with an error"
+#fi
+#
+#exit ${global_exit}