El guión del taller de chef esta disponible en la siguiente dirección: http://gist.github.com/242616
El repositorio de pruebas esta en la siguiente dirección: http://github.com/therobot/chef-repo

El guión del taller de chef esta disponible en la siguiente dirección: http://gist.github.com/242616
El repositorio de pruebas esta en la siguiente dirección: http://github.com/therobot/chef-repo

Denyhosts is a great tool to secure ssh accesses. Accidentally, from time to time an IP address from a valid user is banned (guys, use public key ssh authentication!). Removing an IP address from denyhosts ban lists is painful. You have to edit six files. So this small script comes to rescue and eliminates the pain. Let me introduce you to unban-ip
#!/usr/bin/env ruby
base_path="/var/lib/denyhosts"
hosts_deny="/etc/hosts.deny"
denyhosts_files=%w(hosts hosts-restricted hosts-root hosts-valid users-hosts)
files=denyhosts_files.map{|file| "#{base_path}/#{file}"}.push hosts_deny
denyhosts_stop="/etc/init.d/denyhosts stop"
denyhosts_start="/etc/init.d/denyhosts start"
if ARGV.length!= 1
puts "Wrong number of arguments"
puts "Usage: denyhosts-remove ip"
else
`#{denyhosts_stop}`
ip=ARGV[0]
files.each do |file|
text=File.read(file)
if file == hosts_deny
buffer=text.gsub(/sshd: #{ip}\n/,"")
else
buffer=text.gsub(/#{ip}:(.*)\n/,"")
end
File.open(file,"w") {|fw| fw.write buffer }
end
`#{denyhosts_start}`
end
<p> </p>

Today I just started to thing on how many things I’d like to do, and the small I am able to accomplish. I made a list of all the small projects, things and hobbies I start during a year, for living, having fun, having the feel of creating something, etc. This list follows like this:
First of it is working, you spend lots of time on working, it’s necessary and fortunately for me is quite fun working on ASPgems, also it’s great to do some freelance job from time to time, you get extra money, your CV grows too. As I am a big proponent of Free Software I feel like I don’t return very much to the comunity, some small how-to on this blog from time to time, a small help on mailing lists or irc, but I’d like to start some small open source project, I’ve already started an Eclipse Plugin some years ago as part of my job for Google’s Summer of Code, but still I have a couple of good ideas that I’d like to start to implement. Also I spent time reading blogs and staying on touch with the latest things on the internet related of my job and also in the business. I feel like my ruby skills are not good enough, so I’d like to start learning more ruby and for sure learning rails as well. Finally I wrote articles for spanish linux magazine Todo Linux which is time consuming too (it remembers me to the university years, doing first all the process while taking notes of it and then writing a document with the process).
The second thing I really enjoy doing is djing, I love to play music for people even if I am not paid. Also I’d like to improve my dj skills and trying to became a real dj, ok maybe not that much real but still try to do it better than now. All of this goes quite tied with another thing that I really love and also is time consuming: music research not only because I need to be always on the new things also because I love music in almost every style and I am always eager to discover new bands. That leads me to another related issue which is attending to music concerts, I do it as much as my time, money and the other stuff I do allow me to. Very close with djing is podcasting, from time to time I try to make some dj session and upload it to the internet. The latest thing related to music (which as all my friends know is my other big passion besides internet/technology/sysadmin job), I been playing guitar for most than ten years and still I am not a good perfomer but still I feel the need to learn a little bit more, even if it’s playing covers, and even more: I love playing with synthesizers in my computer (perfect for me since is the sum of my biggest passions). Some years ago even I started a band called Calrissians that of course did not have any kind of success. I would like to spent more time on this. Definetly I’d like to start a band with some friends, even we’ve been in some talks to start that in september.
I try to blog here of music and tech things from time to time (hence the title of the blog), but as you know updates are not quite frequent.
Also the third leg of this table is called social life, seeing friends, going out, having a beer or two, preparing a nice dinner for a couple of friend. Sometimes some party, sometimes too much ;) Also this is quite close with djing, and going to concerts.
Finally there are other small hobbies I have: I bought a digital camera some months ago (Canon Powershot G10 if you are interested on this stuff), so I am trying to learn a little bit about photography, digital manipulation of pictures and so on. I love reading novels and technical books too and watching a film from time to time, specially if they are related to music (not necessarily musicals). Also I’m quite interested in learning and expermienting with cooking, learning german, receiving lessons on wine taste and also receiving lessons on swing dance.
So… is it possible to do all of this? How? I’m feeling sad and stressed of wanting to do so many many many things and not being able to do them. I don’t really want to miss anything in this life.

Todo el mundo sabe que subversion ya no mola, pero todavía se sigue utilizando en muchos proyectos y en muchas empresas. Al recibir el testigo de sysadmin en ASPgems comprobé que cada vez que hacía un checkout del repositorio con un usuario unix nuevo subversion me mostraba un mensaje parecido a este:
- The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! - The certificate hostname does not match. Certificate information: - Hostname: ASPgems - Valid: from May 3 03:47:58 2008 GMT until May 3 03:47:58 2009 GMT - Issuer: IT, Satimis, HK - Fingerprint: 0c:3a:2f:08:a6:15:ff:24:28:6b:fb:52:7f:5d:6a:28:20:e9:c9:6e (R)eject, accept (t)emporarily or accept (p)ermanently?
Total que al hacer el primer despliegue de la aplicación, en el deploy se quedaba parado esperando a que respondieramos a la última pregunta.
En mis máquinas tengo un usuario de shell para cada aplicación, así que este problema me sucedía con bastante frecuencia. Mi primera opción para solventarlo era hacerse un shellscript un poco cutre que lanzado desde root hacía un checkout a un directorio vacío al usuario de la aplicación. Así, semiautomáticamente resolvía el problema.
Por supuesto esta no era la mejor solución, era la solución del lado oscuro: rápida y facil. Hoy con un poco de tiempo me he puesto a investigar la solución correcta, que es conseguir que el subversión de cada máquina acepte el certificado.
Para ello he tenido que realizar distintas tareas, aqui os lo dejo:
Lo primero es volver a generar el certificado en el servidor que tiene apache y dav_svn (el servidor de subversión). Los pasos (como root) son:
Creamos un directorio ssl en la el directorio de configuración de apache:
mkdir -p /etc/apache2/ssl
Accdemos al directorio y generamos una clave privada RSA:
cd /etc/apache2/ssl openssl genrsa -des3 -out server.key 1024
En algún momento nos pedirá una passphrase que debemos rellenar y guardar.
Creamos una petición de firma CSR (Certificate Signing Request) :
openssl req -new -key server.key -out server.csr
Tendremos que asignar ciertos valores, es muy importante asignar en el valor CN (Common Name) el nombre del dominio del virtualhost de apache que va usarse como servidor de subversion. Un ejemplo podria ser:
Country Name (2 letter code) [GB]< State or Province Name (full name) [Berkshire]: Madrid Locality Name (eg, city) [Newbury]: Madrid Organization Name (eg, company) [My Company Ltd]: ASPgems Organizational Unit Name (eg, section) []:Systems Common Name (eg, your name or your server's hostname) []: svn.wadus.com Email Address []</span>: wadus at aspgems.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
A continuación procedemos a eliminar la passphrase de la clave generada, si no hacemos esto cada vez que reiniciemos apache nos pedirá la passphrase, algo que es bastante incomodo.
cp server.key server.key.org openssl rsa -in server.key.org -out server.key
Nos pedirá la passphrase que hemos guardado cuidadosamente antes.
Para finalizar generamos el certificado:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Una vez tengamos el certificado (es el fichero server.crt), tenemos que editar nuestro virtualhost de apache indicandole los paths tanto al certificado como a la clave. Es muy importante que nos aseguremos de que la directiva ServerName del virtualhost de apache tiene el mismo dominio introducido en la sección CN (Common Name) cuando hemos generado la petición de firma.
Hay que añadir el siguiente código al fichero de configuración del virtualhost:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Y reiniciamos apache:
sudo /etc/init.d/apache2 restart
Una vez tengamos esto el certificado estará configurado en el apache correctamente. Pasamos a configurar las máquinas para que acepten como válido el certificado. Esta parte se realiza en las máquinas en las que queremos automatizar el paso del checkout de subversion. Llamemolas clientes.
Lo primero que tenemos que hacer es copiar el certificado a los clientes y ponerlo en algun sitio en la máquina, concretamente debian y ubuntu tienen un directorio específico para almacenar certificados en /etc/ssl/certs.
En la máquina que aloja el subversion, ejecutamos:
scp /etc/apache2/ssl/server.crt cliente.wadus.com:
En la maquina cliente ejecutamos:
sudo mv server.crt /etc/ssl/certs/svn.pem
Y ahora editamos el fichero /etc/subversion/servers añadiendo al final la siguiente linea que nos permite indicarle al cliente de subversion que de como válido el certificado:
ssl-authority-files = /etc/ssl/certs/svn.pem
Con esto ya hemos acabado y hemos conseguido que nuestros clientes de subversion acepten el certificado como válido.
Para más información sobre como generar certificados consultad este enlace.

La semana pasada se me ocurrió esta hacer la lista de reproducción que da nombre al post, intenté no ser excesivamente obvio en la selección de canciones pero buscar musica agradable y buen rollera. Como salió bastante bien la cosa, os aqui el fichero con las canciones.

Este fin de semana se celebra la European Ruby Conference 2009 en el Citilab de Cornellá. Se presentarán distintas charlas relacionadas con el lenguaje: manipulación de imágenes, automatización de sistemas, metodologías de desarrollo o juegos en ruby. Además contará con la presencia del creador de Ruby Yukihiro Matsumoto. Así como de miembros de la comunidad internacional y gran parte de la comunidad Ruby (y en muchos casos Rails) española.
EuRuKo es un evento organizado por el Grupo de Usuarios de Ruby en España a un precio muy asequible. Desgraciadamente las 250 plazas ya han sido vendidas.
Podeis seguir la conferencia en el twitter de EuRuKo, aqui podeis ver el calendario de charlas.
ASPgems ha tenido el detalle de invitar a unos cuantos compañeros de trabajo a asistir a la conferencia, por allí estaremos: Dani Mata, Diego Rodriguez, Rafael García, Manu Campos, Enrique Perez, Javi Ramirez, Xavi Noria y un servidor.

Hace un par de semanas Xavi me pidió la funcionalidad que da título a este post en el deploy de uno de nuestros proyectos, me pareció extraño no encontrarlo por defecto en el código de capistrano, pero así es. Hurgando un poco en la lista encontré el siguiente fragmento de código que realiza lo requerido:
before "deploy:rollback:revision", "deploy:rollback_database"
desc "Rolls back database to migration level of the previously deployed release"
task :rollback_database, :roles => :db, :only => { :primary => true } do
if releases.length < 2
abort "could not rollback the code because there is no prior release"
else
rake = fetch(:rake, "rake")
rails_env = fetch(:rails_env, "production")
migrate_env = fetch(:migrate_env, "")
migrate_target = fetch(:migrate_target, :latest)
run "cd #{current_path}; #{rake} RAILS_ENV=#{rails_env} #{migrate_env} db:migrate VERSION=`cd #{File.join(previous_release, 'db', 'migrate')} && ls -1 [0-9]*_*.rb | tail -1 | sed -e s/_.*$//`"
end
end
Voy a comentar un poquito como funciona la cosa:
La primera línea añade un ‘hook’ a la tarea rollback:revision, es necesario ejecutar la tarea antes de volver a la versión anterior de código por la manera que utilizamos para calcular las migraciones hacia atrás que tenemos que volver, pensad que en un sólo commit se pueden incluir varias migracione.
A continuación comprobamos que haya al menos una versión anterior del código a la que volver, y las siguientes lineas sirven para establecer las variables de entorno y rutas necesarias para ejecutar este ‘rollback’.
Lo importante viene en el comando que se ejecuta, como veis es la tarea de rake que lanza la migración. Voy a comentar los puntos dificiles de la linea:
ls -1 [0-9]*_*.rb | tail -1 | sed -e s/_.*$//
Aqui dejo el código en github.

Si, lo sé. Este post llega tarde, muuuuy tarde. Llevo 3 meses para redactar un maldito post con una lista de 12 discos, que prácticamente tenía ya seleccionados. Que mala es la procrastinación, que malo es internet, que malo es el FOSDEM, que malo es el twitter, que malo es viajar, que malo es que te deje tu novia, podría seguir poniendo excusas ad-eternam, pero en el fondo no la hay. Así que alla vamos, la lista funciona como siempre, un disco por mes, sin orden, y no tienen por que haber salido el año pasado:

The Assemble Head in Sunburst sound - Ekranoplan

Songs Ohia: Axxxes & Ace

Metallica - Death Magnetic

Black Mountain - In The Future

Band of Horses - Everything All The Time

Death Cab for Cutie - Narrow Stairs

Baby Woodrose - Chasing Rainbows

Dirtbombs - We Have you surrounded

Portishead - Third

Six Organs of Admittance - The Sun Awakens

Woven Hand - Ten Stones

Bonnie Prince Billy - Lie Down in the Light
Ahora decidamos la mejor portada de las 12… Yo me quedo con la de Portishead.

Cuando empiezas a tener muchas máquinas (por supuesto con la infraestructura estandarizada) se hace necesario poder operar en muchas a la vez, asi como tener un acceso rápido a las mismas.
Para poder ejecutar el mismo comando en muchas máquinas tenemos herramientas como el shell de capistrano o dsh. Pero ¿qué pasa si queremos acceder a 9 máquinas de una manera rápida y eficiente? En Linux podemos usar ssh menu, pero en Mac ¿que hacemos?. Tenemos Remote Connections Manager o Telnet Launcher que aparte de ser shareware no nos dan la velocidad que buscamos, prefiero lanzar nueve pestañas de Terminal a mano y teclear 9 veces ’ssh maquina1, ssh maquina2′ que hacer lo mismo con el ratón.
Afortunadamente Apple ha desarrollado un lenguaje de scripting para sus aplicaciones, y en la última versión de su sistema operativo (por fin!) el Terminal soporta el uso de pestañas. Asi que se me ocurrió la idea: programo un Applescript que me cree una pestaña con un ssh a cada servidor de una lista dada. Desgraciadamente el lenguaje Applescript es de todo menos intuitivo y sencilo, como bola extra el soporte de scripting para Terminal esta muy limitado. A pesar de todos estos inconvenientes he conseguido implementar mi idea inicial.
Lo primero que tenemos que hacer es configurar la autenticación con clave pública (inglés) en todos los servidores donde nos vayamos a logar, asi evitamos poner la contraseña repetidas veces, ya que con la nueva versión del Terminal la passphrase que asegura la clave pública se guarda como variable de entorno entre los distintos terminales y solo es necesario escribirla la primera vez.
Lo siguiente es abrir el editor de scripts que esta localizado en /Applications/AppleScript/Editor de Scripts y pegar el código que os dejo a continuación y guardarlo en un fichero, por ejemplo en /Applications
set servers to {"web1", "web2", "web3", "web4", "web5", "web6", "web7", "web8", "batch1"}
set domain to "wadus.com"
tell application "Terminal"
activate
do script "clear"
repeat with server in servers
tell application "System Events" to tell process "Terminal" to ¬
keystroke "t" using command down
set cmd to "ssh " & server & "." & domain
delay 0.5
do script cmd in window 1
end repeat
end tell
Si combinamos este script con Quicksilver podemos tener una ventana de terminal con un tab accediendo a cada máquina en cuestion de un par de comandos.

De lejos.
Songs Ohia: I’ve Been Riding with the Ghost.
Gracias a los dos entes musicales que me la descubrieron :)

Este fin de semana la empresa donde trabajo ha tenido el detalle de costearme el viaje al FOSDEM, un evento para desarrolladores de software libre que se desarrolla en Bruselas. Acuden unos 5.000 fans del software libre y el opensource, se dan más de 250 charlas técnicas y de comunidad en más de 10 salas simultáneamente. Todo el evento esta organizado por voluntarios y la entrada es gratuita.
El ambiente que se respira, es estupendo, todo el mundo dispuesto a charlar con quien sea, de lo que sea.
Poder tener a mano a tu hacker favorito de MySQL, FreeBSD, debian para poder hacerle unas preguntas sobre bugs, algún problema que no has sabido responder, próximas features… es impagable.
El catering que consistía en 4 tipos de bocadillos bastante decentes y poco más. Eso si, la carta de cervezas incluía unas 16 variedades con un rango de gradaciones que oscilaba entre 4 y 12 grados, todo perfectamente detallado. Además a precios de estudiante (1′5 euros el bocadillo, las cervezas desde 1′5 euros, los refrescos desde 1 euro).
Los stands de los distintos proyectos: Fedora, CentOS, Debian, Ubuntu, FreeBSD, AmaroK, Mozilla, OpenOffice, Haiku, etc. En ellos podías comprar merchandising, libros y colaborar con los distintos proyectos. En algunos (se nota que a la gente de Mozilla les va muy bien) incluso regalaban chapas y pegatinas. Me compré una bolsa de la compra de Ubuntu que va a ser la envidia del barrio.
El evento de inauguración, donde te encuentras a todo el mundo bebiendo cervezas, conversando de una manera amigable y con un espíritu altamente festivo. Bueno, alguno que otro se pasó y acabo completamente wasted. Google además invitó a unas cuantas rondas.
La ausencia de presencia de empresas, sólo Sun Microsystems (que era sponsor) tenía un pequeño stand, y Google (que tambien era sponsor) dió una charla sobre su programa de colaboración entre estudiantes y proyectos libres Summer of Code. FOSDEM es un evento organizado desde la comunidad, para la comunidad.
El muro Gnome Love y Gnome Hate donde podias enviar bugs con post-its o decir que es lo que más te gusta de Gnome.
La ausencia de FUD anti Microsoft, anti Apple o anti nada, incluso llegue a ver a un debianita dando una ponencia con un Macbook pro con Mac OS X.
Algunas de las charlas: especialmente me gustó una charla de Kris Kennaway sobre optimización y rendimiento de sistemas usando FreeBSD como ejemplo. Otra de las que más me gustaron fue Lenny, the Road to Release dada por Neil McGovern (en falda escocesa!) en la que pudimos comprobar en directo el proceso totalmente abierto de discusión y toma de decisiones del equipo debian con vistas a la salida de la nueva versión estable de debian en los próximos dias.
Parte de la pandilla española que fué para allá, especialmente Fresus y Luis Peralta de 11870 con los que hicimos un gran equipo. Hablo de hicimos porque el cuarto miembro de nuestro comité era la señorita Mari Carmen Gutierrez de la Ossa.
Bruselas, que lo poco que ví de la ciudad me parecio realmente bonito.
El frío, tras un apacible viernes, el sábado y el domingo se transformaron en una trampa para nosotros hispanos, seres mediterráneos poco acostumbrados a estas temperaturas y sobre todo a estos vientos polares.
Algunas de las ponencias: o eran demasiado técnicas ya que eran para los propios desarrolladores de los proyectos, (Common Debian Build System, Replication Replication Replication), o no tenían mucha chicha y eran muy genéricas (MySQL HA, Grid en debian). Quizás simplemente no elegimos correctamente, la cosa estaba dificil.
Volveremos, esperamos que con el mismo equipo, o incluso con una versión mejorada del mismo. Vale la pena acudir a un evento de este tipo a pesar de: dormir poco, comer relativamente mal, beber mucho, morir del frío, todo para pasar un fin de semana que seguramente esté entre los mejores momentos del año.

Hay una manera rapida y facil para consultar el ’status’ de un servidor memcached. Suponiendo que vamos a el memcached que vamos a consultar corre en localhost y esta en el puerto por defecto de memcached lo único que tenemos que ejecutar para encontrar el estatus es:
shell>telnet localhost 11211 stats
Memcached nos devuelve:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. stats STAT pid 9388 STAT uptime 6645 STAT time 1232540191 STAT version 1.2.2 STAT pointer_size 32 STAT rusage_user 1.408088 STAT rusage_system 3.836239 STAT curr_items 4781 STAT total_items 13193 STAT bytes 72603142 STAT curr_connections 24 STAT total_connections 37 STAT connection_structures 25 STAT cmd_get 120738 STAT cmd_set 20895 STAT get_hits 113904 STAT get_misses 6834 STAT evictions 0 STAT bytes_read 315228398 STAT bytes_written 582987042 STAT limit_maxbytes 536870912 STAT threads 1 END
Esto nos puede servir para la cantidad real de memoria usada por memcached, el número de elementos que tenemos almacenados o el numero de hits en memcached obtenidos. Podeis encontrar una lista con la descripción de cada variable de status aqui.