Александр Мисюрин
20.02.2019
289

Сбор статистики о подключениях на Asterisk или Web

Зачастую на АТС существует необходимость открыть доступ для внешних клиентов, иногда для одного – двух адресов, иногда для целых сетей. В данной статье рассмотрим сбор статистики по подключениям таких внешних клиентов, как к серверу телефонии, так и к web-серверу. При желании можно составлять статистику и по подключениям к консоли. Для начала необходимо решить какую информацию […]

Зачастую на АТС существует необходимость открыть доступ для внешних клиентов, иногда для одного – двух адресов, иногда для целых сетей. В данной статье рассмотрим сбор статистики по подключениям таких внешних клиентов, как к серверу телефонии, так и к web-серверу. При желании можно составлять статистику и по подключениям к консоли.

Для начала необходимо решить какую информацию мы будем собирать, например, регистрации аппаратов или подключение к web-интерфейсу АТС.

Собирать информацию будем с помощью логов, поэтому необходимо проверить их заполнение.
Логирование Asterisk

Настраиваем логирование событий Asterisk с помощью модуля Asterisk Logfile Settings для FreePBX. Вводим имя файла и выбираем необходимые события для записи. Для определения необходимы события NOTICE (успешные подключения) и WARNING (ошибки подключений).

Чтобы получить необходимые события, можно вывести лог через утилиту tailf и зайти на web интерфейс, затем переключаясь между окнами, выбрать необходимые события, которые будут внесены в статистику.

Вывод лога в реальном времени

Определив необходимые записи в логе, соберем скрипт, который будет их выбирать из лога и записывать в файл.

stat_login=$( cat /var/log/httpd/ssl_access_log | grep "GET / HTTP/1.1" )
IFS=$'\n'
for fn in $stat_login; do
  unset IFS
                #Получаем адрес
                ip=`expr "$fn" : '^\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)'`
                #Получаем дату и время
                date=`expr "$fn" : '.*\[\([0-9]*\/[A-Za-z]*\/[0-9:]*\)'`
echo Connect: $ip - $date
done;
unset IFS

Это вывод в консоль. Сформируем файлы, для начала удалим временный файл:

rm -f temp_connect.csv

В цикле поменяем вывод в консоль, на вывод в файл:

echo "$date, $ip" >> temp_connect.csv

За циклом отсортируем записи.

sort temp_connect.csv > log_connect.csv.csv

И внесем шапку в начало файла через sed:

sed -i -e "1 s/^/Дата, IP Адрес\n/;" log_connect.csv
Следует учесть, что лог по умолчанию пишется непрерывно, в системах на дистрибутивах же, обычно используют ротацию логов, в нашем случае логи Asterisk ротируются в течение недели, а логи apache в течение месяца и делятся на файлы по 10 дней.

Получаемые значения записываем в файл, но поскольку мы ограничили вывод, то часть событий не увидим, чтобы этого избежать, можно расширить запрос, либо разграничить его по логам. Например, статистику из логов Asterisk собирать отдельно от статистики Apache. Или использовать несколько запросов в лог.

Второй запрос:

stat_POST=$( cat /var/log/httpd/ssl_access_log | grep "POST" )

Из лога web-сервера, будем забирать события подключения и события отправки запроса на сервер (POST).

Отправка запроса (выполнение команды)

Из данных событий, можно получать то, что совершает пользователь на АТС. Для этого будем использовать expr, вырезая необходимые данные.

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

Получаем данные и вносим их в файл

stat_POST=$( cat /var/log/httpd/ssl_access_log | grep "POST" )
rm -f temp_post.csv
echo "Дата/время, IP Адрес, Изменено " >> temp_post.csv
IFS=$'\n'
for fn in $stat_POST; do
  unset IFS
#Получаем адрес
                ip=`expr "$fn" : '^\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)'`
                #Получаем дату и время
date=`expr "$fn" : '.*\[\([0-9]*\/[A-Za-z]*\/[0-9:]*\)'`
#Получаем то, что было изменено
                chg=`expr "$fn" : '.*\?[A-Za-z]*=\([A-Za-z]*\)'`
