[consulta] Uso de PHP-Scripting bajo Asterisk

Forums: 

Empezaré mi primera "aportación" a los foros de EcuaLUG con una pregunta, se trata de un problema que estoy teniendo con una simple IVR que he configurado en mi sistema.

Actualmente estoy usando rodando Asterisk 1.2.1 (con Asterisk@Home 2.2) bajo una versión CentOS release 4.2 (Final), me ayudo de phpMyAdmin 2.6.3-pl1 para las gestiones de bases de datos, la versión de MySQL es 4.1.12

¡Caray! siento la parrafada, voy al grano. Mi idea es pedirle al Asterisk que lance unas llamadas que, al descolgar entrarán al usuario en un IVR de confirmación de datos; para esto no hay problema, he modificado ligeramente la configuración de Teleyapper (http://nerdvittles.com) para lanzar las llamadas e introducirlas en el IVR.

Sin embargo, la parte más imporante está fallando: el registro en la Base de Datos de las pulsaciones realizadas por el destinatario de la llamada no se está realizando. Para insertar los datos he usado un mi propio script PHP con su correspondiente ejecución de SQL que, por algún motivo que desconozco no se está ejecutando.

Según la información de debug de Asterisk (verbose nivel 3) mi Script se ejecuta y devuelve como código de retorno 0; lo más curioso es que devuelve el mismo código de retorno que otros Scripts que SI están funcionando y (por extraño que parezca) también devuelve 0 e indica que se ha ejecutado ¡incluso si el archivo fuente no existe!. También me ha sucedido que Scripts que funcionaban perfectamente, después de modificarlos dejaban de funcionar (incluso si los sobreescribía con su backup).

Es por todo esto que, empiezo a sospechar que el problema no está en el Script (que he revisado decenas de veces) por lo tanto me encuentro perdido sin saber por dónde empezar a investigar el bug. ¿a alguien le ha pasado algo parecido? si es así ¿cómo lo solucionó?

Gracias de antemano por vuestra atención, a continuación anexo mi configuración

Aqui muestro un resumen de el IVR en el que entra el receptor cuando Asterik le envía una llamada (resumido, pues en mi máquina es mucho más extenso).
[code][micontexto]
exten => s,1,Answer
exten => s,2,Background(press-1-for-castellano)
exten => s,3,Wait(1)
exten => s,4,Background(press-2-for-catala)

;--------- CASTELLANO ---------
exten => 1,1,Background(Gracias)
exten => 1,2,Wait(1)

exten => 1,3,Background(esp/intro-answer-1)
exten => 1,4,Read(tmp,esp/answer-1,1)
exten => 1,5,Set(RESPA=${tmp}|g)
exten => 1,6,Background(Gracias)

exten => 1,7,Background(esp/intro-answer-2)
exten => 1,8,Read(tmp,esp/answer-2,1)
exten => 1,9,Set(RESPB=${tmp}|g)
exten => 1,10,Background(Gracias)

exten => 1,11,Set(LANG=1|g)
exten => 1,12,Hangup

;--------- CATALA ---------
exten => 2,1,Background(Gracies)
exten => 2,2,Wait(1)

exten => 2,3,Background(cat/intro-answer-1)
exten => 2,4,Read(tmp,esp/answer-1,1)
exten => 2,5,Set(RESPA=${tmp}|g)
exten => 2,6,Background(Gracies)

exten => 2,7,Background(cat/intro-answer-2)
exten => 2,8,Read(tmp,cat/answer-2,1)
exten => 2,9,Set(RESPB=${tmp}|g)
exten => 2,10,Background(Gracies)

exten => 2,11,Set(LANG=2|g)
exten => 2,12,Hangup

; -- HANGUP --
exten => h,1,DeadAGI(test2.php|${LANG}|${RESPA}|${RESPB})
exten => h,2,Hangup
exten => i,1,Goto(s,3)
exten => o,1,Goto(s,3)[/code]

El menú funciona a la perfección, pero el Script (test2.php) no parece que se ejecute.

Test2.php
[code]#usr/bin/php -q
<?
ob_implicit_flush(false);
error_reporting(0);
set_time_limit(300);

$debug = 1;
$log = "/var/log/asterisk/test2.txt";

$stdlog = fopen($log, 'a');
$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');

if ($debug) :
fputs($stdlog, "Script log.\n\n" . date("F j, Y - H:i:s"));
endif;

// Code begins here
while (!feof($stdin))
{
$inputvalue = fgets($stdin);
if ($debug) fputs($stdlog, "from stdin: " . $inputvalue);

$inputvalue = str_replace("\n", "", $inputvalue);

$partes = explode(":", $inputvalue);
$agivar[$partes[0]] = trim($partes[1]);

if (($inputvalue == "") || ($inputvalue == "\n")) break;
}

$LANG = $_SERVER['argv'][1];
$LANG = trim($TLF);
$LANG = ltrim($TLF);

$RESPA = $_SERVER['argv'][2];
$RESPA = trim($RESPA);
$RESPA = ltrim($RESPA);

$RESPB = $_SERVER['argv'][3];
$RESPB = trim($RESPA);
$RESPB = ltrim($RESPA);

if ($debug) :
fputs($stdlog, "LANG: " . $LANG . "\n");
fputs($stdlog, "RESPA: " . $RESPA . "\n");
fputs($stdlog, "RESPB: " . $RESPB . "\n");
fputs($stdlog, "\n\nOpening database...\n");
endif;

$link = mysql_connect("localhost", "root", "passw0rd") or die("Data base connection failed");
mysql_select_db("testdatabase") or die("data base open failed");

if ($debug) :
fputs($stdlog, "Database opened\n");
endif;

$query = "INSERT INTO `test_table` VALUES (" . $TLF . ", `" . $RESPA . "`, `" . $RESPB . "`, `" . $RESPC . "`)";
$result = mysql_db_query($query) or die("Web site query failed");

if ($debug) :
fputs($stdlog, "the query is: " . $query . "\n");

if ($result)
{ fputs($stdlog, "query done.\n");}
else
{ fputs($stdlog, "query failed.\n");}
endif;

if ($debug) :
fputs($stdlog, "... closing database.\n");
endif;

mysql_close($link);

if ($debug) :
fputs($stdlog, "Script log.\n\n" . date("F j, Y - H:i:s"));
endif;

fclose($stdlog);
fclose($stdin);
fclose($stdlog);
exit;

?>[/code]Este archivo tiene permisos de ejecución y lectura (775) y el owner es asterisk:asterisk

agi debug

Imagen de neologan

La verdad no programo mucho en php para asterisk, suelo utilizar perl o a veces java y si alguna vez me pasó algo parecido fue xq el script no tenía permisos de ejecución (si no tienes inconveniente ponle 777). El resultado 0 que te devuelve no te da mucha información, pues a veces el valor de las variables no se pasan desde asterisk al script (o viceversa) pero igual todo se ejecuta, incluso se puede hacer la conexión a la bdd pero no se guarda nada. En la consola de asterisk puedes teclear "agi debug" (a algo así) para comprobar detalladamente tu agi y revisar en donde esta el problem. Ojalá te ayude en algo, me cuentas por favor como te fué.

logan

La verdad es que finalmente

Imagen de PaperBirdMaster

La verdad es que finalmente he conseguido hacer rodar los scripts... peeeeeeeeero, no era tema de permisos ^_^.

Era tema de FORMATO. La solución fue instalar Notepad++ y guardar los archivos de script en formato Unix. ;)