ajout du suivi utilisateur
This commit is contained in:
71
app.py
71
app.py
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user