Asterisk Advanced – Día 4

Día largo el de ayer, ¡tan largo que duró hasta bien entrada la noche! :) 3469634238_00210b84de_b

Como no podía ser de otra manera todos los alumnos estuvieron de acuerdo en tener una edición nocturna del Asterisk Advanced así que durante las prácticas que los alumnos realizaban Elio y yo preparamos algunos ejercicios con “truco”. Tras estrujarse un poco el cerebro y a veces con alguna pista pudiéron resolverlos y comprobar lo versátil que Asterisk puede llegar a ser.

Hoy es un día un poco más corto, ya que se realizará el exámen para la obtención de la certificación oficial dCAP y luego toca desmontar todo el asunto :(

PD: Ánimo Jose!

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Asterisk Advanced – Día 3

Día de cacharreo y dialplan el de ayer. Por la mañana profundizamos en diversos aspectos del dialplan y por la tarde jugamos a McGyver con las tarjetas :) 3467927870_ec5909e777_b

Aunque la instalación y configuración de tarjetas es algo que se aprende relativamente rápido, requiere mucho movimiento por parte de los alumnos y se alborota un poco la cosa, pero eso a Elio y a mi nos da tiempo para buscar nuestros nombres en Google ;)

Tras aprender a instalar y configurar las tarjetas vinieron las pruebas: enlaces con cables PRI cross-over, teléfonos analógicos, simulaciones de líneas analógicas… vamos, un poco de todo.

Hoy toca dialplan de nuevo, que es en lo que más se profundiza a lo largo de todo el Asterisk Advanced, pero tal vez tengamos alguna sorpresa… ¿habrá un Asterisk Advanced Night Edition? ;)

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Asterisk Advanced – Día 2

Día durillo y lleno de conceptos el de ayer. Día de SIP. Día de IAX2. Día de aprender de VoIP más que de Asterisk.

Uno de los problemas con los que se encuentra mucha gente es que aunque en Asterisk se mueve bien, le flaquean conceptos de VoIP. Por ello el Asterisk Advanced incluye casi un día completo de teoría y práctica sobre SIP e IAX2. Fuimos viendo los protocolos de uno en uno y haciendo prácticas en medio, y los alumnos comprobaron que aunque la teoría esté clara siempre puede surgir algún problemilla :) 3465189646_64177a9d16_b

Se va notando que hay cada vez más ganas de aprender, ya que varios alumnos se quedaron un rato más haciendo pruebas, capturas de tráfico, etc. Nosotros probamos a ver si las IAX transfers funionaban, y sorprendentemente ¡lo hacen! Aunque eso no quita para que SIP sea *el* protocolo a utilizar ;)

Hoy día de dialplan a muerte… ¿aguantarán hasta la noche?

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Asterisk Advanced – Día 1

Al igual que el año pasado, iré posteando a día vencido las idas y venidas de los alumnos y de los “infiltrados” para que los que no hayan podido venir se hagan una idea de lo que por aquí se cuece.

Ayer fue el primer día, día de presentaciones. Los alumnos no se conocían los unos a los otros pero al estar sentados juntos a medida que avanzaba la clase se hacían preguntas entre ellos y cooperaban en la resolución de problemas, eso mola :) img_0019

Espero que hayan dormido bien, porque hoy empieza lo duro: dialplan a tope, y conceptos más profundos de VoIP, ya que ayer sólo vimos lo imprescindible como para configurar un Asterisk con dos terminales que pudieran llamarse entre ellos.

He de decir que el nuevo temario está bastante bien y se tratan con mayor profundidad algunos temas como el NAT, que cuando yo hice el BootCamp ni me mencionaron. También vamos metiendo algún bonus como el uso de ngrep para examinar trazas SIP, y así la cosa se pone más interesante ;)

Seguiremos informando…

PD: Tenéis todas la fotos que vaya sacando en Flickr.

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Todo listo para el AsteriskAdvanced

Como se puede apreciar en las imágenes, ya tenemos todo listo para par el pistoletazo de salida al Asterisk Advanced Bilbao 2k9.img_0015

Éste año han cambiado algunas cosas como el nombre (antes era Asterisk Bootcamp) y la versión de Asterisk, ya que en esta ocasión utilizaremos Asterisk 1.6, pero la ilusión es la misma.

