81 lines
2.3 KiB
Python
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
|