Tag Archives: email

Notificando Nuevas Series Compartidas

Como todo buen friki que se precie, sigo un montón de series, tantas que mis usuarios se pierden cada día buscando las novedades en la carpeta compartida por NFS que tengo en mi red. El directorio compartido es /mnt/almacen/Media, un Seagate Barracuda de 1TB, de ahí cuelgan las series cada una en su directorio, muy bien ordenado.

Pues bien, apoyandome en el demonio Incron, he creado un sistema para notificar por correo electrónico a mi lusers cada novedad. El problema es que incron no implementa todavía la recursividad sobre subdirectorios, así que hay que supervisar cada uno por separado.

Este es el contenido:

bigBangTheory            Dollhouse           House          Mental               Numbers         RobinsonCrusoe    TheBeast
Bones                    EntreFantasmas      Hung           MentesCriminales     Olvidados       RomaCriminal      TheITCrowd
cocheFantastico          Eureka              incoming       Mercy                PadreDeFamilia  SamanthaWho       TheListener
ComoConociAVuestraMadre  EverybodyHateChris  kyle           Mienteme             pelisVistas     scrubs            TorchWood
csi                      FlashForward        LaPeceraDeEva  Monk                 Psych           siesta            Trauma
Deadwood                 Greek               Life           MP3s                 Reaper          Simpson           TrueBlood
Dexter                   Heroes              LifeOnMars     MujeresDesesperadas  Ritchies        StargateAtlantis  videosChicos
Docus                    Historicas          meLlamoEarl    MyOwnWorstEnemy      RobinHood       supernatural      Weeds

Escribir una línea de incrontab para cada uno es algo que no estaba dispuesto a hacer, así que se recurre a find y awk.

find /mnt/almacen/Media/ -maxdepth 1 | awk '{ print $1 " IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py $@ $# " }'

Este comando, que debemos redireccionar a un fichero, nos mostrará esto:

[...]
/mnt/almacen/Media/Mienteme IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py $@ $#
[...]

Que creara un monitor para el directorio, en caso que algún fichero sea movido dentro del directorio, ejecutará el comando nuevoMedio.py con los parametros $@ y $# que son la ruta completa y el nombre del archivo.

Existen, también dos detalles, uno es el directorio históricas donde guardo las series finalizadas, canceladas y discontinuadas. Esto es porque me gusta saber que series he seguido. El otro detalle, es supervisar la raíz de Media para avisar en caso que se añada una nueva serie. Las líneas que hay que añadir al incrontab son las siguientes.

/mnt/almacen/Media/Historicas IN_MOVED_TO /home/nordri/bin/incron/nuevoHistorico.py $# 
/mnt/almacen/Media IN_CREATE /home/nordri/bin/incron/nuevoDirMedio.py $#

Bien, pasemos a la programación, todos los scripts son en el básico Python que manejo, pero que resulta útil para estas cuestiones. El script nuevoMedio.py

import avisoPorEmail
import sys
def getCategoria(t):
  c = t.split("/")
  l = len(c)
  return c[l-1]
