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

в 20:29, , рубрики: ip-телефония, mysql, yate, метки: , ,

Хотел бы Вам рассказать о настройке Yate для работы с MySQL. Эту информацию можно найти в документации, но не у всех получается ее собрать во что-то цельное.
Настраиваем 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

Автор: Kolyanu4

Источник

Поделиться

* - обязательные к заполнению поля