🧩 Merge auto develop → product

This commit is contained in:
root
2025-04-25 11:47:09 +02:00
11 changed files with 100 additions and 329 deletions

View File

@@ -1,29 +0,0 @@
#!/bin/bash
LOG="/home/debian/travail/Logs/deploy.log"
REPO_PATH="/home/debian/travail/Gestion_sondes"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 🔄 Déploiement en cours depuis Gitea (branche product)..." >> $LOG
cd $REPO_PATH
# S'assurer d'être sur la bonne branche
git checkout product >> $LOG 2>&1
git pull origin product >> $LOG 2>&1
# Redémarrer les services Supervisor
for service in Cuisine_Saclay Monitor cuisine_meudon domo91
do
supervisorctl stop $service >> $LOG 2>&1
done
sleep 2
for service in Cuisine_Saclay Monitor cuisine_meudon domo91
do
supervisorctl start $service >> $LOG 2>&1
done
DATE_END=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE_END] ✅ Déploiement terminé avec succès (branche product)" >> $LOG

View File

@@ -1,184 +0,0 @@
# Application Gestion de sondes
import streamlit as st
import mysql.connector
import pandas as pd
from datetime import date
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import random
from fpdf import FPDF
import os
st.set_page_config(page_title="Domo91 - Surveillance", layout="wide")
st.title("📡 Supervision Températures")
# --- Configuration base de données ---
db_config = {
"host": "54.36.188.119",
"user": "michel",
"password": "#SO2&1nf%mZ@jfh",
"database": "Sondes"
}
# --- Initialisation session ---
if "authenticated" not in st.session_state:
st.session_state["authenticated"] = False
st.session_state["role"] = None
st.session_state["lieu_autorise"] = None
# --- Sidebar (connexion + bouton PDF) ---
with st.sidebar:
st.header("🔐 Connexion")
if not st.session_state.get("authenticated"):
login = st.text_input("Nom d'utilisateur")
password = st.text_input("Mot de passe", type="password")
if st.button("Se connecter"):
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM MotsDePasse WHERE utilisateur = %s", (login,))
result = cursor.fetchone()
if result and result["mot_de_passe"] == password:
st.session_state["authenticated"] = True
st.session_state["role"] = result["role"]
st.session_state["lieu_autorise"] = result["Lieu"]
st.success(f"Connecté comme {result['role']} ({result['Lieu']})")
else:
st.error("Identifiants invalides")
cursor.close()
conn.close()
except Exception as e:
st.error(f"Erreur lors de la connexion à la base : {e}")
else:
st.success(f"Connecté ({st.session_state['role']})")
if st.button("🔓 Déconnexion"):
st.session_state["authenticated"] = False
st.session_state["role"] = None
st.session_state["lieu_autorise"] = None
st.rerun()
st.markdown("---")
st.subheader("📄 Rapport PDF")
if "selected_date" in st.session_state:
if st.button("📥 Télécharger létat du jour (PDF)"):
site = st.session_state["lieu_autorise"]
date_val = st.session_state["selected_date"].strftime("%Y-%m-%d")
def generer_pdf(site, date_str):
releves = {
"Chambre 1": [("06:00", 3.5), ("07:00", 3.2), ("08:00", 3.1)],
"Congélateur": [("06:00", -18.1), ("07:00", -17.8), ("08:00", -17.5)]
}
alertes = [
{"Sonde": "Chambre 2", "Debut": f"{date_str} 08:45", "Statut": "En cours"},
{"Sonde": "Congélateur", "Debut": f"{date_str} 12:30", "Statut": "Acquittée"}
]
class RapportPDF(FPDF):
def header(self):
self.set_font("Arial", "B", 14)
self.cell(0, 10, "Rapport de surveillance des sondes", ln=1, align="C")
self.set_font("Arial", "", 12)
self.cell(0, 10, f"Date : {date_str}", ln=1, align="C")
self.ln(5)
def site_info(self, site_name):
self.set_font("Arial", "B", 12)
self.cell(0, 10, f"Site : {site_name}", ln=1)
self.ln(2)
def releves_section(self, data):
self.set_font("Arial", "B", 12)
self.cell(0, 10, "Relevés de température", ln=1)
for sonde, mesures in data.items():
self.set_font("Arial", "B", 11)
self.cell(0, 8, f"Sonde : {sonde}", ln=1)
self.set_font("Arial", "", 10)
for heure, temp in mesures:
self.cell(0, 6, f"{heure} - {temp} °C", ln=1)
self.ln(2)
def alertes_section(self, data):
self.set_font("Arial", "B", 12)
self.cell(0, 10, "Alertes enregistrées", ln=1)
self.set_font("Arial", "", 10)
for a in data:
self.cell(0, 6, f"{a['Sonde']} - {a['Debut']} - {a['Statut']}", ln=1)
pdf = RapportPDF()
pdf.add_page()
pdf.site_info(site)
pdf.releves_section(releves)
pdf.alertes_section(alertes)
file_name = f"rapport_{site}_{date_str}.pdf"
output_path =file_name
pdf.output(output_path)
with open(output_path, "rb") as f:
st.download_button(
label="📥 Télécharger le rapport PDF",
data=f,
file_name=file_name,
mime="application/pdf"
)
generer_pdf(site, date_val)
else:
st.info("Sélectionnez une date pour activer la génération PDF.")
# --- CONTENU PRINCIPAL SI AUTHENTIFIÉ ---
if st.session_state["authenticated"]:
st.markdown("## Sélection du site et de la date")
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
sites_possibles = ["Saclay", "Meudon"]
if st.session_state["role"] == "superviseur":
site_selectionne = st.selectbox("📍 Choisissez un site :", sites_possibles)
else:
site_selectionne = st.session_state["lieu_autorise"]
st.info(f"Site imposé : {site_selectionne}")
selected_date = st.date_input("📅 Date du relevé", value=date.today())
st.session_state["selected_date"] = selected_date
cursor.execute(
f"SELECT * FROM `{site_selectionne}` WHERE DATE(Date) = %s ORDER BY Sonde, Date",
(selected_date.strftime("%Y-%m-%d"),)
)
rows = cursor.fetchall()
if rows:
df = pd.DataFrame(rows)
df["Date"] = pd.to_datetime(df["Date"])
sondes = sorted(df["Sonde"].unique())
sonde_choisie = st.selectbox("🧪 Choisissez une sonde :", sondes)
df_sonde = df[df["Sonde"] == sonde_choisie]
cursor.execute("SELECT Temp_Max FROM Chambres_froides WHERE Lieu = %s AND Sonde = %s", (site_selectionne, sonde_choisie))
seuil = cursor.fetchone()
seuil_temp = seuil["Temp_Max"] if seuil else 10
st.subheader("📊 Tableau des relevés")
df_filtré = df_sonde.copy()
df_filtré = df_filtré.drop(columns="Id", errors="ignore")
st.dataframe(df_filtré, use_container_width=True)
st.subheader("📈 Évolution de la température")
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(df_filtré["Date"], df_filtré["Temperature"], marker='o', label="Température")
ax.axhline(seuil_temp, color='red', linestyle='--', label=f"Seuil {seuil_temp}°C")
ax.set_xlabel("Heure")
ax.set_ylabel("Température (°C)")
ax.set_title(f"{sonde_choisie} - {selected_date.strftime('%d/%m/%Y')}")
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
ax.legend()
st.pyplot(fig)
else:
st.warning("Aucune donnée trouvée pour cette date.")
cursor.close()
conn.close()
except Exception as e:
st.error(f"Erreur MySQL : {e}")

