“елефони€FreePBX и Asteriskѕолезные советы

ћониторинг пиров и транков на Asterisk

ћониторинг дл€ системного администратора

ћерион Ќетворкс

ќдной из основных составл€ющих IP Ц PBX на базе Asterisk €вл€ютс€ SIP Ц транки в сторону провайдера и оконечные телефонные аппараты, или как их прин€то называть Ђпирыї (peers). —егодн€ мы расскажем о способе автоматизации мониторинга состо€ни€ транков и пиров, с отправлением на почту системного администратора.


ћониторинг пиров

»так, начнем с мониторинга состо€ни€ пиров. ƒл€ этого мы напишем небольшой bash Ц скрипт. ѕредположим, что у нас есть 3 площадки, ј, B и C. ј“— Asterisk находитс€ на площадке A. ѕредварительно, перед началом работы, создадим 2 файлы: первый Ц дл€ логов нашего скрипта, а второй, будет служебным, и будет использоватьс€ только в рамках исполнени€ скрипта. ¬нутри каждого скрипта, мы будем писать комментарии к каждой из его строк. —качать скрипт мониторинга пиров вы можете по ссылке ниже:

[root@asteriskpbx]# touch /home/admin/log_mail.txt
[root@asteriskpbx]# touch /home/admin/message.txt

ƒалее, создаем переменные дл€ нашего скрипта:

#!/bin/sh
LOGSIZE=`ls -l /home/admin/log_mail.txt |  awk '{ print $5 }'` //провер€ем размер файла с логами
problempeers=`/usr/sbin/asterisk -rx 'sip show peers' | grep UNKNOWN` //выводим командой 'sip show peers' через консоль Asterisk, и затем, с помощью команды grep UNKNOWN фильтруем пиры, чтобы отобразить только те, состо€ние которых €вл€етс€ UNKNOWN
GWB=`ping -c4 11.22.33.44 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'`  //по протоколу ICMP, пингуем IP Ц адрес шлюза на удаленной площадке четырьм€ пакетами. ≈сли все ќ , и шлюз доступен, до значение переменной будет равно 4. ¬ противном случае, оно будет равно 0.
GWC=`ping -c4 44.33.22.11 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'` //аналогичным образом пингуем шлюз на площадке C
ResultB="" //служебна€ переменна€
ResultC="" //служебна€ переменна€
FILENAME=/home/admin/message.txt //записываем в переменную путь к лог- файлам
LOGFILE=/home/admin/log_mail.txt
DATE="`date +%d.%m.%Y" "%H:%M:%S`" //выводим текущую дату и врем€ в формате дд.мм.гггг чч:мм:сс
echo "$problempeers" > /home/admin/message.txt //записываем содержимое переменной problempeers в служебный файл. ¬ этой переменной содержитс€ результат вывода команды по статусу пиров.
FILESIZE=$(stat -c%s "$FILENAME") //провер€ем размер служебного файла message.txt. ≈сли в нем есть кака€-либо информаци€, значит есть проблемы с пирами (имеютс€ в статусе UNKNOWN), если он пустой, то все ќ .

Ќа этом этапе, мы сформировали все необходимые переменные и у нас имеютс€ все необходимые дл€ формировани€ письма (если надо) на email системному администратору. ѕерейдем к исполнительной части скрипта:

if [ $GWB -eq 0 ]; then //если число ответов шлюза на площадке B на пинг равно 0, то запускаем процесс формировани€ письма
ResultB ="на площадке B Ќ≈ ƒќ—“”ѕ≈Ќ!" //формируем часть текста. ћы ее включим в заголовок письма
else
ResultB ="" //если все таки шлюз ответил на пинг, то оставл€ем переменную пустой
fi
if [ $GW— -eq 0 ]; then //если число ответов шлюза на площадке — на пинг равно 0, то запускаем процесс формировани€ письма
Result—="на площадке — Ќ≈ ƒќ—“”ѕ≈Ќ!" //по аналогии. ”казываем в заголовок, что роутер C недоступен
else
Result— ="" //если все ќ , то оставл€ем переменную пустой
fi
if [ $FILESIZE -ne 1 ]; then //если наш служебный файл message.txt не пустой, то провер€ем следующее условие
if [ $GWB -eq 0 ] || [ $GWC -eq 0 ]; then //если хот€бы один из роутеров недоступен по пинг, то переходим к следующему пункту скрипта

   echo "$problempeers"| mailx -s "ѕроблемы с SIP пирами | –оутер $ResultB $ResultC!" -r "info@merionet.ru" youremail@some.ru > "$LOGFILE" //параллельно с отправкой письма, записываем в лог файл запись, что у нас есть проблемы с пирами (в вывод так же можно добавить с какими именно)
