"Update template files and add windows fixes"

This commit is contained in:
2025-05-29 12:54:24 +02:00
parent 5707d577cc
commit ad92d3d978
7 changed files with 443 additions and 98 deletions

View File

@@ -17,6 +17,16 @@ from typing import List, Dict, Tuple
import time
import subprocess
import json
import signal
# Windows-spezifische Fixes früh importieren
if os.name == 'nt':
try:
from utils.windows_fixes import get_windows_thread_manager, apply_all_windows_fixes
apply_all_windows_fixes()
except ImportError:
# Fallback falls windows_fixes nicht verfügbar
get_windows_thread_manager = None
# Lokale Imports
from models import init_database, create_initial_admin, User, Printer, Job, Stats, SystemLog, get_db_session, GuestRequest, UserPermission, Notification
@@ -4177,10 +4187,46 @@ def trigger_queue_check():
# ===== STARTUP UND MAIN =====
if __name__ == "__main__":
import sys
import signal
import os
# Debug-Modus prüfen
debug_mode = len(sys.argv) > 1 and sys.argv[1] == "--debug"
# Windows-spezifisches Signal-Handling für ordnungsgemäßes Shutdown
def signal_handler(sig, frame):
"""Signal-Handler für ordnungsgemäßes Shutdown."""
app_logger.warning(f"🛑 Signal {sig} empfangen - fahre System herunter...")
try:
# Queue Manager stoppen
app_logger.info("🔄 Beende Queue Manager...")
stop_queue_manager()
# Scheduler stoppen falls aktiviert
if SCHEDULER_ENABLED and scheduler:
try:
scheduler.shutdown(wait=False)
app_logger.info("Job-Scheduler gestoppt")
except Exception as e:
app_logger.error(f"Fehler beim Stoppen des Schedulers: {str(e)}")
app_logger.info("✅ Shutdown abgeschlossen")
sys.exit(0)
except Exception as e:
app_logger.error(f"❌ Fehler beim Shutdown: {str(e)}")
sys.exit(1)
# Signal-Handler registrieren (Windows-kompatibel)
if os.name == 'nt': # Windows
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
# Zusätzlich für Flask-Development-Server
signal.signal(signal.SIGBREAK, signal_handler)
else: # Unix/Linux
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGHUP, signal_handler)
try:
# Datenbank initialisieren
init_database()
@@ -4190,19 +4236,26 @@ if __name__ == "__main__":
register_template_helpers(app)
# Queue-Manager für automatische Drucker-Überwachung starten
try:
queue_manager = start_queue_manager()
app_logger.info("✅ Printer Queue Manager erfolgreich gestartet")
# Shutdown-Handler registrieren
def cleanup_queue_manager():
app_logger.info("🔄 Beende Queue Manager...")
stop_queue_manager()
# Nur im Hauptprozess starten (nicht bei Flask Auto-Reload)
if not debug_mode or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
try:
queue_manager = start_queue_manager()
app_logger.info("✅ Printer Queue Manager erfolgreich gestartet")
atexit.register(cleanup_queue_manager)
except Exception as e:
app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}")
# Verbesserte Shutdown-Handler registrieren
def cleanup_queue_manager():
try:
app_logger.info("🔄 Beende Queue Manager...")
stop_queue_manager()
except Exception as e:
app_logger.error(f"❌ Fehler beim Queue Manager Cleanup: {str(e)}")
atexit.register(cleanup_queue_manager)
except Exception as e:
app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}")
else:
app_logger.info("🔄 Flask Auto-Reload erkannt - Queue Manager wird im Hauptprozess gestartet")
# Scheduler starten (falls aktiviert)
if SCHEDULER_ENABLED:
@@ -4215,12 +4268,25 @@ if __name__ == "__main__":
if debug_mode:
# Debug-Modus: HTTP auf Port 5000
app_logger.info("Starte Debug-Server auf 0.0.0.0:5000 (HTTP)")
app.run(
host="0.0.0.0",
port=5000,
debug=True,
threaded=True
)
# Windows-spezifische Flask-Konfiguration für bessere Thread-Behandlung
if os.name == 'nt':
app.run(
host="0.0.0.0",
port=5000,
debug=True,
threaded=True,
use_reloader=True,
reloader_interval=1,
passthrough_errors=False
)
else:
app.run(
host="0.0.0.0",
port=5000,
debug=True,
threaded=True
)
else:
# Produktions-Modus: HTTPS auf Port 443
ssl_context = get_ssl_context()
@@ -4243,6 +4309,14 @@ if __name__ == "__main__":
threaded=True
)
except KeyboardInterrupt:
app_logger.info("🔄 Tastatur-Unterbrechung empfangen - beende Anwendung...")
signal_handler(signal.SIGINT, None)
except Exception as e:
app_logger.error(f"Fehler beim Starten der Anwendung: {str(e)}")
# Cleanup bei Fehler
try:
stop_queue_manager()
except:
pass
sys.exit(1)