Mi Brain-Training Personal

Para que no se me olviden las cosas…

Razones para actualizar a Asterisk 1.8. O no.

Tras la salida de Asterisk 1.8.0 muchos se preguntan si es el momento de actualizar, si hay que esperar, si Asterisk 1.8 será igual que Asterisk 1.6, etc.

Hace un año que no trabajo directamente con Asterisk, lo cual tal vez me haya dado algo de perspectiva, así que en este post intentaré ofrecer mi visión ante el escenario actual en lo que a versiones de Asterisk se refiere.

Primero, vamos a dividir los usos de Asterisk en 2 grupos:

  • Soluciones actuales basadas en Asterisk 1.4
  • Soluciones basadas en Asterisk todavía por desarrollar

Creo que es importante hacer esta división, ya que en mi opinión es un factor determinante a la hora de elegir la versión adecuada.

Soluciones actuales basadas en Asterisk 1.4

Este sería el caso más típico, ya que muchos nos mostramos reticentes a actualizar a Asterisk 1.6 dado el pequeño caos que causó el cambio en la política de releases de Asterisk. Si ya tenemos una solución desarrollada con Asterisk 1.4 lo más prudente sería esperar a validar que la solución sigue funcionando con Asterisk 1.8 y adaptarla a la nueva versión. Actualizar a lo loco no tiene sentido y es un pasaporte directo a un importante dolor de cabeza.

Actualmente Asterisk dispone de una test suite que permite comprobar si Asterisk se sigue comportando como debiera. Si durante tus pruebas ves que un caso no esta cubierto por ningún test lo ideal sería escribir un nuevo caso de test y enviarlo al bugtracker de Asterisk o al reviewboard. De esta manera ayudarás a evitar posibles futuras regresiones en ese caso.

Soluciones basadas en Asterisk todavía por desarrollar

Si estás decidiendo que versión de Asterisk utilizar para un nuevo desarrollo, tienes 3 opciones:

  • Asterisk 1.4.x
  • Asterisk 1.6.2.x
  • Asterisk 1.8.x

Aquí el tema se pone más complicado. Digium tiene un número finito de recursos, que tras el anuncio de Asterisk SCF (tengo pendiente escribir sobre esto) se dividen en el mantenimiento de Asterisk 1.4.x, Asterisk 1.6.2.x, Asterisk 1.8.x y ahora Asterisk SCF. A esto hay que sumarle que si hay un bug de seguridad todavía será necesario crear parches para la 1.2! Aquí la tabla con versiones y fechas de las distintas versiones de Asterisk.

Teniendo en cuenta que Asterisk 1.8 será la primera LTS de verdad, es seguramente la mejor opción. No por la features que pueda tener, sino por la atención que se le va a prestar a esta versión a partir de ahora.

Razones para actualizar a Asterisk 1.8

  • Tengo versionitis y no puedo evitarlo.
  • Necesito imperiosamente la feature X. ¿Seguro?
  • Necesito una versión soportada a largo plazo.

Razones para NO actualizar a Asterisk 1.8

  • Mi Asterisk ya funciona para lo que quiero.
  • No tengo tiempo para volver a pelear con viejos bugs.

¿Y tu, actualizas?

Spin off: on code

Ahora que por fin tengo el dominio transferido y el hosting en orden, ya puedo publicar por aquí un pequeño spin-off que comencé hace poco: saghul, on code.

Se trata de un blog alojado en Posterous (un servicio que recomiendo btw) y en el básicamente comentaré temas relacionados con código, especialmente Python.

Al principio pensé que podría simplemente añadir el contenido a este blog, pero ya que aquí suelo hablar solamente de VoIP, vamos a dejarlo así. Además, en on code escribo en ingles, que queda mas cool ;-)

Happy coding! See you at http://code.saghul.net

Encontrando nuestro servidor SIP

Hoy vamos a hablar de algo muy conocido por todos pero no siempre utilizado correctamente: el DNS. Como todos sabréis DNS es el mecanismo gracias al cual resolvemos un nombre de dominio en una dirección IP a la que finalmente nos conectaremos.

Los registros DNS más habituales son los de tipo A (AAAA en IPv6) y simplemente resuelven un nombre a una IP:

En VoIP lo habitual es definir registros SRV, que nos ayudan a mapear un servicio en un determinado transporte a otro nombre de dominio, que posteriormente será resuelto con una consulta de tipo A. Si queremos saber si un dominio tiene un servidor SIP UDP podemos hacer la iguiente consulta:

Como sabréis podemos tener varios servidores SIP escuchando distintos transportes (UDP, TCP, TLS) que no necesariamente sean el mismo servidor. Alguno tal vez ya se haya preguntado: ¿Qué transporte elijo? ¿Debería ser el cliente quien elija a cual conectarse? Para resolver esto tenemos otro tipo de registros DNS: NAPTR. Tal vez os acordéis de los registros NAPTR, ya los vimos cuando hablamos sobre ENUM.

Los registros NAPTR nos van a indicar cual el registro SRV preferido para cada servicio de ese dominio. Veamos un ejemplo:

Como se puede apreciar en la imagen el orden que un cliente SIP debería seguir para encontrar el servidor SIP al que conectarse sería el siguiente, suponiedo que su dirección SIP sea saghul@sip2sip.info:

  1. Realizar una consulta NAPTR al dominio sip2sip.info. La respuesta contiene _sip._udp.sip2sip.info como registro SRV prefereido.
  2. Realizar una consulta SRV a _sip._udp.sip2sip.info. La respuesta contiene proxy.sipthor.net.
  3. Realizar una consulta de tipo A a proxy.sipthor.net. La respuesta serán 3 IPs (en este caso). El cliente SIP debería intentar conectarse a esas IPs en secuencia hasta conseguir establecer una conexión el servidor.

Como se puede observar ninguna de las IPs que hemos obtenido es la que se muestra en la primera imagen, así que una consulta de tipo A al dominio no es válida para encontrar nuestro servidor SIP.

Todos estos se pueden (y deben) aplicar en entronos LAN también. Puede parecer una tontería, pero a mi no me gustaría ser el que cambia la IP a 200 terminales si fuera necesario ;-)

Happy dig-ing!

Más info en el blog de Tekelec.

Cambio en el DNS, hosting y demás

Si estás leyendo esto quiere decir que los cambios en el DNS han sido propagados y estás accediento a saghul.net en su nueva ubicación, junto a SIPdoc.

saghul@hal:~$ dig saghul.net

; <<>> DiG 9.7.1-P2 <<>> saghul.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17635
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;saghul.net.                    IN      A

;; ANSWER SECTION:
saghul.net.             2963    IN      A       91.121.117.27

;; Query time: 9 msec
;; SERVER: 192.168.99.116#53(192.168.99.116)
;; WHEN: Sun Oct 31 11:34:27 2010
;; MSG SIZE  rcvd: 44

saghul@hal:~$ dig ns saghul.net

; <<>> DiG 9.7.1-P2 <<>> ns saghul.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33217
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;saghul.net.                    IN      NS

;; ANSWER SECTION:
saghul.net.             3600    IN      NS      ns02.domaincontrol.com.
saghul.net.             3600    IN      NS      ns01.domaincontrol.com.

;; Query time: 429 msec
;; SERVER: 192.168.99.116#53(192.168.99.116)
;; WHEN: Sun Oct 31 11:34:35 2010
;; MSG SIZE  rcvd: 83

saghul@hal:~$

No es que BlueHost no me gustara, pero tener 2 servicios de hosting para cosas diferentes era un poco “redundante”.

Si algo no va como debiera (he intentado que el cambio ni se note) házmelo saber para Google no se olvide de mi ;-)

Wideband Audio Conferencing with Asterisk

Hoy, último día del AstriCon 2010 he vuelto a tener la suerte de poder dar la charla sobre la que hablé hace pocos días. Como lo prometido es deuda, aquí tenéis las transparencias utilizadas, y podéis consultar también los escenarios para SIPp utilizados en las pruebas en mi repositorio de Gitorious.



Espero que guste! :-)

Actualizando el blog y tal…

Una de las cosas que tenía pendientes desde hace tiempo era actualizar un poco el blog: la versión de WordPress, retocar un par de textos aquí y allá y quitar la mierda de publicidad de Google que para lo que me da y 0 pues lo mismo.

El proceso parece haber ido bien, pero nunca se sabe :-S Si encontráis algo extraño al navegar por estos lares os agradecería que me lo hicierais saber.

He añadido un par de links a mi dominio .tel y los repositorios de GitHub, que también lo tenía pendiente, y en cuanto pueda escribiré algo acerca del AstriCon, Asterisk SCF y ésas cosas que se acaban de poner de moda.

AstriCon 2010: calentando motores

Hace tiempo que no posteo, no es algo que me alegre precisamente, pero tras solucionar unos problemas de hosting y poner el WordPress este en condiciones espero volver :)

Mientras tanto vamos ha hablar del AstriCon 2010. Empieza el martes, y aunque yo pensaba que iban a esperar a entonces ya han lanzado Asterisk 1.8.0, asi que no se que gran sorpresa nos tendrán preparada… Ya veremos :-)