else
echo "$problempeers"| mailx -s "ѕроблемы с SIP пирами | –оутеры ƒќ—“”ѕЌџ!" -r "info@merionet.ru" youremail@some.ru > "$LOGFILE" //аналогично вносим запись в лог Ц файл.
fi
else
echo "OK :: $DATE :: all phones are OK" >> "$LOGFILE" //если служебный файл пустой, то мы вносим запись в лог Ц файл что все хорошо и проверка успешно прошла.
fi
if [ $LOGSIZE -ge 150000 ]; then //елси размер нашего лог Ц файла больше или равен 150  Ѕ, то мы очищаем этого (можете подкрутить эту величину, как вам угодно.)
   cat /dev/null > /home/admin/log_mail.txt
fi
cat /dev/null > /home/admin/message.txt //на выходе чисти служебный файл  message.txt, дл€ последующего использовани€

“еперь давайте проверим, что приходит нам на почту в случае, если несколько пиров стали недоступны, но все роутеры доступны:

ћониторинг пиров и транков на Asterisk

ћониторинг транков

ќтлично, перейдем к формированию скрипта по мониторингу транков. «десь все несколько проще, и мы просто будем сравнивать общее количество транков, и количество зарегистрированных транков:

—качать сам скрипт можете ниже:
#!/bin/bash
ALLTRUNKSMINIMUM="`/usr/sbin/asterisk -rx "sip show registry"`" //выводим регистрации по протоколу SIP
ALLTRUNKS=`echo "$ALLTRUNKSMINIMUM" |grep "SIP registrations" |awk '{print $1}'` //численное обозначение всех имеющихс€ транков
REGTRUNKS=`/usr/sbin/asterisk -rx "sip show registry" |grep Registered |wc -l` //численное обозначение всех зарегистрированных транков
DATE="`date +%d.%m.%Y" "%H:%M:%S`" //формируем текущую дату, дл€ логов
LOGFILE=/home/admin/log_mail.txt //дл€ лог Ц файла, указываем тот же файл, что и дл€ скрипта по мониторингу пиров
if [ "$REGTRUNKS" -lt "$ALLTRUNKS" ]; then //если число зарегистрированных транков меньше чем число всех транков
sleep 5 //ждем 5 секунд
echo `/usr/sbin/asterisk -rx "sip reload"` \\ перезагружаем модуль SIP, в цел€х перерегистрации. Ёта команда автоматически перерегистрирует транк на оборудовании провайдера, после чего, он, зачастую, начинает работать.
sleep 5 //ждем еще 5 секунд
VAR=`/usr/sbin/asterisk -rx "sip show registry"` //после перезагрузки SIP модул€, снова смотрим SIP Црегистрации. ≈сли данна€ команда не дала своих результатов, то в переменной VAR будет записаны не работающие транки. ≈сли она помогла, то на email админу придет рабочий вывод всех зарегистрированных транков. Ёто весьма удобно.
echo "$VAR"| mailx -s "ћониторинг транков" -r "info@merionet.ru" youremail@some.ru // отправл€ем письмо на почту системного администратора, с выводом SIP регистраций после перезагрузки модул€
else
echo "OK :: $DATE :: all trunks are OK" >> "$LOGFILE" //если число зарегистрированных транков, равно общему числу, то записываем в лога файл соответствующую запись.
fi

“еперь, когда мы автоматизировали процессы мониторинга состо€ни€ на Asterisk, сделаем выполнение этих скриптов регул€рным. —охраним наши скрипты в формате .sh, можно сделать это, например, в Notepad ++. —делаем выполнение мониторинг транков раз в 2 минуты, а выполнение мониторинга пиров раз в 10 минут. ѕеред загрузкой скриптов на сервер, дадим им необходимые права и, что очень важно, преобразуем скрипт в Linux формат:

[root@asteriskpbx]# dos2unix peer.sh //преобразуем скрипт дл€ мониторинга пиров
[root@asteriskpbx]# dos2unix trunk.sh //преобразуем скрипт дл€ мониторинга транков
[root@asteriskpbx]# chmod 777 peer.sh //дадим необходимые права обоим скриптам
[root@asteriskpbx]# chmod 777 trunk.sh
[root@asteriskpbx]# crontab -e

¬ открывшемс€ cron, задаем задачи дл€ выполнени€ наших скриптов:

*/10 * * * * /bin/bash /home/peer.sh >/dev/null //исполн€ть файл раз в 10 минут
*/2 * * * * /bin/bash /home/trunk.sh >/dev/null //исполн€ть файл раз в 2 минуты

¬от и все. “еперь мы имеет достаточно простой, но порой очень нужный и эффективный мониторинг состо€ни€ транков и пиров на нашем Asterisk


ѕолезна ли ¬ам эта стать€?

–аз в неделю мы отправл€ем дайджест с самыми интересными стать€ми.

P.S. ≈сли укажите свою дату рождени€, то мы об€зательно ¬ас поздравим и подарим небольшой подарок :)

Ќажима€ на кнопку "ѕодписатьс€", вы даете согласие на обработку своих персональных данных