Хранение конфигурации Asterisk 18 в СУБД MariaDB

Thank you for reading this post, don't forget to subscribe!

Asterisk PBX под­дер­жи­ва­ет воз­мож­ность хра­не­ния кон­фи­гу­ра­ции в раз­лич­ных СУБД. В нашей инструк­ции рас­смот­рим связ­ку с MariaDB (MySQL) на Linux CentOS 7. Мы будем исполь­зо­вать ODBC кон­нек­тор и метод обра­бот­ки RealTime или в реаль­ном вре­ме­ни (после изме­не­ния кон­фи­гу­ра­ции в базе, нам не нуж­но будет пере­за­пус­кать сер­вер теле­фо­нии, что­бы при­ме­нить настройки).

Подготовка сервера

Перед уста­нов­кой теле­фо­нии выпол­ним пред­ва­ри­тель­ные действия.

1. Устанавливаем необходимые программы

Обнов­ля­ем пакеты:

yum update

Уста­нав­ли­ва­ем пакеты:

yum install gcc wget ntpdate automake libtool

gcc нужен для сбор­ки исход­ни­ков, wget — для загруз­ки фай­лов из команд­ной стро­ки; ntpdate — син­хро­ни­за­ции вре­ме­ни; automake — участ­ву­ет в созда­нии Makefile при запус­ке configure; libtool — обес­пе­чи­ва­ет про­цесс сбор­ки и исполь­зо­ва­ния дина­ми­че­ских библиотек.

2. Настраиваем время

Уста­нав­ли­ва­ем вре­мен­ную зону:

timedatectl set-timezone Europe/Moscow

* в дан­ном при­ме­ре мос­ков­ское время.

Уста­нав­ли­ва­ем ути­ли­ту для син­хро­ни­за­ции вре­ме­ни и запус­ка­ем ее:

yum install chrony

systemctl enable chronyd --now

3. Настройка безопасности:

Созда­ем новый сер­вис в брандмауэре:

firewall-cmd --permanent --new-service=asterisk

Доба­вим в сер­вис нуж­ные порты:

firewall-cmd --permanent --service=asterisk --add-port=5060/tcp

firewall-cmd --permanent --service=asterisk --add-port=5060/udp

firewall-cmd --permanent --service=asterisk --add-port=5061/tcp

firewall-cmd --permanent --service=asterisk --add-port=5061/udp

firewall-cmd --permanent --service=asterisk --add-port=4569/udp

firewall-cmd --permanent --service=asterisk --add-port=5038/tcp

firewall-cmd --permanent --service=asterisk --add-port=10000-20000/udp

* где 5060 — SIP5061 — SIP over TLS4569 — IAX5038 — AMI (Asterisk Manager Interface), 10000-20000 — диа­па­зон для дина­ми­че­ских портов.

Теперь добав­ля­ем создан­ный сер­вис как разрешенный:

firewall-cmd --permanent --add-service=asterisk

и пере­за­пус­ка­ем фаервол:

firewall-cmd --reload

Установка Asterisk

Уста­нов­ка асте­ри­с­ка выпол­ня­ет­ся путем сбор­ки исход­ни­ков. Сама про­це­ду­ра про­хо­дит в 3 этапа:

  1. Уста­нов­ка DAHDI (драй­ве­ров плат интерфейсов);
  2. Уста­нов­ка LibPRI (биб­лио­те­ка для рабо­ты с пото­ко­вы­ми TDM-интерфейсами);
  3. Соб­ствен­но, сбор­ка и уста­нов­ка Asterisk.

1. Сборка DAHDI

Уста­нав­ли­ва­ем исход­ни­ки для исполь­зу­е­мо­го ядра:

yum install "kernel-devel-uname-r == $(uname -r)"

Загру­жа­ем исход­ник, рас­па­ко­вы­ва­ем его и пере­хо­дим в рас­па­ко­ван­ный каталог:

wget https://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz

tar -xvf dahdi-linux-complete-current.tar.gz

cd dahdi-linux-complete-*/

Выпол­ня­ем сбор­ку и установку:

make

make install

make install-config

Выхо­дим из ката­ло­га с исходником:

cd ..

2. Сборка LibPRI

Про­це­ду­ра, во мно­гом, похо­жа на сбор­ку DAHDI. Загру­жа­ем исход­ник, рас­па­ко­вы­ва­ем его и пере­хо­дим в рас­па­ко­ван­ный каталог:

