#!/usr/bin/env python3

import subprocess

# Inställningar för e-post
smtp_server = "mailout.privat.bahnhof.se"
smtp_port = "587"
smtp_user = "mc344084"
smtp_password = "He35273527"
sender_email = "noreply@engfeldt.st"
recipient_email = "hansengfeldt@gmail.com"

# Lista med diskar som ska kontrolleras
mount_points = [
    
    "//192.168.1.207/SSD1/webbserver",
    "//192.168.1.207/SSD1/webbackup"
]

# Fil för att hålla reda på tidigare status
status_file = "/tmp/disk_status.txt"

def check_disk(mount_point):
    try:
        result = subprocess.run(['df', '-hT'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        if result.returncode == 0:
            output_lines = result.stdout.splitlines()
            for line in output_lines[1:]:
                if mount_point in line:
                    return True, "OK"
            return False, "Ej monterad"
        elif "Host is down" in result.stderr:
            return False, "Host is down"
        else:
            return False, "Okänt fel"
    except Exception as e:
        print(f"Fel vid kontroll av disk: {e}")
        return False, "Okänt fel"

def send_email(subject, body, to_email):
    command = [
        "swaks",
        "--server", smtp_server,
        "--port", smtp_port,
        "--tls",
        "--auth", "LOGIN",
        "--auth-user", smtp_user,
        "--auth-password", smtp_password,
        "--to", to_email,
        "--from", sender_email,
        "--header", f"Subject: {subject}",
        "--body", body,
        "--header", "Content-Type: text/html; charset=UTF-8"
    ]
    try:
        subprocess.run(command, check=True)
        print("E-post skickad!")
    except subprocess.CalledProcessError as e:
        print(f"Fel vid skickning av e-post: {e}")

results = []
any_not_mounted = False
any_host_down = False

for mount_point in mount_points:
    mounted, status_message = check_disk(mount_point)
    if mounted:
        results.append(f"<tr><td>{mount_point}</td><td><span style='color: green;'>OK</span></td></tr>")
    else:
        if "Ej monterad" in status_message:
            any_not_mounted = True
        elif "Host is down" in status_message:
            any_host_down = True
        results.append(f"<tr><td>{mount_point}</td><td><span style='color: red;'>{status_message}</span></td></tr>")

# Läs tidigare status från filen
try:
    with open(status_file, 'r') as f:
        previous_status = f.read().strip()
except FileNotFoundError:
    previous_status = "not_all_ok"

# Bestäm aktuell status
if any_not_mounted or any_host_down:
    current_status = "not_all_ok"
    body = """
<html>
<head>
    <style>
        table {{
            width: 800px;
            border-collapse: collapse;
        }}
        th, td {{
            padding: 10px;
            text-align: left;
            border: 1px solid black;
        }}
        th:nth-child(1) {{
            width: 400px;
        }}
        th:nth-child(2) {{
            width: 100px;
        }}
    </style>
</head>
<body>
    <h2>Status för monteringspunkter</h2>
    <table>
        <tr>
            <th>Monteringspunkt</th>
            <th>Status</th>
        </tr>
        {}
    </table>
</body>
</html>
    """.format("".join(results))
    subject = "Problem med monteringspunkter"
    send_email(subject, body, recipient_email)
else:
    current_status = "all_ok"
    # Skicka e-post om alla monteringspunkter är monterade och status har ändrats
    if previous_status != current_status:
        body = "<html><body><h2>Alla monteringspunkter är nu monterade och uppe.</h2></body></html>"
        subject = "Alla monteringspunkter är OK"
        send_email(subject, body, recipient_email)

# Skriv nuvarande status till filen
with open(status_file, 'w') as f:
    f.write(current_status)

print(f"Nuvarande status: {current_status}")
