Понадобилось быстрое решение - не ломая существующей логики работы АТС на базе Elastix, внедрить проверку звонящего по номеру и сопоставить его с его личным менеджером. Руководство компании было против каких-либо IVR и тому подобного, требовался просто перевод на номер менеджера. Поэтому, поразмыслив, я принял решение организовать подобный проброс звонка с проверкой привязки CID к конретному extension в базе данных MySQL. Проверку решил сделать с помощью ODBC.
Что требуется сделать:
1. Доставить библиотеки
yum install libtool-ltdl mysql-connector-odbc
2. Создать базу данных с двумя полями cid и extension (в принципе можно реализовать и подстановку имени или названия компании в CALLERID(name), создав дополнительные поля в БД и чуть усложнив логику, но в данный момент мне этого было ненужно)
3. Прописать в файлике
/etc/odbcinst.ini коннектор к библиотекам
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc3.so
Setup = /usr/lib/libodbcmyS.so
FileUsage = 1
4. Прописать в файлике
/etc/odbc.ini коннектор к базе mysql
[cidroute]
Driver = MySQL
Server = localhost
Port = 3306
User = mysql_user
Password = mysql_password
Database = cidroute
Socket =
5. Протестировать соединение
isql -v cidroute (может потребоваться перезагрузка)
6. Прописать в файлике астериска
res_odbc.conf коннект к odbc
[cidroute]
enabled => yes
dsn => cidroute
username => mysql_user
password => mysql_password
pooling => no
limit => 1
pre-connect => yes
7. Прописать в файлике астериска
func_odbc.conf функцию для вызова
[CIDROUTE]
dsn=cidroute
readsql=SELECT extension FROM numbers WHERE cid='${CALLER}'
8. Прописать в файлике астериска
extensions_additional.conf в логике входящих звонков (к примеру в настройках входящих в транк) проверку на присутствие в базе внешнего номера
[from-trunk-sip-70123456789]
include => from-trunk-sip-70123456789-custom
exten => _.,1,Set(CALLER=${CALLERID(num)})
exten => _.,n,Set(resultid=${ODBC_CIDROUTE()})
exten => _.,n,Set(GROUP()=OUT_15)
exten => _.,n,ExecIf($["${resultid}" > ""]?Goto(from-trunk,${resultid},1)
exten => _.,n,Goto(from-trunk,${EXTEN},1)
9. Если что-либо не идет - первым делом протестировать коннект с odbc из астериска
odbc show all