]> gitweb.fluxo.info Git - borger.git/commitdiff
Major refactor
authorSilvio Rhatto <rhatto@riseup.net>
Wed, 7 Aug 2019 01:15:52 +0000 (22:15 -0300)
committerSilvio Rhatto <rhatto@riseup.net>
Wed, 7 Aug 2019 01:15:52 +0000 (22:15 -0300)
borger

diff --git a/borger b/borger
index 095f6a687ba3a8a86088e505a96ffb6700cbd02d..3448101e1a9ad143daeb79acff4c90cdfabd13f9 100755 (executable)
--- a/borger
+++ b/borger
@@ -1,12 +1,26 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
 # Borg script for home folder backups.
 # Adapted from https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups
 #
-# See also:
+# See also: https://borgbackup.readthedocs.io/en/stable/faq.html#if-a-backup-stops-mid-way-does-the-already-backed-up-data-stay-there
+#           https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg-help-placeholders
+#
+# Copyright (C) 2019 Silvio Rhatto - rhatto at riseup.net
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation, either version 3 of the License,
+# or any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
-# https://borgbackup.readthedocs.io/en/stable/faq.html#if-a-backup-stops-mid-way-does-the-already-backed-up-data-stay-there
-# https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg-help-placeholders
 
 # Parameters
 FULLNAME="$0"
@@ -35,44 +49,29 @@ function borger_usage {
   exit 1
 }
 
