]> gitweb.fluxo.info Git - scripts.git/commitdiff
Borger: split code into functions and add more options
authorSilvio Rhatto <rhatto@riseup.net>
Wed, 23 May 2018 15:03:38 +0000 (12:03 -0300)
committerSilvio Rhatto <rhatto@riseup.net>
Wed, 23 May 2018 15:03:38 +0000 (12:03 -0300)
borger

diff --git a/borger b/borger
index 240de3691b8970607d76cd52414c3e534bcd7597..990c493396132d344d87bb99959a6a196c8dfb9d 100755 (executable)
--- a/borger
+++ b/borger
 #   # Backup config
 #   keepdaily="7"
 #   keepweekly="4"
-#   keepmonth="3"
+#   keepmonth="6"
 #   encryption="keyfile"
+#   placeholder="{user}"
 
 # Parameters
 BASENAME="`basename $0`"
 DESTINATION="$1"
+OPTION="$2"
 BASE_CONFIG="$HOME/.config/borger"
 CONFIG="$BASE_CONFIG/$DESTINATION"
-HOSTNAME=`cat /etc/hostname`
-
-# Some helpers and error handling:
-info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
-fatal() { info $*; exit 1; }
-
-# 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
-
-# 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="3"
-encryption="keyfile"
+
+# 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
-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
+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
-if [ "$2" == "--check" ]; then
-  borg list
-  exit $?
-fi
+function borger_check {
+  if [ "$OPTION" == "--check" ]; then
+    borg list
+    exit $?
+  fi
+}
 
 # Our trap
-trap 'info $( date ) Backup interrupted >&2; exit 2' INT TERM
+function borger_trap {
+  trap 'info Backup interrupted >&2; exit 2' INT TERM
+}
 
 # Initialize
-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
+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=$?
+    init_exit=$?
 
-  if [ "$init_exit" != "0" ]; then
-    fatal "Error initializing repository"
+    if [ "$init_exit" != "0" ]; then
+      fatal "Error initializing repository"
+    fi
   fi
-fi
+}
 
 # Backup the most important directories into an archive named after
 # the machine this script is currently running on:
-
-info "Starting backup..."
-
-borg create                          \
-  --verbose                          \
-  --filter AME                       \
-  --list                             \
-  --stats                            \
-  --show-rc                          \
-  --compression lz4                  \
-  --exclude-caches                   \
-  ::'{now}'                          \
-  $ORIG
+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
-
-info "Pruning repository..."
-
-# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
-# archives of THIS machine. The '{hostname}-' prefix is very important to
-# limit prune's operation to this machine's archives and not apply to
-# other machines' archives also:
-
-borg prune                      \
-  --list                        \
-  --show-rc                     \
-  --keep-daily    $keepdaily    \
-  --keep-weekly   $keepweekly   \
-  --keep-monthly  $keepmonthly  \
-
-  prune_exit=$?
-
-if [ "$prune_exit" != "0" ]; then
-  fatal "Error pruning repository"
-fi
-
-# use highest exit code as global exit code
-#global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
-#
-#if [ ${global_exit} -eq 1 ];
-#then
-#  info "Backup and/or Prune finished with a warning"
-#fi
-#
-#if [ ${global_exit} -gt 1 ];
-#then
-#  info "Backup and/or Prune finished with an error"
-#fi
-#
-#exit ${global_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