wget https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz

tar -xvf libpri-current.tar.gz

cd libpri-*/

Выпол­ня­ем сбор­ку и установку:

make

make install

Выхо­дим из ката­ло­га с исходником:

cd ..

3. Установка самого астериска

Для нача­ла, загру­жа­ем исход­ник на сер­вер. Так как мы пла­ни­ру­ем уста­но­вить LTS вер­сию, захо­дим на стра­ни­цу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions, раз­дел «Long Term Support (LTS) Releases» и копи­ру­ем ссыл­ку на загруз­ку пакета:

Certified Asterisk — биз­нес вер­сия с под­держ­кой для ком­мер­че­ских клиентов.

Исполь­зуя ссыл­ку, ска­чи­ва­ем на сер­вер программу:

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz

Рас­па­ко­вы­ва­ем архив и пере­хо­дим в него:

tar -xvf asterisk-*.tar.gz

cd asterisk-*

Исполь­зу­ем встро­ен­ный скрипт, что­бы уста­но­вить зави­си­мо­сти для астериска:

./contrib/scripts/install_prereq install

./contrib/scripts/install_prereq install-unpackaged

Чистим обра­зо­вав­ши­е­ся вре­мен­ные файлы:

make distclean

Добав­ля­ем биб­лио­те­ку для рабо­ты с mp3:

./contrib/scripts/get_mp3_source.sh

Кон­фи­гу­ри­ру­ем исходник:

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --with-dahdi --with-pri --with-iconv --with-libcurl --with-speex --with-mysqlclient --with-jansson-bundled --with-pjproject-bundled

* пол­ный пере­чень опция и что они озна­ча­ют мож­но посмот­реть коман­дой ./configure -h.

Про­дол­жа­ем настройку:

make menuselect

Выби­ра­ем необ­хо­ди­мые ком­по­нен­ты (в дан­ном при­ме­ре res_config_mysql, app_mysql, cdr_mysql):

Запус­ка­ем сбор­ку и установку:

make

make install

Уста­нав­ли­ва­ем скрип­ты для авто­за­пус­ка АТС и гото­вые кон­фи­гу­ра­ци­он­ные файлы:

make config

make samples

Уста­нов­ка завершена!

Базовая настройка и запуск

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл:

vi /etc/asterisk/asterisk.conf

Сни­ма­ем ком­мен­та­рии и редак­ти­ру­ем сле­ду­ю­щие пункты:

Созда­ем учет­ную запись:

useradd asterisk -m

Зада­ем пра­ва на сле­ду­ю­щие каталоги:

chown -R asterisk:asterisk /var/run/asterisk

chown -R asterisk:asterisk /etc/asterisk

chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk

chown -R asterisk:asterisk /usr/lib64/asterisk

chown -R asterisk:asterisk /var/log/asterisk

Откры­ва­ем файл:

vi /etc/asterisk/modules.conf

Добав­ля­ем две опции:

Про­ве­ря­ем настройки:

asterisk -c

Если про­грам­ма запу­стит­ся, мы уви­дим Asterisk Ready:

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

Теперь мож­но запу­стить асте­риск как службу:

systemctl enable asterisk

systemctl start asterisk

Заведение пользователя

Созда­дим наш пер­вый диал­план (пра­ви­ло обра­бот­ки звонков):

vi /etc/asterisk/extensions.conf

Допи­шем в него следующее:

* в дан­ном при­ме­ре мы созда­ем кон­текст с име­нем outcaling для трех­знач­ных номе­ров (XXX) с вызо­вом по SIP по внут­рен­не­му номеру.

Теперь созда­дим два внут­рен­них номера:

vi /etc/asterisk/sip.conf

