Skip to main content.

Archive for Enero, 2008

Hackeando ChanSpy

Miércoles, Enero 16th, 2008

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!!

Provisionamiento Linksys SPA9XX

Miércoles, Enero 16th, 2008

Hace poco he necesitado hacer un poco de mass-deployment de teléfonos Linksys SPA922. La verdad es que son terminales que me gustan mucho. He probado los Thompson,los Grandstream y Snom de gama baja/media y la verdad es que para terminales comunes, no de operadora, me quedo con los Linksys: son bonitos y fiables.

El problema me llega cuando busco en Google ficheros de ejemplo sobre el provisionamiento de Linksys. No encuentro ningún ejemplo y tampoco explicaciones claras sobre cómo hacerlo. Bien, esto me pasa por no leerme completito el manual de administrador de los terminales donde en un párrafo se explica bien claro. El motivo de este post es que otro no pierda el tiempo que he perdido yo buscando en google algo tan sencillo.

Un fichero de provisionamiento de Linksys SPA9XX no es más que un fichero XML y es bastante sencillo de hacer. Voy a poner el ejemplo de un SPA922 pero es bastante generalizable a toda la gama.

Lo primero es saber que toda la configuración va en un fichero al que llamaremos spa922.cfg. El fichero admite todas las opciones que vemos normalmente en el interfaz web del terminal sin más que respetar algunas convenciones:

  • Los espacios en las opciones se sustituyen por guiones bajos
  • Las opciones asociadas a una línea han de llevar _X_ al final del nombre de la opción. X hace referncia al número de línea.
  • El fichero empieza y termina con las etiquetas <flat-profile></flat-profile>.

Pongo aquí un ejemplo de fichero. En realidad de dos porque las opciones comunes a todos los teléfonos se ponen en un único fichero y después las opciones particulares, tales como los datos de acceso, se ponen en ficheros individuales para cada teléfono. El genérico es el antes mencionado “spa922.cfg” y el particular es “spa922-${MAC}.cfg”

  1.  
  2. <flat-profile>
  3.  
  4.   <!– PROVISIONING –>
  5.   <resync_periodic>10</resync_periodic>
  6.   <resync_error_retry_delay>20</resync_error_retry_delay>
  7. <profile_rule>/spa922-MAC/spa922-$MA.cfg</profile_rule>
  8.  
  9.   <!– SYSTEM –>
  10.   <enable_web_server>yes</enable_web_server>
  11.   <enable_web_admin_access>yes</enable_web_admin_access>
  12.   <dhcp>yes</dhcp>
  13. <primary_ntp_server>10.10.10.1</primary_ntp_server>
  14.   <enable_vlan>no</enable_vlan>
  15.   <enable_cdp>no</enable_cdp>
  16.  
  17.   <!– SIP –>
  18.   <max_forward>70</max_forward>
  19.   <max_redirection>5</max_redirection>
  20.   <max_auth>2</max_auth>
  21.   <sip_user_agent_name>$VERSION</sip_user_agent_name>
  22.   <sip_reg_user_agent_name>$VERSION</sip_reg_user_agent_name>
  23. <dtmf_relay_mime_type>application/dtmf-relay</dtmf_relay_mime_type>
  24.   <use_compact_header>no</use_compact_header>
  25.   <rtp_port_min>8000</rtp_port_min>
  26.   <rtp_port_max>11000</rtp_port_max>
  27.   <symmetric_rtp>yes</symmetric_rtp>
  28.   <stun_enable>no</stun_enable>
  29.  
  30.   <!– REGIONAL –>
  31.   <time_zone>GMT+01:00</time_zone>
  32.  
  33.   <!– PHONE –>
  34.   <voice_mail_number>451</voice_mail_number>
  35.   <text_logo>Irontec%0ai::voz</text_logo>
  36.   <extension_1_>1</extension_1_>
  37.   <share_call_appearance_1_>private</share_call_appearance_1_>
  38.  
  39.   <!– EXT 1 –>
  40. <line_enable_1_>yes</line_enable_1_>
  41.   <subscription_expires_1_>3600</subscription_expires_1_>
  42.   <sip_port_1_>5060</sip_port_1_>
  43. <proxy_1_>10.10.10.1</proxy_1_>
  44.   <use_outbound_proxy_1_>no</use_outbound_proxy_1_>
  45.   <register_1_>yes</register_1_>
  46.   <make_call_without_reg_1_>no</make_call_without_reg_1_>
  47.   <register_expires_1_>3600</register_expires_1_>
  48.   <use_dns_srv_1_>no</use_dns_srv_1_>
  49.   <use_auth_id_1_>No</use_auth_id_1_>
  50. <preferred_codec_1_>G711a</preferred_codec_1_>
  51.   <use_pref_codec_only_1_>no</use_pref_codec_only_1_>
  52.   <g729a_enable_1_>yes</g729a_enable_1_>
  53.   <g723_enable_1_>no</g723_enable_1_>
  54.   <g726-16_enable_1_>no</g726-16_enable_1_>
  55.   <g726-24_enable_1_>no</g726-24_enable_1_>
  56.   <g726-32_enable_1_>no</g726-32_enable_1_>
  57.   <g726-40_enable_1_>no</g726-40_enable_1_>
  58. <dtmf_tx_method_1_>auto</dtmf_tx_method_1_>
  59.   <dial_plan_1_ ua="na">(1xxS0|2xxS0|6xxxxxxxxS0|9xxxxxxxxS0|xx.)</dial_plan_1_>
  60.   <enable_ip_dialing_1_ ua="na">No</enable_ip_dialing_1_>
  61.  
  62.   <!– User –>
  63.   <time_format>24hr</time_format>
  64.  
  65. </flat-profile>
  1. <flat-profile>
  2.  
  3.   <display_name_1_>Jon Bonilla</display_name_1_>
  4.   <user_id_1_>205</user_id_1_>
  5. <password_1_>secretillo</password_1_>
  6.  
  7. </flat-profile>

