miércoles, 8 de junio de 2011

Asterisk + cdr ODBC + Oracle

CDR (Call Data Records) es una funcionalidad importantísima para cualquier centralita telefónica, el CDR es el que nos va a permitir ver todo el historial de llamadas, quien las ha hecho, a que destinatario, a que hora, que duración ha tenido la llamada...

Nuestro objetivo es tener todo este registro en nuestra base de datos Oracle.

El primer paso sería configurar la conexión de nuestro servidor Asterisk contra nuestra base de datos Oracle, esto ya lo vimos en el anterior capítulo.

Una vez hecha y probada esta configuración el siguiente paso sería crear la tabla donde vamos a almacenar los datos del CDR, también lo vimos en el capítulo anterior.

Por último falta configurar Asterisk para que los registros del CDR los guarde en nuestra base de datos.

1.- Archivo modules.conf

En este archivo añadimos la siguiente linea de configuración a lo que ya tenemos:

[root@ESZ01AST01 asterisk]# vim modules.conf
load => cdr_odbc.so

2.- Archivo cdr_odbc.conf

En este archivo ponemos la siguiente configuración:

[root@ESZ01AST01 asterisk]# vim cdr_odbc.conf
[global]
dsn=asterisk ; nombre que le hemos dado a la conexión en res_odbc.conf
username=asterisk ; usuario base de datos
password=password ; password base de datos
loguniqueid=yes
table=cdr
usegmtime=no


3.- Reiniciamos Asterisk

[root@ESZ01AST01 asterisk]# service asterisk restart

Ya tenemos el cdr en nuestra base de datos!

martes, 7 de junio de 2011

Asterisk + Oracle

Hola a tod@s!

En este nuevo capítulo veremos como integrar Asterisk RealTime con una base de datos Oracle.

Asterisk por defecto lee todas sus configuraciones de los archivos de configuracion que se encuentran en la ruta /etc/asterisk.
Asterisk RealTime es el entorno de Asterisk que se encarga de cargar y almacenar las configuraciones en la Base de datos. La gran ventaja de este sistema es que nos permite cargar configuraciones en tiempo real, sin necesidad de hacer ningún reload en el Asterisk CLI.

Para mas información:

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

En Internet encontraremos una gran cantidad de información acerca de como crear este nuevo entorno con MySQL y PostgreSQL, lo que vamos a hacer en este capítulo es hacer la integración en un entorno Oracle.

1.- Requisitos.

Para hacer esta integración con Oracle necesitaremos los siguientes componentes:

- unixODBC 2.3.0 (Descarga)
- Oracle Instant Client 11g 11.2.0.2, Instant client basic y suplementos ODBC (Descarga)
- unixODBC-devel

Descargamos todos estos paquetes en el servidor.

2.- Instalación unixODBC-devel
Instalamos el unixODBC-devel, yum instalará también automáticamente el paquete unixODBC.
Estas versiones que instala yum son la 2.2.11, mas tarde instalaremos manualmente unixODBC 2.3.0. Esta versión es necesaria por un tema de compatibilidad con el Oracle Instant Client 11g.

[root@ESZ01AST01 src]# yum install unixODBC-devel

3.- Instalación unixODBC 2.3.0
Instalamos unixODBC 2.3.0 en nuestro servidor.

[root@ESZ01AST01 src]# tar zxvf unixODBC-2.3.0.tar.gz
[root@ESZ01AST01 src]# cd unixODBC-2.3.0
[root@ESZ01AST01 unixODBC-2.3.0]# ./configure --prefix=/usr
[root@ESZ01AST01 unixODBC-2.3.0]# make
[root@ESZ01AST01 unixODBC-2.3.0]# make install

Ahora ya tenemos el driver unixODBC 2.3.0 en nuestro servidor, la instalación se ha hecho en las rutas: /usr/bin, /usr/include, /usr/etc y /usr/lib.

4.- Instalación Oracle Instant Client 11g

Hacemos la instalación en la ruta: /opt/instantclient_11/

