Главная
Главная Руководства Asterisk › Asterisk 13 RealTime с MySQL



Автор:

Статья опубликована: 2018-10-16 15:31:05
Последние правки: 2018-10-17 11:45:45

Для домашней АТС использование MySQL как хранилки данных asterisk - так себе идея, ну какая разница, где лежат настройки пяти SIP клиентов - в БД или в sip.conf? Все равно они меняются раз в 10 лет. Единственный, правда тоже сомнительный для домашнего сервера плюс хранения клиентов в БД - при добавлении/удалении не надо перезагружать asterisk. Но вот когда у вас 1000 абонентов или захочется написать нечто, требующее просмотра данных из asterisk или их изменения, самое простое - это работа с базой данных. Приступим.

  • Теория
    Asterisk RealTime - механизм конфигурации для Asterisk использующий внешние хранилища данных, что обеспечивает легкую и единообразную интеграцию между конфигурационными структурами, которые используются в Asterisk и внешними SQL базами данных. При этом, вместо любого конфигурационного файла можно использовать данные, полученные из БД, или вместо специальных конфигурационных записей, которые могут требовать частого изменения в реальном времени, использовать полученные из БД данные для динамического создания этих объектов, записей, пиров и т.д. без необходимости перезагрузки.

    Драйвер - скомпилированный модуль, содержащий код специфичный для конкретной базы данных, который позволяет совершать операции, необходимые для работы механизма RealTime. Например: ODBC или MySQL.
    конфигурационное семейство (Family) - имя, которое ассоциировано с вызовами через механизм RealTime. Например: sippeers, sipusers, voicemail.
    extconfig.conf - файл конфигурации, содержащий информацию необходимую для связи определенного конфигурационного семейства с определенным драйвером.
    res_config_mysql.conf - файл конфигурации для MySQL RealTime.


  • Исходные данные
    # uname -sr
    FreeBSD 11.2-RELEASE-p3
    # pkg info | grep asterisk
    asterisk13-13.23.1             Open Source PBX and telephony toolkit
    # pkg info | grep mysql
    mysql56-server-5.6.41_2        Multithreaded SQL database (server)
    

  • MySQL
    Делаем базу и пользователя:
    mysql> create database asterisk;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> grant all privileges on asterisk.* to 'asterisk'@'localhost' identified by 'AsteriskPassword';
    Query OK, 0 rows affected (0.01 sec)
    

  • Конфигурация порта asterisk
    Опция, которая должна быть установлена при компиляции порта:
    # cd /usr/ports/net/asterisk13
    # make config
    ...
    [x] MYSQL             MySQL database support
    ...
    
    У меня asterisk был установлен без этой опции, поэтому делал переустановку с включенной MYSQL
    # cd /usr/ports/net/asterisk13
    # make reinstall clean
    

  • res_config_mysql.conf
    Ищем файл /usr/local/etc/asterisk/res_config_mysql.conf, где в секции [general] раскомментируем и изменим нужные нам строчки
    [general]
    dbname = asterisk
    dbuser = asterisk
    dbpass = AsteriskPassword
    dbsock = /tmp/mysql.sock
    dbcharset = utf8
    
    Все перфекционисты знают, что при подключении к MySQL на localhost, нужно использовать unix socket вместо сетевой подсистемы, я так и сделал (dbsock).
    На этом этапе подключение астериска к MySQL считается завершенным.
    Вы спросите - и это все? Нет, это не все. Остальной функционал настраивается уже в модулях снежинки, о чем я расскажу ниже.


  • sippeers, sipusers, sipregs familys
    Используем для хранения данных об extensions и об их регистрации. При этом, для описания extensions вы все также параллельно можете использовать и файл sip.sonf.
    Добавляем в mysql табличку:
    CREATE TABLE IF NOT EXISTS `asterisk`.`sip` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(10) NOT NULL,
    `ipaddr` varchar(15) DEFAULT NULL,
    `port` int(5) DEFAULT NULL,
    `regseconds` int(11) DEFAULT NULL,
    `defaultuser` varchar(10) DEFAULT NULL,
    `fullcontact` varchar(35) DEFAULT NULL,
    `regserver` varchar(20) DEFAULT NULL,
    `useragent` varchar(20) DEFAULT NULL,
    `lastms` int(11) DEFAULT NULL,
    `host` varchar(40) DEFAULT NULL,
    `type` enum('friend','user','peer') DEFAULT NULL,
    `context` varchar(40) DEFAULT NULL,
    `permit` varchar(40) DEFAULT NULL,
    `deny` varchar(40) DEFAULT NULL,
    `secret` varchar(40) DEFAULT NULL,
    `md5secret` varchar(40) DEFAULT NULL,
    `remotesecret` varchar(40) DEFAULT NULL,
    `transport` enum('udp','tcp','udp,tcp','tcp,udp') DEFAULT NULL,
    `dtmfmode` enum('rfc2833','info','shortinfo','inband','auto') DEFAULT NULL,
    `directmedia` enum('yes','no','nonat','update') DEFAULT NULL,
    `nat` varchar(50) DEFAULT NULL,
    `callgroup` varchar(40) DEFAULT NULL,
    `pickupgroup` varchar(40) DEFAULT NULL,
    `language` varchar(40) DEFAULT NULL,
    `disallow` varchar(40) DEFAULT NULL,
    `allow` varchar(40) DEFAULT NULL,
    `insecure` varchar(40) DEFAULT NULL,
    `trustrpid` enum('yes','no') DEFAULT NULL,
    `progressinband` enum('yes','no','never') DEFAULT NULL,
    `promiscredir` enum('yes','no') DEFAULT NULL,
    `useclientcode` enum('yes','no') DEFAULT NULL,
    `accountcode` varchar(40) DEFAULT NULL,
    `setvar` varchar(40) DEFAULT NULL,
    `callerid` varchar(40) DEFAULT NULL,
    `amaflags` varchar(40) DEFAULT NULL,
    `callcounter` enum('yes','no') DEFAULT NULL,
    `busylevel` int(11) DEFAULT NULL,
    `allowoverlap` enum('yes','no') DEFAULT NULL,
    `allowsubscribe` enum('yes','no') DEFAULT NULL,
    `videosupport` enum('yes','no') DEFAULT NULL,
    `maxcallbitrate` int(11) DEFAULT NULL,
    `rfc2833compensate` enum('yes','no') DEFAULT NULL,
    `mailbox` varchar(40) DEFAULT NULL,
    `session-timers` enum('accept','refuse','originate') DEFAULT NULL,
    `session-expires` int(11) DEFAULT NULL,
    `session-minse` int(11) DEFAULT NULL,
    `session-refresher` enum('uac','uas') DEFAULT NULL,
    `t38pt_usertpsource` varchar(40) DEFAULT NULL,
    `regexten` varchar(40) DEFAULT NULL,
    `fromdomain` varchar(40) DEFAULT NULL,
    `fromuser` varchar(40) DEFAULT NULL,
    `qualify` varchar(40) DEFAULT NULL,
    `defaultip` varchar(40) DEFAULT NULL,
    `rtptimeout` int(11) DEFAULT NULL,
    `rtpholdtimeout` int(11) DEFAULT NULL,
    `sendrpid` enum('yes','no') DEFAULT NULL,
    `outboundproxy` varchar(40) DEFAULT NULL,
    `callbackextension` varchar(40) DEFAULT NULL,
    `registertrying` enum('yes','no') DEFAULT NULL,
    `timert1` int(11) DEFAULT NULL,
    `timerb` int(11) DEFAULT NULL,
    `qualifyfreq` int(11) DEFAULT NULL,
    `constantssrc` enum('yes','no') DEFAULT NULL,
    `contactpermit` varchar(40) DEFAULT NULL,
    `contactdeny` varchar(40) DEFAULT NULL,
    `usereqphone` enum('yes','no') DEFAULT NULL,
    `textsupport` enum('yes','no') DEFAULT NULL,
    `faxdetect` enum('yes','no') DEFAULT NULL,
    `buggymwi` enum('yes','no') DEFAULT NULL,
    `auth` varchar(40) DEFAULT NULL,
    `fullname` varchar(40) DEFAULT NULL,
    `trunkname` varchar(40) DEFAULT NULL,
    `cid_number` varchar(40) DEFAULT NULL,
    `callingpres` enum('allowed_not_screened','allowed_passed_screen','allowed_failed_screen','allowed','prohib_not_screened','prohib_passed_screen','prohib_failed_screen','prohib') DEFAULT NULL,
    `mohinterpret` varchar(40) DEFAULT NULL,
    `mohsuggest` varchar(40) DEFAULT NULL,
    `parkinglot` varchar(40) DEFAULT NULL,
    `hasvoicemail` enum('yes','no') DEFAULT NULL,
    `subscribemwi` enum('yes','no') DEFAULT NULL,
    `vmexten` varchar(40) DEFAULT NULL,
    `autoframing` enum('yes','no') DEFAULT NULL,
    `rtpkeepalive` int(11) DEFAULT NULL,
    `call-limit` int(11) DEFAULT NULL,
    `g726nonstandard` enum('yes','no') DEFAULT NULL,
    `ignoresdpversion` enum('yes','no') DEFAULT NULL,
    `allowtransfer` enum('yes','no') DEFAULT NULL,
    `dynamic` enum('yes','no') DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`),
    KEY `ipaddr` (`ipaddr`,`port`),
    KEY `host` (`host`,`port`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    Табличка волшебная и используется для хранения данных сразу трех семейств. Описание полей:
    • name - номер телефона
    • ipaddr - заполняет сервер
    • port - заполняет сервер
    • regseconds - заполняет сервер
    • fullcontact - заполняет сервер
    • regserver
    • useragent - заполняет сервер
    • lastms - заполняет сервер
    • host - IP адрес или имя хоста или dynamic, если телефон должен самостоятельно регистрировался.
    • type - возможные значения: friend, peer, user
    • context - контекст плана набора из extensions.conf (например, from-internal), в который попадают вызовы, поступающие от данного клиента.
    • deny - ip/подсеть, из которых можно регистрироваться на этот номер. Например: 192.168.1.1
    • permit - ip/подсеть, из которых нельзя регистрироваться на этот номер. Например: 0.0.0.0/0.0.0.0
    • secret - пароль в открытом виде
    • md5secret - пароль в md5. Имеет приоритет перед паролем из поля secret. Создается командой (пользователь "100", ":asterisk:" - обязательно, "Pass" - пароль):
      # echo -n "100:asterisk:Pass" | md5
      
    • remotesecret - не нашел, для какой ситуации использовать, оставил пустым
    • transport - tcp,udp, но лучше не задавать, чтобы использовались настройки с сервера
    • dtmfmode - rfc2833/info/shortinfo/inband/auto
    • directmedia - yes/no/nonat/update
    • nat - no или force_rport,comedia
    • callgroup
    • pickupgroup
    • language - ru
    • disallow - запрещенные кодеки (all)
    • allow - разрешенные кодеки (ilbc;g729;gsm;g723;alaw;ulaw)
    • insecure
    • trustpid
    • progressinband
    • promiscredir
    • useclientcode
    • accountcode
    • setvar
    • callerid - отображаемое во входящих название звонящего
    • amaflags
    • callcounter
    • busylevel
    • allowoverlap
    • allowsubscribe
    • videosupport
    • maxcallbitrate
    • rfc2833compensate
    • mailbox - 100@default - у клиента есть голосовой ящик 100 в контексте голосовых ящиков [default]
    • session-timers
    • session-expires
    • session-minse
    • session-refresher
    • t38pt_usertpsource
    • regexten
    • fromdomain
    • fromuser
    • qualify - периодическая проверка доступности клиента. Возможные значения: yes(проверка каждые 2 секунды)/no/время в милисекундах.
    • defaultip - IP адрес клиента по умолчанию, когда host=dynamic. Используется, если клиент еще не зарегистрировался, при необходимости его вызова.
    • rtptimeout - значение в секундах. Прервать вызов, если нет активности RTP медиапотока более чем задано и если линия не находится в режиме удержания (hold).
    • rtpholdtimeout - значение в секундах. Прервать вызов, если в режиме удержания линии (hold) нет активности RTP медиапотока более чем задано. Значение должно быть больше, чем rtptimeout.
    • sendrpid
    • outboundproxy - адрес прокси сервера для исходящих вызовов (только для type = peer)
    • callbackextension
    • registertrying
    • timer1
    • timerb
    • qualifyreq
    • constantssrc
    • contactpermit
    • contactdeny
    • usereqphone
    • textsupport
    • faxdetect
    • buggymwi
    • auth - ссылка на запись из секции [authentication] (только для type = peer).
    • fullname
    • trunkname
    • cid_number
    • callgroup
    • callingpres
    • mohinterpret
    • mohsuggest
    • parkinglot
    • hasvoicemail
    • subscribemwi
    • vmexten
    • autoframing
    • rtpkeepalive
    • call-limit - ограничение на кол-во вызовов. Для type=peer - на исходящие, для type=user - на входящие.
    • g926nonstandart
    • ignoresdpversion
    • allowtransfer - yes/no - разрешить/запретить перевод вызова для этого пользователя.
    • dynamic

    Файл /usr/local/etc/asterisk/extconfig.conf. Найти, раскомментировать и поменять строку:
    sippeers => mysql,general,sip
    sipusers => mysql,general,sip
    sipregs => mysql,general,sip
    
    Здесь мы говорим астеру использовать для заданных семейств базу данных mysql, подключение к которой описано в секции [general] файла res_config_mysql.conf, и таблицу с названием sip.

    Файл /usr/local/etc/asterisk/sip.conf. Строки:
    rtcachefriends=yes
    rtupdate=yes
    rtautoclear=yes
    
    rtcachefriends - данные extension кешируются, чтобы клиента можно было увидеть командой sip show peers
    rtupdate - при регистрации клиента, в БД пишутся поля ipaddr, port, regseconds, fullcontact, useragent, lastms
    rtautoclear - если задано значение yes, то по истечении срока действия регистрации соединение типа friend, созданное «на лету», исчезнет из конфигурации до следующей регистрации (а также в БД обнулятся поля ipaddr, port, regseconds, fullcontact, useragent). Если задано целое значение, регистрация будет действительна в течение этого количества секунд, а не в течение обычного срока действия регистрации.