* сна­ча­ла мы созда­ли шаб­лон public, в кото­рый занес­ли общие пара­мет­ры. Шаб­лон мы при­ме­ни­ли к созда­ва­е­мым корот­ким номерам.
* где:

  • [101], [102] — име­на для обо­зна­че­ния номеров.
  • type — типы про­вер­ки номе­ров. Могут быть peeruser или friend. Peer — вызо­вы сопо­став­ля­ют­ся с IP-адре­са­ми и номе­ра­ми пор­тов. User — про­вер­ка username. Friend — вклю­ча­ет воз­мож­но­сти peer и user (про­вер­ка username и IP-адре­са источ­ни­ка) и луч­ше все­го под­хо­дит для теле­фо­нов и теле­фон­ных программ.
  • regexten — доба­воч­ный номер. Если не задан, исполь­зу­ет­ся имя.
  • secret — пароль для аутентификации.
  • context — кон­текст или груп­па правил.
  • host — IP-адрес или имя кли­ен­та. Для авто­ма­ти­че­ской реги­стра­ции исполь­зу­ем dynamic.
  • callerid — иден­ти­фи­ка­тор поль­зо­ва­те­ля при звонке.
  • disallow — запре­ща­ет коде­ки (зада­ет­ся перед пара­мет­ром allow).
  • allow — раз­ре­ша­ет коде­ки. alaw и ulaw — алго­рит­мы для коде­ков g711.
  • language — код исполь­зу­е­мо­го языка.
  • callgroup — зада­ет груп­пу устрой­ства (для воз­мож­но­сти перехвата).
  • pickupgroup — зада­ет пере­чень групп, кото­рые мож­но перехватывать.
  • qualify — вклю­ча­ет или отклю­ча­ет пери­о­ди­че­скую про­вер­ку под­клю­чен­но­го клиента.
  • canreinvite — вклю­ча­ет или отклю­ча­ет про­хож­де­ние голо­со­во­го RTP тра­фи­ка через Asterisk. Уста­нав­ли­вать, толь­ко если кли­ент под­дер­жи­ва­ет функ­цию SIP re-invites.
  • call-limit — огра­ни­че­ние коли­че­ства одно­вре­мен­ных вызовов.
  • nat — уста­нав­ли­ва­ет­ся в yes, если кли­ент нахо­дить­ся за NAT.

Пере­за­пус­ка­ем наш сервис:

systemctl restart asterisk

Подключение телефона и проверка

Для про­вер­ки сер­ве­ра уста­нав­ли­ва­ем софт-теле­фон на ком­пью­тер. Напри­мер, а каче­стве SIP-кли­ен­та под Windows мож­но уста­но­вить бес­плат­ную про­грам­му 3CX Phone, для Android — Zoiper.

При­мер настрой­ки кли­ен­та 3CX Phone:

Настра­и­ва­ем под­клю­че­ние с логи­ном и паро­лем 101 / 1234, вто­рой — 102 / 5678. Про­бу­ем позвонить.

Исправление ошибок

Рас­смот­рим про­цесс устра­не­ния пре­ду­пре­жде­ний и оши­бок во вре­мя запус­ка Asterisk.

Из-за неиспользуемых модулей

Для устра­не­ния дан­ных про­блем необ­хо­ди­мо про­сто отклю­чить дан­ные модули.

Откры­ва­ем файл:

vi /etc/asterisk/modules.conf

И в зави­си­мо­сти от оши­бок, добав­ля­ем ниже­пе­ре­чис­лен­ные исправления…

res_phoneprov … Unable to find a valid server address or name

Отклю­ча­ем res_phoneprov:

noload => res_phoneprov.so

res_config_ldap … No directory URL or host found

Отклю­ча­ем res_config_ldap:

noload => res_config_ldap.so

res_config_pgsql … PostgreSQL RealTime: Failed to connect database asterisk on 127.0.0.1

Отклю­ча­ем res_config_pgsql:

noload => res_config_pgsql.so

cel_pgsql … CEL pgsql config file missing global section

Отклю­ча­ем cel_pgsql:

noload => cel_pgsql.so

cel_tds … cel_tds module had config problems; declining load

Отклю­ча­ем cel_tds:

noload => cel_tds.so

Другие ошибки

ari/config … No configured users for ARI

ARI предо­став­ля­ет API для Asterisk REST Interface. В дан­ном при­ме­ре, отклю­ча­ем поддержку:

vi /etc/asterisk/ari.conf

Нахо­дим пара­метр enabled и меня­ем его зна­че­ние на no:

 

Установка СУБД

yum install mariadb-server

Раз­ре­ша­ем авто­за­пуск сер­ви­са и запус­ка­ем его:

systemctl enable mysql --now

Ста­вим пароль для супер­поль­зо­ва­те­ля СУБД:

mysqladmin -u root password