El trabajo que nos ha llevado montar la sala no es nada comparado con el que van a realizar los asistentes en esta semana intensiva de Asterisk :) Esperemos que al final de la semana la familia de dCAPs cuente con nuevos miembros.

Al igual que el año pasado, haremos un post diario sobre la marcha del curso en este blog y por supuesto que no faltará el Asterisk Night Adavnced :)

¿Te lo vas a perder?

img_0016

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

El Asterisk BootCamp vuelve a Bilbao

Esta vez bajo el nombre Asterisk Advanced, pero volveremos a tener formación oficial de Digium en Bilbao! :)

Avanzada7 e Irontec organizarán el próximo curso Asterisk Advanced, que tendrá lugar en Bilbao del 20 al 24 de abril. El año pasado la experiencia fue muy buena así que tenemos el listón alto pero esperamos superarlo en esta ocasión.join-community

La pregunta que muchos tendrán es “¿voy o no voy?”. Personalmente diferencio dos tipos de perfiles de usuarios como asistentes a los BootCamp:

  • Usuarios con conocimientos básicos de Asterisk. Éstos usuarios han conocido Asterisk hace poco y acuden al BootCamp para adquirir conocimientos sobre VoIP y Asterisk.
  • Usuarios con conocimientos medios o avanzados de Asterisk. Éstos usuarios ya llevan tiempo trabajando con Asterisk y suelen acudir al BootCamp para profundizar y afianzar aún más sus conocimientos.

Si crees que perteneces a alguno de los tipos de usuarios arriba mencionados, deberías venir. :)

La otra duda de los asistentes suele ser si presentarse o no al examen para la certificación dCAP. Mi recomendación es presentarse ya que en Internet no hay mucho material disponible sobre el examen, y lo mejor es verlo por uno mismo.

El año pasado ya tuvimos algún extra como el Night BootCamp y para este año ya se nos van ocurriendo ideas así que quien venga no espere dormir en toda la semana… ¡nos vemos en abril!

Happy Asterisk learning!! :)

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Estratégia de colas “linear” en Asterisk 1.4

Todos los que llevamos algún tiempo con Asterisk hemos tenido que pegarnos alguna vez con su sistema de colas. Las colas de Asterisk no son sencillas de manejar  ya que disponen de decenas de opciones para variar su comportamiento.

Uno de los parámetros de configuración más importantes para las colas es la estrategia (strategy), que define la forma en la que las llamadas serán repartidas entre los agentes.  En Asterisk 1.4 podemos elegir entre las siguientes estrategias:

  • Leastrecent: Asigna la siguiente llamada al agente que más tiempo lleve sin atender una llamada.
  • Fewestcalls: Asigna la siguiente llamada al agente que menos llamadas haya atendido.
  • Random: Asigna la siguiente llamada aleatoriamente a cualquier agente disponible.
  • Ringall: Llama a todos los agentes a la vez y el primero que descuelgue será quien atienda la llamada.
  • RoundRobin: Distribuye las llamadas “por turnos” entre los agentes disponibles. (No disponible en Asterisk 1.6)
  • RRMemory: Similar a RoundRobin, pero “recuerda” el último agente al que intentó llamar.

Además de la estraegia hay muchos parámetros que condicionan la distribución de las llamadas, como ringinuse, weight, etc, pero no es necesario adentrarnos en eso :)

La forma que tiene Asterisk de guardar en memoria los agentes de las colas es mediante una función hash. Esta función hash calcula un valor numérico en base a la interfaz del agente (por ejemplo Agent/1001 o SIP/1002). El valor devuelto por la función hash siempre va a ser el mismo, por lo que con ninguna de las estrategias arriba descritas podemos decidir un orden estricto de distribución de llamadas basado en el orden de login (sin hacer trampas ;) ).

Para solucionar esto, Asterisk 1.6 implementa la estrategia “linear” que distribuye las llamadas de manera similar a RRMemory, pero siguiendo el orden en que los agentes se han unido a la cola.

Muchos encontramos esta estrategia particularmente interesante, pero desafortunadamente sólo está disponible para Asterisk 1.6. Tras buscar en el bugtracker de Digium, las listas de Asterisk-Developers y Asterisk-ES no he encontrado un backport de esta estrategia que funcione correctamente en Asterisk 1.4. Así, Manwe y yo hemos hemos hecho un backport de la estrategia “linear” para Asterisk 1.4.

El parche se aplica correctamente con Asterisk 1.4.23.1 y todas las pruebas realizadas han sido satisfactorias :) Aqúi lo tenéis: app_queue-linear-strategy

