]> gitweb.fluxo.info Git - borger.git/commitdiff
Adds borger script
authorSilvio Rhatto <rhatto@riseup.net>
Wed, 23 May 2018 15:09:40 +0000 (12:09 -0300)
committerSilvio Rhatto <rhatto@riseup.net>
Wed, 23 May 2018 15:09:40 +0000 (12:09 -0300)
LICENSE [new file with mode: 0644]
borger [new file with mode: 0755]

diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
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 (executable)
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