[root@ESZ01AST01 src]# mkdir /opt/instantclient_11
Nos ubicamos en la ruta donde hemos descargado el instantclient y lo movemos a la ruta que hemos creado previamente.
[root@ESZ01AST01 src]# mv instantclient-* /opt/instantclient_11/.
[root@ESZ01AST01 src]# cd /opt/instantclient_11/
[root@ESZ01AST01 instantclient_11]# unzip instantclient-basic-linux-x86-64-11.2.0.2.0.zip
[root@ESZ01AST01 instantclient_11]# unzip instantclient-odbc-linux-x86-64-11.2.0.2.0.zip
[root@ESZ01AST01 instantclient_11]# unzip instantclient-sqlplus-linux-x86-64-11.2.0.2.0.zip
[root@ESZ01AST01 instantclient_11]# cd instantclient_11_2/
Ejecutamos el script de instalación para que instale debajo de la ruta /usr como hemos hecho con el driver unixODBC 2.3.0.
[root@ESZ01AST01 instantclient_11_2]# ./odbc_update_ini.sh '/usr/'

Ahora ya tenemos configurado el instanclient con el driver unixODBC 2.3.0, ha modificado automáticamente los archivos:
- /usr/etc/odbcinst.ini
- /root/.odbc.ini

Editamos el archivo /usr/etc/odbcinst.ini y lo dejamos así:

[OracleODBCdriver]
Description = Oracle ODBC driver for Oracle
Driver = /opt/instantclient_11/instantclient_11_2/libsqora.so.11.1
Setup = /opt/instantclient_11/instantclient_11_2/libsqora.so.11.1
DontDLClose = 1
FileUsage = 1
UsageCount = 1

Copiamos el archivo a la ruta /etc

[root@ESZ01AST01 instantclient_11_2]# cp /usr/etc/odbcinst.ini /etc/

Editamos el archivo /root/.odbc.ini:

[OracleODBC-11g]
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CloseCursor = F
DisableDPM = F
DisableMTS = T
Driver = OracleODBCdriver
DSN = OracleODBCdriver
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
Lobs = T
Longs = T
MaxLargeData = 0
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
Database = "change to your Instance name"
ServerName = "change to your database dns or ip"
Port = "change to your port"
SQLGetData extensions = F
Translation DLL =
Translation Option = 0
DisableRULEHint = T
UserID = "change to your user database"
Password = "change to your password user"
StatementCache=F
CacheBufferSize=20
UseOCIDescribeAny=F


Copiamos este archivo a /usr/etc/odbc.ini y a /etc:

[root@ESZ01AST01 instantclient_11_2]# cp /root/.odbc.ini /usr/etc/odbc.ini
[root@ESZ01AST01 instantclient_11_2]# cp /root/.odbc.ini /etc/odbc.ini

Añadimos la ruta de las librerias del instantclient al ldconfig:

[root@ESZ01AST01 instantclient_11_2]# vi /etc/ld.so.conf.d/instantclient.conf
/opt/instantclient_11/instantclient_11_2

Hacemos un ldconfig -v y comprobamos que el sistema está cargando las librerias del instantclient.
[root@ESZ01AST01 instantclient_11_2]# ldconfig -v

Ahora comprobamos que la instalación del unixODBC está bien hecha y que carga la configuración de forma correcta.
[root@ESZ01AST01 instantclient_11_2]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /usr/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/etc/odbc.ini
FILE DATA SOURCES..: /usr/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8


Para finalizar comprobamos que la conexión a la Base de datos es correcta y que se logea:

[root@ESZ01AST01 instantclient_11_2]# isql -v OracleODBC-11g
[S1000][unixODBC][Oracle][ODBC][Ora]ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

[ISQL]ERROR: Could not SQLConnect


Como vemos aparece un mensaje de error, es porque nos falta definir el tnsnames (archivo de configuración de servidores Oracle). Es necesario especificar la base de datos destino en este archivo sino no sabe llegar a ella.