Happy Asterisk hacking! ;)

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Monitorización de Asterisk con Munin

Todos los que nos dedicamos a esto de Asterisk hacemos nuestros pinitos con mon, nagios, snmp y similares para atender nuestras centralitas y saber cuándo algo va mal. Este tipo de monitorización, depende del soporte que se haya vendido, no le importa al cliente ya que a él sólo le importa que la centralita funcione. Pero hay algunas estadísticas que sí que le pueden interesar al cliente, como saber cuántas llamadas concurrentes suele tener, si las licencias de su ASR están en uso por picos o de forma constante, si el balanceo de sus primarios está correctamente hecho o si por el contrario estamos saturando alguno… etc. Me refiero a estadísticas de uso de los recursos de Asterisk.

Esto no es nada nuevo. Hay multitud de programas y desarrollos a medida que nos permiten monitorizar estos casos y que nos generan gráficos y estadísticas en flash, con animaciones y todo. En este post vamos a hablar de Munin como sistema de monitorización de la centralita.

Para los que no lo conozcan, Munin es un sistema que nos genera gráficos de cualquier cosa que podamos imaginar: Uso de la CPU, colas del MTA, queries de Mysql, uso de la swap, uso de la RAM… todo a base de unos sencillos plugins.

Para usar munin no tenemos más que instalar los paquetes correspondientes:

apt-get install munin munin-node apache2

Una vez hecho esto esperaramos hasta 5 minutos para que munin genere las primeras imágenes y al acceder a la URL http://localhost/munin ¡SORPRESA! Tenemos un fea y anticuada web maquetada con tablas en la que a medida que pase el tiempo veremos cómo van dibujándose gráficos referentes a los recursos y servicios que tengamos instalados.

Por defecto munin trae bastantes plugins de monitorización de servicios. Los plugins en el caso de Debian se guardan en /usr/share/munin/plugins y se activan mediante enlaces simbólicos en /etc/munin/plugins/ y configuran en /etc/munin/plugin-conf.d/munin-node. Claro que hasta ahora no ha hecho falta tocar nada de todo esto porque funciona de serie.

Ya tenemos un sistema que genera gráficas de los servicios típicos que tenemos en un servidor GNU/Linux. Ahora sólo falta la parte de monitorizar asterisk usando los plugins que no vienen de serie con el programa.
Zap channels

En la web de munin podemos encontrar plugins generados por los usuarios. A partir de un plugin genérico que se conecta al manager de asterisk, mete un comando y parsea la respuesta podemos sacar casi todas las estadísticas que nos interesen: Canales zap, misdn, sip, iax, llamadas simultáneas, licencias G729 en uso…

Veamos un ejemplo de un plugin de munin que vía Manager saca las llamadas concurrentes en el asterisk:

  1. #!/usr/bin/perl -w                                                                                                                                                                  
  2. use strict;
  3. my $ret = undef;
  4. if (! eval "require Net::Telnet;")
  5. {                                
  6.     $ret = "Net::Telnet not found";
  7. }                                  
  8. if ($ARGV[0] and $ARGV[0] eq "config")
  9. {
  10.     print "graph_title Asterisk active CALLS\n";
  11.     print "graph_args –base 1000 -l 0\n";
  12.     print "graph_vlabel calls\n";
  13.     print "graph_category asterisk\n";
  14.     print "channels.draw AREA\n";
  15.     print "channels.label channels\n";
  16.     exit 0;
  17. }
  18.  
  19. my $host = exists $ENV{‘host’} ? $ENV{‘host’} : "127.0.0.1";
  20. my $port = exists $ENV{‘port’} ? $ENV{‘port’} : "5038";
  21.  
  22. my $username = "administrador";
  23. my $secret   = "secretillo";
  24.  
  25. my $pop = new Net::Telnet (Telnetmode => 0);
  26. $pop->open(Host => $host,
  27.            Port => $port);
  28.  
  29. ## Read connection message.
  30. my $line = $pop->getline;
  31. die $line unless $line =~ /^Asterisk/;
  32.  
  33. ## Send user name.
  34. $pop->print("Action: login");
  35. $pop->print("Username: $username");
  36. $pop->print("Secret: $secret");
  37. $pop->print("Events: off");
  38. $pop->print("");
  39.  
  40. ## Request status of messages.
  41. $pop->print("Action: command");
  42. $pop->print("Command: core show channels");
  43. $pop->print("");
  44. my $result;
  45. while (($line = $pop->getline) and ($line !~ /END COMMAND/o))
  46. {
  47.     print $line;
  48.     $result = $line if $line =~ /active call/;
  49. }
  50.  
  51. my $nb = (split ‘ ‘,$result)[0];
  52. $pop->print("Action: logoff");
  53. $pop->print("");
  54.  
  55. print "channels.value $nb\n";

