diff --git a/srv/poe_manager/app.py b/srv/poe_manager/app.py index 1a135b7..07b295b 100644 --- a/srv/poe_manager/app.py +++ b/srv/poe_manager/app.py @@ -81,6 +81,38 @@ def logout(): logout_user() return redirect(url_for('login')) +import glob +from datetime import datetime + +def get_last_seen(dev_name: str): + """Letztes Mal, dass ein Gerät erreichbar war.""" + log_files = glob.glob("/var/log/rpi-*.log") + if not log_files: + return None + + latest_time = None + + # alle Logs durchgehen + for logfile in sorted(log_files): + with open(logfile, "r") as f: + for line in f: + line = line.strip() + if f"{dev_name} ist erreichbar!" in line: + try: + ts_str = line.split(" ")[0] + " " + line.split(" ")[1] # "YYYY-MM-DD HH:MM:SS" + ts = datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S") + if latest_time is None or ts > latest_time: + latest_time = ts + except Exception: + continue + + if latest_time: + date_str = latest_time.strftime("Zuletzt Online am %d.%m.%Y") + time_str = latest_time.strftime("um %H:%M Uhr") + return date_str, time_str + + return None + @app.route("/") @login_required def index(): @@ -112,8 +144,21 @@ def index(): elif f"{dev[1]} ist nicht erreichbar!" in line: status_dict[dev[0]] = "offline" + last_seen_dict = {} + + 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" + + # 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 + + # Template rendern mit Devices, Status und Intervall - return render_template("index.html", devices=devices, status=status_dict, interval=interval) + 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