LINUX.ORG.RU
решено ФорумAdmin

odbc segfault

 , , ,


0

3

Был debian9, asterisk и postgres. В dialplan запускался скрипт, который внутри силами isql делает пару запросов.

Потребовалось обновиться. Развернул debian11, поставил те-же пакеты для asterisk/postgres/odbc. Конфиги и БД перенёс со старого сервера.

И теперь получаю ситуацию:

Asterisk работает успешно.

isql из консоли запускается, к БД цепляется, запросы выполняет.

Но, как только asterisk из dialplan запускает(SHELL) скрипт, у которого внутри вызов isql, то я ловлю segfault и запросы идут «коту под хвост».

авг 18 23:02:22 pbx kernel: isql[8136]: segfault at 0 ip 00007fb931af7846 sp 00007ffdbae8e4b8 error 4 in libc-2.31.so[7fb931a7f000+14b000]
авг 18 23:02:22 pbx kernel: Code: 0f 1f 40 00 66 0f ef c0 66 0f ef c9 66 0f ef d2 66 0f ef db 48 89 f8 48 89 f9 48 81 e1 ff 0f 00 00 48 81 f9 cf 0f 00 00 77 6a <f3> 0f 6f 20 66 0f 74 e0 66 0f d7 d4 85 d2 74 04 0f bc c2 c3 48 83

Беглый поиск привёл меня к «я дурак криво поставил/настроил odbc», тогда я откатил настройки odbc к по умолчанию и продолжил получать ошибку. Что касается «криво поставил», то тут даже добавить не чего odbc-postgresql из стандартного репозитория врятли может быть «кривым».

Куда ещё можно посмотреть? Складывается ощущение, что я забыл что-то установить, но разве оно не должно было придти в виде зависимостей?


root@pbx:~# cat /etc/odbc.ini
[PostgreSQL-asterisk]
Description         = PostgreSQL connection
Driver              = PostgreSQL ANSI
Trace               = No
TraceFile           = /tmp/psqlodbc.log
Database            = asterisk
Servername          = localhost
UserName            = $login
Password            = $passwd
Port                = 5432
ReadOnly            = No
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No
ConnSettings        =
...
root@pbx:~# cat /etc/odbcinst.ini 
[PostgreSQL ANSI]
Description=PostgreSQL ODBC driver (ANSI version)
Driver=psqlodbca.so
Setup=libodbcpsqlS.so
Debug=1
CommLog=1
UsageCount=1

[PostgreSQL Unicode]
Description=PostgreSQL ODBC driver (Unicode version)
Driver=psqlodbcw.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1

...

Мой скрипт, который падает будучи запущенным из asterisk dialplan

root@pbx:~# cat /usr/src/recall_me.sh 
#!/bin/bash

NUM=$1
request="select * from recall where number='${NUM}' and status='new'"

result=$(echo "${request}" | /usr/bin/isql PostgreSQL-asterisk $login $passwd -b -d'|' 2>&1)
if [ $? = 0 ]; then
  if [ -z "$result" ];then
    request="INSERT INTO recall(date, number, status) VALUES('$(date +"%F %T")', '${NUM}','new')"
    echo ${request} | /usr/bin/isql PostgreSQL-asterisk $login $passwd -b -d'|' 2>&1
  fi
  exit 0
else
  exit 1
fi

И в dialplan скрипт запускается вот такой конструкцией

exten => 9,3,Set(recall_request=${SHELL(bash /usr/src/recall_me.sh ${CALLERID(num)})})
★★

Ответ на: комментарий от Bloody

К этому asterisk написана кучка сторонней логики на bash и python, которые общаются с asterisk(ami) и разными БД (внутренней psql, внешними mysql, mssql).

И обновление затеяли т.к. надо было ещё и к asterisk подключить mysql, но так, чтобы он писал в том числе и cel таблицу.

Это asterisk умеет только через odbc. Да и зачем смешивать кучу различных sql клиентов в скриптах, когда можно odbc и пользоваться всем централизованно?

Flotsky ★★
() автор топика
Последнее исправление: Flotsky (всего исправлений: 1)
Ответ на: комментарий от Turbid

из самого Asterisk через func_odbc

А я так не умею. Если есть пример реализации той-же логики, что у меня или ссылка на примеры, то попробую адаптировать.

PS. А какая разница? asterisk пинает isql и я вижу segfault, что должно измениться если я буду использовать func_odbc?

Flotsky ★★
() автор топика
Ответ на: комментарий от Flotsky

А какая разница?

Лишняя сущность, которая, тем более, может заблочить весь контекст астериска.

https://asterisk-pbx.ru/wiki/asterisk/cf/func_odbc.conf

Чтобы не дергать GotoIf можно 2 запроса переписать в один типа такого:

INSERT INTO recall(date, number, status)
SELECT NOW(), ${ARG1}, 'new'
WHERE
    NOT EXISTS (
        SELECT * FROM recall WHERE number='${ARG1}' and status='new'
    );
Turbid ★★★★★
()
Ответ на: комментарий от Turbid

Спасибо, немного адаптировал, segfault больше нет, данные попадают в SQL.

Теперь буду какое-то время адаптировать другие bash скрипты в функции.

Всё равно странно, что в debian9 оно успешно работало, а в debian11 вдруг решило падать в segfault

Flotsky ★★
() автор топика