jueves, 24 de noviembre de 2011

Asterisk PBX 1.6.2.X: Como autorizar llamadas internacionales con un PIN utilizando una base de datos

Hace días quería compartir este artículo publicado en Voz to Voice, espero les guste más de uno puede implementar cosas interesante a partir de este ejemplo usando obdc que nos da mas flexibilidad


En el articulo anterior hemos visto como autorizar las llamadas internacionales utilizando un PIN y la aplicación Authenticate. Es este articulo veremos como hacer más o menos la misma cosa utilizando una base de datos. En este caso cada usuario podrá cambiar su PIN en cualquier momento. Para este tipo de configuración nos apoyaremos a ODBC y al archivo de configuración de Asterisk func_odbc.conf


Prerrequisitos:



  • haber compilados Asterisk con el soporte ODBC


Para iniciar creamos una base de datos que contendrá los siguientes campos:



  • nombre

  • numero matricula

  • pin


entramos en el cliente de MySQL:


mysql -u root –p


Creamos la base de datos empleados:


mysql> create database empleados; 
Query OK, 1 row affected (0.00 sec)


Otorgamos todos los permisos para esa base de datos al usuario admin  con contraseña sesamo:


GRANT ALL PRIVILEGES ON empleados.* TO 'admin'@'localhost' IDENTIFIED BY 'sesamo'; 
Query OK, 0 rows affected (0.34 sec)


La seleccionamos:


mysql> use empleados 
Database changed


Creamos la tabla PIN que contiene los campos: nombre, matricula y pin:


mysql> CREATE TABLE PIN ( 
    nombre varchar(20), 
    matricula int(5), 
    pin int(4) 
    ); 
Query OK, 0 rows affected (0.02 sec)


Insertamos tres nuevos empleados:


mysql> insert into PIN (nombre,matricula,pin) values ("fulano","10100","1234"),("zutano","10200","1235"),("mengano","10300","1236"); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3  Duplicates: 0  Warnings: 0


Averiguamos que se han creado:


mysql> select * from PIN; 
+---------+-----------+------+ 
| nombre  | matricula | pin  | 
+---------+-----------+------+ 
| fulano  |     10100 | 1234 | 
| zutano  |     10200 | 1235 | 
| mengano |     10300 | 1236 | 
+---------+-----------+------+ 
3 rows in set (0.00 sec)


Salimos del clliente MySQL


myslq> quit


Ahora que tenemos la base de datos vamos a crear una entrada en el archivo odbc.ini para esa base de datos:


nano /etc/idbc,ini


añadimos las siguientes líneas:


[empleados] 
Description = MySQL encuesta 
Driver = MySQL 
Database = empleados 
Server = localhost 
User = admin 
Password = sesamo 
Port = 3306 
Option = 3


En el archivo res_odbc se añadirán unas líneas para crear la conexión ODBC con Asterisk. La referencia es la etiqueta [empleados]:


nano /etc/asterisk/res_odbc.conf


[pin] 
enabled => yes 
dsn => empleados 
username => admin 
password => sesamo 
pre-connect => yes 
sanitysql => select 1 
idlecheck => 3600 
connect_timeout => 10


Para terminar hay que modificar el archivo func_odbc creando dos bloques: uno para leer el pin en la base de datos y uno para actualizarlo. La variable DSN es la etiqueta [pin] del archivo res_odbc.conf:


nano /etc/asterisk/func_odbc.conf


al final del archivo se añade:


[empleados] 
dsn=pin 
readsql=SELECT pin FROM PIN WHERE pin='${SQL_ESC(${ARG1})}' 


[cambioclave] 
dsn=pin 
readsql=SELECT pin FROM PIN WHERE matricula='${SQL_ESC(${ARG1})}' 
writesql=UPDATE PIN SET pin='${SQL_ESC(${VAL1})}' WHERE matricula='${SQL_ESC(${ARG1})}'


Primer Bloque


 



  • La etiqueta [empleados] define la función ODBC que luego encontraremos disponible entre las funciones de Asterisk

  • dsn=pin – pin es la etiqueta que inicia el bloque definido en el archivo res_odbc.conf

  • readsql=… es la sentencia para leer el pin en la tabla PIN


 


Segundo Bloque



  • La etiqueta [cambioclave] define la función ODBC que luego encontraremos disponible entre las funciones de Asterisk

  • dsn=pin – pin es la etiqueta que inicia el bloque definido en el archivo res_odbc.conf

  • readsql=… es la sentencia para leer el pin en la tabla PIN en base al numero de matricula

  • writesql=.. es para actualizar el pin del empleado


Se guardan las modificaciones y se pasa al dialplan. Suponiendo que el contexto que se utiliza para las llamadas internacionales es “internac”, ponemos:


nano /etc/asterisk/extensions.conf


[internac] 
exten => _00.,1,NoOP 
same => n,Answer 
same => n,read(clave,enter-password,4) 
same => n,Noop(${pin}) 
same => n,GotoIf($[${EXISTS(${ODBC_empleados(${clave})})}]?llamar) 
same => n,Congestion(2) 
same => n,Hangup 
same => n(llamar),Dial(SIP/provveedorVoIP/${FILTER(0-9,${EXTEN})}) 
same => n,Hangup


Con la aplicación Read leemos los 4 dígitos que corresponden al PIN que el empleado tendrá que digitar para que se le de acceso a las llamadas internacionales. En la aplicación Gotoif averiguamos que el PIN digitado exista en la base de datos. En el caso exista pasamos a la línea con la etiqueta llamar, el en caso no exista seguimos con el dialplan. La función EXISTS se utiliza para corroborar que una variable no sea vacía.


En la etiqueta llamar ponemos el Dial y iniciamos la llamada. Hasta aquí todo bastante sencillo. Ahora la parte del dialplan que permite al empleado modificar su PIN.


En este caso en el contexto internal ponemos:


exten => *99XXXXX,1,NoOP 
same => n,Read(clave,vm-password,4) 
same => n,GotoIf($[${EXISTS(${ODBC_cambioclave(${EXTEN:3})})}]?nuevaclave) 
same => n,Congestion(2) 
same => n,Hangup 
same => n(nuevaclave),Read(nuevaclave,vm-newpassword,4) 
same => n,Set(ODBC_cambioclave(${EXTEN:3})=${nuevaclave}) 
same => n,Saydigits({nuevaclave}) 
same => n,Hangup


El empleado para cambiar su PIN tendrá que marcar *99 más el numero de su matricula (5 dígitos como definido en la tabla de la base de datos). Con la aplicación read se pide el PIN viejo. Se averigua que este PIN sea efectivamente asociado al numero de matricula digitado. Si es así se pasa a la línea con la etiqueta nuevaclave, sino se termina la llamada. En la etiqueta nuevaclave se pide al empleado que digite el nuevo PIN y este se guarda en la base de datos asociándolo al numero de matricula del empleado. En la penúltima línea se anuncia al empleado su nuevo PIN y luego se cuelga la llamada. ${EXTEN:3}) es la variable que contiene el numero de matricula del empleado. Suponiendo que se digite *9910100 el 3 significa que los primeros tres dígitos se quitarán del valor de la variable.


Se guardan los cambios y se recarga la configuración de Asterisk:


/etc/jinit.d/asterisk reload


Se entra en la consola:


asterisk –rvvvvvvvvvvvvvvvvvv


y se buscan las nuevas funciones registradas:


CLI> core show function ODBC_empleados


CLI> core show function ODBC_cambioclave


Se intenta hacer una llamada internacional. Una vez introducido el PIN la llamada debería empezar.


Para probar el cambio del PIN se marca la extensión *9910100 que es el numero de matricula del empleado fulano.


Fuente: Voz To Voice.org

2 comentarios: