aboutsummaryrefslogtreecommitdiffstats
path: root/arch-system/borgbackup
diff options
context:
space:
mode:
Diffstat (limited to 'arch-system/borgbackup')
-rwxr-xr-xarch-system/borgbackup86
1 files changed, 86 insertions, 0 deletions
diff --git a/arch-system/borgbackup b/arch-system/borgbackup
new file mode 100755
index 0000000..c813fcc
--- /dev/null
+++ b/arch-system/borgbackup
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+set -o errexit -o errtrace
+
+source /etc/borg_env.sh
+
+export BORG_RSH="$BORG_RSH -o ConnectionAttempts=20 -o ServerAliveInterval=30"
+export LC_COLLATE=C
+
+SNAPSHOT_TARGET="/.snapshots/$SNAPSHOT_PREFIX-$(date "+%Y-%m-%dT%H:%M:%S")"
+
+cleanup() {
+ cd /
+ sudo -n /usr/bin/backup-sudo cleanup
+}
+
+handle_failure() {
+ notify_user -u critical "Backup failed!"
+
+ echo "Backup failed!" >&2
+ exit 2
+}
+
+trap cleanup EXIT
+trap handle_failure INT TERM ERR
+
+backup() {
+ # borg's caching of 'known' files is really dumb - it takes the full
+ # canonical path to check if it has already seen a file. This means that the
+ # path of files must never change if you want fast backups.
+ # As symlinks won't work, we use mount(8) to ensure the paths stay the same.
+ sudo -n backup-sudo mount "$1"
+
+ if [ -t 1 ]; then
+ borg_progress="--progress"
+ fi
+
+ cd /backup
+
+ BACKUP_TARGET="$SNAPSHOT_PREFIX"-"$(date -r . "+%Y-%m-%dT%H:%M:%S")"
+ borg create --stats $borg_progress \
+ --patterns-from ~/.borg_pattern \
+ --timestamp . \
+ --show-rc \
+ ::"$BACKUP_TARGET" . && rc=$? || rc=$?
+ if [ $rc -eq 1 ]; then
+ # borg defines return code 1 as warning, usually permission stuff
+ notify_user "Warning: borgbackup returned 1. Check logs"
+ elif [ $rc -gt 1 ]; then
+ borg list --short | grep -q "$BACKUP_TARGET" || false
+ fi
+
+ cleanup
+ sudo -n backup-sudo delete_snapshot "$1"
+}
+
+if [ ! -d "$SNAPSHOT_TARGET" ]; then
+ sudo -n backup-sudo snapshot "$SNAPSHOT_TARGET" "$SNAPSHOT_MOUNTPOINT"
+fi
+
+cleanup
+
+$BORG_RSH "$BORG_HOST" -f -N || rc=$?
+if [ ${rc-0} -eq 255 ]; then
+ notify_user "Backup: upload skipped"
+ echo "SSH server not reachable, skipping upload" >&2
+ exit 0
+elif [ ${rc-0} -ne 0 ]; then
+ false
+fi
+
+for d in /.snapshots/*/ ; do
+ echo "Now working on: $d"
+ backup "$d"
+done
+
+echo "Pruning repository."
+
+borg prune --show-rc --list \
+ --keep-last 20 \
+ --keep-hourly 72 \
+ --keep-daily 7 \
+ --keep-weekly 4 \
+ --keep-monthly 6
+
+echo "Backup finished."