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

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.

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

1 comentario

Hola chicos tremendo articulo

Hola chicos tremendo articulo pero tengo un solo error en el update

UPDATE call_time_controll SET time_used='${VAL1}' WHERE user_extensions_ID=(SELECT ue.ID FROM user_call_accountcode as uca, users_extensions as ue WHERE users_extension_number='${ARG1}')

usando el dialplan
same=>n,Set(ODBC_utime()=${total_tused},${CALLERID(num)})

pero no me funciona la unica forma que logro que me funcione es
UPDATE call_time_controll SET time_used='${VAL1}' WHERE user_extensions_ID=(SELECT ue.ID FROM user_call_accountcode as uca, users_extensions as ue WHERE users_extension_number='3232')

pasando el users_extension_number manual pero el valor si funciona dinamico que puedo verificar?

Suscribirse a Comentarios de "Asterisk PBX 1.6.2.X: Como autorizar llamadas internacionales con un PIN utilizando una base de datos" Suscribirse a VozToVoice - Todos los comentarios