[root@ESZ01AST01 instantclient_11_2]# mkdir -p /opt/instantclient_11/instantclient_11_2/network/admin
[root@ESZ01AST01 instantclient_11_2]# cd /opt/instantclient_11/instantclient_11_2/network/admin
[root@ESZ01AST01 admin]# vim tnsnames.ora

SERVER_NAME (servername al que hacemos referencia en odbc.ini) =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = servername_or_ip)(PORT = nuestro_port)
)
(CONNECT_DATA =
(SID = nuestro_SID)
)
)



Volvemos a comprobar la conexión a la base de datos:

[root@ESZ01AST01 admin]# isql -v OracleODBC-11g
[28000][unixODBC][Oracle][ODBC][Ora]ORA-01017: nombre de usuario/contraseña no válidos; conexión denegada

[ISQL]ERROR: Could not SQLConnect


Ahora como podemos ver el error nos dice que el usuario y contraseña no son válidos, es decir ya está llegando a la base de datos Oracle.

5.- Creación de tablas en Oracle.
Desde Oracle ejecutamos el siguiente SQL.

create user asterisk identified by password default tablespace asterisk;
grant connect, resource to asterisk;
conn asterisk/password

create sequence asterisk.seq_sip_buddies;
drop table asterisk.sip_buddies;
CREATE TABLE asterisk.sip_buddies (
id number(11) CONSTRAINT sip_buddies_pk PRIMARY KEY,
name varchar2(80) default '' ,
accountcode varchar2(20) default NULL,
amaflags varchar2(7) default NULL,
callgroup varchar2(10) default NULL,
callerid varchar2(80) default NULL,
canreinvite varchar2(3) default 'yes',
context varchar2(80) default NULL,
defaultip varchar2(15) default NULL,
dtmfmode varchar2(7) default NULL,
fromuser varchar2(80) default NULL,
fromdomain varchar2(80) default NULL,
fullcontact varchar2(80) default NULL,
host varchar2(31) ,
insecure varchar2(20) default NULL,
language varchar2(2) default NULL,
mailbox varchar2(50) default NULL,
md5secret varchar2(80) default NULL,
nat varchar2(5) default 'no',
deny varchar2(95) default NULL,
permit varchar2(95) default NULL,
mask varchar2(95) default NULL,
pickupgroup varchar2(10) default NULL,
port varchar2(5) default ' ',
qualify varchar2(3) default NULL,
restrictcid varchar2(1) default NULL,
rtptimeout varchar2(3) default NULL,
rtpholdtimeout varchar2(3) default NULL,
secret varchar2(80) default NULL,
type varchar2(6) default 'friend',
username varchar2(80) default '',
disallow varchar2(100) default 'all',
allow varchar2(100) default 'g729;ilbc;gsm;ulaw;alaw',
musiconhold varchar2(100) default NULL,
regseconds varchar2(11) default '0',
ipaddr varchar2(15),
regexten varchar2(80),
cancallforward varchar2(3) default 'yes',
CONSTRAINT uniq_1 UNIQUE (name)
);
create or replace trigger asterisk.trig_sip_buddies
before insert on asterisk.sip_buddies
for each row
begin
select asterisk.seq_sip_buddies.nextval into :new.id from dual;
end;
/


create sequence asterisk.seq_extensions;
CREATE TABLE asterisk.extensions (
id number(11) ,
context varchar2(20) default '' ,
exten varchar2(20) default '' ,
priority number(4) default '0' ,
app varchar2(20) default '' ,
appdata varchar2(128) default '' ,
constraint extensions_pk PRIMARY KEY (context,exten,priority)
--KEY id (id)
);
create or replace trigger asterisk.trig_extensions
before insert on asterisk.extensions
for each row
begin
select asterisk.seq_extensions.nextval into :new.id from dual;
end;
/

create sequence asterisk.seqvoicemessages;


CREATE TABLE asterisk.voicemessages (
id number(11) ,
msgnum number(11) default '0' ,
dir varchar2(80) default '',
context varchar2(80) default '',
macrocontext varchar2(80) default '',
callerid varchar2(40) default '',
origtime varchar2(40) default '',
duration varchar2(20) default '',
mailboxuser varchar2(80) default '',
mailboxcontext varchar2(80) default '',
recording blob,
constraint vmessages_pk PRIMARY KEY (id)
--KEY dir (dir)
);
create or replace trigger asterisk.trigvoicemessages
before insert on asterisk.voicemessages
for each row
begin
select asterisk.seqvoicemessages.nextval into :new.id from dual;
end;
/


