...

пятница, 25 октября 2013 г.

Настраиваем 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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий