Inicio > Elastix, PostgresSql > Elastix + CDR en PostgreSQL

Elastix + CDR en PostgreSQL

Elastix es una excelente distribución que integra en un sistema operativo Linux (Centos)  la centralita telefónica por software Asterisk.

Es una de las mejores soluciones de telefonía que existen, capaz de competir con otras soluciones propietarias muchísimo más costosas.


Una de las funciones más interesantes de Asterisk, y por tanto de Elastix, es el llamado CDR (Call Detailed Records), que es un registro de las llamadas que se hacen en la centralita. Se puede configurar la centralita para que esta información se guarde en diferentes sitios, desde un archivo CSV (Comma Separated Values) hasta en una base de datos, comúnmente, MySQL.

Elastix, como casi todas las distribuciones Linux orientadas a Asterisk, viene pre-configurado para almacenar estos datos e una base de datos MySQL que la propia distribución instala y configura para que no haya ningún problema.

Sin embargo, puede ser interesante guardar estos datos en otro sitio, aparte de la base de datos MySQL, por ejemplo en una base de datos PostgreSQL, y a ello nos vamos a dedicar en el resto del articulo.

La configuración propuesta, en este articulo, almacena los datos CDR, tanto en el MySQL de Elastix, como en la base de datos PostgreSQL que se le especifique. Para ello usaremos las siguientes versiones de los componentes principales:

  • Elastix 2.2.0 (con Asterisk 1.8)
  • PostgreSQL 9.1

En este documento, supondremos que ya tenemos instalado y funcionando Elastix, y que tenemos un servidor externo con una base de datos PostgreSQL 9.1 al cual tenemos acceso mediante una conexión por socket.

Los pasos a seguir son los siguientes:

1.- Cargar por defecto el módulo cdr_pgsql.so:

El módulo cdr_pgsql.so es el encargado de comunicar de forma nativa Asteriskcon PostgreSQL

Para cargarlo, debemos editar el fichero :

/etc/asterisk/modules.conf

y comentar la línea 78, cuyo contenido es:

noload => cdr_pgsql.so

dejandola:

;noload => cdr_pgsql.so

Con ello se consigue que Asterisk cargue al iniciarse el módulo cdr_pgsql.so

2.- Modificar de fichero /etc/asterisk/cdr_pgsql.conf :

El fichero cdr_pgsql.conf, es donde se configurarán los parámetros de conexión a la base de datos PostgresSQL. Este fichero deberá ser modificado, poniendo los datos correctos de conexión a la base de datos. A continuación se muestra un fichero de ejemplo.

; Sample Asterisk config file for CDR logging to PostgresSQL 
; Note that you can use TLS connections to your database server. 
; This is configured for your PostgreSQL client installation 
; on this system (check for pgsessions.conf) 
[global] 
hostname=192.168.1.55 
port=5432 
dbname=asterisk 
password=asterisk 
user=asterisk 
table=cdr ;SQL table where CDRs will be inserted 
;encoding=UTF8 ; Encoding of logged characters in Asterisk 
;timezone=UTC ; Uncomment if you want datetime fields in UTC/GMT 

Con ello lograremos que Asterisk sea capaz de conectarse al servidor PostgreSQL que se le indique.

3.- Crear el usuario y la base de datos en PostgreSQL:

La creación del usuario, y la base de datos, puede ser opcional, si por ejemplo ya tenemos un usuario y una base de datos donde queremos almacenar los datos. Lo que no es opcional, es la creación de la tabla donde se almacenarán esos datos. Por ello, este apartado, lo dividiremos a su vez en dos subapartados:

3.1.- Creación de la base de datos y del usuario de acceso a la misma (opcional).

A continuación se pone un script SQL de ejemplo para crear el ususario y la Base de datos para que Elastix se pueda conectar. Este script se debe ejecutar como el usuario postgres.

------------------------------------------------------------------ 
-- Este Script crea la Base de datos y el usuario necesarios 
-- para que Elastix guarde en postgreSQL los datos de CDR. 
-- Se debe ejecutar bajo el usuario postgres 
------------------------------------------------------------------ 
-- Eliminamos posibles datos anteriores 
DROP DATABASE IF EXISTS asterisk; 
DROP ROLE IF EXISTS asterisk; 
-- Creamos el usuario 
CREATE ROLE asterisk LOGIN ENCRYPTED PASSWORD 'asterisk' VALID UNTIL 'infinity'; 
-- Creamos base de datos 
CREATE DATABASE asterisk WITH ENCODING='UTF8' OWNER=asterisk LC_CTYPE='es_ES.UTF-8' 
                CONNECTION LIMIT=-1; 

3.2- Crear de la tabla para almacenar los datos CDR

Este script se debe ejecutar conectando a la base de datos desde la recién creada cuenta del usuario asterisk o bien desde la cuenta de usuario que se quiera que sea la propietaria de la tabla. EN este último caso, habrá que modificar el script, para adecuar el el esquema y la base de datos donde deseemos crearla.

-------------------------------------------------------------------------------------------- 
-- Este Script crea la Tabla, la Secuencia, y la clave primaria necearia para que 
-- Asterisk guarde en postgreSQL los datos de CDR. 
-- Se debe ejecutar bajo el usuario asterisk, conectado a la base de datos asterisk. 
-------------------------------------------------------------------------------------------- 
-- Creamos la tabla para CDR 
CREATE TABLE asterisk.public.cdr ( 
       AcctId BIGSERIAL PRIMARY KEY , 
       calldate TIMESTAMP with time zone NOT NULL DEFAULT now(), 
       clid VARCHAR(45) NOT NULL default '', 
       src VARCHAR(45) NOT NULL default '', 
       dst VARCHAR(45) NOT NULL default '', 
       dcontext VARCHAR(45) NOT NULL default '', 
       channel VARCHAR(45) NOT NULL default '', 
       dstchannel VARCHAR(45) NOT NULL default '', 
       lastapp VARCHAR(45) NOT NULL default '', 
       lastdata VARCHAR(45) NOT NULL default '', 
       duration INTEGER NOT NULL default '0', 
       billsec INTEGER NOT NULL default '0', 
       disposition VARCHAR(45) NOT NULL default '', 
       amaflags INTEGER NOT NULL default '0', 
       accountcode VARCHAR(45) NOT NULL default '', 
       uniqueid VARCHAR(45) NOT NULL default '', 
       userfield VARCHAR (255) default '' 
); 
COMMENT ON COLUMN cdr.acctid IS 'Identificador único del registo.'; 
COMMENT ON COLUMN cdr.calldate IS 'Fecha en la que se realiza la llamada (TimeStamp)'; 
COMMENT ON COLUMN cdr.clid IS 'Identificador único de la extensión llamante con texto.'; 
COMMENT ON COLUMN cdr.src IS 'Identificador único de la extensión llamante.'; 
COMMENT ON COLUMN cdr.dst IS 'Extensión Destino.'; 
COMMENT ON COLUMN cdr.dcontext IS 'Contexto de Destino.'; 
COMMENT ON COLUMN cdr.channel IS 'Canal Usado.'; 
COMMENT ON COLUMN cdr.dstchannel IS 'Canal destino si procede.'; 
COMMENT ON COLUMN cdr.lastapp IS 'Última aplicación si procede.'; 
COMMENT ON COLUMN cdr.lastdata IS 'Parámetros de la ultima aplicación.'; 
COMMENT ON COLUMN cdr.duration IS 'Tiempo total en segundos que dura la llamada, dede que se marca,
                                   hasta que se cuelga.'; 
COMMENT ON COLUMN cdr.billsec IS 'Tiempo de la llamada en segundos, desde que es respondida hasta 
                                  que se cuelga.'; 
COMMENT ON COLUMN cdr.disposition IS 'Estado de la llamada. Los valores posibles son:
                                        * ANSWERED : Llamada contestada 
                                        * NO ANSWER: Llamada no contestada
                                        * BUSY: Destino ocupado 
                                        * FAILED: Llamada fallida debido a un error.'; 
COMMENT ON COLUMN cdr.amaflags IS 'Flags usados en la llamada.'; 
COMMENT ON COLUMN cdr.accountcode IS 'Identificador único de la cuenta de Asterisk que realiza 
                                      la llamada.'; 
COMMENT ON COLUMN cdr.uniqueid IS 'Identificador único del canal usado.'; 
COMMENT ON COLUMN cdr.userfield IS 'Campo definido por el usuario.'; 

4.- Reiniciar Asterisk

El último paso para hacer efectiva la configuración es reiniciar Asterisk. Esto se puede hacer, bien desde la interfaz web de Elastix, bien desde la consola de comandos de Linux del servidor Elastix. En ese último caso, el comando que hay que ejecutar es el siguiente:

[root@Elastix64 ˜]# /etc/init.d/asterisk restart
Anuncios
Categorías:Elastix, PostgresSql Etiquetas: ,
  1. yosmeli
    noviembre 29, 2012 en 2:34 pm

    Holaaa esta bueno el articulo me encanta la explicacion… segui tus pasos pero aun ando un poco desorientada mi pregunta es como hago para conectar la base de datos postgres a un ivr ? yo entre en el archivo cdr_pgsql.conf y coloque lo siguiente
    hostname=127.0.0.1
    port=5432
    dbname=postgres ——–>¿ es el nombre de la base de datos que ya tengo creada?
    password=xxxxxx
    user=postgres
    table=cdr ———-> ¿ es el nombre de la tabla que ya cree?

    que mas sigue depues de eso?
    donde mas tengo que configurar para que que supeda conenctar? si es tus manos esta ayudarme te lo agradeceria bastanteeeee

  1. marzo 15, 2012 en 9:11 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: