diff --git a/srv/poe_manager/app.py b/srv/poe_manager/app.py index 07b295b..8672e16 100644 --- a/srv/poe_manager/app.py +++ b/srv/poe_manager/app.py @@ -122,44 +122,46 @@ def index(): c.execute("SELECT mac, name, is_active FROM devices ORDER BY name ASC") devices = c.fetchall() - # Intervall aus DB (Minuten) laden + # Intervall laden c.execute("SELECT value FROM settings WHERE key='interval'") row = c.fetchone() - interval = int(row[0]) if row else 5 # Default 5 Minuten + interval = int(row[0]) if row else 5 conn.close() - # Status aus letztem Log ermitteln - import glob, os + # Neu: Status und "zuletzt online" ermitteln log_files = glob.glob("/var/log/rpi-*.log") status_dict = {} + last_seen_dict = {} + if log_files: latest_log = max(log_files, key=os.path.getctime) with open(latest_log, "r") as f: - for line in f: - line = line.strip() - for dev in devices: - # prüfen, ob Name enthalten ist und Statusphrase - if f"{dev[1]} ist erreichbar!" in line: - status_dict[dev[0]] = "online" - elif f"{dev[1]} ist nicht erreichbar!" in line: - status_dict[dev[0]] = "offline" + lines = f.readlines() - last_seen_dict = {} + for dev in devices: + last_status = None + last_time = None - for dev in devices: - # Status aus Log ermitteln - status_dict[dev[0]] = "offline" if f"{dev[1]} ist nicht erreichbar!" in open(max(glob.glob('/var/log/rpi-*.log'), key=os.path.getctime)).read() else "online" + for line in reversed(lines): # von unten nach oben lesen + if f"{dev[1]} ist erreichbar!" in line: + last_status = "online" + last_time = line.split(" ")[0] + " " + line.split(" ")[1] + break + elif f"{dev[1]} ist nicht erreichbar!" in line: + last_status = "offline" + last_time = line.split(" ")[0] + " " + line.split(" ")[1] + break - # Last Seen nur, wenn offline - if status_dict[dev[0]] == "offline": - last_seen = get_last_seen(dev[1]) # dev[1] = Device Name - if last_seen: - last_seen_dict[dev[0]] = last_seen + if last_status: + status_dict[dev[0]] = last_status + if last_status == "offline": + last_seen_dict[dev[0]] = [f"Zuletzt online: {last_time}", dev[1]] + else: + status_dict[dev[0]] = "unbekannt" - - # Template rendern mit Devices, Status und Intervall return render_template("index.html", devices=devices, status=status_dict, last_seen=last_seen_dict, interval=interval) + @app.route("/settings", methods=["GET", "POST"]) @login_required def settings():