#!/bin/bash
#
# syncs the given directory (or file) to the configured backup space

. /usr/sbin/eb-check-eb

if [ ! -d ${EBMOUNTDIR}/${EBDESTBASE} ] ; then
  echo "FATAL: Target base directory not found: ${EBMOUNTDIR}/${EBDESTBASE}"
  echo "You might have to call sudo eb-mount"
  exit 31
fi

DIR=$1
if [ -z "$DIR" ] ; then
  echo "No directory (or file) to backup given."
  exit 32
fi

if [ ! -e "$DIR" ] ; then
  echo "No such file or directory: $DIR"
  exit 33
fi

if [ ! -d "$DIR" ] ; then
  if [ ! -f "$DIR" ] ; then
    echo "$DIR is neither a file nor a directory:"
    ls -ld $DIR
    exit 34
  fi
fi

export FILE="$DIR"
if [ ! -d "$DIR" ] ; then
  DIR=$(dirname $FILE)
fi

ABSDIR=$(echo "$DIR" |egrep '^/')
if [ -z "$ABSDIR" ]
then
  echo "Path not absolute: ${DIR}"
  exit 41
fi

EVILDIR=$(echo "$DIR" |egrep '^/($|dev|proc|sys)')
if [ ! -z "$EVILDIR" ]
then
  echo "Path not allowed: ${DIR}"
  exit 42
fi

if [ -d "${FILE}" ] ; then
  FILE="${FILE}/"
fi

#echo "DIR=${DIR}"
#echo "FILE=${FILE}"

# OK, go to work

# sooner or later we might have multiple backup generations on most hosts
# this also makes sure we have access

export BAKDESTBASE="${EBMOUNTDIR}/${EBDESTBASE}"
echo "Checking target for $DIR, ${BAKDESTBASE}/${DIR}"
mkdir -pv ${BAKDESTBASE}/${DIR}
test -d ${BAKDESTBASE}/${DIR} || exit 52

shift
export SYNCOPTIONS=""
if [ -n "$*" ] ; then
  export SYNCOPTIONS="$*"
fi
SYNCOPTIONS="$SYNCOPTIONS "$(egrep "^$DIR " ${BSCLIENT_ETC_DIR}/dirs2backup |cut -f2- -d ' ')
if [ ! "${SYNCOPTIONS}" = " " ] ; then
  echo "Using special rsync options:"
  echo "  ${SYNCOPTIONS}"
fi

export RSYNCOPTIONS="-r --delete --delete-after --force -g -l -o -p -v -S -t -x --timeout=60" # -W ?

echo "Synching ${FILE}"
XSOK="no"
echo "Calling   rsync ${RSYNCOPTIONS} ${SYNCOPTIONS} ${FILE} ${BAKDESTBASE}/${FILE}"
rsync ${RSYNCOPTIONS} ${SYNCOPTIONS} ${FILE} ${BAKDESTBASE}/${FILE} && XSOK="yes"
if [ "$XSOK" = "no" ] ; then
  echo "Failed, retry 1"
  rsync ${RSYNCOPTIONS} ${SYNCOPTIONS} ${FILE} ${BAKDESTBASE}/${FILE} && XSOK="yes"
fi
if [ "$XSOK" = "no" ] ; then
  echo "Failed, retry 2"
  rsync ${RSYNCOPTIONS} ${SYNCOPTIONS} ${FILE} ${BAKDESTBASE}/${FILE} && XSOK="yes"
fi
if [ "$XSOK" = "no" ] ; then
  echo "Failed, retry 3"
  rsync ${RSYNCOPTIONS} ${SYNCOPTIONS} ${FILE} ${BAKDESTBASE}/${FILE} || exit 55
fi

echo "Finished syncing ${FILE} to ${BAKDESTBASE}"

