miércoles, 14 de noviembre de 2012

CDR en Asterisk con CDR_ADAPTIVE _ODBC

Hola nuevamente, aprovechando que estoy en casa por temas de salud y a pedido del publico voy a hacer un pequeño post de como utilizar el modulo cdr_adaptive_odbc.so para almacenar los registros de las llamadas(CDR) directamente en una base de datos , esto reemplaza al cdr_mysql.so(deprecated).

En este esquema muestra la conexión que hay entre uno y otro  fichero:




Empezaré explicando algo de CDR de asterisk:

Por cada llamada entrante, saliente, entre anexos, etc, Asterisk genera registro detallado de llamadas conocidos como CDR (Call Detail Records). Los registros son almacenados en un archivo de texto separado por comas, también conocido como CSV (comma separated value), en el directorio: /var/log/asterisk/cdr-csv/

El fichero donde se guardan los registros tiene como nombre: Master.csv

Pero Asterisk tambien puede almacenar registros  de CDR en una base de datos MySQL. De ello se encarga el module CDR_ADAPTIVE_ODBC.SO.


Lo que se guarda en el CDR en texto plano(Master.csv) tiene la siguiente estructura:


Tener el claro que el registro no se guarda en tiempo real, se guarda una vez que haya finalizado la llamada.

Procedemos a monitorear el log del CDR es decir el fichero Master.csv:


#tail -f /var/log/asterisk/cdr-csv/Master.csv


