3
Дек

Скрипт мониторинга доступности портов в сети с уведомлением на email (.sh) – для Centos 6.5

Данный скрипт можно использовать для любого количества проверяемых хостов.
Вам нужно выбрать хосты в интернете или локальной сети и порты которые Вы хотите мониторить.
После чего в файл /etc/ping/servers необходимо внести список хостов с портами в столбик:
satsis.info:80
hd.zp.ua:80
smtp.mail.ru:25

Скрипт можно поставить на мониторинг раз в минуту. В данном случае будет 5 попыток достучатся до определённого порта и если все 5 попыток неудачны, вы получите e-mail об ошибке. После восстановления работоспособности, получите e-mail о том что всё восстановлено. Все ошибки доступа порта меньше 5-ти, списываем на нестабильный интернет и начинаем проверку по новой. Такое исполнение избавит вас от кучи писем из-за вашего провайдера. В логах ведется информация о проблемах и их решении.
Для собственного мониторинга можно использовать самый дешевый тарифный план на digitalocean за 5$/месяц и существенно сэкономить на мониторинге.
sms можно отправлять к себе на телефон, при помощи услуги мобильных операторов sms на e-mail. Киевстар Украина предоставляет такую услугу за 7 грн в месяц.

 #!/bin/sh
 DATENOW=$(date +%d-%m-%Y--%T)
 CATALOG="/etc/ping/" # Указать каталог где находится данный скрипт
 NMAPCAT="/usr/bin/" # Указать при необходимости расположение nmap
 WC="/usr/bin/" # Путь к приложению wc
 echo "Subject: Monitoring hosts sms Niderlands" > "$CATALOG"mail # Тема письма
 echo "From: mail@hd.zp.ua" >> "$CATALOG"mail # От кого шлём письмо
 ### Создаем при каждом запуске скрипта шапку письма
 echo "To: mail@hdtv.zp.ua" >> "$CATALOG"mail # Кому шлём письмо
 echo "CC: mail2@hdtv.zp.ua" >> "$CATALOG"mail # Кому шлём копию письма
 echo "" >> "$CATALOG"mail
 echo "server time is $DATENOW" >> "$CATALOG"mail
 ### Делаем выборку из nmap 5 раз с задержкой 5 секунд результат открытости порта
 for i in 1 2 3 4 5
 do
 #for a in $(< "$CATALOG"servers); do( exec 2>/dev/null; echo -en > `echo /dev/tcp/$a | sed -e 's/:/\//'` ) || echo $a; done >> "$CATALOG"serverlist$
 for a in $(< "$CATALOG"servers); do "$NMAPCAT"nmap `echo $a | sed -e 's/:/ -p /'` | grep -q "/tcp *open " || echo $a; done >> "$CATALOG"serverlist_$
 echo "Console number is $i"
 sleep 5;
 done
 ### Сортируем записи недоступных портов и копируем уникальную запись для отправки в тело письма
 /bin/sort -u "$CATALOG"serverlist_n > "$CATALOG"serverlist
 ### Проверяем количество ошибок в запросе, если равен 5 - то сообщаем о проблеме, если меньше - считаем что неполадки с нашим интернет каналом
 if [[ $(cat "$CATALOG"serverlist_n | "$WC"wc -w) -ge 5 ]]
 then
 cat "$CATALOG"serverlist >> "$CATALOG"mail
 echo "" >> "$CATALOG"mail
 echo "serv"
 else
 echo "All OK" >> "$CATALOG"mail
 echo "" >> "$CATALOG"mail
 echo "ok"
 fi
 ### Проверяем не пропал ли интернет
 if [[ $(cat "$CATALOG"servers | "$WC"wc -w) -eq $(cat "$CATALOG"serverlist | "$WC"wc -w) ]]
 then
 cat /dev/null > "$CATALOG"serverlist_n
 echo "lost internet"
 exit 1
 fi
 ### Если статус доступности порта изменился - сообщаем об этом на e-mail (при абсолютном значении) + заносим запись в лог
 a=`expr $(cat "$CATALOG"serverlist_n | "$WC"wc -w) % 5`
 b=`expr $(cat "$CATALOG"serverlist_old | "$WC"wc -w) % 5`
 if [[ $(cat "$CATALOG"serverlist_old | "$WC"wc -w) -ne $(cat "$CATALOG"serverlist_n | "$WC"wc -w) && $a -eq 0 && $b -eq 0 ]]
 then
 cat "$CATALOG"serverlist_n | "$WC"wc -w >> "$CATALOG"mail
 cat "$CATALOG"serverlist_old | "$WC"wc -w >> "$CATALOG"mail
 /etc/ping/sendmail > /dev/null
 echo "------------" >> "$CATALOG"log
 echo $DATENOW >> "$CATALOG"log
 cat "$CATALOG"serverlist >> "$CATALOG"log
 cat "$CATALOG"serverlist_n | "$WC"wc -w >> "$CATALOG"log
 cat "$CATALOG"serverlist_old | "$WC"wc -w >> "$CATALOG"log
 echo "------------" >> "$CATALOG"log
 echo "send"
 fi
 ### заносим данные в архив для проверки изменения
 if [[ $a -eq 0 ]]
 then
 cat "$CATALOG"serverlist_n > "$CATALOG"serverlist_old
 echo "end"
 fi
 cat /dev/null > "$CATALOG"serverlist_n
 exit
 fi