-# Check if in multiple mode
-function borger_check_multiple {
+# Setup
+function borger_setup {
+  # Ensure we have our base config folder
+  mkdir -p $BASE_CONFIG
+
+  # Check config
   if [ ! -e "$CONFIG" ]; then
     fatal "No such config $CONFIG"
     exit 1
   elif [ -d "$CONFIG" ]; then
     MULTIPLE="yes"
+  fi
 
-    # Avoid too many loops
-    if [ "$OPTION" == "--continuous" ]; then
-      MULTIPLE_OPTION=""
-    else
-      MULTIPLE_OPTION="$OPTION"
-    fi
-
-    info "Multiple destination \"$DESTINATION\" found. Processing each subconfig..."
-
-    # Config is a folder, so we iterate over all items
-    # and call borger for each config in parallel
-    for config in `ls $CONFIG`; do
-      info "Calling borger for $DESTINATION/$config..."
-      ( $FULLNAME $DESTINATION/$config $MULTIPLE_OPTION 2>&1 | sed -e "s/^\[borger\]/[borger] [$config]/" -e "s/^\([^\[]\)/[borger] [$config] \1/" ) &
-    done
-
-    # Since we dispatched everything to subprocesses,
-    # there's nothing to do here.
-    #exit
-    wait
+  # Lockfile location
+  if [ "$OPTION" == "--continuous" ]; then
+    LOCKFILE="$TMP/$BASENAME/$DESTINATION-continuous.lock"
+  else
+    LOCKFILE="$TMP/$BASENAME/$DESTINATION.lock"
   fi
 }
 
 # Process configuration
 function borger_config {
-  # If running on multiple mode, stop here
-  if [ "$MULTIPLE" == "yes" ]; then
-    exit
-  fi
-
   # Ensure we have an username
   if [ -z "$USER" ]; then
     USER="`whoami`"
@@ -100,13 +99,6 @@ function borger_config {
     export BORG_REPO_DIR="/var/backups/users/$USER/borg"
     export BORG_REPO="ssh://$SSH_SERVER:$SSH_PORT/$BORG_REPO_DIR"
   fi
-
-  # Lockfile location
-  if [ "$OPTION" == "--continuous" ]; then
-    LOCKFILE="$TMP/$BASENAME/$DESTINATION-continuous.lock"
-  else
-    LOCKFILE="$TMP/$BASENAME/$DESTINATION.lock"
-  fi
 }
 
 # List
@@ -245,17 +237,63 @@ function borger_check_lockfile {
 
 # Main backup procedure
 function borger_run {
-  borger_check_multiple
-  borger_config
   borger_check_lockfile
   borger_set_lockfile
-  borger_trap
-  borger_init
-  borger_create
-  borger_prune
-  borger_exit
+
+  # Run for single or multiple destinations
+  if [ "$MULTIPLE" == "yes" ]; then
+    borger_multiple
+  else
+    borger_config
+    borger_trap
+    borger_init
+    borger_create
+    borger_prune
+    borger_exit
+  fi
+}
+
+# Run for a single destination
+function borger_single {
+  borger_config
+
+  # Convert the pass command to passphrase otherwise
+  # the user would be interrupted by a passphrase prompt
+  # at every iteration
+  if [ ! -z "$BORG_PASSCOMMAND" ]; then
+    export BORG_PASSPHRASE="`$BORG_PASSCOMMAND`"
+    export BORG_PASSCOMMAND=""
+  fi
+
+  $FULLNAME $DESTINATION
+}
+
+# Run for multiple destinations
+function borger_multiple {
+  info "Multiple destination \"$DESTINATION\" found. Processing each subconfig..."
+
+  # Serial approach
+  # FIXME: export BORG_PASSPHRASE config for each destination using an array
+  for config in `ls $CONFIG`; do
+    info "Calling borger for $DESTINATION/$config..."
+    $FULLNAME $DESTINATION/$config 2>&1 | sed -e "s/^\[borger\]/[borger] [$config]/" -e "s/^\([^\[]\)/[borger] [$config] \1/"
+  done
+
+  # Parallel approach
+  ## Config is a folder, so we iterate over all items
+  ## and call borger for each config in parallel
+  #for config in `ls $CONFIG`; do
+  #  info "Calling borger for $DESTINATION/$config..."
+  #  ( $FULLNAME $DESTINATION/$config $MULTIPLE_OPTION 2>&1 | sed -e "s/^\[borger\]/[borger] [$config]/" -e "s/^\([^\[]\)/[borger] [$config] \1/" ) &
+  #done
+
+  ## Since we dispatched everything to subprocesses,
+  ## there's nothing to do here.
+  ##exit
+  #wait
 }
 
+# Exit procedure
 function borger_exit {
   # Use highest exit code as global exit code
   global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
@@ -271,8 +309,28 @@ function borger_exit {
   exit ${global_exit}
 }
 
-# Ensure we have our base config folder
-mkdir -p $BASE_CONFIG
+# Continuous backup processing
+function borger_continuous {
+  borger_check_lockfile
+  borger_set_lockfile
+
+  # Run until interruption
+  while true; do
+    # Run as a subprocess so we do not exit on any fatal error
+    if [ "$MULTIPLE" == "yes" ]; then
+      borger_multiple
+    else
+      borger_single
+    fi
+
+    # Wait
+    info "Running on continous mode... sleeping $INTERVAL..."
+    sleep $INTERVAL
+  done
+}
+
+# Setup
+borger_setup
 
 # Dispatch
 if [ -z "$DESTINATION" ]; then
@@ -280,35 +338,14 @@ if [ -z "$DESTINATION" ]; then
 elif [ -z "$OPTION" ]; then
   borger_run
 elif [ "$OPTION" == "--list" ]; then
-  borger_check_multiple
   borger_config
   borger_list
 elif [ "$OPTION" == "--check" ]; then
-  borger_check_multiple
   borger_config
   borger_check
 elif [ "$OPTION" == "--info" ]; then
-  borger_check_multiple
   borger_config
   borger_info
 elif [ "$OPTION" == "--continuous" ]; then
-  borger_check_multiple
-  borger_config
-  borger_check_lockfile
-  borger_set_lockfile
-
-  # Convert the pass command to passphrase otherwise
-  # the user would be interrupted by a passphrase prompt
-  # at every iteration
-  if [ ! -z "$BORG_PASSCOMMAND" ]; then
-    export BORG_PASSPHRASE="`$BORG_PASSCOMMAND`"
-    export BORG_PASSCOMMAND=""
-  fi
-
-  while true; do
-    # Run as a subprocess so we do not exit on any fatal error
-    $FULLNAME $DESTINATION
-    info "Running on continous mode... sleeping $INTERVAL..."
-    sleep $INTERVAL
-  done
+  borger_continuous
 fi