#!/bin/bash
#2020-04-25

BUDIR="/mnt/backup"
NUM=8
LIST="/root/backup-list"
HOSTNAME=$(</etc/hostname)
SRCDIR=$1
#NAME=${SRCDIR//\//--}
NAME=$2

function usage () {
  echo "This script requires either one or two arguments."
  echo "Usage:"
  echo "$0 JOBLIST"
  echo "$0 SOURCE_DIRECTORY NAME"
  echo
  echo "JOBLIST			File that contains one backup job per line in the format SOURCE_DIRECTORY NAME"
  echo "SOURCE_DIRECTORY	Directory that should be backed up. Please, no trailing slash."
  echo "NAME			A string that is used to name the backup in the destination."
  exit 1
}

function single() {
  if grep -qs "$BUDIR " /proc/mounts
  then
    mkdir -p "$BUDIR/$HOSTNAME"
    FULLNAME=$BUDIR/$HOSTNAME/$NAME
    echo "Attempting backup of source directory $SRCDIR to $FULLNAME."
    echo "Number of differential backups to keep: $NUM"
    rm -rf $FULLNAME.$NUM
    for ((i=$NUM; i>=2; i--)); do
      mv $FULLNAME.$((i-1)) $FULLNAME.$i
    done
    cp -al $FULLNAME.0 $FULLNAME.1
    NOW=$(date)
    echo >> $FULLNAME.log
    echo >> $FULLNAME.log
    echo >> $FULLNAME.log
    echo "STARTING INCREMENTAL BACKUP AT $NOW" >> $FULLNAME.log
    echo >> $FULLNAME.log
    rsync --archive -L --delete $SRCDIR/ $FULLNAME.0/ 2>&1 | tee -a $FULLNAME.log
    NOW=$(date)
    echo "If this line is here the script finished (with or without errors) at $NOW" >> $FULLNAME.log
  else
    echo "$BUDIR is not mounted. Aborting."
    exit 1
  fi
}

function fromlist() {
  while read job; do
    if [ -n "$job" ]; then
      NAME="${job#* }"
      SRCDIR="${job% *}"
      single
    fi
  done < $LIST
}

case $# in
0)
  mount $BUDIR
  echo "Reading backup jobs from list. Defaulting to $LIST."
  fromlist
  ;;
1)
  mount $BUDIR
  LIST=$1
  echo "Reading backup jobs from $LIST"
  fromlist
  ;;
2)
  mount $BUDIR
  single
  ;;
3)
# I can't decide whether to make the third argument NUM or BUDIR. I don't need it anyway.
#  NUM=$3
#  BUDIR=$3
#  mount $BUDIR
#  single
  usage
  ;;
*)
  usage
  ;;
esac

exit 0

