#!/bin/bash

# -------------------- НАСТРОЙКИ --------------------
#ARC_DIR="/home/bkp"	# хранилище резервных копий
ARC_DIR="./bkp_dir"	# хранилище резервных копий
#ARC_SYNC_DIR="/mnt/smb.backbone/bkp"	# зеркало хранилища
ARC_SYNC_DIR="./remote_dir"	# зеркало хранилища

#USR_DIRS="/home/kolan /home/tanya /home/ftp"	# пользовательские директории для резервирования
USR_DIRS="./usr_data"	# пользовательские директории для резервирования
USR_EXCL=""	# исключения

#SYS_DIRS="/bin /boot /etc /lib32 /lib64 /opt /root /sbin /usr /var"	# системные директории для резервирования
SYS_DIRS="./sys_data"	# системные директории для резервирования
SYS_EXCL="/var/tmp"	# исключения

FULL_NUM=2 # кол-во хранимых полных копий
#INCR_NUM=8	# кол-во инкр. копий между полными копиями
INCR_NUM=4	# кол-во инкр. копий между полными копиями

TAR="nice -n 19 ionice -c2 -n7 tar czp --one-file-system -f" # команда архивирования
EXT="tgz"
# -------------------- ПЕРЕМЕННЫЕ --------------------
NOW=`date +%Y%m%d\ %H:%M:%S`
HOSTNAME=`hostname`
ARC_DIR_HOST="$ARC_DIR/$HOSTNAME"
ARC_SYNC_DIR_HOST="$ARC_SYNC_DIR/$HOSTNAME"
DIRS="$SYS_DIRS $USR_DIRS"
EXCL="$SYS_EXCL $USR_EXCL"
# -------------------- ФУНКЦИИ --------------------
# Удаление "сломанных" инкрементальных копий,
# для которых не найдена полная копия
function rm_brok_incr
{
  for dir in `ls $ARC_DIR_HOST`; do
	full_arc_dirname=`cat $ARC_DIR_HOST/$dir/full-arc-dirname 2>/dev/null`
	if [[  ( "$?" != "0" || ! -d $ARC_DIR_HOST/$full_arc_dirname ) && "`echo $dir|grep full`" == "" ]]; then
	  rm -rf $ARC_DIR_HOST/$dir
	fi
  done
}

# -------------------- MAIN --------------------
# создаём необходимые каталоги
mkdir -p $ARC_DIR_HOST $ARC_SYNC_DIR_HOST

# удаляем мусор
rm_brok_incr

# дата последней полной копии
LAST_FULL_DIR=`ls $ARC_DIR_HOST|grep full|tail -n1`
LAST_FULL_TIME=`echo $LAST_FULL_DIR|sed 's/-full//;s/\.//g;s/_/ /'`

# кол-во сделанных инкр. копий
INCR_COUNT=0
for dir in `ls $ARC_DIR_HOST`; do
  if [[ "`echo $dir|grep full`" != "" ]]; then
	INCR_COUNT=0
  else
	INCR_COUNT=$(($INCR_COUNT+1))
  fi
done

# если кол-во инкр. копий превысило INCR_NUM,
# то необходимо делать новую полную резервную копию
if [[ $INCR_COUNT -ge $INCR_NUM ]]; then
  LAST_FULL_DIR=""
  LAST_FULL_TIME=""
fi

# выбор копии - полная или инкр.
BKP_DIRNAME=`date -d "$NOW" +%Y.%m.%d_%H:%M:%S`
if [[ "$LAST_FULL_DIR" == "" ]]; then	# ----- полная копия
  BKP_DIRNAME=$BKP_DIRNAME-full
  mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME
  # создаём полную резервную копию
  for dir in $DIRS; do
	dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`"
	$TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --exclude "$EXCL"
  done
  
else	# ----- инкрем. копия
  mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME
  echo $LAST_FULL_DIR > $ARC_DIR_HOST/$BKP_DIRNAME/full-arc-dirname
  NEWER=`date -d "$LAST_FULL_TIME" +%Y-%m-%d\ %H:%M:%S`
  # создаём резервную копию
  for dir in $DIRS; do
	dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`"
	$TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --newer "$NEWER" --exclude "$EXCL"
  done
fi

# удаление старых резервных копий
for dir in `ls $ARC_DIR_HOST|grep full|head -n -$FULL_NUM`; do
  rm -rf $ARC_DIR_HOST/$dir
done

# удаляем мусор
rm_brok_incr

# синхронизируем с зеркалом
rsync -rt --delete $ARC_DIR_HOST/ $ARC_SYNC_DIR_HOST
rsync -rt --delete $ARC_SYNC_DIR/ $ARC_DIR