Статистика сервера в Telegram. Отправка с помощью сервисного кода АТС или по превышению пороговых значений
В данной статье рассмотрим отправку статистики сервера в Telegram чат. Для этого будем опираться на статью: Отправка информации о клиенте в Telegram, в момент поступления вызова. Получать будем следующую информацию: Часть статистики сервера Статус сервисов АТС (Asterisk, httpd, mysql (при необходимости другие)) Статус памяти АТС, место на жестких дисках Нагрузка на АТС Заблокированные адреса fail2ban […]
В данной статье рассмотрим отправку статистики сервера в Telegram чат. Для этого будем опираться на статью: Отправка информации о клиенте в Telegram, в момент поступления вызова.
Получать будем следующую информацию:
Часть статистики сервера
- Статус сервисов АТС (Asterisk, httpd, mysql (при необходимости другие))
- Статус памяти АТС, место на жестких дисках
- Нагрузка на АТС
- Заблокированные адреса fail2ban (при наличии)
Часть статистики телефонии:
- Статусы транков
- Статусы внутренних номеров (отслеживаем подключенные/не подключенные)
- Текущие звонки на АТС
На первом этапе просто создадим скрипт вывода всей нужной информации в консоль.
Для начала создаем простой скрипт вывода неподключенных SIP учеток:
#!/usr/bin/php -q <?php //Trigers define('MAX_MEM',95);//Заполненность память в процентах define('MAX_AVG',1);//Нагрузка на АТС define('TRUNKS',0);//Количество не подключенных транков define('LOCAL_NUMS',0);//Количество не подключенных внутренних номеров define('CALLS',95);//Количество одновременных звонков //PBX conf define('LEN_PEER',3); $peers='/usr/sbin/asterisk -rx "sip show peers" | egrep "^[0-9]{'.LEN_PEER.'}[^0-9]" | grep UNREACHABLE'; echo `$peers`; ?>
Также указываем константы, для различных показателей, на них будем ориентироваться отправлять ли статистику или нет (можно несколько основных поставить условиями).
Начнем по порядку, указанному выше.
Сервисы:
Asterisk, httpd, mysql, fail2ban
Статус сервиса получаем через команду service или через демона:
/etc/ini.d/asterisk status
При недоступности сервиса, будем вписывать ответ в переменную. Впоследствии на эту переменную будем опираться для отправки сообщения.
$trigger="";//Переменная для условия $aster=`/etc/init.d/asterisk status`; $httpd=`/etc/init.d/httpd status`; $mysql=`/etc/init.d/mysql status`; $fail2ban=`/etc/init.d/fail2ban status`; // if (preg_match("/.*is stop.*/",$aster)) { $trigger.="Asterisk: $aster--------------\n"; } if (preg_match("/.*is stop.*/",$httpd)) { $trigger.="HTTPD: $httpd--------------\n"; } if (preg_match("/.*is stopped.*/",$fail2ban)) { $trigger.="Fail2ban: $fail2ban--------------\n"; } if (preg_match("/.*not running.*/",$mysql)) { $trigger.="Mysql: $mysql--------------\n"; }
Эту же переменную используем для проверки дискового пространства:
$free="/bin/df -h | grep '".DSK."' | awk '{print $5}' | awk -F '%' '{print $1}'"; $trdsk=`$free`; if ($trdsk>MAX_MEM) { $trigger.="Empty space is running out, my captain!\n$Used (%): trdsk"; }
Также заносим в переменную информацию, если память заканчивается
Пропишем переменную для статистики:
$statistics=””; $statistics.="Asterisk: $aster--------------\n "; $statistics.="HTTPD: $httpd--------------\n "; $statistics.="Fail2ban: $fail2ban--------------\n "; $statistics.="Mysql: $mysql--------------\n"; $statistics.=" Disk used(%): $trdsk--------------\n"; $statistics.="Load Average: $avg--------------\n";
Проверка нагрузки:
$avg=`/bin/cat /proc/loadavg | awk '{print $1,$2,$3}'`; $avgarr=explode(' ',$avg); if ($avgarr[0]>MAX_AVG) { if (($avgarr[0]<$avgarr[1]) | ($avgarr[0]<$avgarr[2])) { $trigger="The load is eased, my lord!\n$avg--------------\n"; } elseif (($avgarr[0]>$avgarr[1]) | ($avgarr[0]>$avgarr[2])) { $trigger="The load is growing, my lord!\n$avg--------------\n"; } }
Проверку на наполненность fail2ban, осуществлять будем, опираясь на заранее прописанные цепочки.
const CHAINS = array('f2b-asterisk-auth','f2b-sshd-auth','f2b-httpd-auth');
Соответственно проверяем наполненность каждой цепочки и при наличии заблокированных адресов прописываем сообщение:
foreach (CHAINS as $value) { $f2b=`/usr/sbin/ipset list $value | egrep "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"`; if ($f2b != "") { $f2b=str_replace("\n","|",$f2b); $trigger.="Banned IP addresses in $value:\n$f2b--------------\n"; $statistics.="Banned IP addresses in $value:\n$f2b"; $statistics.="Banned IP addresses in $value:\n$f2b--------------\n"; } }
Проверка статусов транков:
$trunkopt='/usr/sbin/asterisk -rx "sip show peers" | egrep "^[0-9]{'.LEN_PEER.'}[^0-9]" -v | grep -v OK | egrep ".*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.*" -c';//количество транков не в ОК $trunkreg='/usr/sbin/asterisk -rx "sip show register" | egrep -v "dnsmgr|registrations" | egrep ".*Registered.*" -v -c';//Количество транков не Registered $trunktropt=`$trunkopt`; $trunktrreg=`$trunkreg`; if (($trunktropt>TRUNKS) | ($trunktrreg>TRUNKS)) { $trunkopt='/usr/sbin/asterisk -rx "sip show peers" | egrep "^[0-9]{'.LEN_PEER.'}[^0-9]" -v | grep -v OK | egrep ".*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.*"'; $trunkreg='/usr/sbin/asterisk -rx "sip show registry" | egrep -v "dnsmgr|registrations" | egrep ".*Registered.*" -v'; $trunktropt=`$trunkopt`; $trunktrreg=`$trunkreg`; $trigger.="Проблема с внешними линиями.\nOPTIONS:\n$trunktropt Registrations:\n$trunktrreg--------------\n"; $statistics.="Проблема с внешними линиями.\nOPTIONS:\n$trunktropt Registrations:\n$trunktrreg--------------\n"; }
Проверяем на доступность линий и при отклонении от нормального статуса записываем в переменную.
С внутренними номерами поступаем аналогично, просто убираем проверку регистраций и маску регулярного выражения:
$peers='/usr/sbin/asterisk -rx "sip show peers" | egrep "^[0-9]{'.LEN_PEER.'}[^0-9]" | grep -v OK | egrep ".*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.*"';//количество внутренних не в ОК $peers=`$peers`; if ($peers!="") { $trigger.="Проблема с внутренними номерами.\nOPTIONS:\n$peers--------------\n"; $statistics.="Проблема с внешними линиями.\nOPTIONS:\n$trunktropt Registrations:\n$trunktrreg--------------\n"; }
Следующий пункт – количество звонков:
$calls=`/usr/sbin/asterisk -rx 'core show channels' | grep 'active call' | awk '{print $1}'`; if ($calls>CALLS) { $trigger.="Количество одновременных звонков приближается к ограничению: $calls--------------\n"; $statistics.="Проблема с внешними линиями.\nOPTIONS:\n$trunktropt Registrations:\n$trunktrreg--------------\n"; }
Просто запрашиваем от Asterisk количество вызовов и сравниваем с введенной в начале константой.
Всю информацию получили, теперь необходимо отправить ее в чат, отправку осуществлять будем двумя способами:
- Отправка посредством сервисного кода, вся информация
- Отправка посредством превышения пределов, запуск скрипта раз в 15 минут.
В сам скрипт добавляем обработчики:
Указываем в диалплане:
exten => *101*,1,System(php -f /opt/atsstat.php stat) same => n,Macro(hangupcall,)
В скрипте:
file_put_contents('/opt/statistics.txt',$statistics); $date=date('l jS \of F Y h:i:s A'); if ($argv[1]=="stat") { $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://api.telegram.org/bot111111111:................../sendDocument?caption=Запрошена+статистика+сервера+в+$date+с+номера+$argv[2]&chat_id=-4********", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: multipart/form-data' ], CURLOPT_POST => true, CURLOPT_POSTFIELDS => [ 'document' => curl_file_create('/opt/statistics.txt', 'text/plain', 'statistics.txt') ] ]); $data = curl_exec($curl); curl_close($curl); }
Далее нам необходимо условие для срабатывания по времени:
file_put_contents('/opt/trigger.txt',$trigger); if ($argv[1]=="time") { if ($trigger!="") { $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://api.telegram.org/ bot111111111:................../sendDocument?caption=Обнаружены+проблемы+на+АТС+$date&chat_id=-4********", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: multipart/form-data' ], CURLOPT_POST => true, CURLOPT_POSTFIELDS => [ 'document' => curl_file_create('/opt/trigger.txt', 'text/plain', 'trigger.txt') ] ]); $data = curl_exec($curl); curl_close($curl); } }
И заносим скрипт на выполнение в крон, каждые 15 минут.
*/15 * * * /usr/bin/php –f /opt/atsstat.php time
В дальнейших статьях рассмотрим запрос статистики и управление АТС с помощью чат бота.
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.