- Теория
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). Если задано целое значение, регистрация будет действительна в течение этого количества секунд, а не в течение обычного срока действия регистрации.
Статья опубликована: 2018-10-16 15:31:05
Последние правки: 2018-10-17 11:45:45
Для домашней АТС использование MySQL как хранилки данных asterisk - так себе идея, ну какая разница, где лежат настройки пяти SIP клиентов - в БД или в sip.conf? Все равно они меняются раз в 10 лет. Единственный, правда тоже сомнительный для домашнего сервера плюс хранения клиентов в БД - при добавлении/удалении не надо перезагружать asterisk. Но вот когда у вас 1000 абонентов или захочется написать нечто, требующее просмотра данных из asterisk или их изменения, самое простое - это работа с базой данных. Приступим.