Este articulo va en respuesta a una consulta que nos hacen desde el servicio meteorologico de Paraguay:

Buenas tardes Sebastian, deseo puedas ayudarme con un script para automatizar una tarea que regularmente lo viene realizando los compañeros en el Servicio Meteorologico, la mano viene asi: Recientemente hemos instalado Ubuntu 8.04 como sistema operativo en las computadoras de tareas diarias, y los compañeros realizan en ellas tareas cotidianas que me gustaria automatizarlas, la misma son:

  1. Editan un boletin diario en open office y lo guardan con un nombre especifico como ser boletin diario.doc
  2. Lo exportan a formato pdf con el siguiente nombre añomesdiahora.pdf, por ejemplo 2009012712.pdf
  3. El archivo en formato pdf lo abren con gimp para exportarlo a un documento .gif, y lo guardan con un nombre boletin.gif
  4. ambos documentos el .pdf y el .gif son levantados a traves deun aceso ftp al sitio web de la DMH

Bueno trashaberte puesto al tanto de la tarea que se realiza, se podria hacer un script para ejecutarlo automaticamene cada cierto tiempo?

Desde ya gracias por la ayuda.


Antes que nada felicitarlos por la decision de haber instalado GNU/Linux. Realmente es una excelente noticia. El titulo de este articulo podria haber sido algo como “El servicio meteorologico migra a Ubuntu GNU/Linux” o algo por el estilo.

Veamos paso a paso como ejecutar cada una de estas tareas desde la linea de comandos, para luego poner todo esto en un script que lo haga automaticamente.


</p>

Exportar el .odt a formato .pdf

Lo primero que necesitamos es exportar el documento de Open Office a formato pdf. Para esta tarea existe un exelente script en python que se puede descargar de la siguiente url:

http://www.artofsolving.com/opensource/pyodconverter

http://www.artofsolving.com/files/DocumentConverter.py

Para ejecutar el script, es necesario primero ejecutar Open Office desde la linea de comandos con los siguientes parametros:

> ooffice  -accept="socket,port=8100;urp;" &

Note

En este articulo, usare el simbolo > para indicar el prompt del shell bash, para que no se confunda el simbolo del prompt con el simbolo $ de las macros de ftp que veremos mas abajo.

Luego, para convertir un documento a pdf, por ejemplo boletindiario.odt, ejecutamos el siguiente comando:

> python DocumentConverter.py boletindiario.odt  boletindiario.pdf

Note

