From e75eedd08f5753faedfd12ccc872a29fd20c79c7 Mon Sep 17 00:00:00 2001 From: Michel Date: Fri, 25 Apr 2025 14:43:16 +0200 Subject: [PATCH 1/3] =?UTF-8?q?"Fichier=20=C3=A0=20jour=20avec=20connexion?= =?UTF-8?q?=20SSH"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run_deploy.py | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/run_deploy.py b/run_deploy.py index 178ddcd..98ccf01 100644 --- a/run_deploy.py +++ b/run_deploy.py @@ -9,35 +9,53 @@ load_dotenv() HOST = os.getenv("SSH_HOST") USER = os.getenv("SSH_USER") KEY = os.getenv("SSH_KEY") +PASSPHRASE = os.getenv("SSH_KEY_PASSPHRASE") +root = tk.Tk() +root.withdraw() + +# 🛡 Vérifie que le fichier existe +if not os.path.exists(KEY): + messagebox.showerror("❌ Erreur", f"Clé SSH introuvable :\n{KEY}") + exit(1) + +# 🛡 Vérifie que la clé est lisible par paramiko +try: + paramiko.RSAKey.from_private_key_file(KEY, password=PASSPHRASE) +except paramiko.PasswordRequiredException: + messagebox.showerror("❌ Clé protégée", "La clé est protégée par une passphrase, mais aucune n'a été fournie.") + exit(1) +except paramiko.SSHException: + messagebox.showerror("❌ Erreur de format", "Le fichier de clé n’est pas au format OpenSSH.\n\nSolution : Exporter depuis PuTTYgen → Conversions > Export OpenSSH key") + exit(1) +except Exception as e: + messagebox.showerror("❌ Autre erreur", f"{e}") + exit(1) + +# ✅ Si la clé est valide, on continue client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: - client.connect(hostname=HOST, username=USER, key_filename=KEY) + client.connect( + hostname=HOST, + username=USER, + key_filename=KEY, + passphrase=PASSPHRASE + ) + stdin, stdout, stderr = client.exec_command("bash ~/travail/Gestion_sondes/scripts/deploy_all.sh") output = stdout.read().decode() errors = stderr.read().decode() if "Déploiement complet terminé avec succès" in output: - success = True + messagebox.showinfo("✅ Déploiement réussi", "Le déploiement s'est bien déroulé.") else: - success = False - - # Affichage de la notification visuelle - root = tk.Tk() - root.withdraw() # cache la fenêtre principale - - if success: - messagebox.showinfo("Déploiement terminé", "✅ Le déploiement s'est bien déroulé !") - else: - messagebox.showwarning("Déploiement partiel", f"⚠️ Déploiement incomplet. Vérifiez les logs.\n\n{errors}") + messagebox.showwarning("⚠️ Déploiement incomplet", f"Vérifie les logs :\n\n{errors}") except Exception as e: - root = tk.Tk() - root.withdraw() - messagebox.showerror("Erreur SSH", f"❌ Erreur : {e}") + messagebox.showerror("❌ Erreur SSH", f"{e}") finally: client.close() From 71dc84bae3f89f2bea02b95883afcbe56689b9d1 Mon Sep 17 00:00:00 2001 From: Michel Date: Sat, 26 Apr 2025 10:21:42 +0200 Subject: [PATCH 2/3] "Modifications de domo91 & Monitor" --- domo91.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domo91.py b/domo91.py index 61f3fc8..47f9695 100644 --- a/domo91.py +++ b/domo91.py @@ -291,7 +291,7 @@ if st.session_state["authenticated"]: st.session_state["selected_date"] = selected_date cursor.execute( - f"SELECT * FROM `{site_selectionne}` WHERE DATE(Date) = %s ORDER BY Sonde, Date", + f"SELECT * FROM `{site_selectionne}` WHERE DATE(Date) = %s ORDER BY Sonde, Date DESC", (selected_date.strftime("%Y-%m-%d"),) ) rows = cursor.fetchall() From 67fc5a707bbff59cb9d7777522ed009cd7066442 Mon Sep 17 00:00:00 2001 From: Michel Date: Sat, 26 Apr 2025 10:22:38 +0200 Subject: [PATCH 3/3] "Modifications de domo91 & Monitor" --- Monitor.py | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/Monitor.py b/Monitor.py index 2bc9325..29236bd 100644 --- a/Monitor.py +++ b/Monitor.py @@ -1,4 +1,4 @@ -# Surveillance continue avec envoi d'alertes par email + log CSV +# Surveillance continue avec envoi d'alertes par email + rappels + log CSV import mysql.connector from datetime import datetime, timedelta import time @@ -19,7 +19,10 @@ config = { } # --- Destinataires email --- -destinataires = ['services@domo91.fr,cuisine@bw-paris-saclay.com>'] +destinataires = ['services@domo91.fr', 'michel-68000@hotmail.fr'] + +# --- Suivi des alertes actives pour rappels --- +alertes_actives = {} # --- Fonction d'envoi de mail --- def envoyer_mail(sujet, message, destinataires): @@ -37,6 +40,7 @@ def envoyer_mail(sujet, message, destinataires): # --- Fonction de surveillance --- def surveiller(): + global alertes_actives log_entries = [] try: conn = mysql.connector.connect(**config) @@ -63,7 +67,6 @@ def surveiller(): """, (nom_sonde,)) relevés = cursor.fetchall() - # Log CSV : tous les relevés analysés for r in relevés: log_entries.append({ "Date": r['Date'], @@ -91,14 +94,30 @@ def surveiller(): (nom_sonde,) ) 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 : {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" + f"depuis plus de 30 minutes.\nHeure : {maintenant.strftime('%Y-%m-%d %H:%M:%S')}" ) envoyer_mail(sujet, message, destinataires) - # Acquittement automatique + # 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')}" + ) + envoyer_mail(sujet, message, destinataires) + alertes_actives[nom_sonde] = maintenant + + # Vérifier retour à la normale (Acquittement) cursor.execute(f""" SELECT Temperature FROM {table_temp} WHERE Sonde = %s @@ -112,11 +131,14 @@ 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] + conn.commit() cursor.close() conn.close() - # Enregistrer le log if log_entries: df_logs = pd.DataFrame(log_entries) df_logs.to_csv("/home/debian/travail/Logs/monitor.csv", sep=";", index=False) @@ -129,3 +151,4 @@ while True: print(f"📡 Vérification à {datetime.now()}", flush=True) surveiller() time.sleep(300) # 5 minutes +