LibreOffice headless: debugging session (OMG!)

Logo LibreofficeA couple of years ago I decided to try LibreOffice’s “–convert-to” parameter to generate different formats of a document, instead of using the ancient listen-on-port-8100 service and use an external Python script in order to do the dirty job of conversion. The results of the tests where great: excelent performance, reliable results, avoid the control of port 8100: IM-PRESSIVE! 🙂

Recently an ancient Rails 2.3 app was failing in the generation of PDFs via this 8100 port + Python script stuff 🙁 I could try to figure out which the error was (dive into Python) or migrate to that convert-to simple solution: no doubt!.

I change my scripts for PDF generation, but something nasty was waiting me around the corner 🙁

  • It didn’t work just out of the box.
  • Local development setup was working right.
  • Debugging time! 🙂

First I tried at CLI:


libreoffice --headless --convert-to --outdir /tmp my-test-file.odt

It works!. So problem is not neither with Libreoffice and Ruby version. Trouble is elsewhere. Next I consider my code: perhaps something was interfering and I decided to set a simple “runner” task just to call the system:


# simple-task.tb
`libreoffice --headless --convert-to --outdir /tmp my-test-file.odt`

Nope, seems to fail again 🙁 Then I tried to get the output error. I found an excellent post about: http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html. So I changed my task:


# simple-task.tb
output = `libreoffice --headless --convert-to --outdir /tmp my-test-file.odt 2>&1`
Rails.logger.info('DEBUG: ' + output)

The output was a simple: “Error: source file could not be loaded” :/ After so many searches at DuckDuckGo (please avoid Google-vil) I found a tip at Stackoverflow here: http://stackoverflow.com/questions/37772250/using-soffice-within-python-command-works-in-terminal-but-not-in-python-subproc. Then I tried to reproduce it: yes if the source file (the one to be converted) does not exist then, the same error shows up!. Mmmm, path issue?, naaahh. Seems to be a dead-end, so time for lateral thinking 🙂

The server has some other apps with the same environment (Rails 2.3, Ruby 1.8.7): what if try the same runner task with them?. I found interesting results: some of them worked and some don’t. So the failure had to be with subtle difference somewhere between apps: almost there 🙂

Finally I found the guilty code: a stupid line at “config/environments/production.rb”:


ENV['TMPDIR'] = '/srv/rails/tmp'

That path does not exist in current server, so LibreOffice was unable to generate/find the middle temporary file in order to convert the document. Remove that line and yes!, I have it up and running again 🙂

What do I’ve learned after 2 days debugging session?:

  • I manage the stress better than 2 before 😀
  • Put configuration environment constants elsewhere is a bad habit
  • Debugging is nice: you learn a lot of things, but it so stressful 🙁
  • Going for a walk or so helps a lot in lateral thinking 🙂

Cheers! 🙂

Posted in Programación, Ruby, Software, Solucioname esto... | Tagged , , , , , , | Leave a comment

Thunderbird: insertar una imagen NO incrustada

thunderbirdMozilla Thunderbird es una herramienta muy poderosa y versátil. Recientemente he necesitado hacer que la imagen de un correo HTML apunte a un servidor, y sea cargada en el correo cada vez que este se abra por sus destinatarios.

Por defecto Thunderbird hace que una imagen que se añade a un correo HTML sea incrustada en el propio correo:


img src='http://mi-dominio.com/imagen.jpg'

Para forzar a la situación y hacer que la imagen no esté incrustada en el correo hay que usar un poco de “Mozilla-fu” 🙂


img moz-do-not-send='true' src='http://mi-dominio.com/imagen.jpg'

¡Gran parámetro, excepcional resultado! 😀

Posted in Software, Software Libre | Tagged , , | Leave a comment

Acme.sh facil (no tanto en CentOS 5)

Letsencrypt logoHe estado mirando últimamente la manera de empezar con Let’s Encrypt en un proyecto que andamos terminando. No lo había probado hasta ahora, pero tras leer un rato me he decantado por el script en BASH, Acme.sh, ya que el servidor sobre el que tengo que montar en producción está un poco desfasado y el cliente oficial (certbot) no funciona por defecto.

Esto es lo que he hecho para hacer funcionar Acme.sh en CentOS 5:

  • Instalar según el proyecto indica en el README. La única particularidad es que al utilizar wget para descargar el fichero acme.sh es necesario añadir –no-check-certificate.
  • Al intentar generar el certificado por primera vez fallaba y he necesitado añadir –insecure a la línea que estaba utilizando. Esto está relacionado con el parámetro anterior que he tenido que añadir a wget, y se debe a la versión de wget precisamente que hay disponible en los repositorios de CentOS.
  • Salvando este escollo, mi siguiente pega estaba en que Let’s Encrypt me rechazaba con un error 403 por falta de autenticación. He estado mirando por diferentes ficheros de mi instalación y modificando la línea en la que se añade un correo electrónico, en el fichero /home/mi-usuario/.acme.sh/account.conf (la línea comentada que empieza con ACCOUNT_EMAIL), se ha podido generar el certificado.
  • Mi siguiente pega ha sido con Rails: el proyecto que estaba poniendo en producción es una proyecto hecho en Rails y en la línea en que se indica a Acme.sh donde esta el raiz del proyecto para que realice la verificación automática del dominio, se debe añadir el directorio “public” para que la verificación no falle.

En concreto, para que todo vaya bien esta ha sido la línea final de generación del certificado:


acme.sh --issue -d mi.dominio.com --insecure -w /mi/ruta/hasta/proyecto/rails/public

El parámetro –debug es bastante útil también para ver que pasa bajo el capó 😉

Una vez generado el certificado es cuestión de configurar Apache (servicio HTTPD en CentOS) como cualquier otro (hay abundante documentación al respecto, o sea que no me meto, aunque quizá este sea un buen enlace al respecto) y listo 🙂

La conexión entre Apache y el proyecto Rails, en este caso se realiza con Phussion Passenger y no es necesario hacer nada mas al respecto. Únicamente en la aplicación Rails es necesario añadir que SSL debe estar activado. En este enlace se explica muy claramente cómo hacerlo para aplicaciones Rails (superiores a 3.1 e inferiores también).

Una nota interesante también es cómo redireccionar el tráfico del puerto 80 al 443 para servir siempre desde HTTPS y que ninguna petición se escape por el puerto 80. En el wiki de Apache se explica perfectamente 🙂

Mi conclusión es que muy positiva al respecto de Let’s Encrypt: en general es un proceso sencillo, y las pequeñas trampas que hay que solucionar son pequeñas piedras en el camino de cualquier administrador mínimamente experimentado. ¡Ánimo y probadlo!.

Posted in Ubuntu | Leave a comment

DDWRT: repetidor de un AP y AP propio a la vez

ddwrtDDWRT es un firmware alternativo para multitud de routers. Personalmente me parece que la combinación de este firmware con un router de Linksys, el WRT54GL, es una combinación perfecta para disponer en definitiva de un router que te permite multitud de combinaciones.

Una combinación que he tenido que configurar en un par de ocasiones, ha sido utilizarlo como cliente de un AP WiFi que ya existe, y simultáneamente que el router ofrezca un segundo AP WiFi para algunos equipos cliente. Primero se establece la interfaz principal como “Repeater” y se selecciona el SSID del AP WiFi que ya está emitiendo, y posteriormente se añade una interfaz virtual sobre la física para crear el emisor del AP WiFi que necesitamos:

ddwrt_repeater_1

Por último añadimos la autenticación para la interfaz “repetidora” y opcionalmente una clave WEP a la interfaz emisora:

ddwrt_repeater_2

¡Salud! 🙂

Posted in Hardware, Software, Software Libre | Tagged , , | Leave a comment

Ejecutar un script tras establecer un tunel OpenVPN

OpenVPNTeniendo un servidor OpenVPN montado y por ejemplo una RaspberryPi cliente que se conecte al arrancar, podemos llegar a necesitar que se ejecute un script que realice alguna acción, por ejemplo añadir unas rutas a la tabla de rutas del cliente.

Añadir los siguientes argumentos a la línea de comandos:

--script-security 2 --up /ruta/hasta/tu/script.bash

O metiendo en el fichero de configuración:

script-security 2
up /ruta/hasta/tu/script.bash

¡Salud! 🙂

Posted in Software, Software Libre, Solucioname esto..., Ubuntu | Tagged , , , , | Leave a comment