Ajout pause/resume/stats pour commandes !agentON/OFF
- 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 <noreply@anthropic.com>
This commit is contained in:
+61
-4
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user