Ideas de mi materia gris

octubre 23, 2008

Asterisk y E1, experiencias

Filed under: Asterisk — ciclodetrantor @ 8:39 pm

Finalmente le toco a un servidor, instalar un conmutador Asterisk con una tarjeta E1. Para ser la primera vez no estuvo tan mal teniendo en cuenta que actualmente se encuentra operando de manera satisfactoria, uno que otro detalle pero nada con tintes de catástrofe.

Para poner las cosas en contexto, desde que inicie en esto de Asterisk siempre encontré información de que en México y otros países no era algo trivial la instalación de enlaces E1, en caso concreto con Telmex.

Bueno estas cosas son empíricas, hasta que uno no se encuentra con el problema, uno no aprende como resolverlo.

Vamos a ver la tarjeta que se uso fue una Wildcard TE122.

Tarjeta TE122

Tarjeta TE122

Despues de instalar el Linux de tu preferencia (CentOS y Debian son los que mas uso), nuestro sistema debe reconocer la tarjeta, dando el comando lspci | grep Digium podemos ver lo siguiente:

[root@asteriskcentro ~]# lspci | grep Digium
05:02.0 Ethernet controller: Digium, Inc. Unknown device 8001 (rev 11)
05:04.0 Ethernet controller: Digium, Inc. Unknown device 0800 (rev 11)

En este caso aparecen dos, por que también hay una tarjeta analógica TDM800P, con ocho puertos FXO. Hay una serie de aplicaciones que necesitamos instalar para echar a andar esta situación, las cuales son: zaptel, spandsp, libsupertone, libunicall, libmfcr2  y Asterisk. Podemos descargar cada una de estas aplicaciones por separado pero afortunadamente hay alguien (es el desarrollador principal de chan_unicall) que tiene un comprimido con todo lo necesario incluyendo manual de instrucciones, podemos descargarlo desde aquí: http://www.moythreads.com/astunicall/downloads/

La versión que yo use es la1.4.21.2, realmente es fácil la instalación, suponiendo que tienes todas las dependencias, todo se resume a tres cosas: ./configure –prefix=/usr && make && make install.

Terminado esto, y configurado adecuadamente el archivo zaptel.conf tomando como base el ejemplo que acompaña a los archivos de instalación nos queda de la siguiente manera, a lo ultimo hay algo extra con respecto de la tarjeta analógica, en caso de solo tener la tarjeta digital se omite la ultima linea.

[root@asteriskcentro ~]# more /etc/zaptel.conf
# MFC/R2 requires CAS signaling
# channel 16 is required to transmit ABCD bits so is not used for voice
span=1,1,0,cas,hdb3
cas=1-15:1101
dchan=16
cas=17-31:1101
fxsls=32-39

Si verificamos con el comando ztcfg, que lee el archivo zaptel.conf, para verificar la configuración, obtendremos algo similar a lo siguiente:

[root@asteriskcentro ~]# ztcfg -v
Zaptel Version: 1.4.11
Echo Canceller: MG2
Configuration
======================
SPAN 1: CAS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
39 channels to configure.

Eso es en caso de ir bien, si se te presenta un error similar a este:

ZT_CHANCONFIG failed on channel 2: Invalid argument (22)
Did you forget that FXS interfaces are configured with FXO signaling
and that FXO interfaces use FXS signaling?

En mi caso era de que por alguna razón, los módulos no cargaban bien, volviendo a cargar los modulos de zaptel y verificar bien la configuración del archivo, obtenemos que las tarjetas están listas para usarse.

Después de esto, te copias el archivo de ejemplo de unicall.conf, dentro de /etc/asterisk, para modificarlo a tu gusto aunque realmente lo que tienes que verificar es la siguiente linea: protocolvariant=mx,10,4

Esto significa que estamos en México, que son 10 numeros y que los últimos 4 números son los que envía el proveedor, por ejemplo tenemos las siguientes lineas telefónicas en la ciudad de México (55) 51 41 21 00, 51 41 21 02, 51 41 21 06, 51 41 21 07, etc., son diez dígitos y los que cambian son los últimos 2 que identifican cada linea, estos se denominan dígitos ANI y DNI.

Ahora si, iniciamos Asterisk, y verificamos el estado de las canales, realmente al conectar el enlace a nuestra tarjeta surgirán un montón de mensajes, el color del led pasara de rojo a verde, y directo a probar agarramos un celular y marcamos para ver como se comporta.

asteriskcentro*CLI> UC show channels
Channel Extension  Context         Status     Language   MusicOnHold
      1 2107       entrantescentro Idle       en         default
      2 2100       entrantescentro Idle       en         default
      3 2110       entrantescentro Idle       en         default
      4 2113       entrantescentro Idle       en         default
      5 2107       entrantescentro Idle       en         default
      6 2120       entrantescentro Idle       en         default
      7            entrantescentro Idle       en         default
      8            entrantescentro Idle       en         default
      9            entrantescentro Idle       en         default
     10            entrantescentro Idle       en         default
asteriskcentro*CLI>

Configuramos nuestro contexto de llamadas entrantes:

[entrantescentro]
include => ivr

exten => _X.,1,Background(custom/ivrcentro)
exten => _X.,n,WaitExten(15)
exten => _X.,n,Dial(SIP/2100)

exten => 2102,1,Macro(voicemail,SIP/${EXTEN})
exten => 2105,1,Macro(voicemail,SIP/${EXTEN})
exten => 2106,1,Macro(voicemail,SIP/${EXTEN})
exten => 2107,1,Macro(voicemail,SIP/${EXTEN})
exten => 2110,1,Macro(voicemail,SIP/${EXTEN})
exten => 2120,1,Macro(llamar,SIP/${EXTEN})
exten => 2121,1,Macro(llamar,SIP/${EXTEN})

Realizamos una llamada de prueba, y vemos el estado de la consola.

Connected to Asterisk 1.4.21.2 currently running on asteriskcentro (pid = 3281)
Verbosity is at least 10
[Oct 23 15:10:38] NOTICE[3395]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Detected
[Oct 23 15:10:39] NOTICE[3395]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Offered
[Oct 23 15:10:39] NOTICE[3395]: chan_unicall.c:2642 handle_uc_event: CRN 33152 - Offered on channel 0 (ANI: , DNIS: 2100, Cat: 1)
[Oct 23 15:10:40] NOTICE[3395]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Accepted
    -- Executing [2100@entrantescentro:1] NoOp("UniCall/1-1", "2100") in new stack
    -- Executing [2100@entrantescentro:2] NoOp("UniCall/1-1", "") in new stack
    -- Executing [2100@entrantescentro:3] Set("UniCall/1-1", "CALLERID(all)="Llamada"") in new stack
    -- Executing [2100@entrantescentro:4] BackGround("UniCall/1-1", "custom/ivrcentro") in new stack
    -- <UniCall/1-1> Playing 'custom/ivrcentro' (language 'en')
[Oct 23 15:10:40] NOTICE[13441]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Answered
[Oct 23 15:11:02] NOTICE[13441]: chan_unicall.c:1914 unicall_exception: Exception on 23, channel 1
[Oct 23 15:11:02] NOTICE[13441]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Far end disconnected
[Oct 23 15:11:02] NOTICE[13441]: chan_unicall.c:2790 handle_uc_event: CRN 33152 - far disconnected cause=Normal Clearing [16]
    -- Channel 0 got hangup
  == Spawn extension (entrantescentro, 2100, 4) exited non-zero on 'UniCall/1-1'
    -- Hungup 'UniCall/1-1'
[Oct 23 15:11:02] NOTICE[3395]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Drop call
[Oct 23 15:11:02] NOTICE[3395]: chan_unicall.c:2518 handle_uc_event: Unicall/1 event Release call
    -- Unicall/1 released
asteriskcentro*CLI>

Lo que hicimos fue marcar al numero cabeza de grupo, el que termina en 2100, si marcamos el numero con terminación 2107 se dirige directamente al usuario sin pasar por el mensaje de bienvenida.

Caso contrario si queremos hacer llamadas creamos un contexto como este:

[salientescentro-local]
exten => _XXXXXXXX,1,Dial(Unicall/g1/${EXTEN})

Hasta ahorita todo va bien, conforme pase el tiempo veremos como se comporta esto, y lo pondre por acá.

Date una vuelta por estas paginas y échales un ojo:

http://zarzamora.com.mx/archivo-historico/17

http://www.moythreads.com/astunicall/

http://www.voip-info.org/wiki/view/Asterisk+MFC+R2

octubre 3, 2008

IAXModem en acción.

Filed under: Asterisk, Fax — ciclodetrantor @ 5:45 pm