Este año también ha habido suerte y me aceptaron una charla: “Wideband Audio Conferencing with Asterisk”. En ella comentaré y analizaré las distintas optiones que tenemos en Asterisk 1.8 para llevar a cabo una multiconferencia en wideband. Se analizarán tanto opciones nativas de Asterisk como módulos programados por terceros, comparando su rendimiento y utilizando además de las herramientas típicas, la mejor herramienta disponible para medir la calidad del audio: el oído humano ;-)

Como siempre colgaré las transparencias en Slideshare tan pronto acabe la charla, espero que os resulten de interés.

Si alguien todavía me lee y se encuentra por aquí ¡que avise!

speaking

Blink Qt beta para Windows disponible!

Hace unos días ya comentaba que se había liberado la primera beta de Blink Qt para GNU/Linux, pues hoy ya tenemos disponible la versión para Windows.

Las versiones de Windows y GNU/Linux utilizan la misma base de código para el GUI, por lo que implementan las mismas características. No obstante, y dado que en esta beta no es posible editar preferencias de una cuenta de usuario, es necesario utilizar una cuenta creada en http://sip2sip.info

Una vez creada la cuenta podéis acceder a la web de configuración en http://x.sip2sip.info y hacer click en la pestaña llamada “Blink”. Una aplicación Java solicitará vuestro permiso, y tras descargar e instalar Blink haced click en “Configure Blink with this account” y al reiniciar Blink vuestra cuenta ya estará configurada. ¿Fácil, no?

blink-windows4

La única diferencia entre las versiones de Windows y GNU/Linux es que la versión de Windows tiene capacidad de autoactualización, así que a medida que vayamos lanzando nuevas versiones una ventana os informará de ello y podréis actualizar Blink cómodamente.

blink-windows2

Como siembre, todo feedback es bienvenido, podéis reportar bugs, etc. en la lista de correo de Blink: http://lists.ag-projects.com/mailman/listinfo/blink

blink-windows1

blink-windows3

Tenéis más información aquí: http://icanblink.com/blink-qt-windows-beta.phtml

Now you can Blink on Windows :-)

Blink Qt beta para GNU/Linux disponible!

Tras muchos meses de trabajo por fin tenemos Blink Qt (beta) para GNU/Linux disponible para su descarga.

Tanto la versión de Mac, Blink-Cocoa como la versión para GNU/Linux (y próximamente Windows), Blink-Qt comparten el mismo core: SIPSIMPLE SDK. De momento todas las funcionalidades no se encuentran implementadas (beta), pero vamos paso a paso, intentando construir el mejor cliente SIP para todas las plataformas.

Ésta es la lista de features de la versión beta de Blink-Qt: http://icanblink.com/features.phtml

Hay paquetes Debian disponibles para Debian testing y unstable y Ubuntu Lucid (10.04) y Karmic (9.10), tenéis todas las instrucciones de instalación así como una breve guía de uso aquí: http://icanblink.com/blink-qt-beta.phtml

Hemos puesto mucho esfuerzo en ésta versión, pero como humanos que somos puede haber fallos, todo feedback es bienvenido. ;-) La lista de correo de Blink donde reportar errores, sugerencias, etc. está aquí: http://lists.ag-projects.com/mailman/listinfo/blink

blink-qt

Happy Blinking! :-)

Probando el soporte IPv6 de Asterisk 1.8

Como ya habréis leído por ahí la próxima versión de Asterisk, la 1.8, traerá soporte para IPv6. Gracias a mi buen amigo Mikel “packet tracer” Jimenez dispongo de plena conectividad IPv6 en mi casa, así que hacer una llamada SIP por IPv6 era la siguiente prueba tras ping6. ;-)

No quería ensuciar mucho el servidor de SIPdoc (donde realicé las pruebas) así que opté por instalar Asterisk 1.8 con el script live_ast que ya comenté en su día. Resumiendo:

svn co http://svn.asterisk.org/svn/asterisk/branches/1.8 asterisk18
cd asterisk18
cp contrib/scripts/live_ast .
./live_ast configure
./live_ast install
./live_ast samples
./live_ast run -vvvvvvvvvvvvvvc

Tras instalar asterisk modificamos el fichero sip.conf e indicamos que Asterisk escuche en IPv6:

udpbindaddr=::

Si tenemos una IP concreta a la que queremos bindear haríamos lo siguiente:

udpbindaddr=[2001:470:1f12:X:X::1]:5060

¡Ya tenemos el servidor configurado! Para hacer nuestra primera llamada SIP con IPv6 utilizaremos la herramienta pjsua del proyecto PJSIP.

Por defecto PJSIP no se compila con soporte IPv6, así que haremos lo siguiente para descargar y compilar PJSIP:

svn co http://svn.pjsip.org/repos/pjproject/trunk pjsip
cd pjsip
echo "#define PJ_HAS_IPV6 1" > pjlib/include/pj/config_site.h
./configure && make dep && make