CREATE TABLE asterisk.queues (
name varchar2(128) CONSTRAINT queues_pk PRIMARY KEY,
musiconhold varchar2(128) default NULL,
announce varchar2(128) default NULL,
context varchar2(128) default NULL,
timeout number(11) default NULL,
monitor_type varchar2(50) ,
monitor_format varchar2(128) default NULL,
queue_youarenext varchar2(128) default NULL,
queue_thereare varchar2(128) default NULL,
queue_callswaiting varchar2(128) default NULL,
queue_holdtime varchar2(128) default NULL,
queue_minutes varchar2(128) default NULL,
queue_seconds varchar2(128) default NULL,
queue_lessthan varchar2(128) default NULL,
queue_thankyou varchar2(128) default NULL,
queue_reporthold varchar2(128) default NULL,
announce_frequency number(11) default NULL,
announce_round_seconds number(11) default NULL,
announce_holdtime varchar2(128) default NULL,
retry number(11) default NULL,
wrapuptime number(11) default NULL,
maxlen number(11) default NULL,
servicelevel number(11) default NULL,
strategy varchar2(128) default NULL,
joinempty varchar2(128) default NULL,
leavewhenempty varchar2(128) default NULL,
eventmemberstatus varchar2(4) default NULL,
eventwhencalled varchar2(4) default NULL,
reportholdtime number(1) default NULL,
memberdelay number(11) default NULL,
weight number(11) default NULL,
timeoutrestart number(1) default NULL,
periodic_announce varchar2(50) default NULL,
periodic_announce_frequency number(11) default NULL,
ringinuse number(1) default NULL
);

create sequence asterisk.seq_queue_members;

CREATE TABLE asterisk.queue_members (
uniqueid number(10) CONSTRAINT queues_members PRIMARY KEY,
membername varchar2(40) default NULL,
queue_name varchar2(128) default NULL,
interface varchar2(128) default NULL,
penalty number(11) default NULL,
paused number(1) default NULL,
CONSTRAINT uniq_2 UNIQUE (queue_name,interface)
--UNIQUE KEY queue_interface (queue_name,interface)
);
create or replace trigger asterisk.tri_queue_members
before insert on asterisk.queue_members
for each row
begin
select asterisk.seq_queue_members.nextval into :new.uniqueid from dual;
end;
/

create sequence asterisk.seq_cdr;
drop table asterisk.cdr;
CREATE TABLE asterisk.cdr (
uniqueid varchar2(32) default ' ' ,
calldate date default '01-01-00' ,
clid varchar2(80) default ' ' ,
src varchar2(80) default ' ' ,
dst varchar2(80) default ' ' ,
dcontext varchar2(80) default ' ' ,
channel varchar2(80) default ' ' ,
dstchannel varchar2(80) default '1',
lastapp varchar2(80) default ' ' ,
lastdata varchar2(80) default ' ' ,
duration number(11) default 0 ,
billsec number(11) default 0 ,
disposition varchar2(45) default ' ' ,
amaflags number(11) default 0 ,
accountcode varchar2(20) default ' ',
userfield varchar2(255) default ' '
);
create or replace trigger asterisk.tri_cdr
before insert on asterisk.cdr
for each row
begin
select asterisk.seq_cdr.nextval into :new.uniqueid from dual;
end;
/


Volvemos a hacer la comprobación de conexión:

[root@ESZ01AST01 admin]# isql -v OracleODBC-11g
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>


Ya lo tenemos!

6.- Compilación de Asterisk.

Una vez ya tenemos el unixODBC contra nuestra base de datos configurado y funcionando, tenemos que volver a compilar Asterisk, para dar soporte de ODBC a nuestra instalación.

Primero instalamos unas librerias que son necesarias.
[root@ESZ01AST01 asterisk-1.8.4.2]# yum install libtool-ltdl-devel openssl-devel newt-devel zlib-devel
[root@ESZ01AST01]# cd /usr/src/asterisk-1.8.4.2
[root@ESZ01AST01 asterisk-1.8.4.2]# make clean
[root@ESZ01AST01 asterisk-1.8.4.2]# ./configure
En este menú nos aseguramos que las siguientes opciones están seleccionadas:
cdr_odbc, func_odbc, func_realtime, pbx_realtime, res_config_odbc, res_odbc.
[root@ESZ01AST01 asterisk-1.8.4.2]# make menuselect
[root@ESZ01AST01 asterisk-1.8.4.2]# make install
[root@ESZ01AST01 asterisk-1.8.4.2]# make config
[root@ESZ01AST01 asterisk-1.8.4.2]# make samples

7.- Configuración de Asterisk ODBC.

Ahora falta configurar Asterisk para que se conecte a la base de datos Oracle. Tenemos que modificar varios archivos de configuración.
Empecemos:

7.1.- res_odbc.conf

En este archivo configuramos las conexiones ODBC, en este archivo se configuran parámetros de conexión a la base de datos, los cuales serán usados por los distintos módulos de Asterisk.

[root@ESZ01AST01 asterisk]# vim /etc/asterisk/res_odbc.conf
[asterisk]
enabled => yes
dsn => OracleODBC-11g
username => asterisk
password => password
loguniqueid = yes
pre-connect => yes
sanitysql => select 1 from dual


7.2.- modules.conf
En el archivo modules.conf añadimos las siguientes lineas:
[root@ESZ01AST01 asterisk]# vim modules.conf
[modules]
preload => res_odbc.so
preload => res_config_odbc.so
load => cdr_odbc.so
preload => func_odbc.so


7.3.- extconfig.conf
En este archivo de configuración indicamos que módulos de asterisk queremos que se carguen de base de datos. Yo voy a poner tres de momento.

[root@ESZ01AST01 asterisk]# vim extconfig.conf
[settings]

sipusers => odbc,asterisk,sip_buddies
sippeers => odbc,asterisk,sip_buddies
extensions => odbc,asterisk,extensions


sipusers es la familia de realtime, odbc es el tipo de conector al poner odbc buscará la configuración en el archivo res_odbc.conf, asterisk es la base de datos configurada previamente en res_odb.conf y sip_buddies es la tabla donde se guardan los datos.

Reiniciamos asterisk y ya estará la plataforma lista para interactuar con la base de datos.
[root@ESZ01AST01 asterisk]# service asterisk restart

7.4.- extensions.conf
Para ubicar extensiones en la base de datos, dentro de un contexto previamente definido en el archivo extensions.conf, es necesario hacer una redirección desde este contexto hacia otro creado en la base de datos.

Por ejemplo:
Para buscar las extensiones del contexto internal en la base de datos, hacemos una redirección como se muestra en el ejemplo hacia el nuevo contexto internaldb en la tabla extensions.

[root@ESZ01AST01 asterisk]# vim /etc/asterisk/extensions.conf
[phones]
include => internal
include => outgoing_calls

[internal]
switch => Realtime/internaldb@extensions


Es necesario hacer un dialplan reload para que asterisk recargue la configuración.
[root@ESZ01AST01 asterisk]# asterisk -rvvvv
Asterisk 1.8.4.2, Copyright (C) 1999 - 2010 Digium, Inc. and others.
Created by Mark Spencer
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.
=========================================================================
== Parsing '/etc/asterisk/asterisk.conf': == Found
== Parsing '/etc/asterisk/extconfig.conf': == Found
== Binding sipusers to odbc/asterisk/sip_buddies
== Binding sippeers to odbc/asterisk/sip_buddies
== Binding extensions to odbc/asterisk/extensions
Connected to Asterisk 1.8.4.2 currently running on ESZ01AST01 (pid = 11351)
Verbosity is at least 7

ESZ01AST01*CLI> dialplan reload

