Скрипт мониторинга доступности портов в сети с уведомлением на email (bash)

в 9:44, , рубрики: мониторинг сервера, системное администрирование, метки:

Так уж вышло, что живем мы хоть и в продвинутой всякими технологиями стране, но стабильность интернет соединения для городов которые в дали от столицы это редкое явление. Долго выбирал всевозможные сервисы для профессионального мониторинга доступности оборудования в сети. У одних есть проверка только 80 порта веб-сервера, у других возможно проверить ключевое слово на странице, отправлять GET или POST запросы. Нашел сервис лучше других, есть там возможность проверить доступность ssh, но оплата зависит от количества запросов за определенный промежуток времени и естественно количество оборудования которое необходимо мониторить.

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

— Скрипт начал отсылать не только письмо о недоступности порта, но и появлении его в сети.
— Скрипт присылает на почту письмо и записывает в лог время, количество ошибок при проверке и предыдущее состояние проверки.
— Скрипт присылает на почту письмо только в том случае, если было пять неудачных попыток соединения либо пять удачных после недоступности.
— Скрипт не присылает письмо если в месте расположения скрипта пропал интернет
— Скрипт можно запускать каждую минуту


#!/bin/bash
CATALOG="/share/Web/"
NMAPCAT="/share/MD0_DATA/.qpkg/Optware/bin/"
WC="/mnt/ext/usr/bin/"
echo "Subject: Monitoring hosts sms" > "$CATALOG"mail
echo "From: send_from@mail.ru" >> "$CATALOG"mail
echo "To: send_to@mail.ru" >> "$CATALOG"mail
echo "CC: copy_to@gmail.com" >> "$CATALOG"mail
echo "" >> "$CATALOG"mail
for i in 1 2 3 4 5
do
for a in $(<"$CATALOG"servers); do "$NMAPCAT"nmap `echo $a | sed -e 's/:/ -p /'` | grep -q "/tcp *open " || echo $a; done >> "$CATALOG"serverlist_n;
sleep 5;
done
"$WC"sort -u "$CATALOG"serverlist_n | /bin/uniq -u > "$CATALOG"serverlist
if  [[ $(cat "$CATALOG"serverlist_n | "$WC"wc -w) -ge 5 ]]
then 
      cat "$CATALOG"serverlist >> "$CATALOG"mail
	  echo "" >> "$CATALOG"mail
else
      echo "All OK" >> "$CATALOG"mail
	  echo "" >> "$CATALOG"mail
fi
if  [[ $(cat "$CATALOG"servers | "$WC"wc -w) -eq  $(cat "$CATALOG"serverlist | "$WC"wc -w) ]]
then 
      echo "" > "$CATALOG"serverlist_n
fi	  
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
cat "$CATALOG"mail | sendmail -t
echo "------------" >> "$CATALOG"log
DATENOW=$(date +%d-%m-%Y_%T)
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
fi
if [[ $a -eq 0 ]]
then
cat "$CATALOG"serverlist_n > "$CATALOG"serverlist_old
fi
echo "" > "$CATALOG"serverlist_n
exit
fi


CATALOG="/share/Web/" — Указать каталог где находится данный скрипт
NMAPCAT="/share/MD0_DATA/.qpkg/Optware/bin/" — Указать при необходимости расположение nmap
WC="/mnt/ext/usr/bin/" — Путь к приложению wc

Содержание файла servers такое:

 
192.168.1.1:80
192.168.1.2:25
192.168.1.3:110

В log получаем записи:

 
------------
29-12-2013_12:42:41
192.168.1.1:80
      5
      0
------------
------------
29-12-2013_12:58:19
192.168.1.1:80
192.168.1.2:25
     10
      5
------------

Хотелось бы добавить о возможности мониторинга и на sms.
Пользуясь в основном почтой mail.ru, настроил фильтр на прием писем так, что если в теме содержится слово sms, то такое письмо помечается красным флажком в списке писем папки Входящие, а копия отправляется на телефон в виде смс по адресу 38068594xxx2@sms.kyivstar.net.
В тарифе Киевстар (Beeline UA) возможно получение 150 sms и 50 mms ежемесячно за 7 копеек сутки.

Скрипт мониторинга можно запускать по cron на роутере, спутниковом ресивере под управлением ОС Linux или на NAS накопителе. В данном случае скрипт запущен на NAS накопителе QNAP TS-419PII
В итоге получаем ежеминутный мониторинг всех ваших серверов почти даром.

В отступлении хочу написать, если уже подключен сервис «Получение SMS/MMS с e-mail» в сети Киевстар, можно также создать фильтр по слову mms в теме письма и получать сообщения общим объемом до 1 Мб без платы отправителя за mms.

Это мой первый скрипт на bash, который я в течении недели много раз переделывал. Надеюсь на конструктивную критику и Ваши комментарии.

Автор: maxya-zp

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js