Una vez tenemos los dos ficheros, sólo necesitamos que el terminal sepa dónde encontrarlos. Hay varias maneras de hacerlo; la que he escogido es tener un servidor tftp en mi asterisk que sirva los ficheros al teléfono. Para ellos debemos instalar un servidor tftp. Para ellos como root instalamos atftp:
apt-get install atftpd
Editamos /etc/default/atftpd para decirle dónde estará nuestro directorio de tftp. En mi caso /tftpboot:
USE_INETD=true
OPTIONS="--daemon --port 69 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot"

Creamos el directorio /tftpboot y ponemos ahí el fichero general spa922.cfg. Después creamos el directorio “/tftpboot/spa922-MAC” donde irán los ficheros particulares de cada teléfono. Por ejemplo el “spa922-000e08de2995.cfg”

Ahora ya tenemos todo preparado. Sólo queda hacer saber al terminal dónde ha de buscar el servidor tftp. Para ello, lo que hacemos es pasarle una option desde el servidor dhcp cuando el terminal hace una petición. En el fichero de configuración del servidor dhcp /etc/dhcp3/dhcpd.conf tendríamos algo así:


subnet 10.10.10.0 netmask 255.255.255.0
{
range 10.10.10.100 10.10.10.254;
option domain-name-servers 212.55.8.132;
option routers 10.10.10.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.10.10.255;
option tftp-server-name "10.10.10.1";
}

Después de esto, tenemos que cuando enchufemos a la red el terminal nuevo éste cogerá la dirección de red del servidor, comprobará que hay un servidor tftp en el que encontrará sus ficheros de configuración y tendremos el terminal listo para usar sin haber tenido que tocar para nada el terminal o haber accedido a la configuración web. Esto es una gran ventaja en cuanto el número de terminales a implantar es mayor de unos pocos. Además si por alguna razón tenemos un usuario torpe y mete la pata, basta con reinicar el teléfono y éste se volvería a configurar con los valores correctos.

Para más parámetros a configurar en los terminales lo mejor es verlos todos detallados en el manual de linksys.

2005 © Irontec S.L. :: Powered by Irontec & Wordpress
[ IRONTEC S.L. - C.I.F. B-95274890 ]
[ Ctra. Basurto-Kastrexana nº70 / Enpresaldea ]
[ 48002 - Bilbao - Bizkaia ]