Страница 1 из 1

dialplan mysql insert

Добавлено: 03 фев 2022, 14:24
lpn672
Всем привет.

Полазил и почитал форум по поводу вставки чего либо в мускул или поиска там именно из диалплана.
Большинство, если не все, используют конструкцию примерно так:

Код: Выделить всё

 same => n,MySql(connect connid ${DBCurrentHost} ${DBuser} ${DBpass} ${DBname})
 same => n,MySql(query resultid ${connid} INSERT INTO blacklist (callerid) VALUES('${BLACKNUMBER}')
 same => n,MySql(fetch fetchid ${resultid} blacklistid)
 same => n,NoOp(FetchID: ${fetchid} Var1: ${blacklistid} ConnID: ${connid} ResultID: ${resultid})
 


В общем все работает, но есть замечания.
Во-первых, на консоли и в логах шторм. Большинство запросов статических и работают с одним ответом из БД.
Во-вторых, в консоли и логах видны ваши учетные данные. Да, обычно вход с этими данными разрешен с localhost и прям угрозы не много. А если не localhost (host1 - asterisk, host2 - mysql)? Упс, опять же не большая, но проблемка назревает.
В-третьих, что-то поправить и/или найти становится долго. Файлы большие, много строк, а сути 0.
В-четверых, это просто жутко некузяво :geek: , ИМХО.

Предлагаю, или скажем хочу напомнить, про механизм func_odbc.
Проще, легче и читабельно.

1. Подключаемся к БД

Код: Выделить всё

--- res_odbc.conf ---
[asterisk]
enabled => yes
dsn => asterisk
username => asterisk
password => asterisk
pre-connect => yes
sanitysql => select 1
max_connections => 10
logging => yes
2. Описываем функцию

Код: Выделить всё

--- func_odbc.conf ---
[D1_BLACKLIST]
prefix=ODBC
dsn=asterisk
writesql=INSERT INTO blacklist (callerid,notes) VALUES('${SQL_ESC(${VAL1})}','${SQL_ESC(${VAL2})}')
И тут хочу нюансик уточнить. И хотя в доке пишут про ВЕРХНИЙ регистр, то следует учесть: имя таблицы РеГиСтРоЗаВиСиМо !

3. Пользуемся в диалплане
--- extensions.conf ---
exten => 69,1,NoOp(ADD TO BLACKLIST)
same => n,Playback(enter-num-blacklist)
same => n,Read(blk_callerid,beep,10,,1,15)
same => n,Playback(telephone-number)
same => n,SayDigits(${blk_callerid})
same => n,Set(ODBC_D1_BLACKLIST()=${blk_callerid},"added by ${CALLERID(num)}")
same => n,Hangup()
Надеюсь изложенное понравится асам, а новичкам меньше граблей будет.

Re: dialplan mysql insert

Добавлено: 03 фев 2022, 14:41
Zavr2008
От подобного и перезагрузки будут.
Не следует напрямую в БД лезть из диалплана.
Юзайте тот же AGI например, и там уже делайте что нужно.

Re: dialplan mysql insert

Добавлено: 09 фев 2022, 12:35
lpn672
Если есть такие опасения, тогда давайте подробнее.

Почему не следует лезть напрямую? Опыт / документация?
Текущая конфигурация настроена и опробована. Для подобных запросов настроен отдельный odbc. Баланс идет нормально. База не "затыкается".

"Ни единого разрыва" (с)...

Re: dialplan mysql insert

Добавлено: 09 фев 2022, 14:13
Ferrum
Хм тоже постоянно тягаю из бд, проблем за лет 8 не было, правда версия древняя 1.8, около 10к звонков в сутки

Re: dialplan mysql insert

Добавлено: 09 фев 2022, 15:43
Zavr2008
По льду тоже многие ходят и ничего, жалуются только те кто ноги-руки уже сломал. У остальных "нормально".
Просто нужно делать правильно, а не заниматься ананией.

Re: dialplan mysql insert

Добавлено: 11 фев 2022, 14:26
lpn672
Подробности можно узнать? Про "льОд" это конечно хорошо и поучительно, но хотелось бы понять ход Ваших мыслей. Если вы говорите "делать правильно" - ткните где правильно.

Re: dialplan mysql insert

Добавлено: 11 фев 2022, 14:48
Zavr2008
Ну гораздо проще же AGI использовать, тот же PHP. Там уже и MySQL подключайте и еще что хотите.
С учетом того что прямое использование MySQL в астере уже рудимент и всё через ODBC идет, то это и быстрее и надежнее.
Прямое использование запросов к БД в диалплане может приводить к утечкам памяти и других ресурсов, ну и к кернел паник в результате.