#!/bin/bash
# Author: LeoN @ka Children of koRn
# www.ilab.me / XMPP: ChildrenofkoRn@ilab.me
# iLAB – Time to fly
# переменные:
VERSION='Version V07 of 2011.04.28 07:03 PM'
# метка с датой и временем, используетя в именах:
FDATE=$(date +%F_%H-%M)
# директория куда сохраняются бекапы:
SAVEDIR='/root/VPSbackups'
# файл с временной меткой последнего полного бекапа,
# время модификации этого файла Tar использует для инкрементального бэкапа:
LAST="${SAVEDIR}/lasttimebackup.log"
# файл со списком баз данных MySQL, которые надо бекапить:
DBS=$(cat ${SAVEDIR}/databaseslist.txt)
# mysqldump с рутовым паролем от MySQL для экспорта баз:
SQLDUMP='mysqldump -uroot -pParanoidPASS'
# темповая директория для экспорта баз перед архивированием:
EXPORTDB="${SAVEDIR}/everyday/DBSexport_${FDATE}"
# список файлов/директорий, которые необходимо архивировать:
INTAR="${SAVEDIR}/tar.includelist.txt"
# список файлов/директорий, которые необходимо исключить из архива:
EXTAR="${SAVEDIR}/tar.excludelist.txt"
#
echo '\n'"$(date +'%R:%S'): Start script VPSbackup, ${VERSION};"'\n'
# получаем день недели:
# условие создано для реализации ручного выбора типа бэкапа путём вызова скрипта с аргументом,
# пример вызова: sh /root/backup_vps.sh $1
# где $1 число: от 1 до 6 - инкрементальный бэкап, 7 - полный бэкап;
# если аргумент не указан [например, когда скрипт автоматически запускается по cron], то день недели берётся из даты на сервере:
if echo "$1" | egrep '^[+]?[1-7]$' >/dev/null ;
	then
		WDAY=$1
	else
		WDAY=$(date +%u)
fi
# создаём темповую директорию для экспорта баз:
mkdir $EXPORTDB 2> /dev/null
# для директорий, которые бекапить нет нужды, но хотелось бы иметь список файлов в случае чего - делаем рекурсивный вывод ls в файл:
ls -lRaF '/home/ftp/pubftp/' > "${EXPORTDB}/pubftp_list_${FDATE}.txt"
ls -lRaF '/home/leon/files/' >  "${EXPORTDB}/files_list_${FDATE}.txt"
echo "$(date +'%R:%S'): begining dump databases.."'\n'
# дампим ejabberd:
/sbin/ejabberdctl dump /ejabberd_backups/ejabberd_${FDATE}.dump
/sbin/ejabberdctl backup /ejabberd_backups/ejabberd_${FDATE}.backup
# дампим базы MySQL, цикл обрабатывает по порядку базы в списке из переменной DBS, до тех пор пока список не закончится:
for dbname in $DBS; do
  $SQLDUMP $dbname > "${EXPORTDB}/${dbname}_${FDATE}.sql"
done
echo "$(date +'%R:%S'): dump databases extracted;"'\n'
# условие которое проверяет какой день недели сегодня [в WDAY записан числовой эквиваленнт дня недели [1 -7], где 1 - понедельник],
# если WDAY != 7, то выполняется блок Then: в переменную TARPAR записываются опции для инкрементального бекапа Tar'ом по дате модификации файла LAST,
# если сегодня воскресенье, т.е. WDAY=7, то выполняется блок Else: в переменную TARPAR записываются опции для полного бекапа Tar'ом и обновляется время модификации файла LAST;
# также в обоих блоках генерируется имя бекапа и лог-файла для Tar'a в переменную SAVENAME.
if [ "$WDAY" -ne 7 ];
		then
			SAVENAME="${SAVEDIR}/VPSbackup_${FDATE}.SMALL"
			TARPAR="-N$LAST -X$EXTAR -T$INTAR $EXPORTDB"
# перестраховка, если случайно время модификации у контрольного файла было изменено [например открыли файл и нажали сохранить, хотя изменений и не вносили],
# получаем _из_ файла LAST штамп времени и устаналиваем его как время модификации _для_ этого же файла:
			touch -t $(cat $LAST) $LAST
		else
			SAVENAME="${SAVEDIR}/VPSbackup_${FDATE}.FULL"
			TARPAR="-X$EXTAR -T$INTAR $EXPORTDB"
			echo $(date +%Y%m%d%H%M.%S) > $LAST
fi
# вывод в консоль полученных переменных, для мониторинга при ручном прогоне:
echo "##### prefix-list in script: #####"
echo "#day of week $WDAY #date $FDATE #last Full backup $(cat $LAST)"'\n'
echo "#databases list:"'\n'"$(ls $EXPORTDB)"'\n'
echo "#savename: ${SAVENAME}"'\n''\n'"#Tar's parameters: ${TARPAR}"'\n''########## end list ##########''\n'
echo "$(date +'%R:%S'): beginning of filtration and packaging backup files .. wait a few moments .."'\n'
# тут всё просто, происходит архивирование, Tar получает опции из переменной TARPAR, а имя для архива и лога из SAVENAME:
tar czvf ${SAVENAME}.tar.gz $TARPAR > ${SAVENAME}.log 2>&1
# добавляем в лог Tar'a текущий временной штамп, себе для справки:
echo $(cat $LAST) >> ${SAVENAME}.log
# удаление временных файлов и директорий [куда дампились бд и т.п.]:
rm -rf $EXPORTDB /ejabberd_backups/*
echo "$(date +'%R:%S'): packing is completed, all operations were successful."'\n''\n'"backup location >> ${SAVENAME}.tar.gz"'\n'
# завершение работы скрипта;
exit 0

