Mi primer AGI en PHP para login/logout múltiple en colas
July 28, 2008 11:24 am Asterisk, Sistemas, Software LibreUno 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,Hangupexten => 2,1,AGI(queue-loginout.php,logout,${username})
exten => 2,n,Hangupexten => 3,1,AGI(queue-loginout.php,pause,${username})
exten => 3,n,Hangupexten => 4,1,AGI(queue-loginout.php,unpause,${username})
exten => 4,n,Hangup
