# definiciones from io import BytesIO import xlsxwriter import settings from pymisp import PyMISP import urllib3 from datetime import datetime from zoneinfo import ZoneInfo import os import logging from logging.handlers import RotatingFileHandler import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from crontab import CronTab urllib3.disable_warnings() class MISPAlertManager: def __init__(self): self.dir_actual = os.getcwd() self.dir_logs = os.path.join(self.dir_actual, 'logs') self._setup_logging() self.misp = PyMISP(settings.MISP_CONFIG['URL_MISP'], settings.MISP_CONFIG['AUTHKEY'], False) def _setup_logging(self): os.makedirs(self.dir_logs, exist_ok=True) log_file = os.path.join(self.dir_logs, f"alertas_{datetime.now().strftime('%Y%m%d')}.log") rotating_handler = RotatingFileHandler(log_file, maxBytes=262144000, backupCount=10) logging.basicConfig( level=logging.INFO, handlers=[rotating_handler], format='%(asctime)s - %(levelname)s - %(message)s' ) def enviar_alerta(self): # realizado (flag) realizado = False # Servidores servidores = [] # Se obtienen datos de conexión de servidores servidores_temp = self.obtener_servidores() if servidores_temp: # Solo se quiere entregar desconectados, se filtra por los desconcetados if settings.SERVERS_OFF: for x in servidores_temp: if x['connection_status'] != 'Connected': servidores.append(x) else: # Entonces todos los servidores servidores = servidores_temp # Se verifica que servidores tenga datos if servidores: # Se arma estructura de correo try: # Version de Servidor de MISP misp_version = self.misp.misp_instance_version['version'] # Configuración de la cuenta de Office 365 y del servidor SMTP smtp_server = settings.EMAIL_CONFIG['server_smtp_host'] smtp_port = settings.EMAIL_CONFIG['server_smtp_port'] from_address = settings.EMAIL_CONFIG['smtp_username'] to_address = settings.EMAIL_CONFIG['email_recipient'] password = settings.EMAIL_CONFIG['smtp_password'] # Crear el mensaje msg = MIMEMultipart() msg["From"] = settings.EMAIL_CONFIG['smtp_username'] # Dirección 'from' msg["To"] = to_address msg["Subject"] = settings.EMAIL_CONFIG['email_subject'] # Cuerpo del correo en HTML inciala html_body_start = """
Instance Name |
Connection Status |
Error Status |
Remote Version |
Remote Org |
Status Code |
Last Check |
"""+serv['instance_name']+""" |
"""+serv['connection_status']+""" |
"""+serv['error_status']+""" |
"""+serv['misp_remote_version']+""" |
"""+serv['remote_org']+""" |
"""+str(serv['status_code'])+""" |
"""+serv['last_check']+""" |
"""+serv['instance_name']+""" |
"""+serv['connection_status']+""" |
"""+serv['error_status']+""" |
"""+serv['misp_remote_version']+""" |
"""+serv['remote_org']+""" |
"""+str(serv['status_code'])+""" |
"""+serv['last_check']+""" |