Secciones

Artículos para tus primeros pasos

Si estás empezando a introducirte en el mundo de Groovy y Grails, no te pierdas nuestros artículos básicos: 

Entrevistas con los expertos
 

Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:


Un proyecto de:
ImaginaWorks
Campus Escuela de Groovy

Cómo supervitaminar y mineralizar tus scripts de shell

sábado 08/09/2007

El problema

Supongamos que tenemos un sitio web que publica información sobre, por ejemplo, un lenguaje de programación dinámico para la máquina virtual Java. Y supongamos que nuestro jefe nos pide que le enviemos un informe periódico de las 50 historias más leídas, con el número de lecturas de cada uno en el momento de generar el informe.

La primera opción es incorporar una tarea periódica al CMS para que envíe el informe. Al fín y al cabo, está escrito en Grails, así que es una tarea sencilla. Lo que pasa es que luego hay que desplegarlo y mantenerlo junto al CMS, y en este caso parece una solución compleja para un problema sencillo.

La segunda opción es escribir un script (la aplicación se ejecuta en un servidor Linux) y programarlo como una tarea cron. Eso tiene mejor pinta: más rápido y fácil de mantener... El problema en este caso es que no estamos seguros de cómo se hacen algunas cosas de las que queremos en un script de shell, en particular lo de conectarse a MySQL y lanzar una consulta.

La solución

Desde aquí os propongo una solución basada en Groovy. Veréis como podemos beneficiarnos de lo mejor de dos mundos: la shell de linux y las librerías Java que ya conocemos.

Lo primero que tenemos que hacer es colocar las librerías que vamos a usar en el directorio ~/.groovy/lib/ . Lo que queremos hacer es conectar con la base de datos y enviar un correo, así que las librerías que usaremos son

- El driver JDBC
- Commons Email
- mail.jar + activation.jar

Una vez guardadas las librerías en su sitio, vamos a ver el script que hace el trabajo:


informe.groovy
#!/usr/bin/env groovy
import groovy.sql.Sql
import org.apache.commons.mail.*

def fecha = new java.text.SimpleDateFormat("dd.MM.yyyy").format(new Date())

def host = "localhost"
def user = "dbuser"
def pass = "dbpass"
def schema = "GroovyHispano"
def driver = "com.mysql.jdbc.Driver"
def query = "SELECT id,titulo,lecturas FROM story ORDER BY lecturas DESC LIMIT 0,50";

def remitente = "no-reply@groovy.org.es"
def destinatario = "destinatario@servidor.com"
def mailHost = "mail.servidor.com"

def asunto = "Informe de lecturas: ${fecha}"

def informe = "ID,TITULO,LECTURAS\n"

println "Conectando con la base de datos..."
sql = Sql.newInstance("jdbc:mysql://${host}/${schema}", user, pass, driver)

println "Consultando..."
sql.eachRow(query,{
informe += "${it.id},${it.titulo},${it.lecturas}\n"
})

def tmpFile = new File("Informe_${fecha}.csv")
tmpFile.write(informe)

println "Enviando informe \"${asunto}\" por correo a ${destinatario}"

EmailAttachment attachment = new EmailAttachment();
attachment.setPath(tmpFile.getCanonicalPath());
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription(asunto);
MultiPartEmail email = new MultiPartEmail();
email.setHostName(mailHost);
email.addTo(destinatario);
email.setFrom(remitente);
email.setSubject(asunto);
email.setMsg(asunto);

email.attach(attachment);

email.send();

println "Borrando archivo temporal"
tmpFile.delete();

println "Proceso completado"

Como vemos, el proceso es muy sencillo:
  • para conectar con la base de datos, usamos GroovySQL. Fijaros en la sencillez con la que conectamos, consultamos y recorremos el resultado generando un documento CSV.
  • una vez guardado el informe en un archivo de texto (fijaros en la sencillez con que se escribe texto en un File gracias al metod write que Groovy añade dinámicamente a la clase java.io.File), componemos el correo con CommonsEmail, como lo haríamos en Java.

Lo único que falta es guardar el script en un archivo de texto, y darle permisos de ejecución. Como hemos incluído la línea "#!/usr/bin/env groovy" al principio, podremos ejecutarlo como cualquier otro archivo de script en linux, o añadirlo a la lista de tareas con "crontab -e".

Conclusión

En un script de 52 líneas hemos utilizado nuestras librerías Java de todos los días para generar un informe en CSV y enviarlo por correo dentro de un trabajo cron estándar de linux. Hemos combinado lo mejor de dos mundos para construir una solución sencilla y eficaz a un problema muy habitual.
Más información: http://groovy.org.es

Contenidos relacionados:



1 comentarios:

Cómo supervitaminar y mineralizar tus scripts de shell

crgiomunoz - lunes 27/04/2009

una inquietud el parametro hostname que usas es un válido?

Tienes que estar registrado para iniciar sesión y poder publicar tus comentarios