MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Sistemas de control de versiones en la vida real

Los sistemas de control de versiones no son ninguna novedad (CVS, SVN, GIT, Mercurial...) lo que si es novedad es empezar a usarlos en sitios que hace unos años ni siquiera se hubieran contemplado.

Tenía ganas de hablar sobre este tema pero me acaba de convencer un bug que acabo de recibir: #537237 .

Desde hace ya varios meses en todos los servidores que administro y en mi portátil personal tengo montado el directorio /etc bajo control de versiones con GIT. Hacerlo es de lo más sencillo que hay:

cd /etc
git init
git add .
git commit -m "importado /etc"

¿Qué ventajas tiene esto?

Pues más que en un equipo de escritorio (que puede ayudarnos a arreglar cosas si andamos con Debian unstable) en los servidores es super útil.

¿Hay que crear un VirtualHost en Apache o editar cierta configuración?

Nuevo "commit" con su respectivo comentario y eso queda para la historia si alguna vez nos da problemas y no sabemos por donde arreglarlo tenemos el log y los diff.

Existen paquetes como etckeeper que se encargan de la parte más complicada por nosotros, pero a mi me sirve con usar git a pelo. Una de las cosas que he añadido es un disparador para apt que se encargue de hacer un commit cada vez que instalamos o desinstalamos algo. (lo tomé prestado de algún sitio y ahora no recuerdo donde)

#!/bin/bash
set -e
caller=$(ps axww | mawk '/aptitude|apt-get/ {for (i=5; i<=NF ; i++) printf ("%s ",$i); printf ("\n") }' | head -1)
STATUS="$(git status)" || true
if echo $STATUS | grep '\(modified\|new\|remove\)' > /dev/null 2>&1 ; then
echo "git-snapshot-script: found changed files"
echo $STATUS
git commit -a -m "snapshot after: $caller"
else
echo "  **GIT** git-snapshot-script: no changes"
fi
echo "  **GIT** git-snapshot-script: done"

Basicamente se lee el nombre de proceso que llama a este script (por ejemplo: apt-get install postfix) se mira si el directorio /etc ha cambiado y se hace el commit quedando en el log el programa que provoco esos cambios.

Para que el invento funcione debemos decirle a apt que llame al script:

cat /etc/apt/apt.conf
DPkg {
Post-Invoke {"cd /etc ; ./apt/git-snapshot-script";};
}

IMPORTANTE: Procura que el directorio /etc/.git solo pueda leerlo y escribirlo root (chmod 700 /etc/.git; chown root:root /etc/.git), con ese directorio se puede sacar el /etc/shadow por ejemplo y probar programas de fuerza bruta para sacar las contraseñas.

Mi vicio por git no termina aquí. Últimamente ando modificando unos cuantos CMS para uso personal o para clientes y un día puse esas web bajo control de versiones, ¡qué gozada! hacer mini-cambios y poder revertirlos, jugar con varias ramas, etiquetar... y para ejemplo un botón, Galopín es nuestro sistema de facturación interno y he ido tocando cosas que no acababan de convencerme, aquí está el git publicado. El primer import tiene parches ya de varios años de uso ;)





Marketing bluetooth por proximidad: python-thinblue

ThinBlue es una aplicación desarrollada en python que envía archivos mediante el protocolo OBEX a dispositivos móviles (teléfonos por ejemplo).

Desde Thinetic Systems (empresa en la que trabajo) hemos liberado una primera versión (funcional, aunque beta) de esta aplicación bajo la licencia GPL2.

De momento tenemos un repositorio GIT con el código y en breve publicaremos paquetes *.deb para las versiones más usadas de Debian y Ubuntu.

Tienes más información en la noticia de nuestra web: ThinBlue, aplicación bluetooth para marketing por proximidad.

Una de las cosas más chulas ha sido desarrollar el panel de administración con el framework web: web.py , de hecho sin contar javascript, html o css son apenas 300 líneas.

A disfrutarla Wink





Manteniendo paquetes Debian con GIT

Llevo ya un tiempo usando GIT y voy aprendiendo a manejarlo muy poco a poco.

Una de las cosas que más me gustan es la facilidad para tener varias ramas y poder crear paquetes deb de una manera simple con «git-buildpackage».

Por ejemplo, con el paquete gnome-pulse-audio tengo 3 ramas:

  • master: rama de trabajo (lo que sería trunk en SVN)
  • upstream: rama de donde se obtienen las fuentes del paquete Debian (orig.tar.gz)
  • gnome-pulse-audio: rama SVN que se sincroniza con el upstream y que permite hacer merges sencillos contra upstream y master.
A veces entre tanta rama se pierde «el norte» (o el HEAD Laughing) y es necesario acudir a una interfaz gráfica, he probado varias pero la que más me convence es gitg. De hecho está en cola de NEW.


Se que GIT hace mucho más que todo esto (podría deshacerme del sistema dpatch) pero iremos aprendiendo poco a poco.



¿Quién usa tu software?

Esta pregunta en la mayoría de las ocasiones es demasiado dificil de contestar...

Ejemplos puedo poner miles, si nos ponernos a contar los usuarios LTSP a nivel mundial, no me creo que sólo se use en 61 sitios.

En TCOS tampoco es que haya muchos, en concreto 7, si bien esto es más dejadez mía y del que lo instala, no es un buen contador.

He intentado probar otras formas, contando las descargas, pero eso ahora no es demasiado exacto y más si contamos que se puede descargar el repositorio y usarlo para instalaciones locales (con mi repo personal habré instalado más de 20 servidores).

Así que a riesgo de que me tachen de intrusor y visto que otros proyectos lo hacen ( [1] [2] ), he pedido opinión en la lista de TCOS, para añadir el código necesario para generar un registro de instalaciones un poco más completo. El script PHP que guarda los datos también es público.

Debian usa popularity-contest, y pregunta si activarlo como último paso de la instalación. Me parece demasiado jaleo programar algo con Debconf para algo tan simple, en un futuro si esto crece ya veremos.

PD.- Me encanta git, y la facilidad para trabajar en «branches», mezclar código... etc..





Parser RSS para proyectos GIT

Hace poco hemos migrado a GIT y como no me acababa de convencer gitweb he instalado cgit [CGIT en TCOS], que es mucho más rápido y personalizable... pero tiene una pequeña falta, no genera feeds RSS.

Para no oxidarme con Python me he puesto a mezclar unos cuantos paquetes [python-git, python-feedparser y python-pyrss2gen] y he hecho: git2rss.py la ventaja sobre otros proyectos es que es multirepositorio, necesitamos pasar la raíz de nuestras carpetas git y el las recorre toma los últimos cambios (5 por proyecto) y ordena en un feed resumen (de 20 elementos). El resultado se imprime en stdout por lo que en el cron es tan simple como poner:

*/30 *  * * *   usuario /ruta/a/git2rss.py > /dir/salida/rss.xml 2>/logs/tcos.git.log 

El nuevo feed (que se genera cada media hora) se puede obtener desde:

http://tcosproject.org/cgit/tcos.git.xml  (RSS 2.0)

Dentro de cada elemento (realmente son commits) se encuentra un pequeño resumen, autor, descripción y el diff. De esta forma podemos estar informados de los cambios que se van haciendo.

Subscribiros !!!!