Никитенко Максим (Sets88)

Личная страница

Bash - СМС Оповещалка

 

По роду деятельности стояла задача: периодически проверять "живы-ли" узлы и если какой из них упал или ожил, немедленно докладывать по СМС.

Написал скрипт который проверяет по списку "nodes" "живы-ли" узлы по средством ping, хотя конечно можно было бы использовать nmap и arp запросы для локальных узлов, но практика показала что некоторые из свичей просто иногда забивают на arp запрос, как и на ICMP, но в моем случае ICMP пакетов отправляется 5 поэтому шансов что ответят больше.

После того как что-то изменилось, тут же отправляет списки изменений по СМС на номера в списке "telephones" через программу scmxx, которая в свою очередь работает с подключенным к компьютеру сотовым телефоном.

В начале была идея использовать онлайн сервисы отправки СМС, но при падении интернета, оказались бы в неведении, пришлось использовать именно такой способ, на мой взгляд намного надежнее. Для работы скрипта требуется scmxx.

После этого скрипт добавляется в crontab для запуска по расписанию и можно приступать к ожиданию плохих новостей :)

Исходный код:
#! /bin/bash

# Указать узлы
nodes="ya.ru
 L99
 Dz12
 L25"
# Указать номера телефонов для рассылки
telephones="+79151112222
            +79612222222
            +79053333333"
namedate=`date +%Y_%m_%d_%H-%M`

# Перебираем все узлы
for node in $nodes
do
# Пингуем узел


 LOG=`/bin/ping -c 5 -W 1 $node`
 # Если ошибка:
 if [ $? -gt 0 ]; then 
   # Если существует файл узла:
   if [ -e "/tmp/$node" ]; then
     # Пишем на stdout что сообщение было уже отослано
     /bin/echo Already sent
     # Если не существует файл узла:
   else
  
     unixtime=`date +%s`
     nodeip=`/usr/bin/resolveip $node -s`
     # Проверяем были ли ошибки в других узлах
     if [ -z "$errors" ];then
       # Начинаем сообщение
       errors="Achtung: $node"
     else
       # Добавляем в сообщение
       errors="$errors,$node"
     fi
   fi
   # Создаем файл и пишем(дописываем) в файл дату
   /bin/echo `date` >> /tmp/$node
   # Если ошибка нет
   else
   # Проверяем наличие файла узла и удаляем его
     if [ -e "/tmp/$node" ]; then
       # Проверяем были ли исправленные ошибки в других узлах
       if [ -z "$fixed" ];then
         # Начинаем сообщение
         fixed="Fixed: $node"
       else
         # Добавляем в сообщение
         fixed="$fixed,$node"
       fi
       /bin/mv /tmp/$node /var/log/smslog/$namedate-$node
     fi
   fi

done

# Проверяем были ли ошибки:
if [ -z "$errors" ];then
 /bin/echo empty
else
  for telephone in $telephones
  do
    /usr/bin/scmxx --device=/dev/ttyACM0 --send --sms --direct --number=$telephone --text="$errors"
  done
fi

# Проверяем были исправились ли ошибки
if [ -z "$fixed" ];then
  /bin/echo empty
else
  for telephone in $telephones
  do
    /usr/bin/scmxx --device=/dev/ttyACM0 --send --sms --direct --number=$telephone --text="$fixed"
  done
fi
Яндекс.Метрика