Ejecuta scripts mediante Email en Python

Majordomo en python

Majordomo en python

Hoy os traigo una utilidad recién sacada del horno. Se trata de una implementación sencilla y simplificada de los famosos Majordomos. Para el que no lo sepa un majodormo es un programa en background que monitoriza una cuenta de email asociada y ejecuta comandos/scripts si encuentra ciertas palabras claves. Si alguna vez te has suscrito a alguna lista de distribución, es muy probable que lo hayas usado indirectamente.

Los casos de uso de un majordomo son muy amplios. En el campo de los administradores de equipos es de bastante utilidad, ya que se realizan tareas de mantenimiento en equipos que suelen ser remotos. La idea es que enviando una palabra mágica a una dirección de correo determinada, el majordomo empiece a trabajar, y que cuando termine nos mande un email para avisarnos.

La implementación la he hecho en Python y uso cron para ejecutar el script cada 5 minutos en busca de nuevos correos (órdenes).

Los scripts son: majoProcess.py y  sendNotify.py

majoProcess.py


#!/usr/bin/env python
import poplib
import string
import os
from random import random

USER="<usuario>"
PASS="<contraseña>"
SERVER_POP3="<servidor-smtp>"
MAGIC_WORD="<secreto>"
TO="uncorreo@undominio.com"
SUBJECT_OK='"Proceso listo'
SUBJECT_FAIL='"Error al ejecutar el proceso"

SUBJECT_INIT='"Proceso en background iniciado"'

if __name__ == "__main__":

 magicFound = False
 M = poplib.POP3(SERVER_POP3)
 M.user(USER)
 M.pass_(PASS)
 n = len(M.list()[1])
 for i in range(n):
 for j in M.retr(i+1)[1]:
 if string.find(j,MAGIC_WORD) != -1:
 magicFound = True
 break;
 # Borramos mensajes
 for i in range(n):
 M.dele(i+1)
 M.quit()
 if magicFound:
 print "Magic word found"
 # Ejecutar proceso
 os.system("/usr/local/bin/sendNotify.py %s %s %s" % (TO,SUBJECT_INIT,'"iniciando proceso"'))
 ret = os.system("<comando/script>")
 if ret == 0:
 os.system("/usr/local/bin/sendNotify.py %s %s %s" % (TO,SUBJECT_OK,'"proceso terminado correctamente"'))
 else:
 os.system("/usr/local/bin/sendNotify.py %s %s %s" % (TO,SUBJECT_FAIL,'"proceso acabado"'))

sendNotify.py


#!/usr/bin/env python

import sys
import datetime
from smtplib import SMTP

FROM="Majordomo <majodomo@dominio.com>"
USER="<user>"
PASS="<password>"

SERVER_SMTP="<server-smtp>"
PORT_SMTP=<smtp-port>

HEADER="Mensaje automatico generado: "

if __name__ == "__main__":

 if len(sys.argv) < 4:
 print "syntax: %s <email-dest> <subject> <msg>" % sys.argv[0]
 sys.exit(0)

 smtp = SMTP()
 smtp.connect(SERVER_SMTP,PORT_SMTP)
 smtp.login(USER,PASS)
 to = sys.argv[1]
 subject = sys.argv[2]
 message = sys.argv[3]
 date = datetime.datetime.now().strftime("%d/%m/%Y %H:%M")
 msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s %s\n%s" % (FROM,to,subject,date,HEADER,date,message)
 smtp.sendmail(FROM,to,msg)
 smtp.quit()

Basta configurar cron añadiendo la siguiente línea que ejecuta nuestro script cada 5 minutos (*/60):


*/5 * * * * root /usr/local/bin/majoProcess.py

Bueno, espero que a alguno le sirva este sencillo majordomo (ojalá los majordomos supieran hacer cafe 🙂 )

Translate to:English
MenefanteMenéame TwitterTwitter

Deja un comentario