8.- Creación de extensiones en la base de datos.

Vamos a crear un usuario en la tabla sip_buddies y vamos a asociar una extensión a este usuario.

INSERT INTO asterisk.sip_buddies (name,secret,context,host,type,username,mailbox,disallow,allow) VALUES ('1001','password','phones','dynamic','friend','1001','1001@internal','all','ulaw,alaw,gsm,g723');

INSERT INTO asterisk.extensions (context,exten,priority,app,appdata) VALUES ('internaldb','1001','1','Dial','SIP/1001,20,tTkKwW');
INSERT INTO asterisk.extensions (context,exten,priority,app,appdata) VALUES ('internaldb','1001','2','VoiceMail','1001@internal');

Ahora mismo si hacemos un sip show peers seguimos sin ver al usuario, eso es porque tenemos que hacer un load.

ESZ01AST01*CLI> sip show peers
Name/username Host Dyn Forcerport ACL Port Status Realtime
0 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 0 offline]


ESZ01AST01*CLI> sip show peer 1001 load


* Name : 1001
Realtime peer: Yes, cached
Secret :
MD5Secret :
Remote Secret:
Context : phones
Subscr.Cont. : default
Language : es


ESZ01AST01*CLI> sip show peers
Name/username Host Dyn Forcerport ACL Port Status Realtime
1001/1001 (Unspecified) D 0 Unmonitored Cached RT
1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 1 offline]


Ahora ya tenemos nuestro usuario cargado en Asterisk, si nos registramos con un sip phone veremos como aparecemos registrados en el CLI de Asterisk.

Nos vemos en el próximo capítulo!

lunes, 6 de junio de 2011

Guia Instalación Asterisk paso a paso

Hola a tod@s!

Creo que no hace falta hacer ninguna introducción de lo que es Asterisk, por si alguien anda un poco despistado aquí tenéis información.

http://es.wikipedia.org/wiki/Asterisk
http://www.voip-info.org/wiki/view/Asterisk

Empezamos con la primera guía de Asterisk en Español, con la instalación paso a paso bajo un sistema CentOS 5.
Poco a poco iré subiendo otras guías con nuevas funcionalidades de Asterisk.

1.- Actualización del sistema.
Para empezar vamos a actualizar nuestro S.O. en nuestro caso lo hacemos con yum de CentOS.
Es importante reiniciar al acabar con la actualización, así se aplican los cambios al actualizar el kernel.

[root@ESZ01AST01]# yum update
[rootESZ01AST01]# yum install kernel-devel kernel-headers
[rootESZ01AST01]# yum update kernel
[rootESZ01AST01]# reboot

2.- Instalación de dependencias.
Es muy importante tener instaladas todas las dependencias en nuestro S.O., si no las tenemos la compilación de Asterisk y sus módulos fallará.

Estas son las dependencias que hay que instalar poder realizar la instalación de Asterisk.

yum install ncurses ncurses-devel openssl zlib zlib-devel curl gcc gcc-c++ libxml2 libxml2-devel libtermcap libtermcap-devel gtk2 gtk2-devel

3.- Instalación de Asterisk.
En primer lugar instalaremos los paquetes Libpri, Dahdi y por último Asterisk.

3.1.- Descarga de los paquetes.
[root@ESZ01AST01 ~]# cd /usr/src/
[root@ESZ01AST01 src]# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8.4.2.tar.gz
[root@ESZ01AST01 src]# wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/releases/dahdi-linux-complete-2.4.1.2+2.4.1.tar.gz
[root@ESZ01AST01 src]# wget http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.11.5.tar.gz

[root@ESZ01AST01 src]# tar zxvf libpri-1.4.11.5.tar.gz
[root@ESZ01AST01 src]# tar zxvf dahdi-linux-complete-2.4.1.2+2.4.1.tar.gz
[root@ESZ01AST01 src]# tar zxvf asterisk-1.8.4.2.tar.gz

3.2.- Instalación Libpri.

