app.py aktualisiert

This commit is contained in:
2025-08-18 10:09:10 +00:00
parent 75f6930a33
commit 75ca131ff5

47
app.py
View File

@@ -1,29 +1,24 @@
# app.py (v2.0 - Autark & Transparent)
from flask import Flask, jsonify, request, render_template_string
# app.py (v2.1 - Final für Docker)
from flask import Flask, jsonify, request
import subprocess
import sys
import os
import logging
import uuid
import json
from datetime import datetime
from pyngrok import ngrok, conf
from config import Config
# --- Konfiguration ---
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
app = Flask(__name__)
# Verzeichnis für Statusdateien der laufenden Jobs
STATUS_DIR = "job_status"
os.makedirs(STATUS_DIR, exist_ok=True)
# Der Pfad, in dem sich der Code im Container befindet
# (muss mit WORKDIR im Dockerfile übereinstimmen)
APP_DIR = "/code"
# SCRIPT MAP (Passen Sie hier bei Bedarf die Skriptnamen an, z.B. auf brancheneinstufung2.py)
SCRIPT_MAP = {
"run_duplicate_check": {"script": "duplicate_checker.py", "args": []},
"run_reclassify_branches": {"script": "brancheneinstufung.py", "args": ["--mode", "reclassify_branches"]},
"run_predict_technicians": {"script": "brancheneinstufung.py", "args": ["--mode", "predict_technicians"]},
"run_reclassify_branches": {"script": "brancheneinstufung2.py", "args": ["--mode", "reclassify_branches"]},
# ... fügen Sie hier bei Bedarf brancheneinstufung2.py hinzu
}
def setup_ngrok():
@@ -49,10 +44,6 @@ def setup_ngrok():
@app.route('/run-script', methods=['POST'])
def run_script():
"""
Startet ein Skript als Hintergrundprozess.
NEU: Leitet die Ausgabe des Skripts in eine dedizierte Log-Datei um.
"""
action = "unknown"
try:
data = request.get_json()
@@ -64,37 +55,33 @@ def run_script():
script_config = SCRIPT_MAP[action]
script_name = script_config["script"]
script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), script_name)
script_path = os.path.join(APP_DIR, script_name) # Korrekter Pfad im Container
if not os.path.exists(script_path):
logging.error(f"Skript '{script_path}' nicht gefunden.")
return jsonify({"status": "error", "message": f"Server-Fehler: Skript nicht gefunden."}), 500
return jsonify({"status": "error", "message": f"Server-Fehler: Skript {script_name} nicht gefunden."}), 500
logging.info(f"Aktion '{action}' empfangen. Starte Skript: '{script_name}'...")
python_executable = sys.executable
command = [python_executable, script_path] + script_config["args"]
script_dir = os.path.dirname(os.path.abspath(__file__))
command = ["python", script_name] + script_config["args"]
# NEU: Dedizierte Log-Datei für den Subprozess erstellen
log_dir = os.path.join(script_dir, "Log")
# Log-Datei für den Subprozess
log_dir = os.path.join(APP_DIR, "Log")
os.makedirs(log_dir, exist_ok=True)
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
process_log_path = os.path.join(log_dir, f"{timestamp}_{action}.log")
logging.info(f"Die Ausgabe des Skripts wird in '{process_log_path}' protokolliert.")
with open(process_log_path, 'w') as log_file:
subprocess.Popen(
command,
cwd=script_dir,
command,
cwd=APP_DIR, # Setze das Arbeitsverzeichnis explizit
stdout=log_file,
stderr=log_file
)
return jsonify({"status": "success", "message": f"Aktion '{action}' wurde erfolgreich gestartet. Details siehe Log-Datei."}), 200
return jsonify({"status": "success", "message": f"Aktion '{action}' gestartet. Log wird in '{process_log_path}' geschrieben."}), 200
except Exception as e:
logging.error(f"Kritischer Fehler in der run_script-Route bei Aktion '{action}': {e}", exc_info=True)
logging.error(f"Kritischer Fehler in run_script bei Aktion '{action}': {e}", exc_info=True)
return jsonify({"status": "error", "message": f"Server-Fehler: {str(e)}"}), 500
@app.route('/get-status', methods=['GET'])