Una de las cosas que mas quebraderos de cabeza me ha ocasionado, es el asunto del fax. Cuando tienes lineas analógicas casi siempre predispones de que el fax pueda fallar. Se me ha presentado ese asunto con Asterisk y una tarjeta TDM410P. No llegan todos los fax enviados y los recibidos fallan con ciertos números. Aprovechando esto se me ocurrió probar el tan mencionado IAXModem e Hylafax.

A continuación anexo el comportamiento de Asterisk al detectar que entra un fax y lo redirige al IAXModem, posteriormente solo checo el archivo en el servidor o el PDF adjunto a algún correo electrónico.

Un excelente documento donde puedes encontrar la instalación de esto lo puedes encontrar aquí: http://www.julianmenendez.es/documentos/asterisk_hylafax_iaxmodem

Connected to Asterisk 1.2.28.1 currently running on SanJeronimo (pid = 15766)
    -- Remote UNIX connection
Verbosity is at least 30
    -- Starting simple switch on 'Zap/4-1'
Oct  2 12:24:03 NOTICE[19221]: chan_zap.c:6248 ss_thread: Got event 18 (Ring Begin)...
Oct  2 12:24:04 NOTICE[19221]: chan_zap.c:6248 ss_thread: Got event 2 (Ring/Answered)...
    -- Executing Answer("Zap/4-1", "") in new stack
    -- Executing Wait("Zap/4-1", "4") in new stack
    -- Redirecting Zap/4-1 to fax extension
  == Spawn extension (fax, fax, 0) exited non-zero on 'Zap/4-1'
    -- Executing Dial("Zap/4-1", "IAX2/200") in new stack
    -- Called 200
    -- Call accepted by 127.0.0.1 (format slin)
    -- Format for call is slin
    -- IAX2/200-8325 is ringing
    -- IAX2/200-8325 answered Zap/4-1
    -- Hungup 'IAX2/200-8325'
  == Spawn extension (fax, fax, 1) exited non-zero on 'Zap/4-1'
    -- Hungup 'Zap/4-1'

agosto 17, 2008

Correo de voz en PostgreSQL

Filed under: Asterisk — ciclodetrantor @ 5:39 pm

Nos conectamos nuevamente a nuestra base de datos.

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=#

Ingresamos las siguientes sentencias para crear el tipo especial donde se almacenaran los mensajes.

CREATE FUNCTION loin (cstring) RETURNS lo AS 'oidin' LANGUAGE internal IMMUTABLE STRICT;
CREATE FUNCTION loout (lo) RETURNS cstring AS 'oidout' LANGUAGE internal IMMUTABLE STRICT;
CREATE FUNCTION lorecv (internal) RETURNS lo AS 'oidrecv' LANGUAGE internal IMMUTABLE STRICT;
CREATE FUNCTION losend (lo) RETURNS bytea AS 'oidrecv' LANGUAGE internal IMMUTABLE STRICT;

CREATE TYPE lo ( INPUT = loin, OUTPUT = loout, RECEIVE = lorecv, SEND = losend, INTERNALLENGTH = 4, PASSEDBYVALUE );
CREATE CAST (lo AS oid) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (oid AS lo) WITHOUT FUNCTION AS IMPLICIT;

CREATE TRUSTED LANGUAGE plpgsql;
CREATE FUNCTION vm_lo_cleanup() RETURNS "trigger"
    AS $$
    declare
      msgcount INTEGER;
    begin
      if (TG_OP = 'UPDATE') then
        if ((old.recording = new.recording) or (old.recording is NULL)) then
          raise notice 'Not cleaning up the large object table, as recording has not changed';
          return new;
        end if;
      end if;
      if (old.recording IS NOT NULL) then
        SELECT INTO msgcount COUNT(*) AS COUNT FROM voicemessages WHERE recording = old.recording;
        if (msgcount > 0) then
          raise notice 'Not deleting record from the large object table, as object is still referenced';
          return new;
        else
          perform lo_unlink(old.recording);
          if found then
            raise notice 'Cleaning up the large object table';
            return new;
          else
            raise exception 'Failed to cleanup the large object table';
            return old;
          end if;
        end if;
      else
        raise notice 'No need to cleanup the large object table, no recording on old row';
        return new;
      end if;
    end$$
    LANGUAGE plpgsql;

CREATE TABLE voicemessages
(
uniqueid serial PRIMARY KEY,
msgnum int4,
dir varchar(80),
context varchar(80),
macrocontext varchar(80),
callerid varchar(40),
origtime varchar(40),
duration varchar(20),
mailboxuser varchar(80),
mailboxcontext varchar(80),
recording lo,
label varchar(30),
“read” bool DEFAULT false
);