[root@ESZ01AST01 src]# cd libpri-1.4.11.5
[root@ESZ01AST01 libpri-1.4.11.5]# pwd
/usr/src/libpri-1.4.11.5
[root@ESZ01AST01 libpri-1.4.11.5]# make install

3.3.- Instalación Dahdi.

[root@ESZ01AST01 libpri-1.4.11.5]# cd ../dahdi-linux-complete-2.4.1.2+2.4.1
[root@ESZ01AST01 dahdi-linux-complete-2.4.1.2+2.4.1]# make all

3.4.- Instalación paquete Asterisk.

[root@ESZ01AST01 dahdi-linux-complete-2.4.1.2+2.4.1]# cd ../asterisk-1.8.4.2
[root@ESZ01AST01 asterisk-1.8.4.2]# ./configure
[root@ESZ01AST01 asterisk-1.8.4.2]# make menuselect

Aquí entramos en un menú donde elegimos la configuración de instalación de Asterisk. Añadimos los paquetes extra de sonidos GSM en "Extra Sound Packages", y el paquete CORE-SOUNDS-ES-GSM en "Core Sound Packages".
Para finalizar con la selección y guardar seleccionamos "Save and Exit".

[root@ESZ01AST01 asterisk-1.8.4.2]# make
[root@ESZ01AST01 asterisk-1.8.4.2]# make install
[root@ESZ01AST01 asterisk-1.8.4.2]# make config
[root@ESZ01AST01 asterisk-1.8.4.2]# make samples

4.- Arrancando Asterisk

Para arrancar Asterisk ejecutaremos el siguiente comando:
[root@ESZ01AST01 asterisk-1.8.4.2]# service asterisk start

Entramos en la consola, el número de veces que escribimos "v" marca el nivel de verbose.
[root@ESZ01AST01 asterisk-1.8.4.2]# asterisk -rvvvv

5.- Configuración de Asterisk

5.1.- Configuración sip.conf

[root@ESZ01AST01 asterisk-1.8.4.2]# cd /etc/asterisk/

Hacemos backup del archivo de ejemplo sip.conf
[root@ESZ01AST01 asterisk]# mv sip.conf sip.conf.old

Editamos un nuevo archivo sip.conf
[root@ESZ01AST01 asterisk]# vim sip.conf

[general]
context = phones
bindport = 5060
bindaddr = 0.0.0.0
srvlookup = yes
allowexternaldomains = yes
allowguest = yes
rtcachefriends = yes
disallow = all
allow = ulaw
allow = alaw
allow = gsm
allow = g723
language = es

[user1]
type=friend
host=dynamic
secret=1234
context=phones

[user2]
type=friend
host=dynamic
secret=1234
context=phones

Una vez hechas las modificaciones cargamos la configuración en Asterisk.

[root@ESZ01AST01 asterisk]# asterisk -rvvvv
ESZ01AST01*CLI sip reload
Reloading SIP
== Parsing '/etc/asterisk/sip.conf': == Found
== Parsing '/etc/asterisk/users.conf': == Found
== Using SIP CoS mark 4
== Parsing '/etc/asterisk/sip_notify.conf': == Found

Si queremos ver si el usuario ya está cargado en la configuración el siguiente comando muestra todos los usuarios.
ESZ01AST01*CLI sip show peers
Name/username Host Dyn Forcerport ACL Port Status
user1/user1 (Unspecified) D 0 Unmonitored
user2 (Unspecified) D 0 Unmonitored
2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 2 offline]


5.2.- Configuración extensions.conf.
Este archivo de configuración es el que contiene la configuración de las extensiones.
Hacemos backup del archivo extensions.conf:
root@ESZ01AST01 asterisk]# mv extensions.conf extensions.conf.old

Editamos un nuevo archivo extensions.conf:
[root@ESZ01AST01 asterisk]# vim extensions.conf

[general]
static = yes
writeprotect = no
autofallthrough = yes
clearglobalvars = no
priorityjumping = no

[globals]

[phones]

exten => 1000,1,Dial(SIP/user1,20)
exten => 1000,2,Hangup()

exten => 1001,1,Dial(SIP/user2,20)
exten => 1001,2,Hangup()

