diff options
Diffstat (limited to 'arch-system/borgbackup')
| -rwxr-xr-x | arch-system/borgbackup | 86 | 
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." | 
