🔒 Sécurisation via .env + refactorisation Monitor et MQTT

This commit is contained in:
2025-04-22 10:48:58 +02:00
parent 4991b6354c
commit 4dd230f77b
6 changed files with 80 additions and 50 deletions

13
.env
View File

@@ -1,3 +1,16 @@
DB_HOST=54.36.188.119 DB_HOST=54.36.188.119
DB_USER=michel DB_USER=michel
DB_PASSWORD=#SO2&1nf%mZ@jfh DB_PASSWORD=#SO2&1nf%mZ@jfh
DB_NAME=Sondes
MQTT_HOST=54.36.188.119
MQTT_USER=Bwps
MQTT_PASSWORD=scJ5ACj2keRfI^
# === EMAIL SMTP ===
SMTP_HOST=smtp.mail.ovh.net
SMTP_PORT=465
SMTP_USER=alertes_saclay@domo91.fr
SMTP_PASSWORD=Kdpke674y23Feq^H
EMAIL_FROM=alertes_saclay@domo91.fr
EMAIL_DEST=services@domo91.fr

1
.gitignore vendored
View File

@@ -9,6 +9,7 @@
venv/ venv/
env/ env/
.env/ .env/
.env
# 👉 Fichiers Python compilés # 👉 Fichiers Python compilés
__pycache__/ __pycache__/

View File

@@ -1,30 +1,35 @@
import paho.mqtt.client as mqttClient import paho.mqtt.client as mqttClient
client = mqttClient.Client()
import mysql.connector import mysql.connector
import sys import os
sys.path.insert(0, "/myenv/lib/python3.11.2/site-packages") from dotenv import load_dotenv
# Configuration de la connexion MySQL load_dotenv()
# Site figé ici
site = "Meudon"
# Connexion MySQL
mydb = mysql.connector.connect( mydb = mysql.connector.connect(
host="54.36.188.119", host=os.getenv("DB_HOST"),
user="michel", user=os.getenv("DB_USER"),
password="#SO2&1nf%mZ@jfh", password=os.getenv("DB_PASSWORD"),
database="Sondes" database=os.getenv("DB_NAME")
) )
# Fonction de callback quand un message est reçu # Callback MQTT
def on_message(_client, _userdata, msg): def on_message(_client, _userdata, msg):
print(f"Message reçu sur {msg.topic}: {msg.payload.decode()}") print(f"[{site}] Message reçu sur {msg.topic}: {msg.payload.decode()}")
cursor = mydb.cursor() cursor = mydb.cursor()
frigo_name = msg.topic.split('/')[-1] # Prend la dernière partie après le "/" frigo_name = msg.topic.split('/')[-1]
sql = "INSERT INTO Meudon (Sonde, Temperature) VALUES (%s, %s)" sql = f"INSERT INTO {site} (Sonde, Temperature) VALUES (%s, %s)"
val = (frigo_name, msg.payload.decode()) val = (frigo_name, msg.payload.decode())
cursor.execute(sql, val) cursor.execute(sql, val)
mydb.commit() mydb.commit()
# Configuration du client MQTT # Client MQTT
client.username_pw_set("Bwps", "scJ5ACj2keRfI^") client = mqttClient.Client()
client.username_pw_set(os.getenv("MQTT_USER"), os.getenv("MQTT_PASSWORD"))
client.on_message = on_message client.on_message = on_message
client.connect("54.36.188.119", 1883, 60) client.connect(os.getenv("MQTT_HOST"), 1883, 60)
client.subscribe("Meudon/#") # S'abonner à tous les topics commençant par Saclay client.subscribe(f"{site}/#")
client.loop_forever() # Rester connecté en continu pour écouter les messages client.loop_forever()

View File

@@ -1,30 +1,35 @@
import paho.mqtt.client as mqttClient import paho.mqtt.client as mqttClient
client = mqttClient.Client()
import mysql.connector import mysql.connector
import sys import os
sys.path.insert(0, "/myenv/lib/python3.11.2/site-packages") from dotenv import load_dotenv
# Configuration de la connexion MySQL load_dotenv()
# Site figé ici
site = "Saclay"
# Connexion MySQL
mydb = mysql.connector.connect( mydb = mysql.connector.connect(
host="54.36.188.119", host=os.getenv("DB_HOST"),
user="michel", user=os.getenv("DB_USER"),
password="#SO2&1nf%mZ@jfh", password=os.getenv("DB_PASSWORD"),
database="Sondes" database=os.getenv("DB_NAME")
) )
# Fonction de callback quand un message est reçu # Callback MQTT
def on_message(_client, _userdata, msg): def on_message(_client, _userdata, msg):
print(f"Message reçu sur {msg.topic}: {msg.payload.decode()}") print(f"[{site}] Message reçu sur {msg.topic}: {msg.payload.decode()}")
cursor = mydb.cursor() cursor = mydb.cursor()
frigo_name = msg.topic.split('/')[-1] # Prend la dernière partie après le "/" frigo_name = msg.topic.split('/')[-1]
sql = "INSERT INTO Saclay (Sonde, Temperature) VALUES (%s, %s)" sql = f"INSERT INTO {site} (Sonde, Temperature) VALUES (%s, %s)"
val = (frigo_name, msg.payload.decode()) val = (frigo_name, msg.payload.decode())
cursor.execute(sql, val) cursor.execute(sql, val)
mydb.commit() mydb.commit()
# Configuration du client MQTT # Client MQTT
client.username_pw_set("Bwps", "scJ5ACj2keRfI^") client = mqttClient.Client()
client.username_pw_set(os.getenv("MQTT_USER"), os.getenv("MQTT_PASSWORD"))
client.on_message = on_message client.on_message = on_message
client.connect("54.36.188.119", 1883, 60) client.connect(os.getenv("MQTT_HOST"), 1883, 60)
client.subscribe("Saclay/#") # S'abonner à tous les topics commençant par Saclay client.subscribe(f"{site}/#")
client.loop_forever() # Rester connecté en continu pour écouter les messages client.loop_forever()

