Вы здесь

Настройка Aserisk для работы с удаленной БД через драйвер ODBC

Есть чистый астериск, установленный из исходников. Задача поднять драйвер 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. Не забудьте о дополнительной защите АТС