ajout du suivi utilisateur

This commit is contained in:
oussi
2026-04-02 11:43:48 +02:00
parent 52ef8143a6
commit 5354c9983d

71
app.py
View File

@@ -20,6 +20,7 @@ from werkzeug.security import check_password_hash, generate_password_hash
from config_manager import ConfigManager from config_manager import ConfigManager
from monitor import SystemMonitor from monitor import SystemMonitor
from alerter import EmailAlerter from alerter import EmailAlerter
from user_monitor import UserMonitor
# --- Init --- # --- Init ---
config = ConfigManager() config = ConfigManager()
@@ -53,6 +54,7 @@ login_manager.login_message = "Veuillez vous connecter."
# Services # Services
alerter = EmailAlerter(config) alerter = EmailAlerter(config)
monitor = SystemMonitor(config, alerter) monitor = SystemMonitor(config, alerter)
user_monitor = UserMonitor(config)
class AdminUser(UserMixin): class AdminUser(UserMixin):
@@ -312,6 +314,72 @@ def toggle_monitoring():
return redirect(url_for("dashboard")) 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): def check_port_available(port):
"""Verifie si un port est disponible.""" """Verifie si un port est disponible."""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
@@ -341,6 +409,9 @@ def main():
# Collecte initiale # Collecte initiale
monitor.collect_metrics() monitor.collect_metrics()
user_monitor.start()
user_monitor.parse_logs()
print("[Supervision] Monitoring actif") print("[Supervision] Monitoring actif")
app.run(host="0.0.0.0", port=port, debug=False) app.run(host="0.0.0.0", port=port, debug=False)