[Video] v23 Email оповещение в случае неудавшегося бекапа.

В своём прошлом видео о операторах ветвления и конструкции if-then-else я предложил вам попробовать написать скрипт который бы производил проверку доступности вашего удлаённого сервера перед тем как произвести бекап и в случае проблем отправлял бы вам письмо.

При написании данного скрипта можно воспользоваться упомянутой конструкцией if-then-else.
Я обещал показать свой вариант, что я сегодня и сделаю.

Напомню как выглядит целевая конструкция (я её немного изменил с целью улучшения):
Сначала условие:

if – если потеря пакетов до сервера выше 20% -> переходим к then, если меньше то к else;
then – ошибка – отправляется короткое письмо Вам с сообщением о не удавшемся бекапе(плюс информация о том что бекапилось).
else – произвести копирование файлов с одного сервера на другой;
+ отправляет письмо о успешном бекапе(плюс информация о том что бекапилось).;

Если сам бекап сервер не имел доступа в интернет в момент бекапа(или на сервере какой-либо другой сбой),то письмо возможно не уйдёт. Но вы знаете, что вам должно приходить письмо с сервера и если у вас на почте нет письма с положительным или отрицательным результатом бекапа – значит настало время проверить ваш бекап сервер!

Итак, вот мой скрипт:
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ cat script.v25.sh
# this is a script about if-then
#
# script is waiting that your will enter site FQDN or ip-address for ping test...
#
clear
host=$1
packet_loss=$(ping -c 10 -q $host | grep -oP '\d+(?=% packet loss)')

# info section
echo "host= $host"
echo "packet_loss= $packet_loss"

# Prepare email.
rm /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo "To: email-вашего-телефона@почта.ru" >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo "From: email-вашего-сервера@почта.ru" >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt

if expr $packet_loss ">" 20
then
echo "Packetloss=$packet_loss%, more than 20%!"
# send statistics to mail recipients:
echo "Subject: Backup of $host FAILED !!! `date +%F.%T`." >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo -e "\nMonitoring of $host, packetloss=$packet_loss%, more than 20%!" >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo -e "\033[31;1m !-ERROR-! sending email with this info! \033[0m"
/usr/sbin/ssmtp email-вашего-телефона@почта.ru < /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt else cp text.txt text.txt.bak.`date +%F.%T` echo -e "\033[32;1m File has been successfully backuped! \033[0m" echo "Subject: Backup of $host was successful. `date +%F.%T`." >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo -e "\nMonitoring of $host, packetloss=$packet_loss%, less than 20%!\nBackup should be successful." >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
/usr/sbin/ssmtp email-вашего-телефона@почта.ru < /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt fi

Что же тут происходит?
clear - просто очистка экрана для наглядности;
host=$1

Данный скрипт ожидает что при его запуске вы передадите ему один позиционный параметр - имя вашего сервера который вы хотите забекапить. Я использую конструкцию с позиционным параметром дабы упростить проверку работы данного скрипта, можно было поместить имя сервера в тело скрипта, но так просто удобнее для теста и демонстрации.
host=$1 - в переменную host помещается имя сервера который мы ходим забекапить.

packet_loss=$(ping -c 10 -q $host | grep -oP '\d+(?=% packet loss)')
Создаётся переменная packet_loss и ей присваивается определённое значение.
Значение переменной равно проценту потери пакетов до указанного при запуске скрипта хоста, переменная host.
Само значение вычисляется с помощью утилиты ping и фильтрации с помощью регулярных выражений. Рассматривать регулярные выражения в этом видео я не буду, это огромная тема для отдельной серии видео. Данное конкретное выражение подробно разобрано у меня в статье на сайте - переходите по ссылке к этому видео.

Далее идёт информационная секция - служит для отладки скрипта и в целях демонстрации в данном видео, в реальных условия может быть удалена:
# info section
echo "host= $host"
echo "packet_loss= $packet_loss"

Следующая секция служит для начала формирования письма, которое будет отправлено вам по завершению работы скрипта.
# Prepare email.
rm /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo "To: email-вашего-телефона@почта.ru" >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo "From: email-вашего-сервера@почта.ru" >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt

Сначала происходит удаление предыдущего письма, отправленного в предыдущий раз, если такое имеется.
Далее происходит построчное заполнение файла, который будет будущим письмом - mailheader-backupstatus.txt, здесь вводятся информационные параметры - отправитель и получатель письма.
Подробнее о таком файле я рассказывал в своём видео о отправке писем с сервера и утилите ssmtp - ссылка есть в описании к этому видео.

if expr $packet_loss ">" 20
Далее наступает черёд оператора ветвления. Проверяется условие с использованием утилиты expr - если значение переменной packet_loss больше значения 20, т.е. потеря пакетов до вашего сервера выше 20 процентов, то переходим к ветке then, если потеря пакетов ниже 20%, то переходим к ветке else.

В случае высоких потерь пакетов:
then
echo "Packetloss=$packet_loss%, more than 20%!"
# send statistics to mail recipients:
echo "Subject: Backup of $host FAILED !!! `date +%F.%T`." >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo -e "\nMonitoring of $host, packetloss=$packet_loss%, more than 20%!" >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo -e "\033[31;1m !-ERROR-! sending email with this info! \033[0m"
/usr/sbin/ssmtp email-вашего-телефона@почта.ru < /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt

Сначала выводится информационное сообщение, необходимое для отладки и демонстрации.
Следующие две строки формируют заголовок будущего письма - с указанием имени хоста и даты когда не удалось сделать бекап.
В тело письма добавляется информация о величине потерь до целевого хоста.
Выводится ещё одно информационное сообщение.
Производится отправка письма с использованием утилиты ssmtp о которой я рассказывал в предыдущем видео.

Если потеря пакетов не выше 20%, то переходим к ветке else:
else
cp text.txt text.txt.bak.`date +%F.%T`
echo -e "\033[32;1m File has been successfully backuped! \033[0m"
echo "Subject: Backup of $host was successful. `date +%F.%T`." >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
echo -e "\nMonitoring of $host, packetloss=$packet_loss%, less than 20%!\nBackup should be successful." >> /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt
/usr/sbin/ssmtp email-вашего-телефона@почта.ru < /home/alex/mytest.dir/v23-mail-backup-ifthenelse/mailheader-backupstatus.txt fi

Здесь происходит создание бекап файла в имени которого добавляется дата создания данного бекап файла- в данном случае на локальной машине, но вместо команды copy - cp может стоять команда secure copy - scp, разницы никакой нет, но для демонстрации достаточно и copy - cp.
Далее выводится информационное сообщение, необходимое для отладки и демонстрации.
Затем, формируется тема и тело информационного письма. - указывается имя хоста бекап которого был произведён и текущая величина потерь пакетов.
Далее с использованием утилиты sSMTP производится отправка письма.

Теперь давайте проверим работу скрипта. Так как бекап-копирование у меня происходит локально, то я могу использовать внешние ресурсы для проверки потери пакетов. Плюс я не могу сам сэмулировать потерю пакетов на своих сервера, они сейчас доступны, что меня устраиват, а вот на каких-либо внешних ресурсах ping может быть закрыт - я конечно тоже могу открывать-закрывать пинг у себя на сервере используя iptables, но считаю, что для тестов и демонстрации проще использоватьсяпару внешних сайтов.

Я буду пинговать яндекс, обычно он отвечает на пинг - сейчас я могу его пропинговать, если яндекс доступен, то файл будет скопирован, если нет то не будет.
Я знаю что сайт microsoft.com не отвечает на icmp вообще - я могу его использовать как пример в котором сервер недоступен или до него высокие потери пакетов.

