MySQLAsterisk umożliwia przeniesienie części konfiguracji z plików
do bazy danych np. MySQL lub PostgreSQL. Taki tryb pracy Asterisk-a
nazywa się Realtime. Gdyż zmiany na bazie danych powodują automatyczną
zmianę pracy konfiguracji. Gdyby edytować dialplan w pliku, należałoby
ponownie załadować konfigurację komendą:
root# asterisk -rx 'dialplan reload'
Zmiany w sip.conf:
root# asterisk -rx 'sip reload'
Tak wystarczy UPDATE na odpowiedniej kolumnie i Asterisk będzie działał
z aktualną konfiguracją.
Do bazy danych można między innymi przenieść:
- skrzynki poczty głosowej
- dialplan
- sip.conf
- kolejki i konsultantów (members)
- CDR-y - rejestr połączeń
Poniższy przykład jak tego dokonać będzie dotyczył silnika MySQL.
Należy zainstalować Asterisk zgodnie z procesem przedstawionym w zakładce instalacja.
Należy zainstalować devele MySQL oraz Asterisk Add-ons.
Tworzymy domyślną bazę danych:
##
##Database: `asterisk`
##
CREATE DATABASE `asterisk` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `asterisk`;
##########################################################
##
##Table structure for table `cdr`
##
CREATE TABLE IF NOT EXISTS `cdr` (
`recid` mediumint(8) unsigned NOT NULL auto_increment COMMENT 'Record ID',
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`uniqueid` varchar(32) NOT NULL default '',
`userfield` varchar(255) NOT NULL default '',
PRIMARY KEY (`recid`),
KEY `calldate` (`calldate`),
KEY `dst` (`dst`),
KEY `accountcode` (`accountcode`),
KEY `src` (`src`),
KEY `disposition` (`disposition`),
KEY `uniqueid` (`uniqueid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
##########################################################
##
##Table structure for table `queue_members`
##
CREATE TABLE IF NOT EXISTS `queue_members` (
`queue_name` varchar(128) NOT NULL default '',
`interface` varchar(128) NOT NULL default '',
`penalty` int(11) default NULL,
`uniqueid` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`queue_name`,`interface`,`uniqueid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
##########################################################
##
##Table structure for table `queues`
##
CREATE TABLE IF NOT EXISTS `queues` (
`name` varchar(128) NOT NULL,
`musiconhold` varchar(128) default 'default',
`announce` varchar(128) default NULL,
`context` varchar(128) default NULL,
`timeout` int(11) default '60',
`monitor_join` tinyint(1) default NULL,
`monitor_format` varchar(128) default NULL,
`queue_youarenext` varchar(128) default NULL,
`queue_thereare` varchar(128) default NULL,
`queue_callswaiting` varchar(128) default NULL,
`queue_holdtime` varchar(128) default NULL,
`queue_minutes` varchar(128) default NULL,
`queue_seconds` varchar(128) default NULL,
`queue_lessthan` varchar(128) default NULL,
`queue_thankyou` varchar(128) default NULL,
`queue_reporthold` varchar(128) default NULL,
`announce_frequency` int(11) default NULL,
`announce_round_seconds` int(11) default NULL,
`announce_holdtime` varchar(128) default NULL,
`periodic_announce` varchar(128) default NULL,
`periodic_announce_frequency` int(11) default NULL,
`retry` int(11) default '5',
`ringinuse` varchar(5) NOT NULL default 'no',
`autofill` varchar(5) NOT NULL default 'yes',
`autopause` varchar(5) NOT NULL default 'no',
`setinterfacevar` varchar(5) NOT NULL default 'yes',
`wrapuptime` int(11) default '30',
`maxlen` int(11) default NULL,
`servicelevel` int(11) default NULL,
`strategy` varchar(128) default 'ringall',
`joinempty` varchar(128) default 'no',
`leavewhenempty` varchar(128) default 'yes',
`eventmemberstatus` tinyint(1) default NULL,
`eventwhencalled` tinyint(1) default NULL,
`reportholdtime` tinyint(1) default NULL,
`memberdelay` int(11) default NULL,
`weight` int(11) default NULL,
`timeoutrestart` tinyint(1) default NULL,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
##########################################################
##
##Table structure for table `sip`
##
CREATE TABLE IF NOT EXISTS `sip` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(80) NOT NULL DEFAULT '',
`context` varchar(80) DEFAULT NULL,
`callingpres` enum('allowed_not_screened','allowed_passed_screen','allowed_failed_screen',
'allowed','prohib_not_screened','prohib_passed_screen','prohib_failed_screen','prohib',
'unavailable') DEFAULT 'allowed_not_screened',
`deny` varchar(95) DEFAULT NULL,
`permit` varchar(95) DEFAULT NULL,
`secret` varchar(80) DEFAULT NULL,
`md5secret` varchar(80) DEFAULT NULL,
`remotesecret` varchar(250) DEFAULT NULL,
`transport` enum('tcp','udp','tcp,udp') DEFAULT NULL,
`host` varchar(31) NOT NULL DEFAULT '',
`nat` varchar(5) NOT NULL DEFAULT 'no',
`type` enum('user','peer','friend') NOT NULL DEFAULT 'friend',
`accountcode` varchar(20) DEFAULT NULL,
`amaflags` varchar(13) DEFAULT NULL,
`callgroup` varchar(10) DEFAULT NULL,
`callerid` varchar(80) DEFAULT NULL,
`defaultip` varchar(15) DEFAULT NULL,
`dtmfmode` varchar(7) DEFAULT NULL,
`fromuser` varchar(80) DEFAULT NULL,
`fromdomain` varchar(80) DEFAULT NULL,
`insecure` varchar(4) DEFAULT NULL,
`language` char(2) DEFAULT NULL,
`mailbox` varchar(50) DEFAULT NULL,
`pickupgroup` varchar(10) DEFAULT NULL,
`qualify` char(3) DEFAULT NULL,
`regexten` varchar(80) DEFAULT NULL,
`rtptimeout` char(3) DEFAULT NULL,
`rtpholdtimeout` char(3) DEFAULT NULL,
`setvar` varchar(100) DEFAULT NULL,
`disallow` varchar(100) DEFAULT 'all',
`allow` varchar(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw',
`fullcontact` varchar(80) NOT NULL DEFAULT '',
`ipaddr` varchar(15) NOT NULL DEFAULT '',
`port` mediumint(5) unsigned NOT NULL DEFAULT '0',
`username` varchar(80) NOT NULL DEFAULT '',
`defaultuser` varchar(80) NOT NULL DEFAULT '',
`subscribecontext` varchar(80) DEFAULT NULL,
`directmedia` enum('yes','no') DEFAULT NULL,
`trustrpid` enum('yes','no') DEFAULT NULL,
`sendrpid` enum('yes','no') DEFAULT NULL,
`progressinband` enum('never','yes','no') DEFAULT NULL,
`promiscredir` enum('yes','no') DEFAULT NULL,
`useclientcode` enum('yes','no') DEFAULT NULL,
`callcounter` enum('yes','no') DEFAULT NULL,
`busylevel` int(10) unsigned DEFAULT NULL,
`allowoverlap` enum('yes','no') DEFAULT 'yes',
`allowsubscribe` enum('yes','no') DEFAULT 'yes',
`allowtransfer` enum('yes','no') DEFAULT 'yes',
`ignoresdpversion` enum('yes','no') DEFAULT 'no',
`template` varchar(100) DEFAULT NULL,
`videosupport` enum('yes','no','always') DEFAULT 'no',
`maxcallbitrate` int(10) unsigned DEFAULT NULL,
`rfc2833compensate` enum('yes','no') DEFAULT 'yes',
`session-timers` enum('originate','accept','refuse') DEFAULT 'accept',
`session-expires` int(5) unsigned DEFAULT '1800',
`session-minse` int(5) unsigned DEFAULT '90',
`session-refresher` enum('uac','uas') DEFAULT 'uas',
`t38pt_usertpsource` enum('yes','no') DEFAULT NULL,
`outboundproxy` varchar(250) DEFAULT NULL,
`callbackextension` varchar(250) DEFAULT NULL,
`registertrying` enum('yes','no') DEFAULT 'yes',
`timert1` int(5) unsigned DEFAULT '500',
`timerb` int(8) unsigned DEFAULT NULL,
`qualifyfreq` int(5) unsigned DEFAULT '120',
`contactpermit` varchar(250) DEFAULT NULL,
`contactdeny` varchar(250) DEFAULT NULL,
`lastms` int(11) NOT NULL,
`regserver` varchar(100) NOT NULL DEFAULT '',
`regseconds` int(11) NOT NULL DEFAULT '0',
`useragent` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `name_2` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC ;
##########################################################
#
# Table structure for table `extensions_table`
#
CREATE TABLE `extensions` (
`id` int(11) NOT NULL auto_increment,
`context` varchar(20) NOT NULL default '',
`exten` varchar(20) NOT NULL default '',
`priority` tinyint(4) NOT NULL default '0',
`app` varchar(20) NOT NULL default '',
`appdata` varchar(128) NOT NULL default '',
PRIMARY KEY (`context`,`exten`,`priority`),
KEY `id` (`id`)
) TYPE=MyISAM;
##########################################################
##
##Table structure for table `voicemail_messages`
##
CREATE TABLE IF NOT EXISTS `voicemail_messages` (
`id` int(11) NOT NULL auto_increment,
`msgnum` int(11) NOT NULL default '0',
`dir` varchar(80) default '',
`context` varchar(80) default '',
`macrocontext` varchar(80) default '',
`callerid` varchar(40) default '',
`origtime` varchar(40) default '',
`duration` varchar(20) default '',
`mailboxuser` varchar(80) default '',
`mailboxcontext` varchar(80) default '',
`recording` longblob,
PRIMARY KEY (`id`),
KEY `dir` (`dir`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1088 ;
##########################################################
#
# Table structure for table `meetme`
#
CREATE TABLE `meetme` (
`confno` char(80) NOT NULL default '0',
`starttime` datetime NOT NULL default '0000-00-00 00:00:00',
`endtime` datetime NOT NULL default '2099-12-31 23:59:59' ,
`pin` char(20) default NULL,
`opts` char(100) default NULL,
`adminpin` char(20) default NULL,
`adminopts` char(100) default NULL,
`members` int(11) NOT NULL default '0',
`maxusers` int(11) NOT NULL default '0',
PRIMARY KEY (`confno`,`starttime`)
);
##########################################################
##
##Table structure for table `voicemail_users`
##
CREATE TABLE IF NOT EXISTS `voicemail_users` (
`uniqueid` int(11) NOT NULL auto_increment,
`customer_id` varchar(11) NOT NULL default '0',
`context` varchar(50) NOT NULL default 'default',
`mailbox` varchar(11) NOT NULL default '0',
`password` varchar(5) NOT NULL default '6666',
`fullname` varchar(150) NOT NULL,
`email` varchar(50) NOT NULL,
`pager` varchar(50) NOT NULL,
`tz` varchar(10) NOT NULL default 'en',
`attach` varchar(4) NOT NULL default 'yes',
`saycid` varchar(4) NOT NULL default 'yes',
`dialout` varchar(10) NOT NULL,
`callback` varchar(10) NOT NULL,
`review` varchar(4) NOT NULL default 'no',
`operator` varchar(4) NOT NULL default 'no',
`envelope` varchar(4) NOT NULL default 'no',
`sayduration` varchar(4) NOT NULL default 'no',
`saydurationm` tinyint(4) NOT NULL default '1',
`sendvoicemail` varchar(4) NOT NULL default 'no',
`delete` varchar(4) NOT NULL default 'no',
`nextaftercmd` varchar(4) NOT NULL default 'yes',
`forcename` varchar(4) NOT NULL default 'no',
`forcegreetings` varchar(4) NOT NULL default 'no',
`hidefromdir` varchar(4) NOT NULL default 'yes',
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`uniqueid`),
KEY `mailbox_context` (`mailbox`,`context`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=101 ;
## ########################################################
##
##Create realtime user with approximately the right privs.
##
CREATE USER 'astrealtime'@'localhost' IDENTIFIED BY 'haslo_asterisk';
GRANT FILE ON * . * TO 'astrealtime'@'localhost' IDENTIFIED BY 'haslo_asterisk'
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
GRANT INSERT ON `asterisk`.`cdr` TO 'astrealtime'@'localhost';
GRANT SELECT , INSERT , UPDATE , DELETE ON `asterisk`.`queue_members` TO 'astrealtime'@'localhost';
GRANT SELECT , UPDATE ON `asterisk`.`queues` TO 'astrealtime'@'localhost';
GRANT SELECT , UPDATE ON `asterisk`.`sip` TO 'astrealtime'@'localhost';
GRANT SELECT , UPDATE ON `asterisk`.`voicemail_users` TO 'astrealtime'@'localhost';
GRANT SELECT , UPDATE , INSERT , DELETE ON `asterisk`.`voicemail_messages` TO 'astrealtime'@'localhost';
GRANT SELECT ON `asterisk`.`extensions` TO 'astrealtime'@'localhost';
GRANT SELECT , UPDATE ON `asterisk`.`meetme` TO 'astrealtime'@'localhost';
Tworzymy i edytujemy pliki z konfiguracją połączenia z bazą danych:
root# nano /etc/asterisk/cdr_mysql.conf
[global]
hostname=localhost
dbname=asterisk
table=cdr
password=haslo_asterisk
user=astrealtime
dbsock = /var/run/mysqld/mysqld.sock
root# nano /etc/asterisk/res_mysql.conf
[general]
dbhost=localhost
dbname=asterisk
dbuser=astrealtime
dbpass=haslo_asterisk
dbsock = /var/run/mysqld/mysqld.sock
root# nano /etc/asterisk/extconfig.conf
[settings]
sipusers => mysql,general,sip
sippeers => mysql,general,sip
extensions => mysql,general,extensions
queues => mysql,general,queues
queue_members => mysql,general,queue_members
meetme => mysql,general,meetme
voicemail => mysql,general,voicemail_users
Po restarcie asteriska:
root# asterisk -rx 'core restart now'
możemy sprawdzić, czy mamy połączenie z bazą danych:
asterisk*CLI> cdr mysql status
Connected to asterisk on socket file default using table cdr for 4 minutes, 0 seconds.
Wrote 0 records since last restart.
asterisk*CLI> realtime mysql status
general connected to asterisk@localhost, port 3306 with username astrealtime for 4 minutes.
Jak to działa ?
Dodajemy użytkownika:
mysql> insert into sip (`name`, `context`, `secret`, `host`, `nat`, `type`, `qualify`, `username`,
`defaultuser`, `allow`, `disallow`) values ('andrzej_100','polaczenia','123456','dynamic','yes',
'friend','yes','andrzej_100','andrzej_100','alaw','all');
Query OK, 1 row affected, 1 warning (0.00 sec)
Dodajemy kolejkę:
mysql> insert into queues (`name`) values ('sekretariat');
Query OK, 1 row affected (0.00 sec)
Dodajemy konsultanta do kolejki:
mysql> insert into queue_members values ('sekretariat','SIP/andrzej_100','1','1');
Query OK, 1 row affected (0.00 sec)
Dodajemy obsługę połączenia:
mysql> insert into extensions (`context`, `exten`, `priority`, `app`, `appdata`)
values ('polaczenia', '2000', '1', 'Queue', 'sekretariat');
Query OK, 1 row affected (0.00 sec)
Modyfikujemy pliki:
root# nano /etc/asterisk/sip.conf
Odkomentowujemy wpisy:
rtcachefriends=yes ; Cache realtime friends by adding them to the internal list
; just like friends added from the config file only on a
; as-needed basis? (yes|no)
rtsavesysname=yes ; Save systemname in realtime database at registration
; Default= no
rtupdate=yes ; Send registry updates to database using realtime? (yes|no)
Edytujemy plik:
root# nano /etc/asterisk/extensions.conf
Dodajemy wpis:
[polaczenia]
switch => Realtime
Edytujemy plik:
root# nano /etc/asterisk/queues.conf
Dodajemy wpis:
[general]
realtime_family = queues, queue_members
Przeładowujemy konfiguracje:
root# asterisk -rx 'reload'
Rejetrujemy SIP-a i sprawdzamy rezultaty:
asterisk*CLI> queue show sekretariat
sekretariat has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
SIP/andrzej_100 with penalty 1 (realtime) (Not in use) has taken no calls yet
No Callers
asterisk*CLI> dialplan show polaczenia
[ Context 'polaczenia' created by 'pbx_config' ]
Alt. Switch => 'Realtime/' [pbx_config]
asterisk*CLI> sip show peer andrzej_100
* Name : andrzej_100
Realtime peer: Yes, cached
Teraz możemy przetestować dialplan z REALTIME wybierając 2000:
== Using SIP RTP CoS mark 5
-- Executing Queue("SIP/andrzej_100-00000000", "sekretariat")
-- Started music on hold, class 'default', on SIP/andrzej_100-00000000
== Using SIP RTP CoS mark 5
-- SIP/andrzej_100-00000001 is ringing
-- SIP/andrzej_100-00000001 answered SIP/andrzej_100-00000000
-- Stopped music on hold on SIP/andrzej_100-00000000
-- Packet2Packet bridging SIP/andrzej_100-00000000 and SIP/andrzej_100-00000001
-- Started music on hold, class 'default', on SIP/andrzej_100-00000001
Widać, że dzwonimy sami do siebie, a dialplan jest zrealizowany na podstawie bazy.
W taki sam sposób dodajemy inne spisy do dialplanu oraz definiujemy usługę poczty głosowej itp.
|