Данный скрипт был сделан для решения следующей задачи:
1. Необходимо архивировать инкрементально по расписанию файлы с файлового сервера Windows.
2. Пользователи имеют привычку подмонтировать к себе на компьютеры в виде дисков подпапки общей папки Windows, в результате чего пути файлов становятся более 255 символов и архивирование из под windows в результате не отрабатывает длинные пути.
3. Борьба с пользователями нежелательна, поскольку те исторически так делают, и их все устраивает, да и им так объективно удобнее.
4. Архивирование будет производиться на linux компьютер (ubuntu).
Поэтому было принято решение монтировать windows-шары на linux компьютер, под специально для этих случаев созданным пользователем windows, имеющим права на чтение для нужных ресурсов. В cron запускается скрипт main_start, который проверяет, не запущен ли он уже, и если нет, то запускающий по очереди скрипты архивирования (в примере orz_op).
Скрипт orz_op монтирует шару, проверяет наличие полного архива, и при его отсутствии начинает создавать полный архив. При наличии полного архива скрипт начинает архивировать в архив с текущей датой в названии измененные или новые файлы относительно полного архива. О своих действиях пишет в arch_log файл и отправляет оповещения на jabber. В конце папка отмонтируется.
main_start begin
#
# запихиваем этот файл в cron по необходимому расписанию
if test -r "/DATA/backup/main_flag";
then
echo ничего делать не буду, поскольку уже есть работающий backup, пусть он отработает до конца
else
echo содадим флаг и приступим
touch /DATA/backup/main_flag
/SCRIPTS/MOUNT_WIN/orz_op
echo все сделали, не стыдно флаг удалить!
rm /DATA/backup/main_flag
fi
main_start end
orz_op begin
#!/bin/bash
# Пропишем пути
#Имя папки в которую монтируется общая папка windows
NAMED_AS=ORZ_OP
#Путь к папке, в которую будем монтировать общую папку Windows
IN_PATH=/SCRIPTS/MOUNT_WIN/ORZ_OP
#Путь к папке, в которой хранятся архивы
OUT_PATH=/DATA/backup/ORZ_OP
#Имя полного архива
ARC_NAME=orz_op_
#Имя инкрементального архива
ARC_INCREMENT=orz_op_`date +%d%m%y`.7z
# Смонтируем папку сервера Windows на локальную машину
smbmount //server-name/ОР /SCRIPTS/MOUNT_WIN/$NAMED_AS -o domain=windowsdomain,username=backupuser,password=_backupuser_password,iocharset=utf8
if ! (locale | grep "ru_RU.UTF-8" > /dev/nul)
then
export LC_ALL=ru_RU.UTF-8
fi
#Проверим, существует ли полный архив
if test -r "$OUT_PATH/$ARC_NAME.7z";
then
echo $NAMED_AS инкрементальный архив стартовал >> /DATA/backup/arch_log.txt
date >> /DATA/backup/arch_log.txt
echo
>> /DATA/backup/arch_log.txt
echo а файл главной копии уже есть, поэтому будем делать инкрементальную копию
7za u $OUT_PATH/$ARC_NAME.7z $IN_PATH/ -ms=off -mx=9 -t7z -u- -up0q3r2x2y2z0w2!$OUT_PATH/$ARC_INCREMENT >> $OUT_PATH/$ARC_INCREMENT.txt
echo "$ARC_INCREMENT Backup FINISHED:$(date +%d.%m.%Y\ %H:%M:%S) , $(tail -n 2 $OUT_PATH/$ARC_INCREMENT.txt), $?" | sendxmpp -s '$NAMED_AS' -r 'Backup' -u sender_username -j jabber.ru:5222 -p 'password'
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
else
echo $NAMED_AS полный архив стартовал >> /DATA/backup/arch_log.txt
date >> /DATA/backup/arch_log.txt
echo
>> /DATA/backup/arch_log.txt
echo нету файла полной копии, поэтому делаем полный архив
7za a $OUT_PATH/$ARC_NAME $IN_PATH -ms=off -mx=9 >> /DATA/backup/$NAMED_AS/$ARC_NAME.txt
echo "$ARC_NAME Backup FINISHED:$(date +%d.%m.%Y\ %H:%M:%S) , $(tail -n 2 $OUT_PATH/$ARC_NAME.txt), $?" | sendxmpp -s '$NAMED_AS' -r 'Backup' -u sender_username -j jabber.ru:5222 -p 'password'
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
fi
umount /SCRIPTS/MOUNT_WIN/$NAMED_AS
echo $NAMED_AS работу закончил, всем спасибо >> /DATA/backup/arch_log.txt
date >> /DATA/backup/arch_log.txt
tail -n 2 $OUT_PATH/$ARC_INCREMENT.txt >> /DATA/backup/arch_log.txt
tail -n 2 $OUT_PATH/$ARC_NAME.txt >> /DATA/backup/arch_log.txt
echo
>> /DATA/backup/arch_log.txt
exit
orz_op end