Сборка Asterisk

Если Asterisk уже уста­нов­лен и изна­чаль­но не соби­рал­ся с уче­том MySQL, необ­хо­ди­мо выпол­нить сбор­ку сно­ва. Сна­ча­ла смот­рим вер­сию уста­нов­лен­но­го Asterisk:

asterisk -V

Пере­хо­дим в ката­лог, куда будем загру­жать исходник:

cd /usr/src

Пере­хо­дим по ссыл­ке https://downloads.asterisk.org/pub/telephony/asterisk и копи­ру­ем ссыл­ку на нашу вер­сию про­дук­та. После ска­чи­ва­ем ее, например:

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz

Рас­па­ко­вы­ва­ем архив и пере­хо­дим в ката­лог с рас­па­ко­ван­ным содержимым:

tar -xvf asterisk-*.tar.gz

cd asterisk-*

Кон­фи­гу­ри­ру­ем исходник:

./configure … --with-mysqlclient

* где  — опции + with-mysqlclient, кото­рый отве­ча­ет для рабо­ту с MySQL.

Напри­мер:

Откры­ва­ем окно допол­ни­тель­ных настроек:

make menuselect

В раз­де­ле Add-ons ста­вим все опции, свя­зан­ные с mysql:

Выби­ра­ем Save & Exit.

Соби­ра­ем исход­ник и уста­нав­ли­ва­ем его:

make

make install

Настройка

СУБД

Под­клю­ча­ем­ся к MariaDB:

mysql -u root -p

Созда­ем базу дан­ных и пользователя:

* дан­ны­ми коман­да­ми мы созда­ли базу дан­ных asterisk и предо­ста­ви­ли к ней доступ поль­зо­ва­те­лю asteruser с паро­лем asterpassword123.

Загру­жа­ем дан­ные в базу:

* где /usr/src/asterisk-18.13.0 — путь до рас­па­ко­ван­но­го исходника.

> \q

ODBC коннектор

В нашем при­ме­ре исполь­зу­ет­ся MariaDB, поэто­му нам нуж­но уста­но­вить кон­нек­тор дан­ной СУБД. Для это­го пере­хо­дим по ссыл­ке mariadb.com/downloads/connectors и выби­ра­ем для загруз­ки ODBC-кон­нек­тор и нашу вер­сию опе­ра­ци­он­ной системы:

Ниже появит­ся ссыл­ка, кото­рую нуж­но скопировать:

В команд­ной стро­ке ска­чи­ва­ем файл, вос­поль­зо­вав­шись ссылкой:

wget https://dlm.mariadb.com/2338606/Connectors/odbc/connector-odbc-3.1.16/mariadb-connector-odbc-3.1.16-centos7-amd64.tar.gz

Рас­па­ко­вы­ва­ем архив:

tar -xvf mariadb-connector-odbc-*.tar.gz

Копи­ру­ем драйверы:

cp mariadb-connector-odbc-*-centos7-amd64/lib/mariadb/lib* /usr/lib/

Настра­и­ва­ем odbc драйвер:

vi /etc/odbcinst.ini

Добав­ля­ем строки:

Для под­клю­че­ния асте­ри­с­ка к базе, созда­ем DSN:

vi /etc/odbc.ini

* где MariaDB — имя драй­ве­ра, кото­рый мы созда­ли на преды­ду­щем шаге; asteriskasteruserasterpassword123 — соот­вет­ствен­но, имя базы дан­ных, имя поль­зо­ва­те­ля и пароль для под­клю­че­ния к СУБД.

Дела­ем тесто­вое подключение:

Про­бу­ем посмот­реть спи­сок таблиц:

Мы долж­ны уви­деть что-то на подобие:


Отключаемся:

SQL> quit

Asterisk

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл с настрой­кой модулей:

vi /etc/asterisk/modules.conf

Добав­ля­ем в него сле­ду­ю­щие строки:

Настра­и­ва­ем под­клю­че­ние к базе через DSN:

vi /etc/asterisk/res_odbc.conf

Пере­за­пус­ка­ем Asterisk:

systemctl restart asterisk

Под­клю­ча­ем­ся к его консоли:

asterisk -r

Про­ве­ря­ем, что астер уви­дел odbc:

> odbc show

Мы долж­ны уви­деть что-то на подобие:

Добавление настроек в базу