A continuación cargamos la configuración en Asterisk:

[root@ESZ01AST01 asterisk]# asterisk -rvvvv
ESZ01AST01*CLI dialplan reload

6.- Registrando en Asterisk.

Una vez ya tenemos usuario y hemos creado la extensión ya podemos registrarnos en Asterisk y empezar a hacer llamadas.
Podemos utilizar como sip phone Zoiper (http://www.zoiper.com) por ejemplo, una vez hemos configurado la cuenta con la contraseña que pusimos en el campo secret del archivo sip.conf, veremos en la consola de Asterisk que el login se hace correctamente:

ESZ01AST01*CLI>
[Jun 6 22:59:27] NOTICE[1911]: chan_sip.c:23618 handle_request_subscribe: Received SIP subscribe for peer without mailbox: user1
-- Registered SIP 'user1' at 192.168.1.24:5060
> Saved useragent "Zoiper rev.11619" for peer user1
[Jun 6 22:59:27] NOTICE[1911]: chan_sip.c:23618 handle_request_subscribe: Received SIP subscribe for peer without mailbox: user1

Ahora si ejecutamos "sip show peers", veremos que el usuario ya está registrado.
ESZ01AST01*CLI> sip show peers
Name/username Host Dyn Forcerport ACL Port Status
user1/user1 192.168.1.24 D 5060 Unmonitored
user2 (Unspecified) D 0 Unmonitored
2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 1 offline]

Para ver información en detalle de algún usuario en concreto:
ESZ01AST01*CLI sip show peer user1


* Name : user1
Secret :
MD5Secret :
Remote Secret:
Context : phones
Subscr.Cont. : default
Language : es
AMA flags : Unknown
Transfer mode: open
CallingPres : Presentation Allowed, Not Screened
Callgroup :
Pickupgroup :
MOH Suggest :
Mailbox :
VM Extension : asterisk
LastMsgsSent : 32767/65535
Call limit : 0
Max forwards : 0
Dynamic : Yes
Callerid : "" <>
MaxCallBR : 384 kbps
Expire : 2967
Insecure : no
Force rport : No
ACL : No
DirectMedACL : No
T.38 support : No
T.38 EC mode : Unknown
T.38 MaxDtgrm: -1
DirectMedia : Yes
PromiscRedir : No
User=Phone : No
Video Support: No
Text Support : No
Ign SDP ver : No
Trust RPID : No
Send RPID : No
Subscriptions: Yes
Overlap dial : Yes
DTMFmode : rfc2833
Timer T1 : 500
Timer B : 32000
ToHost :
Addr->IP : 192.168.1.24:5060
Defaddr->IP : (null)
Prim.Transp. : UDP
Allowed.Trsp : UDP
Def. Username: user1
SIP Options : norefersub replaces replace
Codecs : 0xf (g723|gsm|ulaw|alaw)
Codec Order : (ulaw:20,alaw:20,gsm:20,g723:30)
Auto-Framing : No
100 on REG : No
Status : Unmonitored
Useragent : Zoiper rev.11619
Reg. Contact : sip:user1@10.1.21.4:5060;rinstance=96fa0be45d26ae72;transport=UDP
Qualify Freq : 60000 ms
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Parkinglot :
Use Reason : No
Encryption : No

Al hacer una llamada vemos en la consola de Asterisk como se ejecuta la llamada, pero nos muestra un error, normal ya que estamos llamando a una extensión que no está registrada.

ESZ01AST01*CLI
== Using SIP RTP CoS mark 5
-- Executing [1001@phones:1] Dial("SIP/user1-00000000", "SIP/user2,20") in new stack
[Jun 6 23:11:21] WARNING[2083]: app_dial.c:2041 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Unknown)
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [1001@phones:2] Hangup("SIP/user1-00000000", "") in new stack
== Spawn extension (phones, 1001, 2) exited non-zero on 'SIP/user1-00000000'


En próximas publicaciones veremos como implementar diversas funcionalidades que harán de Asterisk una centralita de lo mas completa.

Hasta la próxima!