Статистика сервера в 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
База знаний
IP-АТС
Оборудование
О нас




