aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSilvio Rhatto <rhatto@riseup.net>2018-05-23 12:03:38 -0300
committerSilvio Rhatto <rhatto@riseup.net>2018-05-23 12:03:38 -0300
commit55351da8d6fcd3a53473bcc0c2212183244baa61 (patch)
tree6cee47206aa1504cad0539ab1cd6c3dac05ea421
parentd3d8a9da90091ec1d53cfc975f1a1fe5134ce54b (diff)
downloadscripts-55351da8d6fcd3a53473bcc0c2212183244baa61.tar.gz
scripts-55351da8d6fcd3a53473bcc0c2212183244baa61.tar.bz2
Borger: split code into functions and add more options
-rwxr-xr-xborger232
1 files changed, 123 insertions, 109 deletions
diff --git a/borger b/borger
index 240de36..990c493 100755
--- a/borger
+++ b/borger
@@ -21,136 +21,150 @@
# # 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