среда, 20 января 2016 г.

Проблемы при обновлении значения поля 'port' в Asterisk Realtime при использовании Mysql 5.7

При использовании MySQL 5.7 в качестве сервера баз данных для Asterisk Realtime столкнулся с проблемой когда, при хранении настроек SIP в Realtime, удаляется регистрация пользователя.

Asterisk в момент удаления регистрации пытается обновить данные в строке пользователя, чья регистрация удаляется, обнулить соответствующие поля, и при обновлении поля 'port' пытается выставить ему пустое значение, передавая в запросе port = '', очевидно такое действие с более старыми версиями MySQL прокатывало, а вот MySQL 5.7 Это не очень нравится.
В консоли Asterisk появляются вот такие ошибки:
[Jan 20 11:32:07] NOTICE[4432]: chan_sip.c:23396 handle_response_peerpoke: Peer 'test1' is now Reachable. (6ms / 2000ms) -- Unregistered SIP 'test1'
[Jan 20 11:32:13] WARNING[4432]: res_config_mysql.c:635 update_mysql: MySQL RealTime: Failed to update database: Incorrect integer value: '' for column 'port' at row 1
[Jan 20 11:32:13] WARNING[4432]: res_config_mysql.c:635 update_mysql: MySQL RealTime: Failed to update database: Incorrect integer value: '' for column 'port' at row 1 

Причём данная проблема уже известна c версии 11.16 и в 11.17 исправлена . Я наткнулся на эту проблему в версии Asterisk 11.6-cert11 пришлось править исходник chan_sip



И так, Asterisk у нас собран из исходников, по этому открываем файл chan_sip.c , у меня он расположен тут - /usr/src/certified-asterisk-11.6-cert11/channels/chan_sip.c, и правим строчку 15532 вот с таким содержанием:

ast_update_realtime(tablename, "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "regserver", "", "useragent", "", "lastm


после поля "port" там стоит пустое значение "" заменяем его на "0"

Далее находим строчку 4958 в том же файле, со следующим содержанием:

st_copy_string(port, ast_sockaddr_port(addr) ? ast_sockaddr_stringify_port(addr) : "", sizeof(port));


И правим очередные пустые кавычки "" на "0"

После этого потребуется по новой скомпилировать исходники, в папке с Asterisk выполняем make, а затем просто копируем получившийся модуль в папку модулей Asterisk:

cp /usr/src/certified-asterisk-11.6-cert11/channels/chan_sip.so /usr/lib64/asterisk/modules/chan_sip.so


Если даже сервер запущен, после копирования потребуется только сделать sip reload чтобы применились изменения.

Проверяем, что у нас получилось, подключаемся клиентом и отключаемся:

[Jan 20 11:35:08] NOTICE[4432]: chan_sip.c:23396 handle_response_peerpoke: Peer 'test1' is now Reachable. (12ms / 2000ms)
 -- Unregistered SIP 'test1'
 -- Registered SIP 'test1' at 10.54.76.14:5060
 -- Unregistered SIP 'test1'
 -- Registered SIP 'test1' at 10.54.76.14:5060

Проблема решена!

P.S Большое спасибо Игорю Павлову за помощь в поисках второй строки с косяком  в chan_sip.c :)



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

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

Яндекс.Метрика