"1234","208","999555999","usuarios","""Ludovico Peluche"" <208>","SIP/0000FFFF0001-00002a8c","SIP/GSM2-00002a8d","Dial","SIP/GSM2/999555999","2012-11-14 21:49:21","2012-11-14 21:49:40","2012-11-14 21:50:13",52,33,"ANSWERED","DOCUMENTATION","1352229761.55511","Celular"



De esta llamada realizado a un celular desde el extensión 208 podemos observar los siguientes valores que se almacenan en el fichero Master.csv:

Accountcode: 1234
Src: 208
Dst: 999555999
Dcontext: usuarios
Clid: Ludovico Peluche <208>
Dchannel: SIP/0000FFFF0001-00002a8c
Dstchannel : SIP/GSM2-00002a8d
Lastapp: Dial
Lastdata: SIP/GSM2/999555999
Start: 2012-11-14 21:49:21
Answer: 2012-11-14 21:49:40
End : 2012-11-14 21:50:13
Duration: 52
Billsec: 33
Dispotition: ANSWERED
Amaflag:DOCUMENTATION
uniqueid: 1352229761.55511
Userfield:Celular

Bueno hasta este punto espero que todo este claro, si no preguntar a SAN GOOGLE mas detalles.

Ahora Procedemos a almacenar dichos registros en la Base de datos MySQL.


Procedemos a crear nuestra Base de Dados y Tabla, donde queremos que se almacene los registros del CDR.

Creamos un fichero cdr.sql, donde tendremos el script que nos crea la tabla:
#vim /opt/cdr.sql

USE asteriskcdr;
CREATE TABLE cdr (
id bigint(20) NOT NULL auto_increment,
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 '',
peeraccount varchar(20) NOT NULL default '',
uniqueid varchar(32) NOT NULL default '',
linkedid varchar(80) NOT NULL default '',
userfield varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY callerid (clid)
);

Guardamos los cambios.

Ahora creamos la base de datos asteriskcdr:
#mysql -ps3kr3t
mysql>create dabatase asteriskcdr;
mysql>quit;

#mysql -ps3kr3t  < /opt/cdr.sql

Para validar si efectivamente se ha creado la tabla cdr:
#mysql  -ps3kr3t

mysql> use asteriskcdr;
mysql>show tables;
mysql>describe cdr;


Hasta este punto ya tenemos la tabla donde se guardaran los registros de las llamadas:

Ahora empieza lo que muchos estaban pidiendo: cdr_adaptive_odbc

El CDR_ADAPTIVE_ODBC, permite  crear diferentes tablas donde nosotros podemos guardar los CDR.

Primero tenemos que validar que tengamos el módulo instalado:


*CLI> module show like cdr_adaptive_odbc.so





empecemos revisando el fichero /etc/odbc.ini 

#vim /etc/odbc.ini
[asteriskcdr]

Description = MySQL ODBC CDR
Driver = MySQL
Database = asteriskcdr
Server = localhost
User = root
Password = s3kr3t
Port = 3306
Option = 3



Guardamos los cambios y probamos la conexión entre ODBC y  la base de datos:
#isql asteriskcdr root asteriskcdr










Para salir de SQL, digitamos quit

Nota:

asteriskcdr – etiqueta que da inicio al bloque configurado en odbc.ini
root – nombre del usuario que tiene acceso a la base de datos creada; deberían crear otro usuario con privilegios para lo que se requiere.
s3kr3t – la contraseña de MySQL para el usuario root

Ahora nos toca revisar el fichero res_odbc.conf
#vim /etc/asterisk/res_odbc.conf
[asteriskcdr]

enabled => yes
dsn => asteriskcdr
username => root
password => s3kr3t
pre-connect => yes


Guardamos y cargamos los cambios:
#asterisk -rvvvvvvvv
*CLI>module reload res_odbc.so



Finalmente veamos el fichero cdr_adaptive_odbc.conf
#vim /etc/asterisk/cdr_adaptive_odbc.conf

[asteriskcdr]
connection=asteriskcdr
table=cdr
alias start => calldate

Guardamos y cargamos los cambios
#asterisk -rvvvv
*CLI>module reload cdr_adaptive_odbc.so

Nota:
Cada vez que realicemos llamadas a cualquier destino, podremos ver el el CLI de asterisk la data que se inserta en la base de datos, siempre y cuando tengamos configurado una verbosidad mayor a 20

*CLI>core set verbose 25

Podemos ver algo como esto:



  > [INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid,linkedid,userfield) VALUES ({ ts '2012-11-14 17:26:01' },'"Junior Peluche" <216>','216','4320483','usuario','SIP/0000FFFF0002-00002a5e','SIP/troncalSIP-00002a6f','Dial','SIP/troncalSIP/4320483',98,75,'ANSWERED',3,'13523431962.11721','13523431962.11721','Fijo')]


Finalmente, es hora te tomar mi pastilla
Procedemos a revisar la tabla cdr y validar si se guardaron los registros:

#mysql  -ps3kr3t
mysql> use asteriskcdr;
mysql>select * from cdr;


Bueno señores espero que esto les sirva de ayuda, y hasta la próxima... vez que me vuelva a enfermar :-P



Fuentes de ayuda:
http://ofps.oreilly.com/titles/9780596517342/asterisk-DB.html
http://www.voztovoice.org
Recomiendo bajarse el  llibro de Asterisk™: The Definitive Guide y comprar el libro de VoiceTovoice, es muy buena.



4 comentarios:

Unknown dijo...

Buen dato Nilsinho ,se agradece la info, ahora uno con AMI se te agradeceria mucho.

Unknown dijo...
Este comentario ha sido eliminado por el autor.
aztrock1 dijo...

2013-07-30 23:53:01 COT ERROR: error de sintaxis en o cerca de «end» en carácter 115

tengo ese error, cuando agrego los campos star, answer y end

Unknown dijo...

Hola, Gracias, Muy buen tutorial, Tengo instalado Asterisk 11.8.1 y estoy tratando de guardar los datos de CDR en mysql, segui tu tutorial pero no me estan dando dos errores en los pasos que presentar y las llamadas no se graban en la base de datos, te muestro mi informacion:

-cuando ejecuto:
*CLI> module show like cdr_adaptive_odbc.so
Module Description Use Count
cdr_adaptive_odbc.so Adaptive ODBC CDR backend 0
1 modules loaded



- Me da error Cuando ejecuto:

root@debian:~# isql asteriskcdr root asteriskcdr
[ISQL]ERROR: Could not SQLConnect

- Me da error cuando ejecuto:

*CLI> module reload res_odbc.so
-- Reloading module 'res_odbc.so' (ODBC resource)
== Parsing '/etc/asterisk/res_odbc.conf': Found
[Mar 28 13:15:32] NOTICE[7721]: res_odbc.c:1527 odbc_obj_connect: Connecting asteriskcdr
[Mar 28 13:15:32] WARNING[7721]: res_odbc.c:1552 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified
[Mar 28 13:15:32] WARNING[7721]: res_odbc.c:1367 _ast_odbc_request_obj2: Failed to connect to asteriskcdr
[Mar 28 13:15:32] NOTICE[7721]: res_odbc.c:919 load_odbc_config: Registered ODBC class 'asteriskcdr' dsn->[asteriskcdr]


*CLI> module reload cdr_adaptive_odbc.so
-- Reloading module 'cdr_adaptive_odbc.so' (Adaptive ODBC CDR backend)
== Parsing '/etc/asterisk/cdr_adaptive_odbc.conf': Found
[Mar 28 13:20:00] NOTICE[7726]: res_odbc.c:1527 odbc_obj_connect: Connecting asteriskcdr
[Mar 28 13:20:00] WARNING[7726]: res_odbc.c:1552 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified
[Mar 28 13:20:00] WARNING[7726]: res_odbc.c:1367 _ast_odbc_request_obj2: Failed to connect to asteriskcdr
[Mar 28 13:20:00] WARNING[7726]: cdr_adaptive_odbc.c:126 load_config: No such connection 'asteriskcdr' in the 'asteriskcdr' section of cdr_adaptive_odbc.conf. Check res_odbc.conf.


Yo cree la base de datos asterisk cdr y la tabla cdr dentro de asterisk cdr:

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| asterisk |
| asteriskcdr |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

mysql> use asteriskcdr;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------+
| Tables_in_asteriskcdr |
+-----------------------+
| cdr |
+-----------------------+
1 row in set (0.00 sec)


A pesar de que he generado llamadas, la tabla cdr esta vacia:

mysql> select * from cdr;
Empty set (0.00 sec)


Este es mi archivo /etc/odbc.ini :

[asteriskcdr]
Description = MySQL ODBC CDR
Driver = MySQL
Database = asteriskcdr
Server = localhost
User = root
Password = password
Port = 3306
Option = 3


Mi archivo /etc/asterisk/res_odbc.conf


;------------------------
[asteriskcdr]
enabled => yes
dsn => asteriskcdr
username => root
password => logramsa
pre-connect => yes
;---------------------


- Mi archivo /etc/asterisk/cdr_adaptive_odbc.conf :

[asteriskcdr]
connection=asteriskcdr
table=cdr
alias start => calldate