View File

@@ -1,6 +0,0 @@
# Fichier de sauvegarde BDD sur Syno en NFS
# Fichier my.cnf
#[mysqldump]
#user=root
#password=4V5t9P!Z2HgT#CLFes4cntEeNBWs
mysqldump --defaults-file=/home/debian/travail/my.cnf -u root --all-databases > /mnt/syno920/all-$(date +%Y%m%d).sql

View File

@@ -1,9 +0,0 @@
mysql~=0.0.3
mysql-connector-python~=9.2.0
pandas~=2.2.3
DateTime~=5.5
streamlit~=1.44.1
matplotlib~=3.10.1
paho-mqtt~=2.1.0
requests~=2.32.3
schedule~=1.2.2

31
scripts/deploy_all.sh Normal file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
UPDATE_SCRIPT="/home/debian/travail/Gestion_sondes/scripts/update_product.sh"
RESTART_SCRIPT="/home/debian/travail/Gestion_sondes/scripts/restart_services.sh"
echo ""
echo "===== 🚀 DÉPLOIEMENT GLOBAL EN COURS ====="
echo ""
# Étape 1 : Mise à jour Git
echo "🔄 Étape 1 : Mise à jour des sources (Git)"
bash "$UPDATE_SCRIPT"
# Vérifie le code retour du script de mise à jour
if [ $? -ne 0 ]; then
echo ""
echo "❌ La mise à jour a échoué ou a été interrompue (conflit, erreur Git)."
echo "➡️ Les services ne seront pas redémarrés."
exit 1
else
echo "✅ Mise à jour réussie !"
fi
# Étape 2 : Redémarrage des services Supervisor
echo ""
echo "🔁 Étape 2 : Redémarrage des services"
bash "$RESTART_SCRIPT"
echo ""
echo "🎯 Déploiement complet terminé avec succès."
echo "===== ✅ FIN ====="

View File

@@ -0,0 +1,37 @@
#!/bin/bash
LOG="/home/debian/travail/Gestion_sondes/Logs/restart_services.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 🔄 Redémarrage des services Supervisor" >> $LOG
echo ""
echo "===== 🔄 DÉMARRAGE REDÉMARRAGE DES SERVICES ====="
echo ""
SERVICES=("Cuisine_Saclay" "Monitor" "cuisine_meudon" "Interface")
ALL_OK=true
for service in "${SERVICES[@]}"
do
echo "🔁 Redémarrage de $service..."
supervisorctl restart $service >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "$service redémarré avec succès."
else
echo "❌ Échec du redémarrage de $service."
ALL_OK=false
fi
done
DATE_END=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE_END] ✅ Tous les services ont été traités." >> $LOG
echo ""
if $ALL_OK; then
echo "🎉 Tous les services ont été redémarrés avec succès !"
else
echo "⚠️ Certains services n'ont pas pu être redémarrés. Vérifiez le log :"
echo "$LOG"
fi
echo ""
echo "===== ✅ FIN DU SCRIPT ====="

32
scripts/update_product.sh Normal file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
LOG="/home/debian/travail/Gestion_sondes/Logs/update_product.log"
REPO_PATH="/home/debian/travail/Gestion_sondes"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 🔄 Lancement du script de mise à jour" >> $LOG
cd $REPO_PATH || { echo "❌ Dossier introuvable : $REPO_PATH" >> $LOG; exit 1; }
# Vérifie s'il y a une fusion en cours
if [ -d .git ] && [ -f .git/MERGE_HEAD ]; then
echo "[$DATE] ❌ Fusion en cours détectée. Abandon automatique." >> $LOG
echo "➡️ Lancez 'git merge --abort' manuellement si besoin." >> $LOG
exit 1
fi
# Récupération des dernières modifications distantes
git fetch origin >> $LOG 2>&1
# Réinitialisation de la branche product sur la version distante
git checkout product >> $LOG 2>&1
git reset --hard origin/product >> $LOG 2>&1
# Fusion directe depuis origin/develop
git merge origin/develop -m "🧩 Merge auto develop → product" >> $LOG 2>&1
# Push vers le dépôt distant
git push origin product >> $LOG 2>&1
DATE_END=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE_END] ✅ Mise à jour terminée avec succès." >> $LOG

View File

@@ -1,37 +0,0 @@
#!/bin/bash
LOG="/home/debian/travail/Logs/deploy.log"
REPO_PATH="/home/debian/travail/Gestion_sondes"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 🔄 Déploiement en cours depuis Gitea (merge develop → product)..." >> $LOG
cd $REPO_PATH
# Récupérer les dernières modifications
git fetch origin >> $LOG 2>&1
# Passer sur la branche product
git checkout product >> $LOG 2>&1
# Fusionner la branche develop dedans
git merge origin/develop -m "Auto-merge develop into product via deploy.sh" >> $LOG 2>&1
# Pousser la mise à jour (si tu veux que product soit mis à jour sur Gitea aussi)
# git push origin product >> $LOG 2>&1
# Redémarrer les services Supervisor
for service in Cuisine_Saclay Monitor cuisine_meudon domo91
do
supervisorctl stop $service >> $LOG 2>&1
done
sleep 2
for service in Cuisine_Saclay Monitor cuisine_meudon domo91
do
supervisorctl start $service >> $LOG 2>&1
done
DATE_END=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE_END] ✅ Déploiement terminé avec succès (develop → product)" >> $LOG

View File

@@ -1,31 +0,0 @@
#!/bin/bash
LOG="/home/debian/travail/Logs/deploy_product.log"
REPO_PATH="/home/debian/travail/Gestion_sondes"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 🚀 Déploiement de la branche develop vers product" >> $LOG
cd $REPO_PATH
# 1. Récupérer les dernières modifs
git fetch origin >> $LOG 2>&1
# 2. Basculer sur la branche product
git checkout product >> $LOG 2>&1
# 3. Mettre à jour tous les .py depuis develop
git checkout origin/develop -- *.py >> $LOG 2>&1
# 4. Commit et push
git commit -am "🧩 Déploiement auto : maj des fichiers .py depuis develop" >> $LOG 2>&1
git push origin product >> $LOG 2>&1
# 5. Redémarrage des services Supervisor
for service in Cuisine_Saclay Monitor cuisine_meudon domo91 Interface
do
supervisorctl restart $service >> $LOG 2>&1
done
DATE_END=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE_END] ✅ Déploiement terminé avec succès." >> $LOG

View File

@@ -1,33 +0,0 @@
#!/bin/bash
# ---------------------------------------------
# Script : update_product_from_develop.sh
# Objectif : Met à jour les fichiers de 'product' depuis 'develop'
# uniquement pour les fichiers déjà existants dans product
# ---------------------------------------------
echo "📁 Branche active : $(git branch --show-current)"
# Vérification qu'on est bien sur 'product'
current_branch=$(git branch --show-current)
if [ "$current_branch" != "product" ]; then
echo "❌ Tu n'es pas sur la branche 'product'. Abandon."
exit 1
fi
# Lister les fichiers présents dans 'product'
echo "📄 Création de la liste des fichiers dans 'product'..."
git ls-tree --name-only -r product > product_files.txt
echo "🔄 Mise à jour des fichiers depuis 'develop'..."
while IFS= read -r file; do
if git show develop:"$file" > /dev/null 2>&1; then
git checkout develop -- "$file"
echo "✅ Mis à jour : $file"
else
echo "❌ Absent dans develop : $file"
fi
done < product_files.txt
echo "✅ Mise à jour terminée."