jci's blog

Earthquakes can't stop the rock

« Sorry for the crossposting :: As I said before, go back to the matresses »

Escrito el 08/01/11 12:38:50 pm por jci

It's Gotta Be the Ugliest Hack I Have Ever Done

Categories: GNU/Linux, Programacion, Hacks, Ubuntu

[ debido a algun NDA, no puedo revelar ciertos detalles, pero contare los importantes ]

Intentando mejorar ciertos aspectos de [ censura ], se me ocurrio implementar un sistema de alarmas rapido, eficaz, economico y audaz. Ahora, el asunto es que jugar con protocolos de comunicacion no es uno de mis fuertes pero si lo es el [ censura ] y tambien [ censura ]. Despues claro de intentar hacer funcionar rancios programas hechos en C o Python.

IMG_3489
Snowy day here at the end of the world

De pasadita, encontre un bug que afecta a finch y pidgin, pero los contare otro dia. Ya esta el bug en Launchpad :B

A lo que ibamos.

Empece primero usando XMPP, ya que [ censura ] y ya estaba corriendo, asi que fue mi primera eleccion. Debido a que el servidor estaba corriendo con [ censura ] y no dejaba conectarse por otra cosa que no fuera pidgin...

Despues de reintentos varios donde tuve cosas como hostMistmatch y cepillandome un par de bibliotecas en Python decidi abortar mision. Aunque claro, instalando un XMPP server local, incluso con negociacion con TLS, andaba de peluches.

IMG_1325
Some friends call this a quick action photo

Recorde que hace tiempo me mostraron que Pidgin era compatible con Bonjour. Bonjour (antiguamente Zeroconf) permite mostrar servicios a traves de la red usando (inserte su magia favorita aqui) y los programas que sean capaces de entender estos mensajes, pues los interpretan.

Veamos un ejemplito, sin censura, claro.

Resolved service:
  fullname   = boba\032\09100\05821\0589b\0586a\058a6\058a6\093._workstation._tcp.local.
  hosttarget = boba.local.
  port       = 9
Service added; resolving
Resolved service:
  fullname   = lacantina\032\09100\05821\0589b\05872\058ac\05828\093._workstation._tcp.local.
  hosttarget = lacantina.local.
  port       = 9

Que carajos es esto? Pues bien, un mensaje que indica solamente la presencia de una workstation en la red local. Es todo.
Ah, lo interesante. Es manejado todo por debajo del capo usando Avahi. Si no saben que es, apliquense un google. Y 1000 internets menos.

IMG_3392
Dessert

Todos los que son hosttarget son las maquinas que mDns resuelve de forma economica y audaz. Si quieren mirar la forma de resolucion de estos nombres...

jci@socrates:~/Build/pybonjour-1.1.1/examples$ more /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4 # <- LOOKIE HERE!
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Cierto. Primero mira /etc/hosts, de ahi usa mDns para la resolucion de hosts. Si no lo encuentra, usa una version mas completa. Y de ahi mDns en IPV4. Nota : este detalle de IPV4 es super importante en un problema que tuve haciendo pruebas.

Ahora miremos lo que necesitamos : Bonjour. Afortunadamente, este servicio tambien se registra en la red con el nombre de "presence". Y como Bonjour tambien identifica el tipo de conexion (tcp, en este caso), lo unico que nos queda es preguntar en la red local quienes tienen corriendo el servicio presence.

Y voila!

jci@socrates:~/Build/pybonjour-1.1.1/examples$ python browse_and_resolve.py _presence._tcp
Service added; resolving
Resolved service:
  fullname   = jci\064socrates._presence._tcp.local.
  hosttarget = socrates.local.
  port       = 5298
Service added; resolving
Resolved service:
  fullname   = user1\064lacantina._presence._tcp.local.
  hosttarget = lacantina.local.
  port       = 5298
Service added; resolving
Resolved service:
  fullname   = user2\064muldernix._presence._tcp.local.
  hosttarget = asterix.local.
  port       = 5298

Asi que lo que me queda : conectarme directo a cada uno de esos "hosts" (nota : los .local son agregados de la resolucion de mDns) y lanzarles un mensaje.

IMG_3376
Weird collection of weird toys

Spamming time!

#!/bin/bash

for i in `cat listahosts.txt`
do
      echo '<message type="chat"><body>'Feed me a stray cat'</body></message> ^] quit' \ 
      | telnet $i 5298
done

Les dije que el hack era algo feo.

Por supuesto que el mensaje de ejemplo de aca es bastante burdo. El real mensaje que debo enviar es [ censura ].

Si, yo tambien odio los NDA. Pero a fin de cuentas, lo importante no esta censurado. [ censura ]. Creo.

IMG_3431

That's not fog. It's a freaking cloud

Ah, y el problema que tuve con IPV4. Pues bien, al usar Bonjour con Pidgin, si esta habilitado IPV6, va a intentar resolver...con errores. Deshabilitar IPV6 con

# echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

Dije que esto se veia feo.

5394 views » Send feedback »

No feedback yet

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.
PoorExcellent
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)

Acerca de este glob

On the Sixth Day, there was a Running Man looking for a Predator to stop a Raw Deal with a Commando. Only True Lies were said. But nao, Junior is about to get Twins, with the help of a Kindergarden Cop. That will be the Terminator of all struggles.

Archives