Merge branch 'master' of ssh://codewiz.org/git/bernie/wizbackup
authorSugar Labs BOFH <sysadmin@sugarlabs.org>
Sun, 17 May 2015 05:40:58 +0000 (01:40 -0400)
committerSugar Labs BOFH <sysadmin@sugarlabs.org>
Sun, 17 May 2015 05:40:58 +0000 (01:40 -0400)
Conflicts:
wizbackup

1  2 
wizbackup

diff --combined wizbackup
index c88cc7e11861aae6220690401a0dadec5f8e302f,0656128e089f65f2477f164f9804c3cf9b974c2c..39534ac7203b67f96070e7b8666f8fa75183fd55
+++ b/wizbackup
@@@ -4,7 -4,7 +4,7 @@@
  # Based on incremental-backup 0.1 by Matteo Mattei
  #
  # Copyright 2006 Matteo Mattei <matteo.mattei@gmail.com>
- # Copyright 2007, 2008, 2009, 2010, 2011, 2015 Bernie Innocenti <bernie@codewiz.org>
 -# Copyright 2007, 2008, 2009, 2010, 2011, 2012 Bernie Innocenti <bernie@codewiz.org>
++# Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2015 Bernie Innocenti <bernie@codewiz.org>
  #
  #  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
@@@ -38,25 -38,25 +38,30 @@@ SRC=$1; shif
  # Destination directory (will be created if it doesn't exist)
  DEST=$1; shift
  
+ CONF_FILE="/etc/wizbackup/wizbackup.conf"
  # NOTE: --timeout needs to be large enough: if a large dir tree don't change a lot of time can pass without I/O
  # NOTE: --inplace will clobber linked files in older snapshots. DON'T USE IT!
  RSYNC_OPTS="-HAXa --stats --timeout 1800 --numeric-ids --delete --delete-excluded --ignore-errors $@"
  
 -# Number of saved snapshots
 -SNAPSHOTS=45
 +# Number of months to keep
 +MONTHS=3
  
  # Abort backup if the destination volume has less than these GBs free
  MIN_FREE_GB=10
  
  RESULT=500
 -DATE=`date +"%Y%m%d"`
 +DATE=$(date +"%Y%m%d")
 +if [ $(date +"%d") = 1 ]; then
 +      DATE="$DATE-monthly"
 +elif [ $(date +"%w") = 0 ]; then
 +      DATE="$DATE-weekly"
 +fi
  DEST="`echo $DEST | sed -e 's/\/$//'`"
  
+ if [ -f "$CONF_FILE" ]; then
+       source /etc/wizbackup/wizbackup.conf
+ fi
  
  # Use "backup" ssh key with ssh protocol, or password file for rsync protocol
  if [ "${SRC%:*}" == "rsync" ]; then
@@@ -66,12 -66,14 +71,12 @@@ els
  fi
  
  # Error tolerant grep
 -tgrep()
 -{
 +tgrep() {
        grep "$@"
        return 0
  }
  
 -do_backup()
 -{
 +do_backup() {
        set -o pipefail
        echo "$(date): rsync $RSYNC_OPTS $SRC $DEST/tmp/"
        rsync $RSYNC_OPTS "$SRC" "$DEST/tmp/" 2>&1 | tgrep -v -E 'vanished|some files'
@@@ -94,7 -96,9 +99,7 @@@
        set +o pipefail
  }
  
 -
 -do_init()
 -{
 +do_init() {
        # Safety net (4 slashes just in case)
        case "$DEST" in
                /|//|///|////) exit 666 ;;
        cd "$DEST" || exit 668
  }
  
 -do_prune()
 -{
 -      local old=`ls | grep -v tmp | head -n -$SNAPSHOTS | tr '\n' ' '`
 -      if [ ! -z "$old" ]; then
 +do_prune() {
 +      local num_snapshots="$1"
 +      local suffix="$2"
 +      local oldest="$(ls -d [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$suffix | head -n -$num_snapshots)"
 +      for old in $oldest; do
                echo "$(date): Removing oldest snapshot(s): $old..."
 -              rm -rf $old || exit 669
 -      fi
 +              rm -rf "$old" || exit 669
 +      done
  }
  
 -do_link()
 -{
 -      local newest=`ls | grep -v tmp | tail -n 1`
 +do_link() {
 +      local newest=`ls -d [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]* | tail -n 1`
        if [ -d "$DEST/tmp" ]; then
                echo "$(date): Continuing with pre-existing snapshot $DEST/tmp"
        elif [ -z "$newest" ]; then
        fi
  }
  
 -do_test()
 -{
 +do_test() {
        # TODO: test for free space and free inodes in the $DEST filesystem
        block_size=`stat --file-system --format "%S" "$DEST"`
        free_blocks=`stat --file-system --format "%f" "$DEST"`
  # make sure to be root
  if (( `id -u` != 0 )); then { echo "Sorry, must be root.  Exiting..."; exit; } fi
  
- echo "$(date): BEGIN backup: $SRC -> $DEST"
+ echo "$(date): BEGIN backup: $0 $@"
  echo "$(date): $0 $SRC $DEST $@"
  do_init
 -do_prune
 +do_prune 6 ""
 +do_prune 4 "-weekly"
 +do_prune $MONTHS "-monthly"
  do_test
  do_link
  do_backup