jueves, 19 de septiembre de 2013

Asterisk CDR en MySQL


Para llevar un completo control de todos los eventos de llamadas en Asterisk o hacer un sistema de facturación no hay como CEL (Channel Event Logging). Sin embargo para ciertas tareas puede ser más que suficiente almacenar los CDR (Call Detail Record) de Asterisk en una BBDD MySQL.
Desde la versión 1.8 ya viene incluido y no hace falta descargarse las “addons”.

Simplemente necesitamos instalar la dependencia “libmysqlclient-dev” y “mysql-server” si la BBDD va a ir en el mismo servior y al compilar asterisk seleccionar la opción “Add-ons > [*]cdr_mysql
Yo voy a tener la BBDD en otro servidor (192.168.3.3). Así que la creamos.
1- Nos conectamos a MySQL:
# mysql -u root -p

2- Creamos la database:

mysql> CREATE DATABASE asteriskCDR;

3- Creamos un usuario “asterisk” para esta database “asteriskCDR”:

mysql> GRANT INSERT ON asteriskCDR.* TO asterisk@localhost IDENTIFIED BY 'password';

4- Creamos la tabla:

mysql> USE asteriskCDR;
Database changed


mysql> 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 '',
`uniqueid` VARCHAR(32) NOT NULL default '',
`linkedid` VARCHAR(32) NOT NULL default '',
`sequence` VARCHAR(32) NOT NULL default '',
`peeraccount` VARCHAR(32) NOT NULL default ''
);

Una vez hecho esto ponemos como índices para optimizar la búsqueda por estos campos:

ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

5- Si queremos le damos permiso para acceder solo desde nuestra PBX Asterisk (192.168.3.2):

GRANT ALL ON asteriskCDR.* TO asterisk@'192.168.3.2' IDENTIFIED BY 'nuestro passwd';

Para que se pueda acceder a la BBDD desde otro servidor puede que necesitemos configurar nuestra database editando el archivo /etc/mysql/my.cnf y cambiando la opción “bind-address = 127.0.0.1″ por “bind-address = 0.0.0.0″ y reiniciando el servidor “service mysql restart”.
A continuación configuramos nuestra PBX Asterisk (192.168.3.2) para guardar los CDR en esa database.
Editamos el archivo /etc/asterisk/cdr_mysql.so y ponemos algo tal que así:

[global]
hostname=192.168.3.3 ;ip de nuestra database. Si fuese local pondríamos localhost
dbname=asteriskCDR
table=cdr
password=el que sea
user=asterisk
port=3306
sock=/tmp/mysql.sock


[columns]
;static "" =>
;alias =>
alias start => calldate
alias callerid => clid
;alias src => src
;alias dst => dst
;alias dcontext => dcontext
;alias channel => channel
;alias dstchannel => dstchannel
;alias lastapp => lastapp
;alias lastdata => lastdata
;alias duration => duration
;alias billsec => billsec
;alias disposition => disposition
;alias amaflags => amaflags
;alias accountcode => accountcode
;alias userfield => userfield
;alias uniqueid => uniqueid

Salvamos el archivo y comprobamos desde el CLI> que tenemos soporte para el módulo cdr_mysql.so

CLI> module show like cdr_mysql.so
Module Description Use Count
cdr_mysql.so MySQL CDR Backend 0
1 modules loaded

Para que empiece a grabar los CDR en la database descargamos y cargamos el módulo:

CLI> module unload cdr_mysql.so
== Unregistered 'mysql' CDR backend


CLI> module load cdr_mysql.so
Loaded cdr_mysql.so
== Parsing '/etc/asterisk/cdr_mysql.conf': == Found
-- Found alias start for column calldate
-- Found alias callerid for column clid
Loaded cdr_mysql.so => (MySQL CDR Backend)

Y comprobamos que está todo bien:

CLI> cdr mysql status
Connected to asteriskCDR@192.168.3.3, port 3306 using table cdr for 1 hours, 1 minutes, 49 seconds.
Wrote 2 records since last restart.


CLI> cdr show status


Call Detail Record (CDR) settings
----------------------------------
Logging: Enabled
Mode: Simple
Log unanswered calls: No


* Registered Backends
-------------------
mysql
csv
cdr-custom

y tiene que aparecer entre los “Registered Backends” mysql.
Listo 

NOTA sobre uniqueid
Para habilitar uniqueid hay que seguir este How-To:
http://www.voip-info.org/wiki/view/Asterisk+cdr+mysql
Los únicos campos escribibles son:
${CDR(accountcode)} The channel’s account code (read-write).
${CDR(uniqueid)} The channel’s unique id.
${CDR(userfield)} The channels uses specified field (read-write).

No hay comentarios:

Publicar un comentario