Предыстория
Имеем в «штате» Asterisk 11 и СУБД FireBird 2.5, в которую PBX пишет CDR. Нечасто, но бывает так, что запись в БД прекращается, а узнаем мы об этом тогда, когда нужно что-то посмотреть в CDR. Увидев, что записей нет, перезапускаем Asterisk, запись в БД восстанавливается. В очередной раз не получив важную информацию из CDR, было решено каким-то образом отслеживать факт записи/не записи в CDR.
В качестве системы мониторинга мы используем Zabbix 3, поэтому было решено написать простенький скрипт на Python, который будет подключаться к FireBird и проверять время последней записи в таблицу с CDR, если это время превышает 30 минут, то система мониторинга просигнализирует нам об этом.
Установка Python 3
Asterisk установлен на уже стареньком Centos 6.8, поэтому для начала устанавливаем свежий Python.
Качаем самые свежие на момент написания статьи исходники:
wget http://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz -O /var/tmp/Python-3.6.1.tar.xz
Идём в указанный выше каталог:
cd /var/tmp/Python-3.6.1
Выполняем:
./configure
Собираем:
make
Устанавливаем:
make install
Python установится в каталог /usr/local/bin/python3
Установка питоновской библиотеки для связи с FireBird
Нужно обновить или записать клиентскую библиотеку для нашей версии FireBird. Можно 2.5.5, можно 3.0.2.
2.5.5. уже была, добавляем в этот же каталог /usr/lib64 еще libfbclient.so.3.0.2, создаем, аналогично уже существующим, симлинки libfbclient.so.3 и заменяем симлинк libfbclient.so на такой же, указывающий на libfbclient.so.3.
Pip с нашей последней версией python 3.6.1 уже имеется, называется аналогично python3 – pip3.
Устанавливаем библиотеку для работы с FireBird на Linux:
pip install fdb
Скрипт подключения к FireBird и получения результата о наличии/отсутствии записи в CDR
#!/usr/local/bin/python3
# Скрипт предназначен для мониторинга заполняемости таблицы cdr в базе
import fdb
from datetime import timedelta, datetime
# Соединение
con = fdb.connect(dsn='192.168.7.15:e:/path/db_asterisk.fdb', user='user', password='password')
# Объект курсора
cur = con.cursor()
# Выполняем запрос
dt = (datetime.now() - timedelta(minutes=30)).replace(microsecond=0)
cur.execute("select iif(exists(select * from cdr c where c.calldate > '" + str(dt) + "'), 1, 0) from rdb$database")
# cur.fetchall() возвращает список из кортежей. Адресуемся к единственному значению; + перевод строки
print(str(cur.fetchall()[0][0]))
В строке соединения, естественно, указываем свои данные (IP, путь, логин, пароль).
Zabbix сервер
Данная статья не преследует цель научить пользоваться системой мониторинга, поэтому здесь всё кратко, для понимания процесса.
Создаём новый элемент данных на узле с Asterisk:
Добавляем триггер на событие:
Zabbix агент
В конец файла /etc/zabbix/zabbix_agentd.conf добавляем строчку:
UserParameter=CDRWrite.check[*], /path/to_scripts/script.py
И перезапускаем агент:
service zabbix-agent restart
После проделанного на Zabbix сервер должны начать поступать данные о выполнении скрипта. В случае, если данные не пишутся более 30 минут (что в нашем случае невозможно в рабочее время), система мониторинга нас оповестит об этом.
Автор: jumper_xf-666