Como puede verse leyendo un poco el código, la base del script es siempre el mismo, datos, establecimiento de la conexión… etc. Con sólo cambiar unas pocas líneas podemos ir sacando y monitorizando toda la información que deseemos. Las líneas clave serían:
$pop->print("Command: core show channels"); Donde metemos el comando que queremos.
$result = $line if $line =~ /active call/; Es la línea que tiene el resultado que queremos. Si ejecutamos a mano un asterisk -rx "core show channels" podemos ver que la respuesta es del estilo
root@pbx:/etc/asterisk/dialplan# asterisk -rx "core show channels"
Channel Location State Application(Data)
SIP/sarenet-09130f90 946571015@default:1 Ringing AppDial((Outgoing Line))
SIP/2627-b32fade0 s-VOIP@macro-salient Ring Dial(SIP/sarenet/946571015|80|
SIP/2100-08f814c0 2100@desde-usuarios: Ringing AppDial((Outgoing Line))
SIP/2652-b2cdd190 s@macro-llamadainter Ring Dial(SIP/2100|45|Tt)
SIP/sarenet-08b4d478 (None) Up Bridged Call(SIP/2404-b2ff03f0
SIP/2404-b2ff03f0 s-VOIP@macro-salient Up Dial(SIP/sarenet/943446826|80|
mISDN/1-u981 s@ivr-operadorbuzon: Up BackGround(locuciones/EUS_IVR_
SIP/sarenet-082f7388 (None) Up Bridged Call(SIP/2612-089c0d50
SIP/2612-089c0d50 s-VOIP@macro-salient Up Dial(SIP/sarenet/944806571|80|
9 active channels
5 active calls
Está claro que en el caso de querer monitorizar las llamadas concurrentes a lo largo del tiempo lo que nos interesa es la línea última que es la que tiene el número de llamadas concurrentes en ese momento. Una vez tenemos la línea en la que está la información lo único que hace falta es sacar el dato de esa línea y sacar el resultado en el formato que a munin le interesa:
my $nb = (split ‘ ‘,$result)[0];
print "channels.value $nb\n";
De hecho, si ejecutamos el script a mano desde la consola lo que veremos será la salida que se le pasará a munin cuando éste ejecute dicho script de forma periódica:
root@pbx:~# /usr/share/munin/plugins/asteriskcalls
Response: Success
Message: Authentication accepted
Response: Follows
Privilege: Command
Channel Location State Application(Data)
mISDN/1-u994 s@macro-getcallerid: Ringing AGI(getcallerid.php|943085756)
SIP/sarenet-08e41cd0 (None) Up Bridged Call(SIP/2626-b318d338
SIP/2626-b318d338 s-VOIP@macro-salient Up Dial(SIP/sarenet/630642987|80|
SIP/sarenet-08b4d478 (None) Up Bridged Call(SIP/2404-b2ff03f0
SIP/2404-b2ff03f0 s-VOIP@macro-salient Up Dial(SIP/sarenet/943446826|80|
SIP/sarenet-082f7388 (None) Up Bridged Call(SIP/2612-089c0d50
SIP/2612-089c0d50 s-VOIP@macro-salient Up Dial(SIP/sarenet/944806571|80|
7 active channels
4 active calls
channels.value 4

Si nos fijamos en el principio del script podemos ver que “channels.value” es el valor que le interesa a munin para hacer la gráfica ya que hemos puesto “channels” en la vertical.

Este script hace las cosas bien, con manager y todo. Pero no tenemos por qué limitarnos a eso. Al final munin sólo quiere un valor para un campo vertical que irá pintando a lo largo del tiempo. Podemos hacer cosas menos bonitas y más imaginativas. Ejemplo de uso de un primario que pertenece a un grupo de varios:

  1. #!/bin/sh
  2.  
  3. LISTAZAP=$(asterisk -rx ‘core show channels’ | cut -d ‘ ‘ -f 1 | grep -a ‘Zap/’ | cut -d ‘/’ -f 2 | cut -d ‘-’ -f 1)
  4.  
  5. ZAP1=0
  6. ZAP2=0
  7. ZAP3=0
  8. if [ $# = 1 ]; then
  9.         if [ $1 == "config" ]; then
  10.             echo "graph_title Asterisk PRI 3";
  11.             echo "graph_args –base 1000 -l 0";
  12.             echo "graph_vlabel channels";
  13.             echo "graph_category asterisk";
  14.             echo "channels.draw AREA";
  15.             echo "channels.label channels";
  16.             exit 0
  17.         fi
  18. fi
  19.  
  20. for actual in $LISTAZAP;do
  21.         if [ $actual -lt 32 ]; then
  22.                 ZAP1=$(expr $ZAP1 + 1)
  23.         else    if [ $actual -lt 63 ]; then
  24.                         ZAP2=$(expr $ZAP2 + 1)
  25.                 else    if [ $actual -lt 94 ]; then
  26.                         ZAP3=$(expr $ZAP3 + 1)
  27.                         fi
  28.                 fi
  29.         fi
  30. done
  31.  
  32. echo "channels.value $ZAP3"
  33.  

Muchas veces este sencillo programa, que hace gráficas feas, pero que es muy sencillo de instalar y de configurar puede salvarte la vida ya que puedes ver que los últimos días ha habido errores en eth0, que las querys de mysql han aumentado demasiado, que las interrupciones están por las nubes… y te permite diagnosticar momentos de congestión o fallos pasados que no son posibles reproducir en el presente.

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Sistema de streaming con Asterisk y Icecast2

Con motivo de la Semana ESIDE, se han organizado diversos actos y charlas desde el E-Ghost. Suele ser habitual grabarlas, y alguna vez se ha experimentado con el streming del audio, pero para esta ocasión se me ocurrió que podríamos hacer las 2 cosas a la vez con Asterisk.logo_phpbb.gif

El funcionamiento del sistema se basa en Asterisk y Icecast2, que es un servidor de streaming, configurando el montaje de la siguiente manera:

  • Un servidor remoto con Icecast2.
  • Un portátil con Asterisk instalado, de manera que metemos en un MeetMe el ‘console channel driver’, es decir, la entrada de micrófono y grabamos la conversación con la opción ‘r’ de MeetMe.
  • Con chan_local, metemos a ese mismo MeetMe la aplicación Ices, que envía el stream a un servidor de Icecast2.

y ahora, vamos por partes:

Instalación y configuración de Icecast2

apt-get install icecast2

  1.  
  2. <icecast>
  3.     <limits>
  4.         <clients>100</clients>
  5.         <sources>2</sources>
  6.         <threadpool>5</threadpool>
  7.         <queue-size>524288</queue-size>
  8.         <client-timeout>30</client-timeout>
  9.         <header-timeout>15</header-timeout>
  10.         <source-timeout>10</source-timeout>
  11.         <burst-on-connect>1</burst-on-connect>
  12.         <burst-size>65535</burst-size>
  13.     </limits>
  14.     <authentication>
  15.         <source-password>superfarsa</source-password>
  16.         <relay-password>hackme</relay-password>
  17.         <admin-user>admin</admin-user>
  18.         <admin-password>ironfarsa</admin-password>
  19.     </authentication>
  20.     <hostname>streamcluster.irontec.com</hostname>
  21.     <listen-socket>
  22.         <port>8088</port>
  23.     </listen-socket>
  24.     <fileserve>1</fileserve>
  25.     <paths>
  26.         <basedir>/usr/share/icecast2</basedir>
  27.         <logdir>/var/log/icecast2</logdir>
  28.         <webroot>/usr/share/icecast2/web</webroot>
  29.         <adminroot>/usr/share/icecast2/admin</adminroot>
  30.                 <alias source="/" dest="/status.xsl"/>
  31.     </paths>
  32.     <logging>
  33.         <accesslog>access.log</accesslog>
  34.         <errorlog>error.log</errorlog>
  35.         <loglevel>4</loglevel>
  36.         <logsize>10000</logsize>
  37.     </logging>
  38.  
  39.     <security>
  40.         <chroot>0</chroot>
  41.     </security>
  42. </icecast>
  43.  

Después hay que editar el fichero /etc/default/icecast2 y poner ENABLED=true. Tras esto ya podemos iniciar Icecast2:

/etc/init.d/icecast2 start

Configuración de Asterisk necesaria

Necesitamos un fichero de ejemplo para la aplicación Ices, que podemos encontrar en la carpeta contrib de las fuentes de Asterisk. Ejemplo:

  1.  
  2. <?xml version="1.0"?>
  3. <ices>
  4.     <background>0</background>
  5.     <logpath>/var/log/ices</logpath>
  6.     <logfile>ices.log</logfile>
  7.     <loglevel>4</loglevel>
  8.     <consolelog>0</consolelog>
  9.     <stream>
  10.         <metadata>
  11.             <name>Example stream name</name>
  12.             <genre>Example genre</genre>
  13.             <description>A short description of your stream</description>
  14.             <url>http://mysite.org</url>
  15.         </metadata>
  16.         <input>
  17.             <module>stdinpcm</module>
  18.             <param name="rate">8000</param>
  19.             <param name="channels">1</param>
  20.             <!– Read metadata (from stdin by default, or –>
  21.             <!– filename defined below (if the latter, only on SIGUSR1) –>
  22.             <param name="metadata">1</param>
  23.             <param name="metadatafilename">test</param>
  24.         </input>
  25.         <instance>
  26.             <hostname>SERVIDOR_ICECAST2</hostname>
  27.             <port>8000</port>
  28.             <password>PASSWORD_DE_LA_FUENTE</password>
  29.             <mount>/fichero.ogg</mount>
  30.             <yp>1</yp>
  31.             <encode>
  32.                 <quality>0</quality>
  33.                 <samplerate>8000</samplerate>
  34.                 <channels>1</channels>
  35.             </encode>
  36.             <downmix>0</downmix>
  37.         </instance>
  38.     </stream>
  39. </ices>
  40.  

Ya tenemos todo lo necesario, en lo que al streaming se refiere, solo queda un poco de dialplan:


[streaming]
exten => hablar,1,MeetMe(1234,qtr)
exten => escuchar,1,MeetMe(1234,ql)
exten => stream,1,ICES(stream.xml)

y un par de callfiles para automatizar el proceso:

Callfile1:

Channel: CONSOLE/dsp
Context: streaming
Extension: hablar
Priority: 1

Callfile2:

Channel: Local/escuchar@streaming
Context: streaming
Extension: stream
Priority: 1

Pues esto es todo! Con copiar los callfiles a /var/spool/asterisk/outgoing ya tenemos un sistema de streaming rápido y hecho 100% con Software Libre. Enjoy it!

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter

Hackeando ChanSpy

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. g_echelon.jpg

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:

  1.  
  2. res = (f->frametype == AST_FRAME_DTMF) ? f->subclass : 0;
  3.  
  4. ast_frfree(f);
  5.  
  6. if (!res)
  7.    continue;if (x == sizeof(inp))
  8.    x = 0;
  9.  
  10. if (res < 0) {
  11.   running = -1;
  12.   break;
  13. }
  14.  
  15. else if (res == ‘*’) {
  16.   running = 0;
  17.   break;
  18.   } else if (res == ‘#’) {
  19.        if (!ast_strlen_zero(inp)) {
  20.           running = atoi(inp);
  21.           break;
  22.        }
  23.  
  24.            ……………….

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:

  1.  
  2. if (res == ’5′)
  3. {
  4.     ast_verbose(VERBOSE_PREFIX_3 "IRONTEC:Escribiendo en la DB el valor: %sn",csth.spy.chan->cdr->uniqueid);
  5.     if (ast_db_put("UNIQUEID", csth.spy.chan->cdr->uniqueid,"0") )
  6.         ast_verbose(VERBOSE_PREFIX_3 "IRONTEC: OK Database!");
  7.         else
  8.           ast_verbose(VERBOSE_PREFIX_3 "IRONTEC: ERR Database!");
  9.  
  10.         ast_verbose(VERBOSE_PREFIX_3 "IRONTEC:Escribiendo en la DB el valor: %sn",csth.spy.chan->cdr->uniqueid);
  11.         resultado = ast_streamfile(chan, "tt-monkeys", chan->language);
  12.  
  13.        if (!resultado)
  14.            res = ast_waitstream(chan, "");
  15.  
  16. }

Hasta aquí el hackeo de la tarde… Happy Asterisk hacking!!

Te ha gustado? Compartelo:
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Twitter