На теку­щем шаге, Asterisk будет исполь­зо­вать кон­фи­гу­ра­ци­он­ные фай­лы. Рас­смот­рим про­цесс настрой­ки исполь­зо­ва­ния СУБД с добав­ле­ни­ем настро­ек в базу.

Создание extensions

Редак­ти­ру­ем файл extconfig.conf:

vi /etc/asterisk/extconfig.conf

* мы доба­ви­ли две строч­ки в раз­дел settings, кото­рые гово­рят асте­ри­с­ку искать пиры через odbc, настрой­ку asterisk-conf.

Пере­за­пус­ка­ем астер:

systemctl restart asterisk

В даль­ней­шем, все номе­ра, кото­рые мы будем добав­лять в базу дан­ных нач­нут исполь­зо­вать­ся в режи­ме реаль­но­го вре­ме­ни (без необ­хо­ди­мо­сти пере­за­пус­кать теле­фон­ную станцию).

Под­клю­ча­ем­ся к базе данных:

mysql -uasteruser -p

* и вво­дим пароль (в нашем слу­чае asterpassword123).

Доба­вим 4-е корот­ких номера:

* в дан­ном при­ме­ре мы созда­ем 4 номе­ра 1001100210031004 с пра­ви­лом обра­бот­ки вызо­ва в диал­плане outcalling и паро­лем 1234.

Обно­вить запись мож­но коман­дой UPDATE, например:


Пра­ви­ла вызо­ва (кон­текст)

Откры­ва­ем сле­ду­ю­щий файл:

vi /etc/asterisk/extconfig.conf

Добав­ля­ем в раз­дел [settings]:

Откры­ва­ем файл extensions.conf:

vi /etc/asterisk/extensions.conf

Созда­ем диал­план (груп­пу правил):

Пере­за­пус­ка­ем астер:

systemctl restart asterisk

Под­клю­ча­ем­ся к базе и добав­ля­ем пра­ви­ло в диал­план outcalling:

Мож­но сде­лать тесто­вый зво­нок для про­вер­ки нашей настройки.

Call Detail Record (CDR)

Теперь настро­ем хра­не­ние жур­на­ла вызо­вов в базе данных.

Откры­ва­ем сле­ду­ю­щий файл:

vi /etc/asterisk/cdr_adaptive_odbc.conf

Добав­ля­ем в самый низ:

Пере­за­пус­ка­ем астериск:

systemctl restart asterisk

Про­бу­ем позво­нить через наш асте­риск и после звон­ка смот­рим запи­си в базе:

mysql -uasteruser -pasterpassword123 -e "SELECT * FROM asterisk.cdr"

Полу­чим при­мер­но следующее:

Или в более чита­е­мом виде:

Поле При­мер значения Опи­са­ние поля
accountcode NULL Допол­ни­тель­ное поле для иден­ти­фи­ка­ции кли­ен­та. Может исполь­зо­вать­ся, если не хва­та­ет стан­дарт­но­го набо­ра параметров.
src 1001 Кто зво­нит.
dst 1004 Кому позво­ни­ли.
dcontext outcaling Кон­текст (груп­па пра­вил обра­бот­ки звонка).
clid "1001" <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 0 Вре­мя раз­го­во­ра (с момен­та под­ня­тия трубки).
disposition NO ANSWER Состо­я­ние вызо­ва. Воз­мож­ные варианты:
ANSWERED - отвечен.
NO ANSWER - отве­та нет.
CONGESTION / FAILED - ошиб­ка вызова.
BUSY - занято.
amaflags DOCUMENTATION Не исполь­зу­ет­ся.
userfield NULL Поль­зо­ва­тель­ские пара­мет­ры для канала.
uniqueid 1512652284.0 Уни­каль­ный иден­ти­фи­ка­тор кана­ла звонящего.
linkedid 1512652284.0 Уни­каль­ный иден­ти­фи­ка­тор кана­ла звонящего.
peeraccount NULL Код учет­ной запи­си кана­ла Сто­ро­ны 2.
sequence 0 Номер после­до­ва­тель­но­сти канала.

Так­же суще­ству­ют про­дук­ты, поз­во­ля­ю­щие в гра­фи­че­ском интер­фей­се смот­реть CDR. Напри­мер, веб-при­ло­же­ние Asterisk CDR Viewer Mod.