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!
hola victor, mi os es debian, estoy tratando de seguir los pasos pero en el paso 4 cuando hago ./odbc_update_ini.sh '/usr/' no pasa nada,
ResponderEliminarsi ejecuto .odbc_update_ini.sh, me sale lo sgt :
debian:/opt/instantclient_11/instantclient_11_2# ./odbc_update_ini.sh
*** Please pass ODBCDM_HOME as arg-1, and optional arguments -
*** Install location (arg-2), Driver name (arg-3) & DSN (arg-4).
*** Usage: odbc_update_ini.sh [] [] []
pudieras ayudarme
saludos
Julio Cesar
lima, peru
Tengo un error:
ResponderEliminar[01000][unixODBC][Driver Manager]Can't open lib '/u01/app/oracle/product/11.2.0/xe/lib/libsqora.so.11.1' : libclntsh.so.11.1: cannot open shared object file: No such file or directory
[ISQL]ERROR: Could not SQLConnect
Por favor ayuda, gracias de antemano