Хранение конфига Asterisk в СУБД MySQL / MariaDB
Asterisk PBX поддерживает возможность хранения конфигурации в различных СУБД. В нашей инструкции рассмотрим связку с MariaDB (MySQL) на Linux Ubuntu. Мы будем использовать ODBC коннектор и метод обработки RealTime или в реальном времени (после изменения конфигурации в базе, нам не нужно будет перезапускать сервер телефонии, чтобы применить настройки).
Процесс установки и базовой настройки Asterisk подробнее рассмотрен в статье Установка Asterisk на Linux.
Установка СУБД
apt-get install mariadb-server
Разрешаем автозапуск сервиса и запускаем его:
systemctl enable mysql
systemctl start mysql
Ставим пароль для суперпользователя СУБД:
mysqladmin -u root password
Сборка Asterisk
Если Asterisk уже установлен и изначально не собирался с учетом MySQL, необходимо выполнить сборку снова. Сначала смотрим версию установленного Asterisk:
Переходим по ссылке https://downloads.asterisk.org/pub/telephony/asterisk и копируем ссылку на нашу версию продукта. После скачиваем ее, например:
Распаковываем архив и переходим в каталог с распакованным содержимым:
tar -xvf asterisk-*.tar.gz
* где . — опции + with-mysqlclient, который отвечает для работу с MySQL.
./configure —prefix=/usr —sysconfdir=/etc —localstatedir=/var —libdir=/usr/lib64 —with-dahdi —with-pri —with-iconv —with-libcurl —with-speex —with-mysqlclient
Открываем окно дополнительных настроек:
В разделе Add-ons ставим все опции, связанные с mysql:
Выбираем Save & Exit.
Собираем исходник и устанавливаем его:
Настройка
Подключаемся к MariaDB:
Создаем базу данных и пользователя:
> CREATE DATABASE asterisk DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON asterisk.* TO ‘asteruser’@’localhost’ IDENTIFIED BY ‘asterpassword123’;
* данными командами мы создали базу данных asterisk и предоставили к ней доступ пользователю asteruser с паролем asterpassword123.
Загружаем данные в базу:
* где /usr/src/asterisk-15.1.2 — путь до распакованного исходника.
ODBC коннектор
Переходим по ссылке https://dev.mysql.com/downloads/connector/odbc и выбираем нашу версию операционной системы:
Кликаем по Download и копируем ссылку на скачивание файла:
В командной строке скачиваем файл, воспользовавшись ссылкой:
Распаковываем архив и переходим в него:
tar -xvf mysql-connector-odbc-*.tar.gz
cp lib/libmyodbc5* /usr/lib64
Устанавливаем odbc драйвер:
./bin/myodbc-installer -d -a -n «MySQL» -t «DRIVER=/usr/lib64/libmyodbc5w.so;»
Для подключения астериска к базе, создаем DSN:
./bin/myodbc-installer -s -a -c2 -n «Asterisk» -t «DRIVER=MySQL;SERVER=127.0.0.1;DATABASE=asterisk;UID=asteruser;PWD=asterpassword123»
* где MySQL — имя драйвера, который мы создали на предыдущем шаге; asterisk, asteruser, asterpassword123 — соответственно, имя базы данных, имя пользователя и пароль для подключения к СУБД.
* в случае необходимости, отредактировать DSN можно в файле /etc/odbc.ini.
Делаем тестовое подключение:
SQL> show tables
Asterisk
Открываем конфигурационный файл с настройкой модулей:
Добавляем в него следующие строки:
preload => res_odbc.so
preload => res_config_odbc.so
Настраиваем подключение к базе через DSN:
[asterisk-conf]
enabled => yes
dsn => Asterisk
username => asteruser
password => asterpassword123
pre-connect => yes
max_connections => 100
sanitysql => select 1
systemctl restart asterisk
Подключаемся к его консоли:
Проверяем, что астер увидел odbc:
Добавление настроек в базу
На текущем шаге, Asterisk будет использовать конфигурационные файлы. Рассмотрим процесс настройки использования СУБД с добавлением настроек в базу.
Создание extensions
Редактируем файл extconfig.conf:
[settings]
sipusers => odbc,asterisk-conf,sippeers
sippeers => odbc,asterisk-conf,sippeers
* мы добавили две строчки в раздел settings, которые говорят астериску искать пиры через odbc, настройку asterisk-conf.
systemctl restart asterisk
В дальнейшем, все номера, которые мы будем добавлять в базу данных начнут использоваться в режиме реального времени (без необходимости перезапускать телефонную станцию).
Подключаемся к базе данных:
mysql -uasteruser -pasterpassword123
Добавим 4-е коротких номера:
> INSERT INTO asterisk.sippeers
(`name`, `defaultuser`, `host`, `type`, `context`, `secret`, `nat`, `callgroup`, `language`, `disallow`, `allow`, `regexten`, `call-limit`)
VALUES
(‘1001’, ‘1001’, ‘dynamic’, ‘friend’, ‘outcalling’, ‘1234’, ‘no’, ‘1’, ‘ru’, ‘all’, ‘alaw,ulaw’, ‘1001’, ‘4’),
(‘1002’, ‘1002’, ‘dynamic’, ‘friend’, ‘outcalling’, ‘1234’, ‘no’, ‘1’, ‘ru’, ‘all’, ‘alaw,ulaw’, ‘1002’, ‘4’),
(‘1003’, ‘1003’, ‘dynamic’, ‘friend’, ‘outcalling’, ‘1234’, ‘no’, ‘1’, ‘ru’, ‘all’, ‘alaw,ulaw’, ‘1003’, ‘4’),
(‘1004’, ‘1004’, ‘dynamic’, ‘friend’, ‘outcalling’, ‘1234’, ‘no’, ‘1’, ‘ru’, ‘all’, ‘alaw,ulaw’, ‘1004’, ‘4’);
* в данном примере мы создаем 4 номера 1001, 1002, 1003, 1004 с правилом обработки вызова в диалплане outcalling и паролем 1234.
Обновить запись можно командой UPDATE, например:
> UPDATE asterisk.sippeers SET `secret`=’password’ WHERE `name`=’1001′;
Проверить состояние абонентов и транков SIP можно подключившись к консоли Asterisk:
*CLI> sip show peers
Правила вызова (контекст)
Открываем следующий файл:
Добавляем в раздел [settings]:
[settings]
.
extensions => odbc,asterisk-conf,extensions
Открываем файл extensions.conf:
Создаем диалплан (группу правил):
[outcalling]
switch => Realtime/outcalling@extensions
systemctl restart asterisk
Подключаемся к базе и добавляем правило в диалплан outcalling:
mysql -uasteruser -pasterpassword123
> INSERT INTO asterisk.extensions VALUES (NULL, ‘outcalling’, ‘_XXXX’, ‘1’, ‘DIAL’, ‘SIP/$
Call Detail Record (CDR)
Теперь настроем хранение журнала вызовов в базе данных.
Открываем следующий файл:
Добавляем в самый низ:
[cdr]
connection=asterisk-conf
table=cdr
alias src => source
alias channel => source_channel
alias dst => dest
alias dstchannel => dest_channel
systemctl restart asterisk
Пробуем позвонить через наш астериск и после звонка смотрим записи в базе:
mysql -uasteruser -pasterpassword123 -e «SELECT * FROM cdr»
Получим примерно следующее:
| accountcode | src | dst | dcontext | clid | channel | dstchannel | lastapp | lastdata | start | answer | end | duration | billsec | disposition | amaflags | userfield | uniqueid | linkedid | peeraccount | sequence |
+————-+——+——+————+—————+——————-+——————-+———+————-+———————+———+———————+———-+———+————-+—————+————+—————+—————+————-+———-+
| NULL | 1001 | 1004 | outcaling | «1001» | SIP/1001-00000000 | SIP/1004-00000001 | Dial | SIP/1004,,m | 2017-12-07 16:11:24 | NULL | 2017-12-07 16:11:32 | 7 | 0 | NO ANSWER | DOCUMENTATION | NULL | 1512652284.0 | 1512652284.0 | NULL | 0 |
Или в более читаемом виде:
Поле | Пример значения | Описание поля |
---|---|---|
accountcode | NULL | Дополнительное поле для идентификации клиента. Может использоваться, если не хватает стандартного набора параметров. |
src | 1001 | Кто звонит. |
dst | 1004 | Кому позвонили. |
dcontext | outcaling | Контекст (группа правил обработки звонка). |
clid | «1001» | Caller identification или CID. Состоит из имени и номера звонящего. |
channel | SIP/1001-00000000 | Канал, который принимает вызов. |
dstchannel | SIP/1004-00000001 | Канал исходящего вызова. |
lastapp | Dial | Dialplan обработки вызова. |
lastdata | SIP/1004,,m | Что передавалось в lastapp. |
start | 2017-12-07 16:11:24 | Начало звонка. |
answer | NULL | Время, за которое подняли трубку. NULL — трубку не подняли. |
end | 2017-12-07 16:11:32 | Дата и время окончания звонка. |
duration | 7 | Длительность звонка в секундах. |
billsec | Время разговора (с момента поднятия трубки). | |
disposition | NO ANSWER | Состояние вызова. Возможные варианты: — ANSWERED — отвечен. — NO ANSWER — ответа нет. — CONGESTION / FAILED — ошибка вызова. — BUSY — занято. |
amaflags | DOCUMENTATION | Не используется. |
userfield | NULL | Пользовательские параметры для канала. |
uniqueid | 1512652284.0 | Уникальный идентификатор канала звонящего. |
linkedid | 1512652284.0 | Уникальный идентификатор канала звонящего. |
peeraccount | NULL | Код учетной записи канала Стороны 2. |
sequence | Номер последовательности канала. |
Также существуют продукты, позволяющие в графическом интерфейсе смотреть CDR. Например, веб-приложение Asterisk CDR Viewer Mod.
Источник
Подключение Asterisk к MySQL через драйвер ODBC
В первых версиях Asterisk для сбора и хранения данных CDR и CEL в MySQL использовался драйвер cdr_mysql.so и cel_mysql.so, соответственно. В настоящий момент эти драйверы устарели и разработчики рекомендуют использовать технологию ODBC.
ODBC (Open Database Connectivity) — это программный интерфейс (API) доступа к базам данных, разработанный фирмой Microsoft, в сотрудничестве с Simba Technologies на основе спецификаций Call Level Interface (CLI), который разрабатывался организациями SQL Access Group, X/Open и Microsoft. Впоследствии CLI был стандартизован ISO. Стандарт CLI призван унифицировать программное взаимодействие с СУБД, сделать его независимым от поставщика СУБД и программно-аппаратной платформы. Спасибо Википедии.
Проще говоря, драйвер ODBC позволяет подключать какое-либо приложение или программу (в нашем случае это Asterisk) к различным базам данных.
В этой статье мы рассмотрим, как подключить Asterisk к MySQL для записи CDR на сторонний сервер.
— Сервер с Asterisk 13, на ОС Centos 6.5 (x86_64) / Ubuntu Server 14.10 (x86_64)
— Сервер с MySQL 5.5, на какой ОС нам в принципе не важно.
Для установки драйвера на Red Hat подобных ОС, необходимо ввести следующую команду:
Для Debian подобных ОС, необходимо выполнить следующую команду:
Далее необходим отредактировать файл /etc/odbcinst.ini. В Centos он уже существует, в Ubuntu он существует, но файл пустой.
Проверьте правильно ли указаны пути к драйверам ODBC.
1) Для Centos x86_x64:
Далее проверяем видит ли ODBC драйвер для MySQL. Вводим команду
и должны увидеть следующее:
После этого отредактируем файл /etc/odbc.ini, это файл используется для создания идентификатора для Asterisk. Т.е. Asterisk, в своей конфигурации, будет ссылается на название, указанное в этом файле.
Т.е. в нашем примере, Asterisk в своих конфигурационных файлах будет использовать идентификатор [MySQL-asteriskcdrdb].
Если мы хотим подключиться к сторонней базе данных, т.е. установленной на другом сервере, нежели Asterisk, то в файле /etc/odbc.ini необходимо просто изменить строчку server=localhost на server=IPадресБД (в нашем примере 192.168.7.17)
Далее необходимо проверить сможем ли мы подключиться к базе данных, используя утилитку ISQL. Введите следующую команду и вы должны увидеть схожий вывод.
Теперь перейдем к настройкам MySQL.
1) Подключаемся к MySQL
2) Создадим базу данных asteriskcdrdb
3) Переходим в базу данных
4) Создадим две таблицы CDR и CEL.
5) Дадим права пользователю asterisk на работы с БД asteriskadcdb
Если сервер с БД и Asterisk разные машины, то необходимо внести такую запись.
Далее необходимо пересобрать Asterisk, выбрав модули связанные с odbc.
В файл /etc/asterisk/res_odbc.conf добавляем следующие строчки.
Параметр DSN отвечает за подключение Asterisk к базе данных, указанной в файле /etc/odbc.ini. Этот параметр говорит Asterisk, что необходимо открыть и поддерживать соединение с базой данных при загрузке модуля res_odbc.so.
Перезапустим сервис Asterisk
Через CLI Asterisk проверим подключение к БД через драйвер ODBC/
Далее отредактируем файлы, связанные с CDR и CEL.
Источник
Asterisk CDR — запись в базу данных MySQL через cdr_mysql
Причины записи CDR в базу данных MySQL
В первую очередь возникает вопрос — зачем вообще нужно записывать CDR в базу данных MySQL сервера? Дело в том, что в отличие от многих других баз, asterisk может делать запись в mysql собственными средствами, без дополнительных программ. Кроме того, установка и настройка баз MySQL является простой операцией, а сама распространенность баз данных MySQL дает возможность рекомендовать этот формат баз данных для хранения статистики звонков — CDR.
Этапы настройки записи CDR в MySQL
Настройка сохранения истории звонков asterisk (CDR) в базу данных формата MySQL состоит из двух частей, каждая из которых состоит из нескольких этапов. Части могут настраиваться независимо и параллельно (до определенного момента).
Часть 1. Установите и настройте MySQL сервер
- Установите MySQL сервер
- Создайте базу данных для asterisk
- Создайте таблицу для asterisk
Часть 2 — настройка asterisk
- Установите компоненты для работы с MySQL: MySQL client и библиотеку для поддержки MySQL
- Пересоберите asterisk для работы с MySQL — cdr_mysql
- К этому моменту должна быть выполнена часть 1.
- Проверьте подключение к MySQL Server
- Настройте asterisk для работы с MySQL
И отдельным пунктом вынесены возможные ошибки, возникающие в процессе настройки MySQL / asterisk.
Установка и настройка MySQL
Установка MySQL Server
Для установки сервера MySQL в Debian достаточно набрать команду:
apt-get install mysql-server
В операционной системе RHEL / CentOS также все довольно просто:
yum install mysql-server
При этом будет установлена текущая (актуальная) версия mysql сервера (на момент написания статьи это версия 5.5).
В процессе установки будет необходимо задать пароль пользователя root для mysql. Не забудьте этот пароль, он Вам еще понадобится!
Для установки и первоначальной настройки MySQL сервера Вы можете воспользоваться статьей «Установка и первоначальная настройка MySQL в linux».
Запуск сервиса MySQL
Для запуска сервиса в CentOS выполните команду:
service mysqld start
Подключение к серверу SQL для выполнения запросов
Для подключения к MySQL серверу (чтобы можно было выполнять команды SQL) Вы можете воспользоваться любыми своими имеющимися инструментами, например PHPMyAdmin. Либо же можете воспользоваться встроенными средствами командной строки из пакета MySQL — mysql:
mysql -u имя-пользователя-SQL -p
например:
mysql -u root -p
после нажатия Enter будет запрошен пароль для пользователя. После ввода пароля и нажатия Enter, будет выведено приглашение MySQL:
mysql>_
Теперь Вы можете выполнять запросы SQL.
Создание базы данных (и пользователя этой базы данных) для asterisk cdr
Для создания базы данных (назовем ее asteriskcdr, Вы можете выбрать любое другое имя) выполните команду SQL:
Если Вы хотите создать отдельного пользователя (например, asterisk_user) для работы с этой базой данных, при этом выставить ему пароль например, asterisk_password, выполните команду SQL:
Теперь Вам необходимо назначить этому вновь созданному пользователю asterisk_user права для доступа к базе данных (например, права только для добавления / обновления записей и для просмотра базы). Для этого выполните команду SQL:
Если же Вы хотите дать этому пользователю полные права на базу данных, вместо предыдущей команды выполните эту команду SQL:
Если Вы хотите, чтобы пользователь MySQL мог подключаться удаленно к серверу MySQL (с другого компьютера), то (при создании, а также предоставлении ему прав доступа к БД) его имя следует указывать в формате:
имя-пользователя@хост
например:
asterisk_user@192.168.1.1
Если же Вы не знаете, с каких IP будет подключаться пользователь, либо Вам необходимо, чтобы он подключался с любых IP адресов, укажите имя пользователя в следующем формате:
имя-пользователя@’%’
например:
asterisk_user@’%’
В этом случае команда для предоставления полных прав [на работу с MySQL] пользователю asterisk_user, который может подключаться к MySQL с любых IP адресов, будет выглядеть так:
Создание таблицы для asterisk
Для создания таблицы asterisk CDR подключитесь к созданной базе данных и выполните следующий запрос:
Обратите внимание: в этой таблице (в отличие от таблиц asterisk cdr, представленных в интернете) присутствуют поля: start, answer, end. Эти поля присутствуют в самом CDR, имеют место быть в таблице CDR для Microsoft SQL, но почему-то отсутствуют в большинстве рекомендаций по созданию таблиц CDR для баз MySQL.
Дело в том, что (как указано на сайте voip-info.org), любые стандартные столбцы CDR в базе данных MySQL могут быть исключены простым удалением из таблицы (или переименованием столбца). При этом никаких сообщений об ошибках не возникает — просто соответствующая информация не пишется в базу данных (Standard columns may also be excluded now, simply by dropping the column name from the table, renaming the column, or aliasing the cdrname from a nonexistent variable (e.g. foo => amaflags)).
Поэтому в случае, если в Вашей таблице нет столбцов answer и end (вместо start можно использовать calldate), то рекомендую их туда добавить (иначе время ответа на звонок придется вычислять путем сложения и вычитания нескольких других полей, что далеко не всегда удобно).
Обратите также внимание, что в новых версиях asterisk [не уверен, но предполагаю, что речь идет об asterisk 10-й, 11-й версии и новее] столбец calldate является копией столбца start, в отличие от старых версий asterisk, где столбец calldate является копией столбца end.
Настройка asterisk
Установка компонентов для работы asterisk с MySQL: mysql client и библиотеки mysql для сборки asterisk
Для установки клиента mysql (неважно, установлен ли asterisk на том же компьютере, что и сервер MySQL или нет) запустите в debian следующую команду:
apt-get install mysql-client
В случае, если у Вас установлен RHEL / CentOS, выполните такую команду:
yum install mysql
Теперь необходимо установить библиотеки mysql. Они дадут возможность собирать программы, предназначенные для работы с MySQL.
Для debian это будет команда:
apt-get install libmysqlclient-dev
Для RHEL / CentOS выполните:
yum install mysql-devel
Повторная сборка asterisk для работы с MySQL
Перейдите в папку с исходными кодами (откуда устанавливался asterisk) и запустите команду конфирурирования:
cd /usr/src/asterisk-11.4.0/
./configure
make menuselect
В открывшемся меню включите использование следующих компонентов:
- Add-ons => res_config_mysql
- Add-ons => cdr_mysql
После выхода (с сохранением) из меню выбора компонентов выполните сборку и повторную установку asterisk:
make
make install
Команду make samples не делать ни в коем случае, это сотрет имеющиеся конфигурационные файлы! Команду make config также выполнять не нужно, поскольку [предполагается, что] asterisk уже установлен и настроен в Вашей системе.
Теперь необходимо перезапустить сервис астериска для того, чтобы свежеустановленный asterisk начал свою работу.
Проверка связи с MySQL Server
Давайте проверим работу с сервером MySQL, подключившись к нему с помощью mysql клиента.
Для этого из командной строки запустите:
mysql —host= имя-сервера-MySQL -u имя-пользователя-БД -p
например:
mysql —host=192.168.1.1 -u asterisk_user -p
при этом будет запрошен пароль пользователя asterisk_user, укажите его.
При успешном подключении появится приглашение:
mysql>
теперь можно ввести команды mysql, например:
exit — для выхода
Настройка asterisk для работы с MySQL Server
Для настройки asterisk откройте файл /etc/asterisk/cdr_mysql.conf и впишите туда подобные строки (здесь указан лишь пример):
Вы можете раскомментировать нужные Вам строки или вписать новые.
После выполнения вышеуказанных действий запустите asterisk и попробуйте подключить модуль cdr_mysql.so. Для этого запустите подключение к asterisk:
asterisk -rvvv
И из командной строки asterisk (asterisk CLI) выполните следующую команду:
module load cdr_mysql.so
При возникновении ошибок решение см. в конце статьи. В случае, если Вы исправили ошибку, и Вам необходимо выгрузить и повторно загрузить модуль, выполните команды:
module unload cdr_mysql.so
module load cdr_mysql.so
В случае успеха asterisk может выдать несколько уведомлений и загрузит модуль. Убедиться в том, что модуль загружен, можно выполнив команду:
module show like cdr_mysql.so
После этого перезагрузите конфигурацию CDR и убедитесь, что звонки фиксируются в базе данных. Для перезагрузки конфигурации CDR выполните команды:
reload cdr
reload cdr_mysql.so
или
reload
На этом настройка asterisk закончена.
Возможные ошибки, возникающие в процессе настройки MySQL / asterisk
Error 1130 (HY000): Host ‘. ‘ is not allowed to connect to this MySQL server
Если Вы подключаетесь к серверу MySQL удаленно (с другого компьютера), то может возникать подобное сообщение. Данное сообщение означает, что сервер MySQL не настроен на возможность подключения к нему извне (точнее, что пользователю, под которым Вы пытаетесь подключиться, не разрешено подключение извне). Вам необходимо создать нового пользователя вида user@host, например asterisk_user@192.168.1.1 или asteriskcdr@’%’ (второй вариант дает возможность пользователю asteriskcdr подключаться с любого IP адреса).
Error 1045 (28000): Access denied for user ‘. ‘ (using password: NO)
При попытке подключения к серверу MySQL с помощью клиента mysql появляется указанное выше сообщение: это (вероятнее всего) означает, что Вы не задали пароль пользователя MySQL при подключении к серверу.
Error 1045 (28000): Access denied for user ‘. ‘ (using password: YES)
Если при попытке подключения к серверу MySQL с помощью клиента mysql появляется указанное выше сообщение, то это означает, что Вы указали неверный пароль для пользователя MySQL при подключении к серверу.
Error 2003 (HY000): Can’t connect to MySQL server on ‘. ‘ (113)
Если при попытке подключения к серверу MySQL с помощью клиента mysql (с другого компьютера) появляется указанное выше сообщение, это значит, что у Вас закрыт доступ к порту MySQL данного компьютера. Вероятнее всего, это вызвано неверной настройкой (а точнее, отсутствием настройки на работу с MySQL) службы iptables. Для начала попробуйте просто отключить iptables (остановить службу) и попробуйте подключиться ещё раз.
Источник