categoria  = getCategoria(sys.argv[1])
email = open("/tmp/email", "w")
email.write("En la categoria : " + categoria + "\n\nSe ha compartido un nuevo archivo multimedia: \n\n" + sys.argv[2] + "\n\n enjoy ;)")
email.close()
asunto = "Nuevo archivo multimedia"
direcciones = [ #direcciones# ]
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')

Simplemente, recibe la ruta del directorio compartido, elimina las barras y nos quedamos el nombre de la serie, que será la categoría, el segundo parámetro es el nombre del archivo, que lleva consigo el episodio, y todo lo que los uploaders le añaden para autopromocionarse. Se escribe la cadena en un archivo y se manda por correo a las direcciones que se le indican en el array. Hay que avisar a los usuarios que miren en spam por si acaso. A mi me pasa.

Los scripts de nuevoDirMedio.py y nuevoHistorico.py son muy similares.

import avisoPorEmail
import sys
import os
categoria  = sys.argv[1]
email = open("/tmp/email", "w")
email.write("Se está siguiendo una nueva serie : " + categoria + "\n\n enjoy ;)")
email.close()
asunto = "Nueva Serie"
direcciones = [ #direcciones# ]
# Dar de alta el nuevo directorio en incron
os.system('/home/nordri/bin/incron/nuevoDirVigilado.sh ' + categoria)
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')

Prácticamente igual, la peculiaridad aquí está en que si creamos un nuevo directorio, debemos dar de alta el monitor para incron. Para ello utilizo el siguiente script.

echo "/mnt/almacen/Media/$1 IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py \$@ \$#" > /tmp/tareaIncron.txt
incrontab -l >> /tmp/tareaIncron.txt
incrontab /tmp/tareaIncron.txt

Simple, no? Se escribe la tarea en un archivo auxiliar, se anexa el contenido del incrontab actual y se recarga usando el archivo auxiliar como base.

El último es para cuando una serie se pasa al histórico, así,

import avisoPorEmail
import sys
def getCategoria(t):
  c = t.split("/")
  l = len(c)
  return c[l-1]
categoria  = getCategoria(sys.argv[1])
email = open("/tmp/email", "w")
email.write("La serie : " + categoria + "\n\nHa sido cancelada o discontinuada. Perdone las molestias")
email.close()
asunto = "Serie abandonada"
direcciones = [ #Direcciones# ]
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')

Pues bien, cada vez que algo se mueva del incoming del Torrent a su directorio se avisará a los usuarios con un correo electrónico.

Programando Tareas Para Cálculo Distribuido 2

Mucho tiempo ha pasado desde que escribí la primera versión del programa de para administrar la cola de cálculo distribuido, ya anda por su versión 0.5 y ha mejorado sustancialmente. Se comprueban más cosas que el usuario es propenso a equivocar y se pueden fraccionar las horas, esto es podemos lanzar un cálculo de hora y media, mientras que antes sólo era posible horas enteras. Esto es lo último añadido, los usuarios necesitaban una forma de lanzar cálculos pequeños (30 minutos o menos) sin perder la hora entera.

Se sigue mandando el correo con las información del cálculo y ahora también se twittea como mandan las últimas tendencias. Para enviar el mensaje a Twitter se tiene que operar un poco para eliminar los guiones bajos y que quede más bonito, luego esos twitts pasan al blog que estamos preparando con WordPress para que aparezcan en el panel lateral los últimos cálculos que hemos mandado.

Otra cosa que se ha incorporado es el modo de operación, que es un deseo mio, cuando hago pruebas no necesito ni twitter ni email porque son pruebas. Lo demás sí aunque lo lance en un máquina virtual con una cola y un programa abaqus falsos.

Cuando el usuario se siente a lanzar un cálculo lo hará así:

$ abaqusq input=Trabajo job=Resultados cpus=22 time=H.M email=user_email

Aún nos queda pendiente crear una página web con la línea de tiempo de los cálculos, con el tiempo estara chulo ver como han evolucionado.

El código fuente se publica bajo licencia GPL aquí, con la esperanza en que a alguien le sirva.

Enviar Emails Desde La Línea de Comandos

¿A quién no le ha pasado que estando en el despacho la habla un amigo por el aMSN pidiendole que le pases el estudio para una práctica de la escuela que tienes en el PC de casa? Bien, creo que a mi sólo, así que aquí explicaré como hice frente a tal reto…

La solución es tan sencilla que incluso un usuario de Windows podría llevarla a cabo. Todo consiste en llegar a casa, en este caso lo hacemos por SSH.

ssh nordri@..micasa.net

Ahora pongo mi contraseña para poder acceder (lógico no?) una vez logeado en mi casa me muevo hasta el directorio donde está el estudio

cd /home/nordri/Cosas/etsii/segundo/2c/dce/

Aquí se haya el PDF con el estudio teórico que debe ser entregado al compañero. Si bien es cierto que aquí nacen dos posibles caminos de solución. En primer lugar puedo copiar ese archivo a mi máquina del despacho:

scp practica1.pdf nordri@midespacho.es:/home/nordri/

Y una vez aquí utilizar la transferiencia de ficheros que tiene aMSN para enviar el archivo al compañero.

Pero esta forma es mala, es mala porque es lenta, porque tengo que mover el fichero dos veces y me aparece una copia local que no necesito. Así que mejor lo mandamos por correo. Es aquí cuando la misión se pone interesante.

Para enviar correos en línea de comandos dispones de varios programas, inclusive, te puedes configurar todo un servidor SMTP para tal fin. La solución software que yo uso es email.

El paquete email, desgraciadamente, no se encuantra en los repositorios oficiales de Gutsy, así que toca compilarlo a mano, sin miedo, es un programa con pocas dependencias y alta probabilidad de que compile bien a la primera.

Vamos a ello.

1. Descomprimimos el paquete.

tar {z,j}xvf email...tar.{gz,bz2}

Se usa j para bz2 y z para gz.

2. Se configura el paquete

./configure

Si lo anterior no devolvió ningún error procedemos con la compilación. Si devolvió algún error, es más que posible que se trate de algún problema de dependencias. Localizadla e instalarla.

3. Se compila

make && make install

make se puede usar como usuario normal, make install es siempre con permisos de root (su o sudo según el caso). 

Una vez instalado, pasamos a configurarlo, a no ser que le hayas pasado parámetros al configure en el argumento –prefix, los archivos de configuración están en /usr/local/etc/email. La configuración es sencilla, es como cualquier otro cliente de correo. Vamos a ello

El servidor smtp a usar

SMTP_SERVER = 'smtp.servidor.com'
SMTP_PORT = ‘25′

Ponemos nuestro nombre que aparecerá en el remitente.

MY_NAME  = 'nordri'

Nuestro correo.

MY_EMAIL = 'nordri@..'

Esta opción es por si queremos que se respondan los emails a otra cuenta de correo.

REPLY_TO = ''

Podemos añadir una firma a cada correo, del tipo "este correo ha sido enviado desde la línea de comandos." o "este mensaje se envía de forma desatendida, por favor no responda" o cosas así, ahí la imaginación al poder.

SIGNATURE_FILE    = '&/email.sig'
SIGNATURE_DIVIDER = ‘– ‘

Aquí la libreta de direcciones, también es posible añadir direcciones en tiempo de escribir el comando en el prompt.

ADDRESS_BOOK = '&/email.address.template'

El directorio temporal donde email colocará los archivos necesarios durante su ejecución, cuando termine, los eliminará.

TEMP_DIR = '/tmp'

Si queremos conservar una copia de los emails enviados activamos esta opción indicandole dónde guardarla.

SAVE_SENT_MAIL = '~'

El soporte PGP queda aparcado para otro post que quiero escribir.

Hay que indicar el tipo de autentificación que requiere tu servidor de SMTP, normalmente es LOGIN o PLAIN (Nota: en la web oficial anuncian que soporta TLS desde noviembre, sin embargo, tanto en la página del manual como en la documentación del archivo de configuración se indica que sólo soporta esos dos tipos).

SMTP_AUTH = 'elegir'

Nombre de usuario, aquí lo normal es poner todo lo que está delante de la arroba, en otro sitios es necesario poner la dirección completa.

SMTP_AUTH_USER = 'usuario'

La contraseña del correo, esto es un fallo de seguridad, la contraseña queda en en texto plano, accesible a cualquiera que use el sistema.

SMTP_AUTH_PASS = ''

Pues listo, ya tenemos un programita que nos envía correos por la línea de comandos, usémoslo:

email -s "La práctica de dce" -a practica1.pdf compañero@hotm...com

Al apretar intro se abrirá el editor predeterminado del sistema (vim en mi caso) y podremos escribirles unas líneas del cuerpo del mensaje. Aunque si vamos con prisa otra forma de invocarlo es

echo "esto sera el cuerpo del mensaje" | email -s "Práctica DCE" -a practica1.pdf compañero@...mail.com

Los parámetros son varios y están bien comentados en el manual, los más frecuentes (los que yo uso) son:

  • -s: Asunto.
  • -a: Adjunto.
  • -q: Modo silencioso (útil para los scripts)
  • -html: Para enviarlos en modo html. (Tú tienes que escribir el html)

Y ya está. Ahora que puedes mandar correos desde la consola que sólo tu imaginación ponga límites a todo lo que puedes hacer con esto.