Para que el script en python funcione, es necesario tener corriendo Open Office, con el parametro antes mencionado. En una maquina donde el script se corra en forma automatizada (por ejemplo con cron, será necesario tener abierto el Open Office en todo momento. Se puede dejar levantado el Open Office por la mañana, o inclusive hacer un script que revice si esta abierto, y en caso contrario lo cargue con los parametros.

Seteando el formato de la fecha desde linea de comandos

El formato añomesdiahora se puede obtener con el siguiente comando:

> date '+%Y%m%d%H'

Pasando el .pdf a .jpg

El programa pdfimages nos sirve para extraer las imagenes de un .pdf y es parte del paquete poppler-utils. En la mayoria de las distribuciones de GNU/Linux actuales, este paquete viene instalado junto con los paquetes relacionados con la lectura de archivos .pdf, por ejemplo evince o xpdf. Por lo que es bastante probable que ya lo tengan instalado.

Para saber si tenemos instalado este programa (o cualquier otro), podemos ejecutar el comando which o el comando whereis, que nos dicen si esta instalado y donde:

> which pdfimages
/usr/bin/pdfimages

El uso del comando pdfimages es muy simple:

> pdfimages -j boletin2009021223.pdf  boletin2009021223

producira boletin2009021223-000.jpg

y en el caso de que el pdf tenga varias imagenes, las irá agregando en orden consecutivo:
boletin2009021223-001.jpg
boletin2009021223-002.jpg
…etc

Automatizar la subida de archivos (upload) via FTP desde la linea de comandos

Finalmente, antes de poder escribir todos los pasos en un script, nos queda la tarea de automatizar la subida de los archivos generados, para que realmente todo el proceso sea automatico.

El cliente ftp de linea de comandos es muy util, sin embargo tiene el inconveniente de que hay que ingresar usuario y password para poder usarlo, previniendo al proceso de poder automatizarse. Para que el usuario pueda loguearse automaticamente, se puede usar el archivo .netrc

La informacion completa de como automatizar esta tarea la podemos obtener por supuesto de los manuales:

> man ftp
> man netrc

Sin embargo me parece apropiado resumir aqui el proceso de automatizacion de uploads via ftp, ya que la infomacion de los manuales es un poco tecnica.

Usando el archivo .netrc

El archivo .netrc no existe por defecto, es necesario crearlo manualmente y colocado en el directorio home del usuario.
Este archivo contiene los detalles de conexion de cualquier cuenta FTP utilizada:

machine ftp.ejemplo.com
login nombreusuario
password abc123

El archivo .netrc siempre debe terminar con una linea en blanco ( y una linea en blanco tambien debe ser insertada entre las definiciones de cuentas FTP ).

!DANGER!

Aqui hay un problema de seguridad – el usuario esta guardando sus claves en un archivo de texto plano ; Sin embargo, FTP minimiza el riesgo mediante solo ejecutar si el archivo .netrc tiene sus permisos establacidos de modo que solo el usuario pueda leerlo ; de esta forma, debemos ejecutar el siguiente comando:

> chmod 600 .netrc

Con el archivo .netrc configurado correctamente, el acceso FTP se vuelve trivial, basta con escribir ftp ftp.ejemplo.com para que el programa ftp automaticamente intente loguear con el usuario y password configurados en el archivo .netrc

> ftp ftp.ejemplo.com
Connected to ftp.ejemplo.com.
220 FTP server ready
331 Password required for ejemplo.com
230 User nombreusuario logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Y de este forma, la subida o bajada de archivos via ftp se puede automatizar:

> echo put archivo1.txt | ftp ftp.ejemplo.com
> echo get archivo2.txt | ftp ftp.ejemplo.com

FTP Macros

Sin embargo, el proceso de automatizacion se puede simplificar aun mas con el hecho de que se pueden configurar macros para ser usadas con FTP. Las macros son cualquier comando standard FTP que se definen en el archivo .netrc, mediante el uso de la palabra clave macdef. Por ejemplo, podemos agregar las siguientes lineas a nuestro archivo .netrc

macdef updateSite
prompt off
lcd $1
cd $2
put *

Attention!

En el archivo .netrc, cada sentencia debe separarse por una linea en blanco. Por ejemplo, cada sentencia macdef (que puede incluir varias lineas) debe separarse de las demas macros por una linea en blanco. Lo mismo con las sentencias machine que definen una conexion. Ademas el archivo debe terminar con una linea en blanco.

Es interesante notar que una macro a su vez puede invocar otra macro ( mediante el uso del simbolo $). No confundir con el simbolo $ que aparece en el prompt del shell.

macdef updateServMeteorologico
$ updateSite /home/usuario/archivospdf/   directorio_en_servidor_ftp

En el ejemplo de arriba todos los archivos del directorio /home/usuario/archivospdf son subidos (upload) a un servidor, subiendolos al directorio directorio_en_servidor_ftp.

Las macros tambien pueden ser invocadas desde la linea de comandos:

> echo "$ updateServMeteorologico" | ftp ftp.ejemplo.com

Script bash de automatizacion

Ahora, juntemos todos los pasos en un lindo script bash que automatice todos los pasos previos.
Este script consiste simplemente en juntar en un archivo todos los comandos que hemos probado anteriormente en forma separada. El unico agregado son las primeras lineas, donde agregue un chequeo adicional para comprobar si OpenOffice se encunetra corriendo correctamente.

updateServMet.sh

#! /bin/bash

# checkear si el Open Office estar cargado correctamente.
error_not_found=0
error_not_listen=0

if  pgrep soffice.bin > /dev/null  2>&1
then
    soffice_pid=$(pgrep soffice.bin)
    ##echo "ooffice ya esta cargado."
    ps ax | grep ^"$soffice_pid".*soffice.bin.*accept.socket.port.8100.urp
    error_not_listen=$?
else
    error_not_found=1
fi

# si el Open Office no esta cargado con los parametros necesarios
# entonces cargarlo
if [ $error_not_found -gt 0 -o $error_not_listen -gt 0 ]
then
    ooffice  -accept="socket,port=8100;urp;" &
    sleep 15  # espera hasta que ooffice termine de cargar
fi

cd /home/username/servmet


timestamp=$(date '+%Y%m%d%H')

archivopdf="boletindiario${timestamp}".pdf

python DocumentConverter.py boletindiario.odt  "$archivopdf"

pdfimages -j "$archivopdf"  boletin

echo "$ updateServMeteorologico" | ftp ftp.ejemplo.com

Uso de cron para ejecutar programas periodicamente

Por ultimo solo resta agregar nuestro script al archivo crontab para que se ejecute periodicamente.

Cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos o scripts a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el archivo crontab.

Para agregar, quitar o modificar tareas, hay que editar el crontab. Esto se hace con la orden crontab -e

Por ejemplo, para ejecutar el script que actualiza el servicio meteorologico, deberiamos agregar algo como lo siguiente:

01 * * * * cd /home/usuario/servmet ; updateServMet.sh

Para profundizar en el uso del comando crontab los voy a referir a dos enlaces donde esta explicado en forma completa:

http://es.wikipedia.org/wiki/Cron_(unix)

http://www.linuxtotal.com.mx/index.php?cont=info_admon_006

Tambien te puede interesar:

La seccion sobre shell scripts

Copyright: http://snarvaez.poweredbygnulinux.com Sebastian Narvaez


este documento ha sido publicado bajo la siguiente licencia: “Verbatim copying and distribution of this entire article are permitted in any medium provided this notice is preserved.”