Mise à jour de Monitor.py et autres scripts
This commit is contained in:
64
Monitor.py
64
Monitor.py
@@ -1,12 +1,10 @@
|
||||
import mysql.connector
|
||||
from datetime import datetime, timedelta
|
||||
import time
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
from dotenv import load_dotenv
|
||||
import os
|
||||
from pathlib import Path
|
||||
from alerte_sms import envoyer_sms_ovh
|
||||
import ovh
|
||||
|
||||
if os.name != 'nt':
|
||||
log_dir = Path('/home/debian/Gestion_sondes/Logs')
|
||||
@@ -25,24 +23,40 @@ config = {
|
||||
"password": os.getenv("DB_PASSWORD"),
|
||||
"database": os.getenv("DB_NAME")
|
||||
}
|
||||
print("▶️ Lancement Monitor.py")
|
||||
# --- Suivi des alertes actives pour rappels ---
|
||||
alertes_actives = {}
|
||||
|
||||
# --- Fonction d'envoi de mail ---
|
||||
def envoyer_mail(sujet, message, destinataires_list):
|
||||
msg = MIMEText(message)
|
||||
msg['Subject'] = sujet
|
||||
msg['From'] = os.getenv("EMAIL_FROM")
|
||||
msg['To'] = ', '.join(destinataires_list)
|
||||
print("▶️ Lancement Monitor.py")
|
||||
|
||||
# --- Fonction d’envoi de SMS ---
|
||||
def envoyer_sms_ovh(message, lieu):
|
||||
client = ovh.Client(
|
||||
endpoint=os.getenv("OVH_ENDPOINT"), # ex : 'ovh-eu'
|
||||
application_key=os.getenv("OVH_APP_KEY"),
|
||||
application_secret=os.getenv("OVH_APP_SECRET"),
|
||||
consumer_key=os.getenv("OVH_CONSUMER_KEY"),
|
||||
)
|
||||
|
||||
try:
|
||||
with smtplib.SMTP_SSL(os.getenv("SMTP_HOST"), int(os.getenv("SMTP_PORT"))) as server:
|
||||
server.login(os.getenv("EMAIL_FROM"), os.getenv("EMAIL_PASSWORD"))
|
||||
server.sendmail(msg['From'], destinataires_list, msg.as_string())
|
||||
print(f"📧 Mail envoyé à {destinataires_list}", flush=True)
|
||||
services = client.get('/sms/')
|
||||
if not services:
|
||||
print("❌ Aucun service SMS OVH trouvé", flush=True)
|
||||
return
|
||||
|
||||
service_name = services[0]
|
||||
numero_dest = os.getenv("NUMERO_DESTINATAIRE")
|
||||
|
||||
result = client.post(f'/sms/{service_name}/jobs',
|
||||
sender='Monitor',
|
||||
message=message,
|
||||
receivers=[numero_dest],
|
||||
noStopClause=True
|
||||
)
|
||||
print(f"📱 SMS envoyé à {numero_dest} pour {lieu}. Job ID : {result['ids']}", flush=True)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erreur envoi mail : {e}", flush=True)
|
||||
print(f"Erreur envoi SMS : {e}", flush=True)
|
||||
|
||||
# --- Suivi des alertes actives pour rappels ---
|
||||
alertes_actives = {}
|
||||
|
||||
# --- Fonction de surveillance ---
|
||||
def surveiller():
|
||||
@@ -52,14 +66,14 @@ def surveiller():
|
||||
conn = mysql.connector.connect(**config)
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
cursor.execute("SELECT DISTINCT Lieu FROM Chambres_froides")
|
||||
cursor.execute("SELECT DISTINCT Lieu FROM 'Chambres_froides'")
|
||||
lieux = [row['Lieu'] for row in cursor.fetchall()]
|
||||
|
||||
for lieu in lieux:
|
||||
table_temp = lieu
|
||||
table_alertes = f"Alertes_{lieu}"
|
||||
|
||||
cursor.execute("SELECT Sonde, Temp_Max FROM Chambres_froides WHERE Lieu=%s AND Etat='ON'", (lieu,))
|
||||
cursor.execute("SELECT Sonde, Temp_Max FROM 'Chambres_froides' WHERE Lieu=%s AND Etat='ON'", (lieu,))
|
||||
sondes = cursor.fetchall()
|
||||
|
||||
for sonde in sondes:
|
||||
@@ -101,30 +115,22 @@ def surveiller():
|
||||
)
|
||||
print(f"🚨 Alerte déclenchée pour {nom_sonde} ({lieu})", flush=True)
|
||||
|
||||
sujet = f"🚨 ALERTE TEMPÉRATURE - {nom_sonde} ({lieu})"
|
||||
message = (
|
||||
f"La sonde '{nom_sonde}' du site '{lieu}' a dépassé le seuil de {seuil}°C "
|
||||
f"depuis plus de 30 minutes.\nHeure : {maintenant.strftime('%Y-%m-%d %H:%M:%S')}"
|
||||
)
|
||||
destinataires_list = os.getenv("EMAIL_DESTINATAIRES", "").split(",")
|
||||
envoyer_mail(sujet, message, destinataires_list)
|
||||
if ENVOI_SMS:
|
||||
envoyer_sms_ovh(message, lieu)
|
||||
|
||||
# Suivi pour rappels
|
||||
alertes_actives[nom_sonde] = maintenant
|
||||
|
||||
else:
|
||||
# Alerte déjà en cours : vérifier s'il faut faire un rappel
|
||||
dernier_envoi = alertes_actives.get(nom_sonde)
|
||||
if dernier_envoi and (maintenant - dernier_envoi >= timedelta(hours=1)):
|
||||
sujet = f"🔔 RAPPEL ALERTE TEMPÉRATURE - {nom_sonde} ({lieu})"
|
||||
message = (
|
||||
f"La sonde '{nom_sonde}' du site '{lieu}' est TOUJOURS en dépassement de seuil (>{seuil}°C).\n"
|
||||
f"Heure : {maintenant.strftime('%Y-%m-%d %H:%M:%S')}"
|
||||
)
|
||||
destinataires_list = os.getenv("EMAIL_DESTINATAIRES").split(",")
|
||||
envoyer_mail(sujet, message, destinataires_list)
|
||||
if ENVOI_SMS:
|
||||
envoyer_sms_ovh(message, lieu)
|
||||
alertes_actives[nom_sonde] = maintenant
|
||||
@@ -143,7 +149,6 @@ def surveiller():
|
||||
WHERE Sonde = %s AND Status IN ('En cours', 'Test')
|
||||
""", (nom_sonde,))
|
||||
|
||||
# Nettoyage du suivi si normalisé
|
||||
if nom_sonde in alertes_actives:
|
||||
del alertes_actives[nom_sonde]
|
||||
|
||||
@@ -155,10 +160,8 @@ def surveiller():
|
||||
import pandas as pd
|
||||
df_logs = pd.DataFrame(log_entries)
|
||||
|
||||
# Sauvegarde principale
|
||||
df_logs.to_csv(log_dir / "monitor.csv", sep=";", index=False)
|
||||
|
||||
# Sauvegarde secondaire (Linux uniquement)
|
||||
if os.name != 'nt':
|
||||
df_logs.to_csv("/var/log/monitor.csv", sep=";", index=False)
|
||||
|
||||
@@ -170,4 +173,3 @@ while True:
|
||||
print(f"📡 Vérification à {datetime.now()}", flush=True)
|
||||
surveiller()
|
||||
time.sleep(300) # 5 minutes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user