#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import os
import smtplib
from datetime import datetime
from email.mime.text import MIMEText
from email.header import Header

# ==============================================================================
# CONFIGURATION / ZUGANGSDATEN (Bitte hier deine echten Daten eintragen)
# ==============================================================================
SMTP_SERVER = "mail.gmx.net"
SMTP_PORT   = 587  # Für STARTTLS (Falls SSL benötigt wird, Port 465 nutzen)
SMTP_USER   = "ankaiser@gmx.net"     # Deine GMX-Adresse aus dem Screenshot
SMTP_PASS   = "pasmagsab" # Hier dein GMX-Passwort eintragen

# Der gewünschte Pfad für die Logdatei
LOG_FILE_PATH = "/tmp/log/sendmail_http_errors.log"
# ==============================================================================

def main():
    # 1. Prüfen, ob ein Dateipfad als Argument übergeben wurde
    if len(sys.argv) < 2:
        print("Fehler: Kein Dateipfad als Argument übergeben.")
        sys.exit(1)

    # Das erste Argument nach dem Skriptnamen holen
    mailfile = sys.argv[1]

    # Prüfen, ob die übergebene Datei existiert
    if not os.path.isfile(mailfile):
        print(f"Fehler: Datei '{mailfile}' wurde nicht gefunden.")
        sys.exit(1)

    # 2. Datei einlesen
    try:
        with open(mailfile, 'r', encoding='utf-8', errors='ignore') as f:
            content = f.read()
    except Exception as e:
        print(f"Fehler beim Lesen der Datei: {e}")
        sys.exit(1)

    # 3. DER FILTER: Blockiert, wenn "leere Nachricht" IRGENDWO im Text steht
    if "leere Nachricht" in content:
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # --- ERWEITERTES LOGGING ZUR IDENTIFIKATION DES AUFRUFERS ---
        current_pid = os.getpid()
        parent_pid = os.getppid()

        parent_name = "Unbekannt"
        parent_cmdline = "Unbekannt"

        # Versuchen, den Prozessnamen via psutil auszulesen
        try:
            import psutil
            p = psutil.Process(parent_pid)
            parent_name = p.name()
            parent_cmdline = " ".join(p.cmdline())
        except Exception:
            # Fallback über das Linux /proc Verzeichnis, falls psutil fehlt
            try:
                with open(f"/proc/{parent_pid}/cmdline", "r") as f_cmd:
                    parent_cmdline = f_cmd.read().replace("\x00", " ").strip()
                    if parent_cmdline:
                        parent_name = parent_cmdline.split()[0]
            except Exception:
                pass

        # Wichtige Umgebungsvariablen für Web- oder Systemaufrufe sammeln
        env_info = []
        for var in ['USER', 'LOGNAME', 'HOME', 'PWD', 'HTTP_USER_AGENT', 'REMOTE_ADDR', 'REQUEST_METHOD']:
            if var in os.environ:
                env_info.append(f"{var}={os.environ[var]}")
        env_string = ", ".join(env_info) if env_info else "Keine relevanten Umgebungsvariablen"
        # -------------------------------------------------------------

        # Log-Eintrag detailliert zusammenbauen
        log_message = (
            f"[{timestamp}] Datei '{mailfile}' erfolgreich blockiert (Text 'leere Nachricht' gefunden).\n"
            f"  -> Aufgerufen von PID: {current_pid}\n"
            f"  -> Übergeordneter Prozess (PPID): {parent_pid}\n"
            f"  -> Name des Aufrufers: {parent_name}\n"
            f"  -> Befehl des Aufrufers: {parent_cmdline}\n"
            f"  -> System-Umgebung: {env_string}\n"
            f"{'-'*80}\n"
        )

        # Im Terminal ausgeben
        print(log_message.strip())

        # In die gewünschte Logdatei schreiben
        try:
            log_dir = os.path.dirname(LOG_FILE_PATH)
            if not os.path.exists(log_dir):
                os.makedirs(log_dir, exist_ok=True)

            with open(LOG_FILE_PATH, "a", encoding="utf-8") as log_file:
                log_file.write(log_message)
        except Exception as log_error:
            print(f"Fehler beim Schreiben in Logdatei: {log_error}")

        sys.exit(0) # Skript sauber beenden, OHNE eine Mail zu senden

    # 4. MAIL-VERSAND VORBEREITEN
    recipient = "kaiserreich@gmx.de"
    subject = "RaspPi9 Statusmeldung"
    body = content

    # E-Mail Objekt erstellen (UTF-8 Unterstützung für Umlaute)
    msg = MIMEText(body, 'plain', 'utf-8')
    msg['From'] = SMTP_USER
    msg['To'] = recipient
    msg['Subject'] = Header(subject, 'utf-8')

    # 5. E-Mail über GMX senden
    try:
        print(f"Verbinde mit SMTP-Server {SMTP_SERVER}...")
        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        server.ehlo()

        if SMTP_PORT == 587:
            server.starttls()
            server.ehlo()

        server.login(SMTP_USER, SMTP_PASS)
        server.sendmail(SMTP_USER, [recipient], msg.as_string())
        server.quit()

        print(f"Mail an {recipient} erfolgreich versendet.")

    except Exception as e:
        print(f"Fehler beim E-Mail-Versand: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