echo "$date,$ip,$chg" >> temp_post.csv
done;
unset IFS
sort temp_post.csv > log_post.csv
sed -i -e "1 s/^/Дата, IP Адрес, Изменено\n/;" log_post.csv

Отправляем файлы на почту с пояснениями, используем для этого скрипт sendEmail.pl

/usr/local/bin/sendEmail.pl -t "smb@test.ru" -f "Statistic connect <test@yandex.ru>" -u "Statistic connect" -m "Во вложении статистика по подключениям и изменениям за месяц." -a /tmp/log_connect.csv -a /tmp/log_post.csv -o message-charset=UTF-8
Скрипт можно найти по данному адресу: https://github.com/mogaal/sendemail
Выполнение скрипта и получение файла

Лог Asterisk

Для отслеживания подключения к телефонии, будем просматривать  full log Asterisk.

Получаем успешные записи о регистрации в логе:

Следует учесть, что при запросе во все логи за неделю, скрипт будет отрабатывать довольно долго
stat_reg=$( cat /var/log/asterisk/full* | grep -E "Registered SIP|Registered IAX2" )
rm -f temp_reg.csv
IFS=$'\n'
for fn in $stat_reg; do
  unset IFS
                #Получаем адрес
                ip=`expr "$fn" : '.* \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)'`
                #Получаем дату и время подключения
                date=`expr "$fn" : '\[\([0-9]*-[0-9]*-[0-9]* [0-9]*\:[0-9]*\:[0-9]*\)'`
                #Получаем тип подключения (SIP, IAX2)
                tpe=`expr "$fn" : '.*Registered \([A-Za-z0-9]*\) '`
#Выводим в файл
echo "$date,$ip,$tpe" >> temp_reg.csv
echo $date $ip $tpe
done;
unset IFS
sort temp_connect.csv > log_reg.csv
sed -i -e "1 s/^/Дата, IP Адрес, Тип подключения\n/;" log_reg.csv

Следующим шагом будем собирать неудачные попытки подключений, с помощью следующего запроса:

cat /var/log/asterisk/full | grep -E "Wrong|not match ACL" | grep NOTICE

В данном случае необходимо вырезать помимо времени и адреса, также причину отбоя.

stat_wrong=$( cat /var/log/asterisk/full | grep -E "Wrong|not match ACL" | grep NOTICE )
rm -f temp_wrong.csv
IFS=$'\n'
for fn in $stat_wrong; do
  unset IFS
                ip=`expr "$fn" : ".* '\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)"`
                date=`expr "$fn" : '\[\([0-9]*-[0-9]*-[0-9]* [0-9]*\:[0-9]*\:[0-9]*\)'`
                tpe=`expr "$fn" : '.* - \([A-Za-z0-9 ]*\)'`
                ext=`expr "$fn" : '.*"\([0-9]*\)"'`
                if [[ $tpe = "Wrong password" ]];
                        then tpe="Неверный пароль"
                fi
                if [[ $tpe = "Device does not match ACL" ]];
                        then tpe="Подключение из неразрешенной сети"
                fi
echo "$date,$ip,$ext,$tpe" >> temp_wrong.csv
done;
unset IFS
sort temp_wrong.csv > log_wrong.csv
sed -i -e "1 s/^/Дата, IP Адрес, Номер, Тип ошибки\n/;" log_wrong.csv

И отправляем на почту:

/usr/local/bin/sendEmail.pl -t "smb@test.ru" -f "Statistic connect <test@yandex.ru>" -u "Statistic connect" -m "Во вложении статистика по удачным и неудачным подключениям к телефонии за неделю." -a /opt/log_reg.csv -a /opt/log_wrong.csv -o message-charset=UTF-8
При отправке с не верифицированного почтового ящика, письмо попадет в спам, а некоторые почтовые сервисы и вовсе могут его не пропустить.
Проверка верного заполнения

И добавляем скрипты на выполнение в крон, соответственно по Asterisk раз в неделю, а по Apache раз в месяц.

0 7 * * 1 /opt/log_ast.sh 
0 7 1 * * /opt/log_stat.sh
 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices