ipwatch
This commit is contained in:
80
backend/app/services/mqtt_client.py
Normal file
80
backend/app/services/mqtt_client.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user