From 57ed76e50fecc2ea11564e10ea19657f10459433 Mon Sep 17 00:00:00 2001 From: administrateur Date: Sat, 29 Mar 2025 13:36:42 +0100 Subject: [PATCH] Actualiser script_creator.py fix: limit building by website --- script_creator.py | 100 +++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 64 deletions(-) diff --git a/script_creator.py b/script_creator.py index ecd6e7d..5016279 100644 --- a/script_creator.py +++ b/script_creator.py @@ -15,52 +15,24 @@ S3_SECRET_KEY = os.getenv("S3_SECRET_KEY") MINIO_MOUNT_PATH = "/mnt" N8N_WEBHOOK_URL = os.getenv("N8N_WEBHOOK_URL", "https://n8n.n8n.svc.kube.ia86.cc/webhook/7950310f-e526-475a-82d1-63818da79339") -# Mode Debug DEBUG = bool(os.getenv("DEBUG")) def log_debug(message): - """Affiche un message uniquement si DEBUG est activé.""" if DEBUG: print(f"🔍 DEBUG: {message}") -log_debug(f"🌍 Environnement chargé. MinIO: {MINIO_HOST}, Bucket: {MINIO_BUCKET}") - -# Vérifie si les identifiants sont bien définis -if not S3_ACCESS_KEY or not S3_SECRET_KEY: - raise ValueError("❌ ERREUR: Les variables S3_ACCESS_KEY et S3_SECRET_KEY ne sont pas définies.") - -log_debug("✅ Les identifiants S3 sont bien définis.") - -# Fonction pour monter le bucket MinIO (S3) def mount_s3(): - log_debug("🛠 Vérification du montage S3...") if not os.path.ismount(MINIO_MOUNT_PATH): - log_debug(f"📁 Création du répertoire {MINIO_MOUNT_PATH} si inexistant.") os.makedirs(MINIO_MOUNT_PATH, exist_ok=True) - - # Écriture des credentials pour S3FS credentials_file = "/etc/passwd-s3fs" - log_debug(f"🔐 Écriture des credentials dans {credentials_file}...") with open(credentials_file, "w") as f: f.write(f"{S3_ACCESS_KEY}:{S3_SECRET_KEY}\n") - os.chmod(credentials_file, 0o600) # Restreint les permissions - - # Commande pour monter le stockage MinIO avec S3FS + os.chmod(credentials_file, 0o600) cmd = f"s3fs {MINIO_BUCKET} {MINIO_MOUNT_PATH} -o passwd_file={credentials_file} -o url=https://{MINIO_HOST} -o use_path_request_style -o allow_other" - log_debug(f"🚀 Exécution de la commande de montage: {cmd}") - result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + subprocess.run(cmd, shell=True, capture_output=True, text=True) - if result.returncode != 0: - log_debug(f"❌ Erreur lors du montage S3 : {result.stderr}") - else: - log_debug("✅ Montage S3 réussi.") - else: - log_debug("✅ S3 est déjà monté.") - -# Route pour déclencher la compilation MkDocs @app.route("/build", methods=["POST"]) def build_mkdocs(): - log_debug("📥 Requête reçue pour un build MkDocs.") data = request.json website = data.get("WEBSITE") error_callback = data.get("ERROR_CALLBACK", N8N_WEBHOOK_URL) @@ -69,50 +41,50 @@ def build_mkdocs(): log_debug("❌ Paramètre WEBSITE manquant.") return jsonify({"error": "Paramètre WEBSITE manquant"}), 400 - log_debug(f"🌐 SITE: {website}") + lock_file = f"/tmp/build_{website}.lock" - # Vérifie et monte S3 si besoin - mount_s3() + if os.path.exists(lock_file): + log_debug(f"⚠️ Un build est déjà en cours pour {website}.") + return jsonify({ + "status": "busy", + "message": f"Un build est déjà en cours pour {website}." + }), 429 - # Définition des chemins - src = f"/mnt/files/sites/@{website}/mkdocs.yml" - tmp = f"/srv/{website}" + # Création du verrou + open(lock_file, 'w').close() + log_debug(f"🔐 Verrou activé pour {website}.") - log_debug(f"📁 Fichier source: {src}") - log_debug(f"📂 Dossier temporaire: {tmp}") + try: + mount_s3() - # Vérifie si le fichier mkdocs.yml existe - if not os.path.exists(src): - log_debug(f"❌ Le fichier de configuration {src} n'existe pas.") - return jsonify({"error": f"Le fichier de configuration {src} n'existe pas"}), 404 + src = f"/mnt/files/sites/@{website}/mkdocs.yml" + tmp = f"/srv/{website}" - # Commande MkDocs - cmd = f"mkdocs build --quiet --no-strict --config-file {src} --site-dir {tmp}" + if not os.path.exists(src): + log_debug(f"❌ Le fichier de configuration {src} n'existe pas.") + return jsonify({"error": f"{src} introuvable"}), 404 - log_debug(f"🚀 Exécution de la commande MkDocs: {cmd}") + cmd = f"mkdocs build --quiet --no-strict --config-file {src} --site-dir {tmp}" + log_debug(f"🚀 Exécution: {cmd}") - # Exécution de MkDocs - result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) - if result.returncode != 0: - log_debug(f"❌ Erreur lors du build MkDocs : {result.stderr}") + if result.returncode != 0: + build_error = base64.b64encode(result.stderr.encode()).decode() + json_payload = {"site": tmp, "erreur": build_error} + requests.post(error_callback, json=json_payload, headers={"Content-Type": "application/json"}) - # Encodage de l'erreur en base64 - build_error = base64.b64encode(result.stderr.encode()).decode() - json_payload = { - "site": tmp, - "erreur": build_error - } + log_debug(f"❌ Échec du build {website}: {result.stderr}") + return jsonify({"status": "error", "message": "Build échoué", "error": result.stderr}), 500 - # Envoi de l'erreur à n8n - log_debug(f"📡 Envoi de l'erreur à n8n: {N8N_WEBHOOK_URL}") - requests.post(error_callback, json=json_payload, headers={"Content-Type": "application/json"}) + log_debug(f"✅ Build réussi pour {website}.") + return jsonify({"status": "success", "message": "Build réussi"}), 200 - return jsonify({"status": "error", "message": "Build échouée", "error": result.stderr}), 500 - - log_debug("✅ Build MkDocs réussi.") - return jsonify({"status": "success", "message": "Build réussie"}), 200 + finally: + if os.path.exists(lock_file): + os.remove(lock_file) + log_debug(f"🔓 Verrou supprimé pour {website}.") if __name__ == "__main__": - log_debug("🚀 Lancement du serveur Flask...") - app.run(host="0.0.0.0", port=80) + log_debug("🚀 Serveur Flask démarré.") + app.run(host="0.0.0.0", port=80) \ No newline at end of file