From 7f8086444b85f5f27c5f7eccbc7e71d000c91d73 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 8 Mar 2026 15:42:00 +0000 Subject: [PATCH] Ajout pause/resume/stats pour commandes !agentON/OFF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Contrôle via topic agents/agent2_deploy/control (pause/resume/report) - Stats de déploiements (total/success/errors) envoyées sur agents/daily_report - Vérification flag paused avant démarrage d'un déploiement Co-Authored-By: Claude Sonnet 4.6 --- agent2_deploy.py | 65 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/agent2_deploy.py b/agent2_deploy.py index 21e15bd..127fd69 100644 --- a/agent2_deploy.py +++ b/agent2_deploy.py @@ -12,6 +12,7 @@ import asyncio import json import threading from pathlib import Path +from datetime import datetime from slixmpp import ClientXMPP import paho.mqtt.client as mqtt @@ -33,6 +34,11 @@ MQTT_PORT = int(cfg["mqtt_port"]) MQTT_CLIENT = cfg["mqtt_client_id"] AGENT1_INBOX = cfg["agent1_inbox"] +# ── ÉTAT GLOBAL ─────────────────────────────────────────────────────────── +paused = False +start_time = datetime.now() +deploy_stats = {"total": 0, "success": 0, "errors": 0} + # ── MQTT ────────────────────────────────────────────────────────────────── _mqtt_pub = None @@ -40,12 +46,47 @@ def mqtt_publish(topic: str, message: str): if _mqtt_pub: _mqtt_pub.publish(topic, message) +def on_control_message(client, userdata, msg): + """Gère les commandes de contrôle : pause / resume / report.""" + global paused + try: + data = json.loads(msg.payload.decode(errors="replace")) + command = data.get("command", "") + print(f"[CONTROL] Commande reçue : {command}") + + if command == "pause": + paused = True + print("[CONTROL] Mis en pause.") + + elif command == "resume": + paused = False + print("[CONTROL] Reprise.") + + elif command == "report": + uptime_s = int((datetime.now() - start_time).total_seconds()) + payload = json.dumps({ + "agent" : MQTT_CLIENT, + "timestamp" : datetime.now().isoformat(timespec='seconds'), + "uptime_s" : uptime_s, + "paused" : paused, + "tasks_today" : deploy_stats["total"], + "success" : deploy_stats["success"], + "errors" : deploy_stats["errors"], + "avg_duration_s": 0, + "last_error" : None, + "pending" : 0, + }, ensure_ascii=False) + mqtt_publish("agents/daily_report", payload) + print("[CONTROL] Rapport envoyé.") + + except Exception as e: + print(f"[CONTROL] Erreur : {e}") + def start_mqtt(): global _mqtt_pub - import json as _json - _status_topic = "agents/status/{}".format(MQTT_CLIENT) - _offline_payload = _json.dumps({"status": "offline", "agent": MQTT_CLIENT}) - _online_payload = _json.dumps({ + _status_topic = "agents/status/{}".format(MQTT_CLIENT) + _offline_payload = json.dumps({"status": "offline", "agent": MQTT_CLIENT}) + _online_payload = json.dumps({ "status" : "online", "agent" : MQTT_CLIENT, "jid" : XMPP_JID, @@ -60,6 +101,15 @@ def start_mqtt(): _mqtt_pub.publish(_status_topic, _online_payload, retain=True) register_to_agent1() + # Souscription au topic de contrôle + _ctrl_sub = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, + client_id=MQTT_CLIENT + "_ctrl") + _ctrl_sub.on_message = on_control_message + _ctrl_sub.connect(MQTT_HOST, MQTT_PORT) + _ctrl_sub.subscribe("agents/{}/control".format(MQTT_CLIENT), qos=1) + _ctrl_sub.loop_start() + print("[MQTT] Écoute sur agents/{}/control".format(MQTT_CLIENT)) + def register_to_agent1(): """Publie une déclaration de mise en ligne sur agents/register.""" import json as _json @@ -317,6 +367,9 @@ class DeployBot(ClientXMPP): return if text == "!deploy": + if paused: + self.reply(jid, "[PAUSE] Agent2_Deploy est en pause. Envoyez !agentON agent2_deploy à agent1 pour reprendre.") + return self.reply(jid, start_session(jid)) return @@ -342,6 +395,8 @@ class DeployBot(ClientXMPP): self.reply(jid, "Déploiement en cours... Cela peut prendre plusieurs minutes.") def run_deploy(): + deploy_stats["total"] += 1 + def progress(msg): self.reply(jid, "[{}]".format(msg)) @@ -360,6 +415,7 @@ class DeployBot(ClientXMPP): ) if success: + deploy_stats["success"] += 1 speciality = catalog[session["agent_type"]]["description"] notify_agent1( agent_name = session["agent_name"], @@ -370,6 +426,7 @@ class DeployBot(ClientXMPP): ) self.reply(jid, result) else: + deploy_stats["errors"] += 1 self.reply(jid, "Déploiement échoué : " + result) if jid in sessions: