Instalamos la base de datos PostgreSQL y el conector para ODBC.
asteriskpbx:/home/sistemas# aptitude install postgresql-8.1 odbc-postgresql
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes… Hecho
Leyendo las descripciones de las tareas… Hecho
Construir la base de datos de etiquetas… Hecho
Se instalarán automáticamente los siguientes paquetes NUEVOS:
postgresql-client-8.1 postgresql-client-common postgresql-common
Se instalarán los siguiente paquetes NUEVOS:
odbc-postgresql postgresql-8.1 postgresql-client-8.1 postgresql-client-common postgresql-common
0 paquetes actualizados, 5 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 6188kB de ficheros. Después de desempaquetar se usarán 16.4MB.
¿Quiere continuar? [Y/n/?] Y
Escribiendo información de estado extendido… Hecho
Des:1 http://ftp.de.debian.org etch/main odbc-postgresql 1:08.01.0200-2.1 [334kB]
Des:2 http://ftp.de.debian.org etch/main postgresql-client-common 71 [40.2kB]
Des:3 http://ftp.de.debian.org etch/main postgresql-client-8.1 8.1.11-0etch1 [1422kB]
Des:4 http://ftp.de.debian.org etch/main postgresql-common 71 [102kB]
Des:5 http://ftp.de.debian.org etch/main postgresql-8.1 8.1.11-0etch1 [4289kB]
Descargados 6188kB en 43s (142kB/s).
Preconfigurando paquetes …
Seleccionando el paquete odbc-postgresql previamente no seleccionado.
(Leyendo la base de datos …
31472 ficheros y directorios instalados actualmente.)
Desempaquetando odbc-postgresql (de …/odbc-postgresql_1%3a08.01.0200-2.1_i386.deb) …
Seleccionando el paquete postgresql-client-common previamente no seleccionado.
Desempaquetando postgresql-client-common (de …/postgresql-client-common_71_all.deb) …
Seleccionando el paquete postgresql-client-8.1 previamente no seleccionado.
Desempaquetando postgresql-client-8.1 (de …/postgresql-client-8.1_8.1.11-0etch1_i386.deb) …
Seleccionando el paquete postgresql-common previamente no seleccionado.
Desempaquetando postgresql-common (de …/postgresql-common_71_all.deb) …
Seleccionando el paquete postgresql-8.1 previamente no seleccionado.
Desempaquetando postgresql-8.1 (de …/postgresql-8.1_8.1.11-0etch1_i386.deb) …
Configurando odbc-postgresql (08.01.0200-2.1) …
Configurando postgresql-client-common (71) …
Configurando postgresql-client-8.1 (8.1.11-0etch1) …
Configurando postgresql-common (71) …
adduser: Warning: that home directory does not belong to the user you are currently creating.
Configurando postgresql-8.1 (8.1.11-0etch1) …
Creating new cluster (configuration: /etc/postgresql/8.1/main, data: /var/lib/postgresql/8.1/main)…
Moving configuration file /var/lib/postgresql/8.1/main/postgresql.conf to /etc/postgresql/8.1/main…
Moving configuration file /var/lib/postgresql/8.1/main/pg_hba.conf to /etc/postgresql/8.1/main…
Moving configuration file /var/lib/postgresql/8.1/main/pg_ident.conf to /etc/postgresql/8.1/main…
Configuring postgresql.conf to use port 5432…
Starting PostgreSQL 8.1 database server: main.
asteriskpbx:/home/sistemas# /etc/init.d/postgresql-8.1 start
Starting PostgreSQL 8.1 database server: main.
Nos logueamos con el usuario postgres.
asteriskpbx:/home/sistemas# su – postgres
Creamos el usuario asterisk, con el cual trabajaremos.
postgres@asteriskpbx:~$ createuser -s -D -R -l -P -e asterisk
Ingrese la contraseña para el nuevo rol:
Ingrésela nuevamente:
CREATE ROLE asterisk PASSWORD ‘babieca’ SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;
CREATE ROLE
Creamos la base de datos asteriskDB, cuyo dueño sera el usuario asterisk.
postgres@asteriskpbx:~$ createdb -O asterisk -e asteriskDB
CREATE DATABASE “asteriskDB” OWNER asterisk;
CREATE DATABASE
Es importante dar acceso a la base de datos, por lo cual editamos los permisos del siguiente archivo que debe tener una apariencia similar a las lineas siguientes.
postgres@asteriskpbx:~$ vim /etc/postgresql/8.1/main/pg_hba.conf
# “local” is for Unix domain socket connections only
local asteriskDB asterisk md5
local all all ident sameuser
# IPv4 local connections:
host all all 127.0.0.1/32 md5
postgres@asteriskpbx:~$ exit
logout
Al hacer los cambios al archivo anterior, reiniciamos la base de datos.
asteriskpbx:/home/sistemas# /etc/init.d/postgresql-8.1 restart
Restarting PostgreSQL 8.1 database server: main.
Realizamos los parametros iniciales de la conexíon con los drivers necesarios para la conexion mediante ODBC con PostgreSQL, editando el archivo siguiente.
asteriskpbx:/home/sistemas# vim /etc/odbcinst.ini
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/odbc/psqlodbca.so
Setup = /usr/lib/odbc/libodbcpsqlS.so
FileUsage = 1
Verificamos que los parametros sean correctos, en caso de ser así recibiremos el nombre de la sección, en caso contrario nos mandara un error, que en todo caso sera por algún error de sintaxis.
asteriskpbx:/home/sistemas# odbcinst -q -d
[PostgreSQL]
En el archivo siguiente introducimos los parametros para la conexión con nuestra base de datos.
asteriskpbx:/home/sistemas# vim /etc/odbc.ini
[asterisk-connector]
Description = PostgreSQL connection to ‘asterisk’ database
Driver = PostgreSQL
Database = asteriskDB
Servername = localhost
UserName = asterisk
Password = babieca
Port = 5432
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
ShowOidColumn = No
FakeOidIndex = No
ConnSettings =
Realizamos una prueba de conexión.
asteriskpbx:/home/sistemas# echo “select 1″ | isql -v asterisk-connector
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL> +————+
| ?column? |
+————+
| 1 |
+————+
SQLRowCount returns 1
1 rows fetched
SQL>
Si nos surge un error similar, verifiquemos que nuestro servidor de base de datos este inicializado, y que este aceptando conexiones por el puerto dado, (por defecto ya se encuentra activado).
asteriskpbx:/home/sistemas# echo “select 1″ | isql -v asterisk-connector
[08001][unixODBC]could not connect to server: Conexión rehusada
Is the server running on host “localhost” and accepting
TCP/IP connections on port 5432?
[ISQL]ERROR: Could not SQLConnect
Iniciamos asterisk, para verificar que los módulos se carguen correctamente, anteriormente ya habíamos compilado asterisk con soporte para ODBC.
asteriskpbx:/home/sistemas# asterisk -c
Asterisk 1.4.21.2, Copyright (C) 1999 – 2008 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type ‘core show warranty’ for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type ‘core show license’ for details.
=========================================================================
[ Booting...
[ Reading Master Configuration ]
[ Initializing Custom Configuration Options ]
[Aug 15 18:28:32] NOTICE[5800]: cdr.c:1373 do_reload: CDR simple logging enabled.
[Aug 15 18:28:32] NOTICE[5800]: loader.c:851 load_modules: 146 modules will be loaded.
..[Aug 15 18:28:32] NOTICE[5800]: config.c:1274 ast_config_engine_register: Registered Config Engine odbc
……[Aug 15 18:28:32] WARNING[5800]: res_smdi.c:1335 load_module: No SMDI interfaces are available to listen on, not starting SMDI listener.
[Aug 15 18:28:32] NOTICE[5800]: res_odbc.c:235 load_odbc_config: Adding ENV var: INFORMIXSERVER=my_special_database
[Aug 15 18:28:32] NOTICE[5800]: res_odbc.c:235 load_odbc_config: Adding ENV var: INFORMIXDIR=/opt/informix
[Aug 15 18:28:32] NOTICE[5800]: res_odbc.c:716 load_module: res_odbc loaded.
………..[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4131 pbx_load_module: Starting AEL load process.
[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4138 pbx_load_module: AEL load process: calculated config file name ‘/etc/asterisk/extensions.ael’.
[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4146 pbx_load_module: AEL load process: parsed config file name ‘/etc/asterisk/extensions.ael’.
[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4149 pbx_load_module: AEL load process: checked config file name ‘/etc/asterisk/extensions.ael’.
[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4151 pbx_load_module: AEL load process: compiled config file name ‘/etc/asterisk/extensions.ael’.
[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4154 pbx_load_module: AEL load process: merged config file name ‘/etc/asterisk/extensions.ael’.
[Aug 15 18:28:32] NOTICE[5800]: pbx_ael.c:4157 pbx_load_module: AEL load process: verified config file name ‘/etc/asterisk/extensions.ael’.
………………………………………………………………………………..[Aug 15 18:28:32] WARNING[5800]: chan_iax2.c:11111 load_module: Unable to open IAX timing interface: No such file or directory
…………………….. == No hardware transcoders found.
……. ]
Asterisk Ready.
*CLI> module show like res_odbc.so
Module Description Use Count
res_odbc.so ODBC Resource 0
1 modules loaded
*CLI>
Editamos el siguiente archivo, habilitando la conexión y poniendo el nombre de nuestro conector.
asteriskpbx:/home/sistemas# vim /etc/asterisk/res_odbc.conf
[asterisk]
enabled => yes
dsn => asterisk-connector
pre-connect => yes
Reiniciamos el modulo, y observamos que se registra de manera optima.
*CLI> module reload res_odbc.so
[Aug 15 18:35:03] NOTICE[5800]: res_odbc.c:578 reload: Adding ENV var: INFORMIXSERVER=my_special_database
[Aug 15 18:35:03] NOTICE[5800]: res_odbc.c:578 reload: Adding ENV var: INFORMIXDIR=/opt/informix
[Aug 15 18:35:03] NOTICE[5800]: res_odbc.c:530 odbc_obj_connect: Connecting asterisk
[Aug 15 18:35:03] NOTICE[5800]: res_odbc.c:544 odbc_obj_connect: res_odbc: Connected to asterisk [asterisk-connector]
[Aug 15 18:35:03] NOTICE[5800]: res_odbc.c:676 reload: Registered ODBC class ‘asterisk’ dsn->[asterisk-connector]
*CLI> odbc show
Name: asterisk
DSN: asterisk-connector
Pooled: no
Connected: yes
*CLI>
Nos conectamos a la base de datos anteriormente creada.
asteriskpbx:/home/sistemas# psql -U asterisk -h localhost asteriskDB
Contraseña para usuario asterisk:
Bienvenido a psql 8.1.11, la terminal interactiva de PostgreSQL.
Digite: \copyright para ver los términos de distribución
\h para ayuda de comandos SQL
\? para ayuda de comandos psql
\g o or termine con punto y coma para ejecutar una consulta
\q para salir
conexión SSL (cifrado: DHE-RSA-AES256-SHA, bits: 256)
asteriskDB=#
Creamos la tabla cdr, mediante la instruccion siguiente:
CREATE TABLE cdr
(
id bigserial NOT NULL,
calldate timestamptz,
clid varchar(80),
src varchar(80),
dst varchar(80),
dcontext varchar(80),
channel varchar(80),
dstchannel varchar(80),
lastapp varchar(80),
lastdata varchar(80),
duration int8,
billsec int8,
disposition varchar(45),
amaflags int8,
accountcode varchar(20),
uniqueid varchar(40),
userfield varchar(255),
CONSTRAINT asterisk_cdr_id_pk PRIMARY KEY (id)
)
WITHOUT OIDS;
NOTICE: CREATE TABLE creará una secuencia implícita «cdr_id_seq» para la columna serial «cdr.id»
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «asterisk_cdr_id_pk» para la tabla «cdr»
CREATE TABLE
asteriskDB=# \dt
Listado de relaciones
Schema | Nombre | Tipo | Dueño
——–+——–+——-+———-
public | cdr | tabla | asterisk
(1 fila)
asteriskDB=# \d cdr
Tabla «public.cdr»
Columna | Tipo | Modificadores
————-+————————–+————————————————–
id | bigint | not null default nextval(’cdr_id_seq’::regclass)
calldate | timestamp with time zone |
clid | character varying(80) |
src | character varying(80) |
dst | character varying(80) |
dcontext | character varying(80) |
channel | character varying(80) |
dstchannel | character varying(80) |
lastapp | character varying(80) |
lastdata | character varying(80) |
duration | bigint |
billsec | bigint |
disposition | character varying(45) |
amaflags | bigint |
accountcode | character varying(20) |
uniqueid | character varying(40) |
userfield | character varying(255) |
Índices:
«asterisk_cdr_id_pk» PRIMARY KEY, btree (id)
asteriskDB=# \q
Habilitamos el registro de llamadas, editando el siguiente archivo con parametros como el conector que estamos usando, asi como el nombre de la tabla.
asteriskpbx:/home/sistemas# vim /etc/asterisk/cdr_odbc.conf
[global]
dsn=asterisk-connector
username=asterisk
password=babieca
loguniqueid=yes
table=cdr
Reiniciamos el modulo en cuestion.
*CLI> module reload cdr_odbc.so
Verificamos el estado del CDR, para verificar el registro de ODBC.
*CLI> cdr status
CDR logging: enabled
CDR mode: simple
CDR output unanswered calls: no
CDR registered backend: ODBC
CDR registered backend: cdr-custom
CDR registered backend: csv
CDR registered backend: cdr_manager
*CLI>
Creamos dos usuarios SIP para establecer una llamada.
asteriskpbx:/home/sistemas# vim /etc/asterisk/sip.conf
[template2](!)
type=friend
context=internal
host=dynamic
disallow=all
allow=gsm
allow=ulaw
allow=alaw
dtmfmode=rfc2833
secret=holA
[5000](template2)
[5001](template2)
Creamos un pequeño plan de marcado, que consta del contexto internal y un pequeño macro.
asteriskpbx:/home/sistemas# vim /etc/asterisk/extensions.conf
[macro-llamar]
exten => s,1,Dial(${ARG1},10)
exten => s,n,Hangup()
[internal]
exten => _5XXX,1,Macro(llamar,SIP/${EXTEN})
Reiniciamos los archivos modificados.
*CLI> sip reload
*CLI> dialplan reload
Registramos un par de softphones y establecemos una llamada.
*CLI>
– Executing [5000@internal:1] Macro(”SIP/5001-08b44b60″, “llamar|SIP/5000″) in new stack
– Executing [s@macro-llamar:1] Dial(”SIP/5001-08b44b60″, “SIP/5000|10″) in new stack
– Called 5000
– SIP/5000-08b4c2b0 is ringing
– SIP/5000-08b4c2b0 answered SIP/5001-08b44b60
– Native bridging SIP/5001-08b44b60 and SIP/5000-08b4c2b0
== Spawn extension (macro-llamar, s, 1) exited non-zero on ‘SIP/5001-08b44b60′ in macro ‘llamar’
== Spawn extension (macro-llamar, s, 1) exited non-zero on ‘SIP/5001-08b44b60′
> cdr_odbc: Query Successful!
Un ejemplo de un select de la tabla donde se registran las llamadas.
asteriskDB=# select calldate,src,dst,dcontext,channel,dstchannel,lastapp,duration from cdr;
calldate | src | dst | dcontext | channel | dstchannel | lastapp | duration
————————+——+——+———-+——————-+——————-+———+———-
2008-08-16 17:01:00-05 | 5001 | 5000 | internal | SIP/5001-08b4ae58 | SIP/5000-08b4f6f8 | Dial | 16
2008-08-16 17:08:54-05 | 5000 | 5001 | internal | SIP/5000-08b44b60 | SIP/5001-08b520c8 | Dial | 16
2008-08-16 17:09:31-05 | 5001 | 5001 | internal | SIP/5001-08b4f6e0 | SIP/5001-08b498c8 | Dial | 4
2008-08-16 17:09:38-05 | 5001 | 5000 | internal | SIP/5001-08b4f6e0 | SIP/5000-08b498c8 | Dial | 7
2008-08-16 17:09:53-05 | 5001 | 5000 | internal | SIP/5001-08b44b60 | SIP/5000-08b4c2b0 | Dial | 11
2008-08-16 17:10:28-05 | 5001 | 5000 | internal | SIP/5001-08b4f6e0 | SIP/5000-08b498c8 | Hangup | 10
2008-08-16 17:11:03-05 | 5001 | 5000 | internal | SIP/5001-08b44b60 | SIP/5000-08b4c2b0 | Dial | 11
2008-08-16 17:11:17-05 | 5001 | 5000 | internal | SIP/5001-08b44b60 | SIP/5000-08b520c8 | Hangup | 10
(8 filas)