""" Service MQTT pour IPWatch Backend Envoie des commandes MQTT aux agents installés sur les machines """ import paho.mqtt.client as mqtt import json import logging from typing import Optional import os logger = logging.getLogger(__name__) # Configuration MQTT (à charger depuis config.yaml ou variables d'environnement) MQTT_BROKER = os.getenv('MQTT_BROKER', 'localhost') MQTT_PORT = int(os.getenv('MQTT_PORT', '1883')) MQTT_USERNAME = os.getenv('MQTT_USERNAME', None) MQTT_PASSWORD = os.getenv('MQTT_PASSWORD', None) def send_mqtt_command(ip_address: str, command: str) -> bool: """ Envoie une commande MQTT à un équipement Args: ip_address: Adresse IP de l'équipement command: Commande à envoyer (shutdown, reboot, status) Returns: bool: True si la commande a été envoyée avec succès """ try: # Créer le client MQTT client = mqtt.Client(client_id=f"ipwatch-backend-{os.getpid()}") # Authentification si configurée if MQTT_USERNAME and MQTT_PASSWORD: client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD) # Connexion au broker client.connect(MQTT_BROKER, MQTT_PORT, keepalive=10) # Topic de commande pour l'équipement topic = f"ipwatch/device/{ip_address}/command" # Payload JSON payload = json.dumps({ "command": command, "timestamp": __import__('datetime').datetime.now().isoformat() }) # Publier la commande result = client.publish(topic, payload, qos=1) # Attendre que le message soit envoyé result.wait_for_publish(timeout=5) # Déconnexion client.disconnect() logger.info(f"✓ Commande '{command}' envoyée à {ip_address} via MQTT") return result.is_published() except Exception as e: logger.error(f"✗ Erreur envoi commande MQTT à {ip_address}: {e}") return False def get_device_status(ip_address: str) -> Optional[dict]: """ Récupère le statut d'un équipement via MQTT (si disponible) Args: ip_address: Adresse IP de l'équipement Returns: dict: Statut de l'équipement ou None """ # TODO: Implémenter la récupération du statut # Nécessite un mécanisme de souscription et d'attente de réponse pass