mirror of
https://0xacab.org/liberate/backupninja.git
synced 2024-11-13 22:32:29 +01:00
a02a598bb5
Archive names must be unique, so if the backup runs more than once per day with the previous default, it will throw and error because of the duplicate archive name. This is also consistent with the addition of the keephourly prune option.
155 lines
3.7 KiB
Bash
155 lines
3.7 KiB
Bash
# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
|
|
# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
|
|
#
|
|
# borg handler script for backupninja
|
|
# requires borgbackup
|
|
#
|
|
# Guillaume Subiron, Sysnove, 2016
|
|
#
|
|
# Copyright 2016 Guillaume Subiron <guillaume@sysnove.fr>
|
|
#
|
|
# This work is free. You can redistribute it and/or modify it under the
|
|
# terms of the Do What The Fuck You Want To Public License, Version 2,
|
|
# as published by Sam Hocevar. See the http://www.wtfpl.net/ file for more details.
|
|
#
|
|
#
|
|
|
|
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
|
|
|
### GET CONFIG ###
|
|
|
|
getconf testconnect yes
|
|
getconf nicelevel 0
|
|
|
|
setsection source
|
|
getconf keephourly 1
|
|
getconf keepdaily 7
|
|
getconf keepweekly 4
|
|
getconf keepmonthly -1
|
|
getconf include
|
|
getconf exclude
|
|
|
|
setsection dest
|
|
getconf user
|
|
getconf host
|
|
getconf directory
|
|
# strip trailing /
|
|
directory=${directory%/}
|
|
getconf archive {now:%Y-%m-%dT%H:%M:%S}
|
|
getconf compression lz4
|
|
getconf encryption none
|
|
getconf passphrase
|
|
|
|
export BORG_PASSPHRASE="$passphrase"
|
|
|
|
### CHECK CONFIG ###
|
|
|
|
# destination specific checks
|
|
[ "$directory" != "" ] || fatal "Destination directory not set"
|
|
if [ "$host" != "localhost" ]; then
|
|
execstr_repository="$user@$host:$directory"
|
|
else
|
|
execstr_repository="$directory"
|
|
fi
|
|
execstr_archive="$archive"
|
|
|
|
# check the connection at the source and destination
|
|
[ -n "$test" ] || test=0
|
|
if [ "$host" != "localhost" ] && ([ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]); then
|
|
debug "ssh -o PasswordAuthentication=no $host -l $user 'echo -n 1'"
|
|
local ret=`ssh -o PasswordAuthentication=no $host -l $user 'echo -n 1'`
|
|
if [ "$ret" = 1 ]; then
|
|
debug "Connected to $host as $user successfully"
|
|
else
|
|
teststr="borg list --show-rc -v $execstr_repository"
|
|
debug "$teststr"
|
|
output=`su -c "$teststr" 2>&1`
|
|
if echo "$output" | grep "terminating with success status" ; then
|
|
debug "Connected to $host as $user successfully (forced command)"
|
|
else
|
|
if echo "$output" | grep -E "Repository.+does not exist" ; then
|
|
debug "Connected to $host as $user successfully (forced command)"
|
|
else
|
|
fatal "Can't connect to $host as $user."
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
### INIT IF NEEDED ###
|
|
|
|
initstr="borg init --encryption=$encryption $execstr_repository"
|
|
|
|
debug "$initstr"
|
|
|
|
if [ $test = 0 ]; then
|
|
output="`su -c "$initstr" 2>&1`"
|
|
if [ $? = 2 ]; then
|
|
debug $output
|
|
info "Repository was already initialized"
|
|
else
|
|
warning $output
|
|
warning "Repository has been initialized"
|
|
fi
|
|
fi
|
|
|
|
### EXECUTE ###
|
|
|
|
execstr="borg create --stats --compression $compression"
|
|
|
|
set -o noglob
|
|
|
|
# includes
|
|
SAVEIFS=$IFS
|
|
IFS=$(echo -en "\n\b")
|
|
for i in $include; do
|
|
includes="${includes} '$i'"
|
|
done
|
|
IFS=$SAVEIFS
|
|
|
|
# excludes
|
|
SAVEIFS=$IFS
|
|
IFS=$(echo -en "\n\b")
|
|
for i in $exclude; do
|
|
excludes="${excludes} --exclude '$i'"
|
|
done
|
|
IFS=$SAVEIFS
|
|
|
|
set +o noglob
|
|
|
|
# include client-part and server-part
|
|
execstr="${execstr} ${excludes} $execstr_repository::$execstr_archive ${includes}"
|
|
debug "$execstr"
|
|
|
|
if [ $test = 0 ]; then
|
|
output=`nice -n $nicelevel su -c "$execstr" 2>&1`
|
|
if [ $? = 0 ]; then
|
|
debug $output
|
|
info "Successfully finished backing up source $label"
|
|
else
|
|
error $output
|
|
fatal "Failed backuping up source $label"
|
|
fi
|
|
fi
|
|
|
|
### REMOVE OLD BACKUPS ###
|
|
|
|
# borg prune
|
|
prunestr="borg prune --keep-hourly $keephourly --keep-daily $keepdaily --keep-weekly $keepweekly --keep-monthly $keepmonthly $execstr_repository"
|
|
debug "$prunestr"
|
|
|
|
if [ $test = 0 ]; then
|
|
output="`su -c "$prunestr" 2>&1`"
|
|
if [ $? = 0 ]; then
|
|
debug $output
|
|
info "Removing old backups succeeded."
|
|
else
|
|
warning $output
|
|
warning "Failed removing old backups."
|
|
fi
|
|
fi
|
|
|
|
unset BORG_PASSPHRASE
|
|
|
|
return 0
|