CREATE TRIGGER vm_cleanup AFTER DELETE OR UPDATE ON voicemessages FOR EACH ROW EXECUTE PROCEDURE vm_lo_cleanup();

asteriskDB=# \d voicemessages
Tabla «public.voicemessages»
Columna     |         Tipo          |                          Modificadores
—————-+———————–+——————————————————————
uniqueid       | integer               | not null default nextval(‘voicemessages_uniqueid_seq’::regclass)
msgnum         | integer               |
dir            | character varying(80) |
context        | character varying(80) |
macrocontext   | character varying(80) |
callerid       | character varying(40) |
origtime       | character varying(40) |
duration       | character varying(20) |
mailboxuser    | character varying(80) |
mailboxcontext | character varying(80) |
recording      | lo                    |
label          | character varying(30) |
read           | boolean               | default false
Índices:
«voicemessages_pkey» PRIMARY KEY, btree (uniqueid)
Triggers:
vm_cleanup AFTER DELETE OR UPDATE ON voicemessages FOR EACH ROW EXECUTE PROCEDURE vm_lo_cleanup()

asteriskDB=# \q

Verificamos que la conexión sea exitosa para lo anteriormente creado.

asteriskpbx:/home/sistemas# echo “SELECT uniqueid, msgnum, dir, duration FROM voicemessages WHERE msgnum = 1” | isql asterisk-connector
+—————————————+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+—————————————+
SQL> +————+————+———————————————————————————+———————+
| uniqueid   | msgnum     | dir                                                                             | duration            |
+————+————+———————————————————————————+———————+
+————+————+———————————————————————————+———————+
SQLRowCount returns 0
SQL>

Agregamos las siguientes lineas en el archivo de configuración del correo de voz, donde especificamos el nombre del contexto de nuestra conexion y la tabla que contendra los mensajes, asi como la creacion de los buzones para los usuarios anteriormente creados.

asteriskpbx:/home/sistemas# vim /etc/asterisk/voicemail.conf

odbcstorage=asterisk
odbctable=voicemessages

[odbcmail]
5000 => 1984,Daneel,daneel@loquesea.com
5001 => 1984,Giskard,giskard@loquesea.com

Reiniciamos el modulo correspondiente,
*CLI> module unload app_voicemail.so
*CLI> module load app_voicemail.so

Visualizamos la creacion de los usuarios.

*CLI> voicemail show users for odbcmail
Context    Mbox  User                      Zone       NewMsg
odbcmail   5000  Daneel                                    0
odbcmail   5001  Giskard                                   0

Realizamos unos cambios a nuestro macro, para que despues de treinta segundos sonando salte al buzon de voz.
[macro-llamar]
exten => s,1,Dial(${ARG1},30)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(${MACRO_EXTEN}@odbcmail,u)
exten => s-BUSY,n,Voicemail(${MACRO_EXTEN}@odbcmail,b)
exten => s-CHANUNAVAIL,1,Voicemail(${MACRO_EXTEN}@odbcmail,u)
exten => s-CONGESTION,n,Voicemail(${MACRO_EXTEN}@odbcmail,b)

Agregamos lo siguiente a nuestro contexto internal para poder acceder a los correos de voz.

exten => *86,1,VoiceMailMain(@odbcmail)

julio 25, 2008

Sonido de moto en Asterisk

Filed under: Asterisk — ciclodetrantor @ 6:04 pm

Una de las cosas que pueden ocasionar muchos problemas en Asterisk son las lineas analógicas; ruido, eco, cortes de llamadas, llamadas que no se cuelgan, llamadas fantasmas, y un largo etcétera, pero lo de ayer nunca lo había escuchado.

En una oficina, reportaron que al entrar una llamada esta hacia un sonido como de “trompetilla”, y que se venia presentando frecuentemente. Grabando con mixmonitor, las llamadas entrantes del contexto de esa linea, me tope con una grabación mas que peculiar.

A primera vista después de verificar todo, la principal sospechosa fue la linea telefónica (TELMEX), cuando se marcaba el numero en cuestión el que realiza la llamada escucha que esta sonando el numero, pero al contestar del otro lado, se oye el sonido de timbrado bastante distorsionado a tal grado que asemejaba a una moto, a una sierra que resultaba siendo bastante chusco. Diagnostico: reportar la falla a la compañía.

julio 11, 2008

Flash Operator Panel

