aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE33
-rwxr-xr-xborger170
2 files changed, 203 insertions, 0 deletions
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 <jonas@borgstrom.se>
+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 <destination> [--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