From 70e9ba9c64d6fb4d973300f9a00b7fd40e847f00 Mon Sep 17 00:00:00 2001 From: Michel Date: Sat, 26 Jul 2025 13:18:20 +0200 Subject: [PATCH] =?UTF-8?q?Remise=20en=20=C3=A9tat=20des=20fichiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 26 +++++++ .gitignore | 2 - .idea/Gestion sondes.iml | 1 + {scripts => app}/Interface.py | 11 +-- app/Logs/monitor.csv | 49 ++++++++++++ {scripts => app}/Monitor.py | 13 +++- {scripts => app}/Technique.py | 21 +----- app/_init_.py | 0 {utils => app}/db.py | 35 ++------- {scripts => app}/domo91.py | 0 {scripts => app}/logger_config.py | 70 ++++++++--------- {scripts => app}/mqtt_logger.py | 96 ++++++++++++------------ {scripts => app}/supervisor_watchdog.py | 0 {scripts => app}/surveillance_releves.py | 4 +- scripts/db_utils.py => app/utils_db.py | 46 ++++++------ {scripts => app}/utils_sms.py | 68 ++++++++--------- 16 files changed, 239 insertions(+), 203 deletions(-) create mode 100644 .env rename {scripts => app}/Interface.py (99%) create mode 100644 app/Logs/monitor.csv rename {scripts => app}/Monitor.py (92%) rename {scripts => app}/Technique.py (90%) create mode 100644 app/_init_.py rename {utils => app}/db.py (69%) rename {scripts => app}/domo91.py (100%) rename {scripts => app}/logger_config.py (97%) rename {scripts => app}/mqtt_logger.py (93%) rename {scripts => app}/supervisor_watchdog.py (100%) mode change 100755 => 100644 rename {scripts => app}/surveillance_releves.py (97%) mode change 100755 => 100644 rename scripts/db_utils.py => app/utils_db.py (97%) rename {scripts => app}/utils_sms.py (96%) diff --git a/.env b/.env new file mode 100644 index 0000000..9311f3a --- /dev/null +++ b/.env @@ -0,0 +1,26 @@ +#connexion mysql +DB_HOST=162.19.78.131 +DB_USER=Michel +DB_PASSWORD=wuP^wu&6xjx61bh*kjS^4 +DB_NAME=Sondes + +# paramètres mail +SMTP_HOST=smtp.mail.ovh.net +SMTP_PORT=465 +EMAIL_FROM=services@domo91.fr +EMAIL_PASSWORD=6ZiCsVtSf9@nEHv@$^0 +EMAIL_DESTINATAIRES=services@domo91.fr + +# connexion OVH pour les SMS +OVH_APP_KEY=f725d07b2f98a195 +OVH_APP_SECRET=5ca392a0a728e2395edd426bb1e11ad6 +OVH_CONSUMER_KEY=305f2e8611e58b83930de84ee65c99f9 +OVH_ENDPOINT=ovh-eu +OVH_SMS_ACCOUNT=sms-jm164396-1 +OVH_SMS_SENDER=DOMO91FR +OVH_SERVICE_NAME=sms-jm164396-1 +SMS_RECEIVER=+33635164680 +ENVOI_SMS=1 +PHONE_SACLAY=+33682069405,+33650270939 +PHONE_MEUDON=+33666271128 +PHONE_ADMIN=+33635164680 diff --git a/.gitignore b/.gitignore index be0814f..e8c5b28 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,6 @@ # 👉 Environnement virtuel .venv/ venv/ -env/ -.env # 👉 Fichiers Python compilés __pycache__/ diff --git a/.idea/Gestion sondes.iml b/.idea/Gestion sondes.iml index 9b5c576..f2c5810 100644 --- a/.idea/Gestion sondes.iml +++ b/.idea/Gestion sondes.iml @@ -2,6 +2,7 @@ + diff --git a/scripts/Interface.py b/app/Interface.py similarity index 99% rename from scripts/Interface.py rename to app/Interface.py index 9b44e57..6815123 100644 --- a/scripts/Interface.py +++ b/app/Interface.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- import streamlit as st -import mysql.connector import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates @@ -10,7 +9,7 @@ import random from dotenv import load_dotenv from datetime import datetime, date, time import bcrypt - +from .utils_db import connect_to_mysql # Charger les variables d'environnement load_dotenv() @@ -22,12 +21,6 @@ if "authenticated" not in st.session_state: st.title("📡 Supervision Températures") -db_config = { - "host": os.getenv("DB_HOST"), - "user": os.getenv("DB_USER"), - "password": os.getenv("DB_PASSWORD"), - "database": os.getenv("DB_NAME") -} def get_connection(): return mysql.connector.connect(**db_config) @@ -181,7 +174,7 @@ if not st.session_state.get("authenticated"): if result["Expiration"] and result["Expiration"] < date.today(): st.sidebar.error("⛔ Votre accès a expiré. Veuillez contacter un administrateur.") cursor.close() - conn.close()sondes + conn.close() st.stop() st.session_state["authenticated"] = True st.session_state["role"] = result["role"] diff --git a/app/Logs/monitor.csv b/app/Logs/monitor.csv new file mode 100644 index 0000000..ea3b80b --- /dev/null +++ b/app/Logs/monitor.csv @@ -0,0 +1,49 @@ +Date;Lieu;Sonde;Température;Seuil;État +2025-07-26 13:04:30;Saclay;Congelateur;-14.75;-15.0;Dépassement +2025-07-26 12:59:27;Saclay;Congelateur;-11.25;-15.0;Dépassement +2025-07-26 12:54:25;Saclay;Congelateur;-6.50;-15.0;Dépassement +2025-07-26 12:49:22;Saclay;Congelateur;-4.75;-15.0;Dépassement +2025-07-26 12:44:19;Saclay;Congelateur;-7.75;-15.0;Dépassement +2025-07-26 12:39:17;Saclay;Congelateur;-11.50;-15.0;Dépassement +2025-07-26 13:04:30;Saclay;BOF;1.75;8.0;Normal +2025-07-26 12:59:28;Saclay;BOF;2.25;8.0;Normal +2025-07-26 12:54:25;Saclay;BOF;1.00;8.0;Normal +2025-07-26 12:49:22;Saclay;BOF;2.00;8.0;Normal +2025-07-26 12:44:20;Saclay;BOF;0.75;8.0;Normal +2025-07-26 12:39:17;Saclay;BOF;2.00;8.0;Normal +2025-07-26 13:04:31;Saclay;Viandes;21.00;6.0;Dépassement +2025-07-26 12:59:28;Saclay;Viandes;21.00;6.0;Dépassement +2025-07-26 12:54:26;Saclay;Viandes;20.75;6.0;Dépassement +2025-07-26 12:49:23;Saclay;Viandes;21.00;6.0;Dépassement +2025-07-26 12:44:20;Saclay;Viandes;20.75;6.0;Dépassement +2025-07-26 12:39:18;Saclay;Viandes;21.00;6.0;Dépassement +2025-07-26 13:04:31;Saclay;Legumes;5.25;10.0;Normal +2025-07-26 12:59:29;Saclay;Legumes;4.25;10.0;Normal +2025-07-26 12:54:26;Saclay;Legumes;2.75;10.0;Normal +2025-07-26 12:49:23;Saclay;Legumes;5.50;10.0;Normal +2025-07-26 12:44:21;Saclay;Legumes;5.00;10.0;Normal +2025-07-26 12:39:18;Saclay;Legumes;3.75;10.0;Normal +2025-07-26 13:04:32;Saclay;MeP;6.25;8.0;Normal +2025-07-26 12:59:29;Saclay;MeP;7.75;8.0;Normal +2025-07-26 12:54:27;Saclay;MeP;7.00;8.0;Normal +2025-07-26 12:49:24;Saclay;MeP;5.75;8.0;Normal +2025-07-26 12:44:21;Saclay;MeP;3.25;8.0;Normal +2025-07-26 12:39:19;Saclay;MeP;4.75;8.0;Normal +2025-07-26 07:09:45;Meudon;Viandes;3.94;6.0;Normal +2025-07-25 14:37:50;Meudon;Viandes;3.94;6.0;Normal +2025-07-25 14:32:11;Meudon;Viandes;3.94;6.0;Normal +2025-07-25 14:30:20;Meudon;Viandes;3.94;6.0;Normal +2025-07-24 11:00:36;Meudon;Viandes;3.94;6.0;Normal +2025-07-24 10:41:08;Meudon;Viandes;3.94;6.0;Normal +2025-07-26 07:09:45;Meudon;Poissons;3.94;6.0;Normal +2025-07-25 14:37:50;Meudon;Poissons;3.94;6.0;Normal +2025-07-25 14:32:11;Meudon;Poissons;3.94;6.0;Normal +2025-07-25 14:30:20;Meudon;Poissons;3.94;6.0;Normal +2025-07-24 11:00:36;Meudon;Poissons;3.94;6.0;Normal +2025-07-24 10:41:08;Meudon;Poissons;3.94;6.0;Normal +2025-07-26 07:09:45;Meudon;BOF;3.00;8.0;Normal +2025-07-25 14:37:50;Meudon;BOF;3.00;8.0;Normal +2025-07-25 14:32:11;Meudon;BOF;3.00;8.0;Normal +2025-07-25 14:30:20;Meudon;BOF;3.00;8.0;Normal +2025-07-24 11:00:36;Meudon;BOF;3.00;8.0;Normal +2025-07-24 10:41:08;Meudon;BOF;3.00;8.0;Normal diff --git a/scripts/Monitor.py b/app/Monitor.py similarity index 92% rename from scripts/Monitor.py rename to app/Monitor.py index 1a6e08d..b153dd0 100644 --- a/scripts/Monitor.py +++ b/app/Monitor.py @@ -2,9 +2,10 @@ import os import time from datetime import datetime, timedelta from pathlib import Path -from db_utils import connect_to_mysql +from app.utils_db import connect_to_mysql from dotenv import load_dotenv -from utils_sms import envoyer_sms +from app.utils_sms import envoyer_sms + if os.name != 'nt': log_dir = Path('/home/debian/Gestion_sondes/Logs') @@ -37,7 +38,13 @@ def surveiller(): 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 Sondes.Chambres_froides + WHERE Lieu = %s + AND Etat = 'ON' + AND En_entretien = 0 + """, (lieu,)) sondes = cursor.fetchall() for sonde in sondes: diff --git a/scripts/Technique.py b/app/Technique.py similarity index 90% rename from scripts/Technique.py rename to app/Technique.py index 18db695..bc688f9 100644 --- a/scripts/Technique.py +++ b/app/Technique.py @@ -1,25 +1,12 @@ import streamlit as st import pandas as pd -import mysql.connector -from utils.db import ( - get_latest_chaufferie, - get_history_by_sonde, - verifier_utilisateur_commun, - lire_alertes_sondes, - acquitter_alerte -) import altair as alt from dotenv import load_dotenv -import os +from .utils_db import connect_to_mysql st.set_page_config(page_title="Tech Chaufferie", layout="wide") load_dotenv() # charger .env à la racine du projet -# Accès aux variables d'environnement -MYSQL_HOST = os.getenv("DB_HOST") -MYSQL_USER = os.getenv("DB_USER") -MYSQL_PASSWORD = os.getenv("DB_PASSWORD") -MYSQL_DATABASE = os.getenv("DB_NAME") def login_commun(): login = st.text_input("Identifiant", type="default") @@ -108,12 +95,6 @@ if sonde_selection: conn = None cursor = None try: - conn = mysql.connector.connect( - host=MYSQL_HOST, - user=MYSQL_USER, - password=MYSQL_PASSWORD, - database=MYSQL_DATABASE - ) cursor = conn.cursor() # Vérifie s'il existe déjà une alerte en cours diff --git a/app/_init_.py b/app/_init_.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/db.py b/app/db.py similarity index 69% rename from utils/db.py rename to app/db.py index b3bc0e1..134dbbd 100644 --- a/utils/db.py +++ b/app/db.py @@ -1,26 +1,7 @@ # utils/db.py -import mysql.connector -import os -import sys -import logging from datetime import datetime - - -def connect_to_mysql(db_name: str = None): - """Connexion à MySQL via variables d'environnement.""" - try: - mydb = mysql.connector.connect( - host=os.getenv("DB_HOST"), - user=os.getenv("DB_USER"), - password=os.getenv("DB_PASSWORD"), - database=db_name if db_name else os.getenv("DB_NAME") - ) - return mydb - except mysql.connector.Error as err: - logging.error(f"Erreur de connexion MySQL : {err}") - sys.exit(1) - +from app.utils_db import connect_to_mysql # ✅ Import centralisé def get_latest_chaufferie(): """Renvoie les dernières valeurs par sonde dans la table 'Chaufferie'.""" @@ -28,10 +9,10 @@ def get_latest_chaufferie(): cursor = db.cursor(dictionary=True) query = """ SELECT c1.* - FROM Chaufferie c1 + FROM Sondes.Chaufferie c1 INNER JOIN ( SELECT Sonde, MAX(Date) AS MaxDate - FROM Chaufferie + FROM Sondes.Chaufferie GROUP BY Sonde ) c2 ON c1.Sonde = c2.Sonde AND c1.Date = c2.MaxDate ORDER BY c1.Sonde; @@ -48,7 +29,7 @@ def get_history_by_sonde(sonde: str, start: datetime, end: datetime): db = connect_to_mysql() cursor = db.cursor(dictionary=True) query = """ - SELECT * FROM Chaufferie + SELECT * FROM Sondes.Chaufferie WHERE Sonde = %s AND Date BETWEEN %s AND %s ORDER BY Date; """ @@ -64,8 +45,8 @@ def verifier_utilisateur_commun(utilisateur: str, motdepasse: str): db = connect_to_mysql() cursor = db.cursor(dictionary=True) query = """ - SELECT * FROM MotsDePasse - WHERE utilisateur = %s AND motdepasse = %s AND role = 'utilisateur' + SELECT * FROM Sondes.MotsDePasse + WHERE utilisateur = %s AND mot_de_passe = %s AND role = 'utilisateur' """ cursor.execute(query, (utilisateur, motdepasse)) result = cursor.fetchone() @@ -79,7 +60,7 @@ def lire_alertes_sondes(): db = connect_to_mysql() cursor = db.cursor(dictionary=True) query = """ - SELECT * FROM Alertes_Chaufferie + SELECT * FROM Sondes.Alertes_Chaufferie WHERE Etat != 'Acquitté' ORDER BY Debut_defaut DESC """ @@ -94,7 +75,7 @@ def acquitter_alerte(id_alerte: int): """Met à jour une alerte comme acquittée dans la base.""" db = connect_to_mysql() cursor = db.cursor() - query = "UPDATE Alertes_Chaufferie SET Etat = 'Acquitté' WHERE Id = %s" + query = "UPDATE Sondes.Alertes_Chaufferie SET Etat = 'Acquitté' WHERE Id = %s" cursor.execute(query, (id_alerte,)) db.commit() cursor.close() diff --git a/scripts/domo91.py b/app/domo91.py similarity index 100% rename from scripts/domo91.py rename to app/domo91.py diff --git a/scripts/logger_config.py b/app/logger_config.py similarity index 97% rename from scripts/logger_config.py rename to app/logger_config.py index 1149c4a..a0e2d7d 100644 --- a/scripts/logger_config.py +++ b/app/logger_config.py @@ -1,35 +1,35 @@ -import os -import logging - -def setup_logger(log_filename: str, dossier_logs: str = "/var/log/Cuisine_Saclay") -> None: - """ - Configure le logger pour écrire à la fois dans un fichier et sur la console. - - :param log_filename: Nom du fichier de log (exemple : 'Cuisine_Saclay.log') - :param dossier_logs: Dossier où enregistrer les logs (par défaut : /var/log/Cuisine_Saclay) - """ - - # 📁 Créer le dossier s'il n'existe pas - os.makedirs(dossier_logs, exist_ok=True) - - # 📄 Chemin complet du fichier de log - logfile = os.path.join(dossier_logs, log_filename) - - # 📝 Configuration de base du logger (fichier) - logging.basicConfig( - filename=logfile, - level=logging.INFO, - format="%(asctime)s - %(levelname)s - %(message)s", - filemode="a" # ajouter au fichier existant - ) - - # 🔔 Ajout de la sortie console - console = logging.StreamHandler() - console.setLevel(logging.INFO) - formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") - console.setFormatter(formatter) - - # 👇 Ajouter le handler console au logger racine - logging.getLogger('').addHandler(console) - - logging.info(f"Logger initialisé. Fichier de log : {logfile}") +import os +import logging + +def setup_logger(log_filename: str, dossier_logs: str = "/var/log/Cuisine_Saclay") -> None: + """ + Configure le logger pour écrire à la fois dans un fichier et sur la console. + + :param log_filename: Nom du fichier de log (exemple : 'Cuisine_Saclay.log') + :param dossier_logs: Dossier où enregistrer les logs (par défaut : /var/log/Cuisine_Saclay) + """ + + # 📁 Créer le dossier s'il n'existe pas + os.makedirs(dossier_logs, exist_ok=True) + + # 📄 Chemin complet du fichier de log + logfile = os.path.join(dossier_logs, log_filename) + + # 📝 Configuration de base du logger (fichier) + logging.basicConfig( + filename=logfile, + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + filemode="a" # ajouter au fichier existant + ) + + # 🔔 Ajout de la sortie console + console = logging.StreamHandler() + console.setLevel(logging.INFO) + formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") + console.setFormatter(formatter) + + # 👇 Ajouter le handler console au logger racine + logging.getLogger('').addHandler(console) + + logging.info(f"Logger initialisé. Fichier de log : {logfile}") diff --git a/scripts/mqtt_logger.py b/app/mqtt_logger.py similarity index 93% rename from scripts/mqtt_logger.py rename to app/mqtt_logger.py index 5a663b3..e01fa71 100644 --- a/scripts/mqtt_logger.py +++ b/app/mqtt_logger.py @@ -1,48 +1,48 @@ -import argparse -import paho.mqtt.client as mqtt_client -from dotenv import load_dotenv -import logging -from logger_config import setup_logger -from db_utils import connect_to_mysql -from functools import partial - -def on_message(table_sql, _client, _userdata, msg): - try: - logging.info(f"Message reçu sur {msg.topic}: {msg.payload.decode()}") - cursor = mydb.cursor() - sonde_name = '/'.join(msg.topic.split('/')[1:]) - sql = f"INSERT INTO {table_sql} (Sonde, Temperature) VALUES (%s, %s)" - val = (sonde_name, msg.payload.decode()) - cursor.execute(sql, val) - mydb.commit() - logging.info(f"Insertion réussie : {val}") - except Exception as e: - logging.error(f"Erreur lors de l'insertion du message : {e}") - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--log", required=True, help="Nom du fichier de log") - parser.add_argument("--table", required=True, help="Nom complet de la table SQL") - parser.add_argument("--topic", required=True, help="Topic MQTT à écouter") - args = parser.parse_args() - - # 📋 Initialiser le logger - setup_logger(args.log) - - # 🔑 Charger les variables d'environnement - load_dotenv() - - # 🔌 Connexion MySQL - mydb = connect_to_mysql() - - # 📡 Connexion MQTT - try: - client = mqtt_client.Client() - client.username_pw_set("Bwps", "scJ5ACj2keRfI^") - client.on_message = partial(on_message, args.table) - client.connect("54.36.188.119", 1883, 60) - client.subscribe(args.topic) - logging.info(f"Connexion MQTT réussie et abonnement au topic '{args.topic}'.") - client.loop_forever() - except Exception as err: - logging.error(f"Erreur MQTT : {err}") +import argparse +import paho.mqtt.client as mqtt_client +from dotenv import load_dotenv +import logging +from app.logger_config import setup_logger +from utils_db import connect_to_mysql +from functools import partial + +def on_message(table_sql, _client, _userdata, msg): + try: + logging.info(f"Message reçu sur {msg.topic}: {msg.payload.decode()}") + cursor = mydb.cursor() + sonde_name = '/'.join(msg.topic.split('/')[1:]) + sql = f"INSERT INTO {table_sql} (Sonde, Temperature) VALUES (%s, %s)" + val = (sonde_name, msg.payload.decode()) + cursor.execute(sql, val) + mydb.commit() + logging.info(f"Insertion réussie : {val}") + except Exception as e: + logging.error(f"Erreur lors de l'insertion du message : {e}") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--log", required=True, help="Nom du fichier de log") + parser.add_argument("--table", required=True, help="Nom complet de la table SQL") + parser.add_argument("--topic", required=True, help="Topic MQTT à écouter") + args = parser.parse_args() + + # 📋 Initialiser le logger + setup_logger(args.log) + + # 🔑 Charger les variables d'environnement + load_dotenv() + + # 🔌 Connexion MySQL + mydb = connect_to_mysql() + + # 📡 Connexion MQTT + try: + client = mqtt_client.Client() + client.username_pw_set("Bwps", "scJ5ACj2keRfI^") + client.on_message = partial(on_message, args.table) + client.connect("54.36.188.119", 1883, 60) + client.subscribe(args.topic) + logging.info(f"Connexion MQTT réussie et abonnement au topic '{args.topic}'.") + client.loop_forever() + except Exception as err: + logging.error(f"Erreur MQTT : {err}") diff --git a/scripts/supervisor_watchdog.py b/app/supervisor_watchdog.py old mode 100755 new mode 100644 similarity index 100% rename from scripts/supervisor_watchdog.py rename to app/supervisor_watchdog.py diff --git a/scripts/surveillance_releves.py b/app/surveillance_releves.py old mode 100755 new mode 100644 similarity index 97% rename from scripts/surveillance_releves.py rename to app/surveillance_releves.py index 71941f0..cbd9888 --- a/scripts/surveillance_releves.py +++ b/app/surveillance_releves.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta from dotenv import load_dotenv import os -import db_utils +import utils_db import logging from utils_sms import envoyer_sms @@ -62,7 +62,7 @@ def clear_state(site): os.remove(state_file) def main(): - cnx = db_utils.connect_to_mysql() # ← appel via db_utils + cnx = utils_db.connect_to_mysql() # ← appel via db_utils cursor = cnx.cursor() now = datetime.now() diff --git a/scripts/db_utils.py b/app/utils_db.py similarity index 97% rename from scripts/db_utils.py rename to app/utils_db.py index d1f5e47..b7b4dbe 100644 --- a/scripts/db_utils.py +++ b/app/utils_db.py @@ -1,23 +1,23 @@ -import mysql.connector -import os -import sys -import logging - -def connect_to_mysql(db_name: str = None): - """ - Se connecte à MySQL. Par défaut, utilise la base spécifiée dans DB_NAME, - mais peut être redirigé vers une autre base en passant db_name. - """ - try: - sys.path.insert(0, "/myenv/lib/python3.11.2/site-packages") # à ajuster si inutile - mydb = mysql.connector.connect( - host=os.getenv("DB_HOST"), - user=os.getenv("DB_USER"), - password=os.getenv("DB_PASSWORD"), - database=db_name if db_name else os.getenv("DB_NAME") - ) - logging.info(f"Connexion MySQL à la base {mydb.database} réussie.") - return mydb - except mysql.connector.Error as err: - logging.error(f"Erreur de connexion MySQL : {err}") - sys.exit(1) +import mysql.connector +import os +import sys +import logging + +def connect_to_mysql(db_name: str = None): + """ + Se connecte à MySQL. Par défaut, utilise la base spécifiée dans DB_NAME, + mais peut être redirigé vers une autre base en passant db_name. + """ + try: + sys.path.insert(0, "/myenv/lib/python3.11.2/site-packages") # à ajuster si inutile + mydb = mysql.connector.connect( + host=os.getenv("DB_HOST"), + user=os.getenv("DB_USER"), + password=os.getenv("DB_PASSWORD"), + database=db_name if db_name else os.getenv("DB_NAME") + ) + logging.info(f"Connexion MySQL à la base {mydb.database} réussie.") + return mydb + except mysql.connector.Error as err: + logging.error(f"Erreur de connexion MySQL : {err}") + sys.exit(1) diff --git a/scripts/utils_sms.py b/app/utils_sms.py similarity index 96% rename from scripts/utils_sms.py rename to app/utils_sms.py index f0ab77a..19f48e0 100644 --- a/scripts/utils_sms.py +++ b/app/utils_sms.py @@ -1,34 +1,34 @@ -import os -import ovh -from dotenv import load_dotenv - -load_dotenv() - -def envoyer_sms(message: str, lieu: str = ""): - try: - client = ovh.Client( - endpoint=os.getenv("OVH_ENDPOINT"), - application_key=os.getenv("OVH_APP_KEY"), - application_secret=os.getenv("OVH_APP_SECRET"), - consumer_key=os.getenv("OVH_CONSUMER_KEY"), - ) - - 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 SMS : {e}", flush=True) - +import os +import ovh +from dotenv import load_dotenv + +load_dotenv() + +def envoyer_sms(message: str, lieu: str = ""): + try: + client = ovh.Client( + endpoint=os.getenv("OVH_ENDPOINT"), + application_key=os.getenv("OVH_APP_KEY"), + application_secret=os.getenv("OVH_APP_SECRET"), + consumer_key=os.getenv("OVH_CONSUMER_KEY"), + ) + + 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 SMS : {e}", flush=True) +