La herramienta pjsua se habrá compilado en el directorio pjsip-apps/bin. Nos cambiamos a ese directorio y ya podemos arrancarla:

./pjsua-x86_64-unknown-linux-gnu --ipv6 --no-tcp

pjsua-ipv6

Probemos ha hacer una llamada: pulsamos ‘m’ e introducimos la URI SIP a la que queremos llamar: ‘sip:1000@[2001:470:1f12:286::2]‘.

Si hemos dejado el dialplan por defecto deberíamos estar escuchando a Allison Smith y su demo-congrats. ¡A través de IPv6!

asterisk-ipv6

¡Parece que funciona!

INVITE sip:1000@[2001:470:1f12:286::2]:5060 SIP/2.0
Via: SIP/2.0/UDP [2001:470:c846:1:225:ff:feac:6aca]:5060;rport;branch=z9hG4bKPjBcy323TSZVZa86u8GMIV01Zv8wNs1DAE
Max-Forwards: 70
From: ;tag=-3p-SYm.MD6bVaH-8WHegCIArkOYu.9R
To: sip:1000@[2001:470:1f12:286::2];tag=as349aa7db
Contact: 
Call-ID: cWEqE795OfqpixU.l1IavBkTPpgVmX3F
CSeq: 21549 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE, NOTIFY,
REFER, MESSAGE, OPTIONS
Supported: replaces, 100rel, timer, norefersub
Session-Expires: 1800;refresher=uas
Min-SE: 90
Content-Type: application/sdp
Content-Length:   310

v=0
o=- 3490026667 3490026668 IN IP6 2001:470:c846:1:225:ff:feac:6aca
s=pjmedia
c=IN IP6 2001:470:c846:1:225:ff:feac:6aca
t=0 0
a=X-nat:0
m=audio 4030 RTP/AVP 3 101
a=rtcp:4031 IN IP6 2001:470:c846:1:225:ff:feac:6aca
a=rtpmap:3 GSM/8000
a=sendrecv
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15

--end msg--
 21:51:09.178   pjsua_core.c  RX 659 bytes Response msg
100/INVITE/cseq=21549 (rdata0x1f61238) from UDP
2001:470:1f12:286::2:5060:
SIP/2.0 100 Trying
Via: SIP/2.0/UDP [2001:470:c846:1:225:ff:feac:6aca]:5060;branch=z9hG4bKPjBcy323TSZVZa86u8GMIV01Zv8wNs1DAE;received=2001:470:c846:1:225:ff:feac:6aca;rport=5060
From: ;tag=-3p-SYm.MD6bVaH-8WHegCIArkOYu.9R
To: sip:1000@[2001:470:1f12:286::2];tag=as349aa7db
Call-ID: cWEqE795OfqpixU.l1IavBkTPpgVmX3F
CSeq: 21549 INVITE
Server: Asterisk PBX SVN-branch-1.8-r281052
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY,
INFO, PUBLISH
Supported: replaces, timer
Require: timer
Session-Expires: 1800;refresher=uas
Contact: 
Content-Length: 0

--end msg--
 21:51:09.180   pjsua_core.c  RX 981 bytes Response msg
200/INVITE/cseq=21549 (rdata0x1f61238) from UDP
2001:470:1f12:286::2:5060:
SIP/2.0 200 OK
Via: SIP/2.0/UDP [2001:470:c846:1:225:ff:feac:6aca]:5060;branch=z9hG4bKPjBcy323TSZVZa86u8GMIV01Zv8wNs1DAE;received=2001:470:c846:1:225:ff:feac:6aca;rport=5060
From: ;tag=-3p-SYm.MD6bVaH-8WHegCIArkOYu.9R
To: sip:1000@[2001:470:1f12:286::2];tag=as349aa7db
Call-ID: cWEqE795OfqpixU.l1IavBkTPpgVmX3F
CSeq: 21549 INVITE
Server: Asterisk PBX SVN-branch-1.8-r281052
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY,
INFO, PUBLISH
Supported: replaces, timer
Require: timer
Session-Expires: 1800;refresher=uas
Contact: 
Content-Type: application/sdp
Content-Length: 293

v=0
o=root 1289948586 1289948587 IN IP6 2001:470:1f12:286::2
s=Asterisk PBX SVN-branch-1.8-r281052
c=IN IP6 2001:470:1f12:286::2
t=0 0
m=audio 11994 RTP/AVP 3 101
a=rtpmap:3 GSM/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv

Dejo pendiente para otro día el montaje de IPv6 que realicé con Mikel en el servidor de SIPdoc y mi casa.

Happy IPv6 calling!