Files
ipwatch/backend/app/services/mqtt_client.py
2026-02-07 16:57:37 +01:00

81 lines
2.3 KiB
Python

"""
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