Есть чистый астериск, установленный из исходников. Задача поднять драйвер ODBC с удаленной БД, настроить realtime и совершить тестовый звонок...
Первым делом проверим подключение к удаленному Mysql серверу:
# mysql -h 172.26.0.154 -u asteriskuser -p
Enter password: вводим пароль пользователя... и
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 87
Server version: 5.1.69 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
есть коннект! Вводим \q для выхода из шелла БД
Далее настройка ODBC:
Первым делом проверяем наличие драйверов ODBC для подключения к базам данных:
# cat /etc/odbcinst.ini
и если видим такое
# Example driver definitions
# Driver from the postgresql-odbc package
# Setup from the unixODBC package
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/psqlodbc.so
Setup = /usr/lib/libodbcpsqlS.so
Driver64 = /usr/lib64/psqlodbc.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
значит всё нормально: в нашем случае подключено два драйвера: один для работы с БД PostgreSQL, другой для БД MySQL. Если не предполагается использовать PostgreSQL, драйвер для ее можно отключить.
Дальше нас интересует файл /etc/odbc.ini
# cat /etc/odbc.ini
у меня он пустой...
открываем его в редакторе и приводим его к такому состоянию:
# nano /etc/odbc.ini
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
driver=MySQL
server=172.26.0.154
database=asteriskcdrdb
UserName=myuser
Password=mypasswOrd
Port=3306
[MySQL-realtime]
Description=MySQL connection to 'asterisk' database
driver=MySQL
server=172.26.0.154
database=atm
UserName=myuser
Password=mypasswOrd
Port=3306
Таким образом мы создаем два подключения к БД: одно для сохранения CDR, другое для системы realtime
Далее переходим к конфигурации asterisk
# nano /home/asterisk/asterisk-bin/asterisk/res_odbc.conf
и дописываем туда следующие строки:
[asteriskcdrdb]
enabled=>yes
dsn=>MySQL-asteriskcdrdb
pooling=>yes
limit=>10
pre-connect=>yes
username=>myuser
password=>mypasswOrd
[aster-realtime]
enabled=>yes
dsn=>MySQL-realtime
pooling=>yes
limit=>10
pre-connect=>yes
username=>myuser
password=>mypasswOrd
Ну а теперь подключимся к Астериск и проверим наш коннект к БД:
# asterisk -rvvvvvvvvv
asterisk*CLI> odbc show
и если видим это....
ODBC DSN Settings
-----------------
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Last connection attempt: 2013-08-21 07:53:43
Pooled: Yes
Limit: 10
Connections in use: 0
Name: aster-realtime
DSN: MySQL-realtime
Last connection attempt: 2013-08-21 07:53:43
Pooled: Yes
Limit: 10
Connections in use: 0
значит драйвер ODBC сконфигурирован, но не смог подключиться к базе данных. Проверяем...
# echo 'select * from pg_stat_activity' | isql -v MySQL-asteriskcdrdb
и получаем ответ: [01000][unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc5.so' : file not found
который говорит об отсутствии нужной библиотеки
# yum provides /usr/lib64/libmyodbc5.so
...
mysql-connector-odbc-5.1.5r1144-7.el6.x86_64 : ODBC driver for MySQL
Repo : base
Matched from:
Filename : /usr/lib64/libmyodbc5.so
# yum install mysql-connector-odbc
опять проверяем коннект... и если получаем ответ типа такого: [S1000][unixODBC][MySQL][ODBC 5.1 Driver]Access denied for user 'root'@'172.26.0.199' (using password: YES), значит драйвер ODBC работает. Теперь проверим подключение из астериска:
asterisk*CLI> odbc show
ODBC DSN Settings
-----------------
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Last connection attempt: 1970-01-01 00:00:00
Pooled: Yes
Limit: 10
Connections in use: 1
- Connection 1: connected
Name: aster-realtime
DSN: MySQL-realtime
Last connection attempt: 1970-01-01 00:00:00
Pooled: Yes
Limit: 10
Connections in use: 1
- Connection 1: connected
И если в консоли астериска получили такой вывод - значит к удаленной БД законнектились!
Далее настроим сохранение CDR записей.
# nano /home/asterisk/asterisk-bin/asterisk/cdr_odbc.conf
и приведем его к такому виду:
;
; cdr_odbc.conf
;
[global]
dsn=asteriskcdrdb
loguniqueid=yes
dispositionstring=yes
table=cdr ;"cdr" is default table name
usegmtime=yes ; set to "yes" to log in GMT
;hrtime=yes ;Enables microsecond accuracy with the billsec and duration fields
ну и проверяем:
asterisk*CLI> cdr show status
Call Detail Record (CDR) settings
----------------------------------
Logging: Enabled
Mode: Simple
Log unanswered calls: No
Log congestion: No
* Registered Backends
-------------------
Adaptive ODBC
cdr-custom
Теперь механизм asterisk-realtime. У меня реализована динамическая конфигурация объектов SIP...
Все настройки архитектуры реального времени описываются в файле /home/asterisk/asterisk-bin/asterisk/extconfig.conf
туда я добавил следующие строки:
sippeers => odbc,aster-realtime,sip_trunks
sipusers => odbc,aster-realtime,sip_trunks
Пример таблицы для sip объектов:
+-------+----------+------------+--------+--------+----------------+---------------+
|name | host | secret |ipaddr | port |regseconds | username |
+-------+----------+------------+--------+--------+----------------+---------------+
|100 |dynamic |welcome| | |1096 | 54152 | 1000 |
+------+-----------+-----------+----+---+--------+----------------+---------------+
Более подробно эти поля описаны здесь.
На этом можно считать механизм realtime настронным, но если в консоли астериска набрать команду sip show peers, ожидаемого результата вы не увидите... Дело в том, что астериск realtime-объекты долго в памяти не хранит, а обращается к БД по мере необходимости запроса информации по объектам. Пойдем дальше и немного поправим ситуацию. Откроем на редактирование файл /home/asterisk/asterisk-bin/asterisk/sip.conf и найдем там секцию, описывающую механизм realtime (REALTIME SUPPORT, это примерно 993 строка) и там (примерно в 997 строке) параметр rtcachefriends установим в yes. Т.е. должна получиться запись вида rtcachefriends=yes
Теперь идем в консоль астериска и проверяем:
asterisk*CLI> core reload
asterisk*CLI> sip show peers
Name/username Host Dyn Forcerport ACL Port Status Description Realtime
300/300 192.168.2.254 D 21254 OK (111 ms) Cached RT
401/401 192.168.2.11 D 5060 OK (120 ms) Cached RT
402/402 192.168.2.11 D 5060 OK (128 ms) Cached RT
403/403 192.168.2.11 D 5060 OK (121 ms) Cached RT
404/404 192.168.2.11 D 5060 OK (121 ms) Cached RT
uzbek2-8-1/uzbek2-8-1 172.26.102.253 D 5060 OK (184 ms) Cached RT
uzbek2-8-2/uzbek2-8-2 172.26.102.253 D 5060 OK (188 ms) Cached RT
7 sip peers [Monitored: 7 online, 0 offline Unmonitored: 0 online, 0 offline]
И мы видим все наши пиры!
Так, осталось зацепить общие для астерисков конфиги, в нашем случае это диалплан:
# mv /home/asterisk/asterisk-bin/asterisk/extensions.conf /home/asterisk/asterisk-bin/asterisk/extensions.conf.bak
# ln -s /mnt/asterisk/config/extensions.conf /home/asterisk/asterisk-bin/asterisk/extensions.conf
и в консоли астериска:
asterisk*CLI> core reload
asterisk*CLI> dialplan show
и если мы увидели наш диалплан, значит всё в порядке, если нет - копаем дальше...
А теперь пришло время нашего тестового звонка...
P.S. Не забудьте о дополнительной защите АТС