+
Итак приступим!
Сборка
Первым делом нужно собрать 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
yate.null.ro/archive/?action=show_msg&actionargs%5B%5D=72&actionargs%5B%5D=05
ссылка на оригинал статьи http://habrahabr.ru/post/198796/
Добавить комментарий