Esta semana necesitábamos vigilar una carpeta: en concreto, saber si pasaban «n» días sin que llegara ningún fichero nuevo. Por eso programé un script sencillo de Python que nos envía un correo cuando ocurre. Vamos al ejemplo.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import datetime
import glob
import os
import smtplib
now = datetime.datetime.now() # Fecha y hora actuales
list_of_files = glob.glob('c:/tmp/*') # * significa todos; para un formato concreto, p. ej. *.csv
latest_file = max(list_of_files, key=os.path.getctime) # Último fichero creado en la carpeta
newestFileCreationDate = datetime.datetime.fromtimestamp(os.path.getctime(latest_file)) # Fecha de creación del último fichero
dif = now - newestFileCreationDate # Tiempo entre ahora y la última creación
logFile = "c:/tmp2/log.log" # Fichero de registro
def checkFolder(dif, now, logFile):
if dif > datetime.timedelta(days=5): # ¿Hace más de 5 días que no llega ningún fichero?
HOST = "192.16.0.1" # IP de vuestro servidor SMTP
SUBJECT = "¡Alerta! Al menos 5 días sin ficheros nuevos en la carpeta xxxxxxx"
TO = "vuestrocorreo@vuestrodominio.com"
FROM = "noreply@vuestrodominio.com"
text = "%s - El fichero más reciente de la carpeta tiene %s de antigüedad" % (now, dif)
BODY = "\r\n".join((
"From: %s" % FROM,
"To: %s" % TO,
"Subject: %s" % SUBJECT,
"",
text
))
server = smtplib.SMTP(HOST)
server.sendmail(FROM, [TO], BODY.encode("utf-8"))
server.quit()
with open(logFile, "a") as file: # Abrimos el registro en modo añadir
file.write("%s - [AVISO] El fichero más reciente de la carpeta tiene %s de antigüedad\n" % (now, dif))
else: # Han pasado menos de 5 días
with open(logFile, "a") as file:
file.write("%s - [OK] El fichero más reciente de la carpeta tiene %s de antigüedad\n" % (now, dif))
checkFolder(dif, now, logFile) # Llamamos a la función con los 3 argumentos
Para ejecutarlo cada día, podéis programarlo con el Programador de tareas de Windows o con cron en Linux.
Nota: el script original era para Python 2. Esta versión está adaptada a Python 3.
Traducción hecha con ayuda de IA a partir del artículo original.
