From cc8ee49c5f4ed9bd47c54beeb69095065710b27a Mon Sep 17 00:00:00 2001 From: Silvio Rhatto Date: Wed, 23 May 2018 12:09:40 -0300 Subject: Adds borger script --- LICENSE | 33 +++++++++++++ borger | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 LICENSE create mode 100755 borger diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..aadd427 --- /dev/null +++ b/LICENSE @@ -0,0 +1,33 @@ +Since borger is based on the script from Borg documentation, this +repository keeps the original Borg LICENSE: + +Copyright (C) 2018 Silvio Rhatto +Copyright (C) 2015-2018 The Borg Collective (see AUTHORS file from Borg repo) +Copyright (C) 2010-2014 Jonas Borgström +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/borger b/borger new file mode 100755 index 0000000..990c493 --- /dev/null +++ b/borger @@ -0,0 +1,170 @@ +#!/bin/bash +# +# Borg script for home folder backups. +# Adapted from https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups +# +# Example config to be put at ~/.config/borger/destination-name: +# +# # Backup destination +# export SSH_SERVER="user@host" +# export SSH_PORT="2202" +# +# # Repository path +# export BORG_REPO_DIR="/var/backups/users/$USER/borg" +# export BORG_REPO="ssh://$SSH_SERVER:$SSH_PORT/$BORG_REPO_DIR" +# +# # Setting this, so you won't be asked for your repository passphrase: +# #export BORG_PASSPHRASE='HACKME' +# #export BORG_PASSCOMMAND='pass show backup' +# #export BORG_PASSCOMMAND='keyringer default decrypt pessoal/backups/borg 2> /dev/null' +# +# # Backup config +# keepdaily="7" +# keepweekly="4" +# keepmonth="6" +# encryption="keyfile" +# placeholder="{user}" + +# Parameters +BASENAME="`basename $0`" +DESTINATION="$1" +OPTION="$2" +BASE_CONFIG="$HOME/.config/borger" +CONFIG="$BASE_CONFIG/$DESTINATION" + +# Print info +function info { + printf "[$BASENAME] [%s] %s\n" "$(date)" "$*" >&2; +} + +# Fata error +function fatal { + info [fatal] $* + exit 1; +} + +function borger_usage { + # Ensure we have our base config folder + mkdir -p $BASE_CONFIG + + # List available targets + if [ -z "$DESTINATION" ]; then + echo "usage: $BASENAME [--check]" + echo -n "available destinations from $BASE_CONFIG: " + ls $BASE_CONFIG + exit 1 + fi +} + +# Config +function borger_config { + # Ensure we have an username + 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="6" + encryption="keyfile" + placeholder="{user}" + + if [ -e "$CONFIG" ] ; then + source $CONFIG + else + fatal "No such config $CONFIG" + fi + + # Setting this, so the repo does not need to be given on the commandline: + if [ -z "$BORG_REPO" ]; then + export BORG_REPO_DIR="/var/backups/users/$USER/borg" + export BORG_REPO="ssh://$SSH_SERVER:$SSH_PORT/$BORG_REPO_DIR" + fi +} + +# Check +function borger_check { + if [ "$OPTION" == "--check" ]; then + borg list + exit $? + fi +} + +# Our trap +function borger_trap { + trap 'info Backup interrupted >&2; exit 2' INT TERM +} + +# Initialize +function borger_init { + if ! ssh $SSH_SERVER -p $SSH_PORT test -f $BORG_REPO_DIR/config; then + info "Initializing borg repository at $BORG_REPO..." + borg init --encryption=$encryption $BORG_REPO + + 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: +function borger_create { + info "Starting backup..." + + borg create \ + --verbose \ + --filter AME \ + --list \ + --stats \ + --show-rc \ + --compression lz4 \ + --exclude-caches \ + ::"${placeholder}-{now}" \ + $ORIG + + backup_exit=$? + + if [ "$backup_exit" != "0" ]; then + fatal "Error creating snapshot" + fi +} + +# Use the `prune` subcommand to maintain daily, weekly and monthly archives. +# The '${placeholder}-' prefix is very important to limit prune's operation to +# one specific archive and not apply to archives also. +function borger_prune { + info "Pruning repository..." + borg prune \ + --list \ + --prefix "${placeholder}-" \ + --show-rc \ + --keep-daily $keepdaily \ + --keep-weekly $keepweekly \ + --keep-monthly $keepmonthly \ + + prune_exit=$? + + if [ "$prune_exit" != "0" ]; then + fatal "Error pruning repository" + fi +} + +# Main +borger_usage +borger_config +borger_check +borger_trap +borger_init +borger_create +borger_prune -- cgit v1.2.3