Был 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)})})