Хотел бы Вам рассказать о настройке 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
У данного файла несколько предназначений. Используется для:
- аутентификации, регистрации и роутинга (маршрутизации) пользователей, которые хранятся в базе
- записи CDR данных в базу
- для обновления информации пользователей
Я рассмотрю только первое. Что бы добавить аутентификацию для пользователей с базы данных нам нужно указать, что мы будем обрабатывать сообщение «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