Мы уже имеем настроенный сервер Asterisk через который Oktell осуществляет звонки на мобильные. Вся статистика храниться в /var/log/asterisk/cdr-csv/Master.csv Не очень удобно в плане работы… Вот и хочу перенести все в MySQL, а потом смогу эту информацию использовать в сценариях Oktell. Как и в предыдущей статье все будим собирать с исходников на Ubuntu Linux.
Приступим!
Проверяем, установлен ли у нас MySQL и клиентская библиотека:
dpkg -l mysql-server libmysqlclient*dev ii mysql-server 5.1.41-3ubuntu12.6 MySQL database server
Мне нужно установить дополнительно установить клиентскую библиотеку:
aptitude install libmysqlclient-dev
Качаем исходники и собираем модули:
svn checkout http://svn.digium.com/svn/asterisk-addons/branches/1.6.2 asterisk-addons-1.6.2 cd asterisk-addons-1.6.2 ./configure make clean make make install make sample
Прописываем в файле modules.conf загрузку модуля:
; MySQL CDR load => cdr_addon_mysql.so
Дальше, нужно создать в MySQL пользователя, базу и таблицу:
CREATE USER 'asterisk'@'localhost' IDENTIFIED BY 'password'; GRANT USAGE ON * . * TO 'asterisk'@'localhost' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; CREATE DATABASE IF NOT EXISTS `asterisk` ; GRANT ALL PRIVILEGES ON `asterisk` . * TO 'asterisk'@'localhost'; FLUSH PRIVILEGES ; USE asterisk; CREATE TABLE `cdr` ( `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 '', `userfield` varchar(255) NOT NULL default '', `hangupcause` VARCHAR( 50 ) NOT NULL , `peerip` VARCHAR( 50 ) NOT NULL , `recvip` VARCHAR( 50 ) NOT NULL , `fromuri` VARCHAR( 50 ) NOT NULL , `uri` VARCHAR( 50 ) NOT NULL , `useragent` VARCHAR( 50 ) NOT NULL , `codec1` VARCHAR( 50 ) NOT NULL , `codec2` VARCHAR( 50 ) NOT NULL , `llp` VARCHAR( 50 ) NOT NULL, `rlp` VARCHAR( 50 ) NOT NULL , `ljitt` VARCHAR( 50 ) NOT NULL , `rjitt` VARCHAR( 50 ) NOT NULL ); ALTER TABLE `cdr` ADD `uniqueid` VARCHAR(32) NOT NULL default ''; ALTER TABLE `cdr` ADD INDEX ( `calldate` ); ALTER TABLE `cdr` ADD INDEX ( `dst` ); ALTER TABLE `cdr` ADD INDEX ( `accountcode` );
Переходим к файлу /etc/asterisk/cdr_mysql.conf и прописываем наши параметры доступа к базе и расширенные параметры логирования:
[global] hostname=localhost dbname=asterisk table=cdr password=password user=asterisk [columns] alias start => calldate alias callerid => clid alias hangupcause => hangupcause alias peerip => peerip alias recvip => recvip alias fromuri => fromuri alias uri => uri alias useragent => useragent alias codec1 => codec1 alias codec2 => codec2 alias llp => llp alias rlp => rlp alias ljitt => ljitt alias rjitt => rjitt
Нужные контексты файла /etc/asterisk/extensions.conf прописываем сбор информации в MySQL:
; CDR ;exten h must be in same context! exten => h,1,noop("extended CDR") exten => h,n,set(CDR(hangupcause)=${HANGUPCAUSE}) exten => h,n,set(CDR(peerip)=${CHANNEL(peerip)}) exten => h,n,set(CDR(recvip)=${CHANNEL(recvip)}) exten => h,n,set(CDR(fromuri)=${CHANNEL(from)}) exten => h,n,set(CDR(uri)=${CHANNEL(uri)}) exten => h,n,set(CDR(useragent)=${CHANNEL(useragent)}) exten => h,n,set(CDR(codec1)=${CHANNEL(audioreadformat)}) exten => h,n,set(CDR(codec2)=${CHANNEL(audiowriteformat)}) exten => h,n,set(CDR(llp)=${CHANNEL(rtpqos,audio,local_lostpackets)}) exten => h,n,set(CDR(rlp)=${CHANNEL(rtpqos,audio,remote_lostpackets)}) exten => h,n,set(CDR(ljitt)=${CHANNEL(rtpqos,audio,local_jitter)}) exten => h,n,set(CDR(rjitt)=${CHANNEL(rtpqos,audio,remote_jitter)})
Перезапускаем Asterisk и делаем звонки. Все, статистика уже в MySQL:
mysql> select * from cdr;
+---------------------+------+---------------+------------+-------------------+-------------------------+-------------------------+---------+---------------------------------------+----------+---------+-------------+----------+-------------+-----------+--------------+-------------+------------+------------+---------+------------------------------+-----------+--------+--------+-----+-----+-------+-------+
| calldate | clid | src | dst | dcontext | channel | dstchannel | lastapp | lastdata | duration | billsec | disposition | amaflags | accountcode | userfield | uniqueid | hangupcause | peerip | recvip | fromuri | uri | useragent | codec1 | codec2 | llp | rlp | ljitt | rjitt |
+---------------------+------+---------------+------------+-------------------+-------------------------+-------------------------+---------+---------------------------------------+----------+---------+-------------+----------+-------------+-----------+--------------+-------------+------------+------------+---------+------------------------------+-----------+--------+--------+-----+-----+-------+-------+
| 2010-10-23 23:17:18 | | +38093xxxxxxx | s | datacard-incoming | Datacard/datacard1-6f10 | SIP/oktell-00000000 | Dial | SIP/500@oktell | 2 | 0 | FAILED | 3 | | | 1287865038.0 | 16 | | | | | | slin | slin | | | | |
| 2010-10-23 23:17:21 | | asterisk | 093xxxxxxx | gsm-out | SIP/oktell-00000001 | Datacard/datacard1-ea69 | Dial | Datacard/i:358705030202263/093xxxxxxx | 12 | 1 | ANSWERED | 3 | | | 1287865041.2 | 16 | 10.10.10.1 | 10.10.10.1 | | sip:asterisk@10.10.10.1:5060 | Oktell | slin | slin | 1 | 0 | 0 | 0 |
| 2010-10-23 23:17:41 | | asterisk | 093xxxxxxx | gsm-out | SIP/oktell-00000002 | Datacard/datacard1-266d | Dial | Datacard/i:358705030202263/093xxxxxxx | 12 | 3 | ANSWERED | 3 | | | 1287865061.4 | 16 | 10.10.10.1 | 10.10.10.1 | | sip:asterisk@10.10.10.1:5060 | Oktell | slin | slin | 1 | 0 | 12 | 0 |
+---------------------+------+---------------+------------+-------------------+-------------------------+-------------------------+---------+---------------------------------------+----------+---------+-------------+----------+-------------+-----------+--------------+-------------+------------+------------+---------+------------------------------+-----------+--------+--------+-----+-----+-------+-------+
3 rows in set (0.00 sec)
Попробовал ваш совет, но не все данные пишутся в БД. Инфо о кодеках выводится, а вот некоторые остальные ошибка такого типа
Executing [h@russiacalls:3] Set(«SIP/home-000000ce», «CDR(llp)=») in new stack
[Sep 22 11:21:10] WARNING[26692]: sip/dialplan_functions.c:225 sip_acf_channel_read: Unrecognized argument ‘rtpqos,audio,remote_lostpackets’ to CHANNEL
В чем может быть ошибка? Asterisk 10.8.0
У меня это работает на 1.6
На 1.8 не проверял, поскольку сам уже давно переполз на FreeSWITCH 🙂