Сначала проверим какие файлы у меня уже есть:
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ ll
total 16
drwxrwxr-x 2 alex alex 4096 Mar 9 12:22 ./
drwxrwxr-x 9 alex alex 4096 Mar 9 12:14 ../
-rw-rw-r-- 1 alex alex 174 Mar 9 12:22 mailheader-backupstatus.txt
-rw-rw-r-- 1 alex alex 1737 Mar 9 12:21 script.v25.sh
-rw-rw-r-- 1 alex alex 0 Mar 6 14:41 text.txt
-rw-rw-r-- 1 alex alex 0 Mar 6 16:35 text.txt.bak.2015-03-06.16:35:53
-rw-rw-r-- 1 alex alex 0 Mar 6 16:42 text.txt.bak.2015-03-06.16:42:35
-rw-rw-r-- 1 alex alex 0 Mar 9 12:22 text.txt.bak.2015-03-09.12:22:12

Запущу скрипт:
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ bash script.v25.sh yandex.ru
host= yandex.ru
packet_loss= 0
0
File has been successfully backuped!

Проверю текущую дату:
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ date
Mon Mar 9 16:28:52 CET 2015

Теперь проверю текущее содержание директории:
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ ll
total 16
drwxrwxr-x 2 alex alex 4096 Mar 9 16:28 ./
drwxrwxr-x 9 alex alex 4096 Mar 9 12:14 ../
-rw-rw-r-- 1 alex alex 198 Mar 9 16:28 mailheader-backupstatus.txt
-rw-rw-r-- 1 alex alex 1737 Mar 9 12:21 script.v25.sh
-rw-rw-r-- 1 alex alex 0 Mar 6 14:41 text.txt
-rw-rw-r-- 1 alex alex 0 Mar 6 16:35 text.txt.bak.2015-03-06.16:35:53
-rw-rw-r-- 1 alex alex 0 Mar 6 16:42 text.txt.bak.2015-03-06.16:42:35
-rw-rw-r-- 1 alex alex 0 Mar 9 12:22 text.txt.bak.2015-03-09.12:22:12
-rw-rw-r-- 1 alex alex 0 Mar 9 16:28 text.txt.bak.2015-03-09.16:28:45 <<<<<<<<

Теперь нужно проверить почту.

Теперь проверка работы в случае если сервер не доступен.
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ bash script.v25.sh microsoft.com
host= microsoft.com
packet_loss= 100
1
Packetloss=100%, more than 20%!
!-ERROR-! sending email with this info!

Новые файлы в директории не появились:
alex@srv-sc-01:~/mytest.dir/v23-mail-backup-ifthenelse$ ll
total 16
drwxrwxr-x 2 alex alex 4096 Mar 9 16:32 ./
drwxrwxr-x 9 alex alex 4096 Mar 9 12:14 ../
-rw-rw-r-- 1 alex alex 174 Mar 9 16:32 mailheader-backupstatus.txt
-rw-rw-r-- 1 alex alex 1737 Mar 9 12:21 script.v25.sh
-rw-rw-r-- 1 alex alex 0 Mar 6 14:41 text.txt
-rw-rw-r-- 1 alex alex 0 Mar 6 16:35 text.txt.bak.2015-03-06.16:35:53
-rw-rw-r-- 1 alex alex 0 Mar 6 16:42 text.txt.bak.2015-03-06.16:42:35
-rw-rw-r-- 1 alex alex 0 Mar 9 12:22 text.txt.bak.2015-03-09.12:22:12
-rw-rw-r-- 1 alex alex 0 Mar 9 16:28 text.txt.bak.2015-03-09.16:28:45

Осталось только проверить почту.

Конечно, проверка доступности сервера обычным пингом не гарантирует 100% успешность копирования какой-либо инфомарции, но большинство проблем с бекапами возникает по причине проблем с доступностью. Я считаю, что данный скрипт помогает следить за проведением вашими бекапов. В будущем я буду улучшать данные скрипт, добавлять больше проверок.

На сегодня всё. Надеюсь вам пригодится данный скрипт или вы просто узнали что-то новое для себя.

Если у вас есть идеи как можно улучшить данный скрипт, может вы чем-то пользуетесь сами - пишите в комментариях, я опробую Ваш вариант и постараюсь сделать обновление к этому видео.

Спасибо что были смотрели!
Подписывайтесь, комментируйте, задавайте свои вопросы в комментариях к видео.