View File

@@ -5,32 +5,38 @@ import time
import smtplib import smtplib
from email.mime.text import MIMEText from email.mime.text import MIMEText
import pandas as pd import pandas as pd
from dotenv import load_dotenv
import os
# Charger les variables d'environnement
load_dotenv()
# --- Config MySQL --- # --- Config MySQL ---
config = { config = {
"host": "54.36.188.119", "host": os.getenv("DB_HOST"),
"user": "michel", "user": os.getenv("DB_USER"),
"password": "#SO2&1nf%mZ@jfh", "password": os.getenv("DB_PASSWORD"),
"database": "Sondes" "database": os.getenv("DB_NAME")
} }
# --- Destinataires email --- # --- Destinataires email ---
destinataires = ['services@domo91.fr'] destinataires = os.getenv("EMAIL_DEST").split(",")
# --- Fonction d'envoi de mail --- # --- Fonction d'envoi de mail ---
def envoyer_mail(sujet, message, destinataires): def envoyer_mail(sujet, message, destinataires):
msg = MIMEText(message) msg = MIMEText(message)
msg['Subject'] = sujet msg['Subject'] = sujet
msg['From'] = 'alertes_saclay@domo91.fr' msg['From'] = os.getenv("EMAIL_FROM")
msg['To'] = ', '.join(destinataires) msg['To'] = ', '.join(destinataires)
try: try:
with smtplib.SMTP_SSL('smtp.mail.ovh.net', 465) as server: with smtplib.SMTP_SSL(os.getenv("SMTP_HOST"), int(os.getenv("SMTP_PORT"))) as server:
server.login('alertes_saclay@domo91.fr', 'Kdpke674y23Feq^H') server.login(os.getenv("SMTP_USER"), os.getenv("SMTP_PASSWORD"))
server.sendmail(msg['From'], destinataires, msg.as_string()) server.sendmail(msg['From'], destinataires, msg.as_string())
print(f"📧 Mail envoyé à {destinataires}", flush=True) print(f"📧 Mail envoyé à {destinataires}", flush=True)
except Exception as e: except Exception as e:
print(f"Erreur envoi mail : {e}", flush=True) print(f"Erreur envoi mail : {e}", flush=True)
# --- Fonction de surveillance --- # --- Fonction de surveillance ---
def surveiller(): def surveiller():
log_entries = [] log_entries = []

View File

@@ -6,11 +6,13 @@ from datetime import date
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import matplotlib.dates as mdates import matplotlib.dates as mdates
from fpdf import FPDF from fpdf import FPDF
from dotenv import load_dotenv
load_dotenv()
import os import os
import random import random
import datetime import datetime
st.set_page_config(page_title="Domo91 - Surveillance", layout="wide") st.set_page_config(page_title="Domo91 - Gestion sondes", layout="wide")
if "authenticated" not in st.session_state: if "authenticated" not in st.session_state:
st.session_state["authenticated"] = False st.session_state["authenticated"] = False
st.session_state["role"] = None st.session_state["role"] = None
@@ -20,13 +22,11 @@ st.title("📡 Supervision Températures")
# --- Configuration base de données --- # --- Configuration base de données ---
db_config = { db_config = {
"host": "54.36.188.119", "host": os.getenv("DB_HOST"),
"user": "michel", "user": os.getenv("DB_USER"),
"password": "#SO2&1nf%mZ@jfh", "password": os.getenv("DB_PASSWORD"),
"database": "Sondes" "database": os.getenv("DB_NAME")
} }
# --- Fonction de génération PDF --- # --- Fonction de génération PDF ---
def generer_pdf(site, date_str): def generer_pdf(site, date_str):
st.info(f"Génération du rapport PDF pour {site} à la date {date_str}") st.info(f"Génération du rapport PDF pour {site} à la date {date_str}")