From 5354c9983de44501b34790013307b74762a93c60 Mon Sep 17 00:00:00 2001 From: oussi Date: Thu, 2 Apr 2026 11:43:48 +0200 Subject: [PATCH] ajout du suivi utilisateur --- app.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/app.py b/app.py index 2fbbee9..c8fd017 100644 --- a/app.py +++ b/app.py @@ -20,6 +20,7 @@ from werkzeug.security import check_password_hash, generate_password_hash from config_manager import ConfigManager from monitor import SystemMonitor from alerter import EmailAlerter +from user_monitor import UserMonitor # --- Init --- config = ConfigManager() @@ -53,6 +54,7 @@ login_manager.login_message = "Veuillez vous connecter." # Services alerter = EmailAlerter(config) monitor = SystemMonitor(config, alerter) +user_monitor = UserMonitor(config) class AdminUser(UserMixin): @@ -312,6 +314,72 @@ def toggle_monitoring(): return redirect(url_for("dashboard")) +@app.route("/users") +@login_required +def users(): + return render_template("users.html") + + +@app.route("/api/users") +@login_required +def api_users(): + cache = user_monitor.data + if cache.get("error"): + return jsonify({"error": cache["error"]}) + if cache.get("no_files"): + return jsonify({"no_files": True}) + users_list = [ + { + "login": u["login"], + "status": u["status"], + "last_action_time": u["last_action_time"].strftime("%H:%M:%S") if u.get("last_action_time") else None, + "last_action_label": u.get("last_action_label", ""), + "action_count_24h": u.get("action_count_24h", 0), + "connected_since": u["connected_since"].strftime("%H:%M") if u.get("connected_since") else None, + "explicit_logout": u.get("explicit_logout", False), + } + for u in cache.get("users", {}).values() + ] + return jsonify({"users": users_list, "hourly": cache.get("hourly", [])}) + + +@app.route("/api/users/activity/weekly") +@login_required +def api_users_weekly(): + return jsonify({"weekly": user_monitor.get_weekly_activity()}) + + +@app.route("/settings/amadea-log-path", methods=["POST"]) +@login_required +def update_amadea_log_path(): + path = request.form.get("amadea_log_path", "").strip() + if not path: + flash("Le chemin ne peut pas etre vide.", "danger") + return redirect(url_for("settings")) + config.set("amadea_log_path", path) + flash("Chemin des logs Amadea mis a jour.", "success") + return redirect(url_for("settings")) + + +@app.route("/settings/user-thresholds", methods=["POST"]) +@login_required +def update_user_thresholds(): + try: + active = int(request.form["active_minutes"]) + inactive = int(request.form["inactive_minutes"]) + if active < 1 or inactive < 1: + flash("Les seuils doivent etre d'au moins 1 minute.", "danger") + return redirect(url_for("settings")) + if active >= inactive: + flash("Le seuil 'actif' doit etre inferieur au seuil 'inactif'.", "danger") + return redirect(url_for("settings")) + config.set("user_status_thresholds", {"active_minutes": active, "inactive_minutes": inactive}) + flash("Seuils utilisateurs mis a jour.", "success") + except (ValueError, KeyError) as e: + flash(f"Erreur: {e}", "danger") + return redirect(url_for("settings")) + + def check_port_available(port): """Verifie si un port est disponible.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -341,6 +409,9 @@ def main(): # Collecte initiale monitor.collect_metrics() + user_monitor.start() + user_monitor.parse_logs() + print("[Supervision] Monitoring actif") app.run(host="0.0.0.0", port=port, debug=False)