Hoy nos ha surgido la necesidad de grabar bajo demanda el audio procedente de un ChanSpy. Así entre las opciones por defecto no había nada que cumpliera nuestras necesidades. 
Como esta tarde teníamos el hacker_mode a ON, lo primero ha sido un vistazo rápido al app_chanspy.c, en el que nos hemos encontrado lo siguiente:
-
-
res = (f->frametype == AST_FRAME_DTMF) ? f->subclass : 0;
-
-
ast_frfree(f);
-
-
if (!res)
-
continue;if (x == sizeof(inp))
-
x = 0;
-
-
if (res < 0) {
-
running = -1;
-
break;
-
}
-
-
else if (res == ‘*’) {
-
running = 0;
-
break;
-
} else if (res == ‘#’) {
-
if (!ast_strlen_zero(inp)) {
-
running = atoi(inp);
-
break;
-
}
-
-
……………….
A la vista de esto, se nos ha ocurrido que si se pulsa una tecla como por ejemplo el 5, podríamos ejecutar lo que quisiéramos, desde escribir un valor en la DB de Asterisk, reproducir un fichero,… el límite es tu imaginación
Por poner unos ejemplos, a continuación se muestra cómo escribir en la DB el valor ‘uniqueid’ que se escribirá en el CDR y cómo reproducir un fichero:
-
-
if (res == ‘5′)
-
{
-
ast_verbose(VERBOSE_PREFIX_3 "IRONTEC:Escribiendo en la DB el valor: %sn",csth.spy.chan->cdr->uniqueid);
-
if (ast_db_put("UNIQUEID", csth.spy.chan->cdr->uniqueid,"0") )
-
ast_verbose(VERBOSE_PREFIX_3 "IRONTEC: OK Database!");
-
else
-
ast_verbose(VERBOSE_PREFIX_3 "IRONTEC: ERR Database!");
-
-
ast_verbose(VERBOSE_PREFIX_3 "IRONTEC:Escribiendo en la DB el valor: %sn",csth.spy.chan->cdr->uniqueid);
-
resultado = ast_streamfile(chan, "tt-monkeys", chan->language);
-
-
if (!resultado)
-
res = ast_waitstream(chan, "");
-
-
}
Hasta aquí el hackeo de la tarde… Happy Asterisk hacking!!
Posted by saul in Asterisk