Filed under: Asterisk — ciclodetrantor @ 4:27 pm
Una de las herramientas mas útiles que me ha tocado conocer es el FOP (Flash Operator Panel).
Bastante útil para ver el estado de las llamadas, y verificar las lineas analógicas (principalmente cuando se bloquean). En la imagen se muestra un FOP que tengo conectado con cuatro Asterisk.
FOP

FOP

febrero 22, 2008

Asterisk CDR con PostgreSQL

Filed under: Asterisk — ciclodetrantor @ 10:30 pm

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)

noviembre 28, 2007

Instalación de Asterisk

Filed under: Asterisk — ciclodetrantor @ 6:20 pm

Después de instalar la distribución estable de Debian (etch-and-a-half) nos queda un sistema básico, debido a que se utiliza la versión de net-install el cual prepararemos para la instalación de Asterisk y demás componentes. Esta ultima versión tiene soporte para nuevo hardware.

Debido a que el servidor destinado no contendrá monitor, instalaremos SSH para poder manipularlo tranquilamente desde nuestra PC.

asteriskpbx:/home/sistemas# apt-get install openssh-client openssh-server

gabriel@trantor:~$ ssh sistemas@192.9.200.80
sistemas@192.9.200.80’s password:
Linux asteriskpbx 2.6.24-etchnhalf.1-686 #1 SMP Mon Jul 21 11:17:43 UTC 2008 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Aug 11 13:12:34 2008 from 192.9.200.161
sistemas@asteriskpbx:~$ su
Password:
asteriskpbx:/home/sistemas#

Agregamos un repositorio a nuestro fichero de configuración de APT, (en caso de que en la instalación del sistema no hayamos escogido alguno).

asteriskpbx:/home/sistemas# vim /etc/apt/sources.list

deb http://ftp.de.debian.org/debian etch main

Actualizamos la lista de paquetes.

asteriskpbx:/home/sistemas# aptitude update

asteriskpbx:/home/sistemas# aptitude update

Instalamos los paquetes necesarios junto con sus dependencias.

asteriskpbx:/home/sistemas# apt-get install linux-headers-$(uname -r) g++ libncurses5-dev libssl-dev libnewt-dev initrd-tools make bison unixodbc libltdl3-dev unixodbc-dev

Creamos un directorio para la instalación.

asteriskpbx:/home/sistemas# mkdir /usr/src/IPBX
asteriskpbx:/home/sistemas# cd /usr/src/IPBX/

Descargamos la versión actual de las aplicaciones.

asteriskpbx:/usr/src/IPBX# wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.21.2.tar.gz
asteriskpbx:/usr/src/IPBX# wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.11.tar.gz
asteriskpbx:/usr/src/IPBX# wget http://downloads.digium.com/pub/libpri/releases/libpri-1.4.5.tar.gz

Descomprimimos.

asteriskpbx:/usr/src/IPBX# tar xvfz asterisk-1.4.21.2.tar.gz
asteriskpbx:/usr/src/IPBX# tar xvfz libpri-1.4.5.tar.gz
asteriskpbx:/usr/src/IPBX# tar xvfz zaptel-1.4.11.tar.gz

Instalamos.

asteriskpbx:/usr/src/IPBX/libpri-1.4.5# make
asteriskpbx:/usr/src/IPBX/libpri-1.4.5# make install

asteriskpbx:/usr/src/IPBX/zaptel-1.4.11# ./configure
asteriskpbx:/usr/src/IPBX/zaptel-1.4.11# make
asteriskpbx:/usr/src/IPBX/zaptel-1.4.11# make install
asteriskpbx:/usr/src/IPBX/zaptel-1.4.11# make config

asteriskpbx:/usr/src/IPBX/asterisk-1.4.21.2# ./configure
asteriskpbx:/usr/src/IPBX/asterisk-1.4.21.2# make
asteriskpbx:/usr/src/IPBX/asterisk-1.4.21.2# make install
asteriskpbx:/usr/src/IPBX/asterisk-1.4.21.2# make samples

Iniciar Asterisk al arrancar el servidor

# cd /etc/init.d
# cp /usr/src/IPBX/asterisk-1.4.21.2/contrib/init.d/rc.debian.asterisk ./asterisk
# update-rc.d asterisk defaults

noviembre 16, 2007

Hello world!

Filed under: Uncategorized — ciclodetrantor @ 4:36 pm

Empezamos con esto, a ver que tal nos va.

Blog de WordPress.com.