Настраиваем Yate для работы с MySQL

от автора

Хотел бы Вам рассказать о настройке Yate для работы с MySQL. Эту информацию можно найти в документации, но не у всех получается ее собрать во что-то цельное.
+
Итак приступим!

Сборка

Первым делом нужно собрать Yate с поддержкой MySQL. Что бы все прошло хорошо установим следующие пакеты:
apt-get install mysql-client libmysqlclient-dev
После установки можно приступать к сборке Yate:
./configure; make; make install
Сборка завершена. Давайте проверим. Для этого запустим Yate:
yate -vvvvv -CDo
При запуске Вы должны увидеть что-то похожее Loaded module MySQL based on 5.5.32
Вторым способом для проверки является использование модуля rmanager. Подключаемся через telnet и используем команду status.

~$ telnet 0 5038   Trying 0.0.0.0... Connected to 0. Escape character is '^]'. YATE 5.0.0-1 r5675 (http://YATE.null.ro) ready on kolyanu4. status mysqldb %%+status:mysqldb name=mysqldb,type=database,format=Total|Failed|Errors|AvgExecTime;conns=1,failed=0;test_mysql=0|0|0|0 %%-status

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

Настройка

Для настройки нам потребуется внести изменения в 3 файла:
— mysqldb.conf
— register.conf
— ysipchan.conf

Файл mysqldb.conf
Содержит настройки для соединения Yate с MySQL. В данном файле мы всего лишь добавим следующие строки:

[test_mysql] host=127.0.0.1 port=3306 database=yate user=yate_mysql password=secrettext

Естественно в MySQL Вам нужно добавить пользователя yate_mysql с паролем secrettext и создать базу yate, а также запомнить название секции (в данном случае test_mysql)

Есть еще и другие параметры:

timeout - таймаут для запросов (в миллисекундах) nitretry - интервал для создания соединения при сбоях (в секундах, 0 - отключает) socket - UNIX socket для использования при локальных соединениях compress - enable|disable - использовать протокол для сжатия или нет encoding - кодировка, которую использовать при общении с MySQL poolsize - количество соединений для данной учетной записи

Соединение настроено. переходим к файлу register.conf.

Файл register.conf
У данного файла несколько предназначений. Используется для:

  1. аутентификации, регистрации и роутинга (маршрутизации) пользователей, которые хранятся в базе
  2. записи CDR данных в базу
  3. для обновления информации пользователей

Я рассмотрю только первое. Что бы добавить аутентификацию для пользователей с базы данных нам нужно указать, что мы будем обрабатывать сообщение «user.auth». Для этого в секцию [general] дописываем user.auth=yes. После чего дописываем новые секции (можно просто раскомментировать то, что уже есть в конфиге 🙂

[default] account=test_mysql  [user.auth] query=SELECT password FROM users WHERE username='${username}' AND password IS NOT NULL AND password<>'' result=password

Все изменения требуют перезагрузки модулей либо перезапуска Yate (я использую 2 вариант).

В базе yate создаем таблицу users с полями username и password. Так как не принципиально, оба поля у меня были типа varchar(30) и не могли принимать значение NULL.

Секция [default] предназначена для того, что бы описывать общие параметры. Параметру account присваиваем название секции, которое берем с файла mysqldb.conf (в моем случае test_mysql). В таком случае для всех обработчиков (пока только для user.auth) будет использоваться соединения test_mysql.
Аутентификация настроена! Для регистрации и маршрутизации проделываем те же операции. Файл приобретает такой вид:

[general] user.auth=yes user.register=yes user.unregister=yes call.route=yes  [default] account=test_mysql  [user.auth] query=SELECT password FROM users WHERE username='${username}' AND password IS NOT NULL AND password<>'' result=password  [user.register] query=UPDATE users SET location='${data}',expires=CURRENT_TIMESTAMP + INTERVAL '${expires}' SECOND WHERE username='${username}'  [user.unregister] query=UPDATE users SET location=NULL,expires=NULL WHERE expires IS NOT NULL AND username='${username}'  [call.route] query=SELECT location,(CASE WHEN location IS NULL THEN 'offline' ELSE NULL END) AS error FROM users WHERE username='${called}' result=location

Будьте внимательны! В стандартных конфигах могут быть ошибки. Так в моем случае запрос для регистрации выглядел так:
;query=UPDATE users SET location='${data},expires=CURRENT_TIMESTAMP + INTERVAL '${expires} s' WHERE username='${username}'
Правильный запрос:
query=UPDATE users SET location='${data}',expires=CURRENT_TIMESTAMP + INTERVAL '${expires}' SECOND WHERE username='${username}'

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

Файл ysipchan.conf
Зачем нам нужен этот файл? По умолчанию, yate слушает порт 5060 только по udp протоколу. А что если мы хотим использовать tcp? Для этого отредактируем данный файл и добавим строки:

[listener tcp5060] address=0.0.0.0 type=tcp

После чего перерегистрируем аккаунты по tcp протоколу и попробуем позвонить. Те, кто попробовали, могут видеть, что ничего не происходит, а в логах Yate видно ошибку «No route to call target». Что бы исправить данное недоразумение, нужно при регистрации сохранять значение oconnection_id и использовать его для маршрутизации.

В файле register.conf изменятся запросы для user.register, user.unregister, call.route.

[user.register] query=UPDATE users SET location='${data}',oconnection_id='${oconnection_id}',expires=CURRENT_TIMESTAMP + INTERVAL '${expires}' SECOND WHERE username='${username}'  [user.unregister] query=UPDATE users SET location=NULL,expires=NULL,oconnection_id=NULL WHERE expires IS NOT NULL AND username='${username}'  [call.route] query=SELECT location,oconnection_id,(CASE WHEN location IS NULL THEN 'offline' ELSE NULL END) AS error FROM users WHERE username='${called}' result=location

Готово. Теперь перерегистрируем аккаунты и звоним.

Ссылки:
docs.yate.ro/wiki/MySQL
docs.yate.ro/wiki/Register
yate.null.ro/archive/?action=show_msg&actionargs%5B%5D=72&actionargs%5B%5D=05

ссылка на оригинал статьи http://habrahabr.ru/post/198796/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *