Mi primer AGI en PHP para login/logout múltiple en colas

11:24 am Asterisk, Sistemas, Software Libre

Uno de los mayores problemas con las colas de llamadas en la versión 1.4, es que la aplicación AgentLogin está desaconsejada (deprecated). La alternativa es no usar agentes y en su lugar usar las nuevas aplicaciones dinámicas AddQueueMember y RemoveQueueMember. Estás dos aplicaciones tienen una desventaja respecto al uso de los agentes, y es que en caso de que un usuario pertenezca a más de una cola de llamadas tiene que o bien loguearse en todas, o bien tenemos que tener un sitio donde relaciones las colas con los usuarios y preparar algo que nos permita facilitar la tarea.

Es por ello, que aprovechando la base de datos SQLite que tenemos enlazada con nuestro Asterisk, podemos aprovechar y crear una tabla que simule los Agentes de Asterisk:

CREATE TABLE queue_agent_table(
uniqueid integer not null primary key autoincrement,
membername varchar(40),
queue_name varchar(128),
interface varchar(128),
penalty INT(11),
UNIQUE (queue_name, interface)
);

Suponiendo que tenemos una cola llamada Pruebas, para añadirle un agente que sea un usuario SIP llamado ‘agente’, simplemente añadiríamos lo siguiente:

insert into queue_member_table(queue_name,interface,penalty) values(’Pruebas’,'SIP/agente’,1);

Ahora, para permitir la conexión/desconexión a más de 1 cola, es necesario recorrer varias filas de una consulta la tabla creada, por lo que la manera más cómoda es usar un AGI. Para ello creamos el programa queue-loginout.php (que dejaremos en el directorio /var/lib/asterisk/agi-bin) y que contendrá lo siguiente:

#!/usr/bin/php -q
<?php
require(”/var/www/db.php”);

$dbfile = “/var/lib/asterisk/asteriskdb-sqlite.db”;

$results = execute_query($dbfile, “select queue_name,penalty from queue_agent_table where interface=’SIP/$argv[2]‘”);

$stdout = fopen(’php://stdout’, ‘w’);

for($i = 0; $i < count($results); $i ++) {
$name = $results[$i]['queue_name'];
$pen = $results[$i]['penalty'];

if($argv[1] == “login”) {
fputs($stdout,”EXEC AddQueueMember $name|SIP/$argv[2]|$pen
“);
} else if($argv[1] == “logout”) {
fputs($stdout,”EXEC RemoveQueueMember $name|SIP/$argv[2]
“);
} else if($argv[1] == “pause”) {
fputs($stdout,”EXEC PauseQueueMember $name|SIP/$argv[2]
“);
} else if($argv[1] == “unpause”) {
fputs($stdout,”EXEC UnpauseQueueMember $name|SIP/$argv[2]
“);
}
}
fflush($stdout);
?>

El script de AGI recibe dos argumentos, el primero es la operación que se quiere realizar, y el segundo el nombre del usuario SIP. El fichero que se incluye simplemente tiene unas funciones de ayuda para hacer consultas a la BD.

Ahora simplemente nos quedaría hacer uso de este script de AGI desde nuestro dialplan. Para ello podemos crear por ejemplo la extensión *10 que es la que gestionará todo lo relacionado con las colas de llamadas (en el ejemplo lo único que hacemos es saltar a un contexto, donde se recupera el usuario SIP que hace la llamada, y se espera un número del 1 al 4 que es el que indica la operación a hacer):

exten => *10,1,Goto(queue-loginout,s,1)

[queue-loginout]
exten => s,1,Set(foo=${CUT(CHANNEL,,1)})
exten => s,n,Set(username=${CUT(foo,/,2)})
exten => s,n,Read(opt,,1)
exten => s,n,Goto(${opt},1)

exten => 1,1,AGI(queue-loginout.php,login,${username})
exten => 1,n,Hangup

exten => 2,1,AGI(queue-loginout.php,logout,${username})
exten => 2,n,Hangup

exten => 3,1,AGI(queue-loginout.php,pause,${username})
exten => 3,n,Hangup

exten => 4,1,AGI(queue-loginout.php,unpause,${username})
exten => 4,n,Hangup

Deja tu comentario

Tu comentario

Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Advertencia: Está habilitada la moderación de comentarios y puede verse retrasada la publicación. No es necesario que reenvies tu comentario.