diff --git a/backend/app/app.py b/backend/app/app.py index 1d6224d1..df31fca1 100644 --- a/backend/app/app.py +++ b/backend/app/app.py @@ -4267,164 +4267,6 @@ def trigger_queue_check(): # ===== ENDE QUEUE-MANAGER-API-ENDPUNKTE ===== -# ===== 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-spezifische Umgebungsvariablen setzen für bessere Flask-Kompatibilität - if os.name == 'nt' and debug_mode: - # Entferne problematische Werkzeug-Variablen - os.environ.pop('WERKZEUG_SERVER_FD', None) - os.environ.pop('WERKZEUG_RUN_MAIN', None) - - # Setze saubere Umgebung - os.environ['FLASK_ENV'] = 'development' - os.environ['PYTHONIOENCODING'] = 'utf-8' - os.environ['PYTHONUTF8'] = '1' - - # 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.stop() - 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() - create_initial_admin() - - # Template-Hilfsfunktionen registrieren - register_template_helpers(app) - - # Queue-Manager für automatische Drucker-Überwachung starten - # Nur im Produktionsmodus starten (nicht im Debug-Modus) - if not debug_mode: - try: - queue_manager = start_queue_manager() - app_logger.info("✅ Printer Queue Manager erfolgreich gestartet") - - # 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("🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung") - - # Scheduler starten (falls aktiviert) - if SCHEDULER_ENABLED: - try: - scheduler.start() - app_logger.info("Job-Scheduler gestartet") - except Exception as e: - app_logger.error(f"Fehler beim Starten des Schedulers: {str(e)}") - - if debug_mode: - # Debug-Modus: HTTP auf Port 5000 - app_logger.info("Starte Debug-Server auf 0.0.0.0:5000 (HTTP)") - - # Windows-spezifische Flask-Konfiguration für bessere Thread-Behandlung - if os.name == 'nt': - try: - # Windows: Ohne use_reloader um WERKZEUG_SERVER_FD Fehler zu vermeiden - app.run( - host="0.0.0.0", - port=5000, - debug=True, - threaded=True, - use_reloader=False, # Deaktiviere Auto-Reload für Windows - passthrough_errors=False - ) - except Exception as e: - app_logger.warning(f"Windows-Debug-Server Fehler: {str(e)}") - app_logger.info("Fallback: Starte ohne Debug-Modus") - # Fallback: Ohne Debug-Features - app.run( - host="0.0.0.0", - port=5000, - debug=False, - threaded=True - ) - 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() - - if ssl_context: - app_logger.info("Starte HTTPS-Server auf 0.0.0.0:443") - app.run( - host="0.0.0.0", - port=443, - debug=False, - ssl_context=ssl_context, - threaded=True - ) - else: - app_logger.info("Starte HTTP-Server auf 0.0.0.0:8080") - app.run( - host="0.0.0.0", - port=8080, - debug=False, - 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) # ===== NEUE ADMIN API-ROUTEN FÜR BUTTON-FUNKTIONALITÄTEN ===== @@ -5707,4 +5549,150 @@ def export_guest_requests(): 'message': f'Fehler beim Export: {str(e)}' }), 500 -# ===== ENDE ADMIN GASTAUFTRÄGE API-ENDPUNKTE ===== \ No newline at end of file +# ===== ENDE ADMIN GASTAUFTRÄGE API-ENDPUNKTE ===== + + +# ===== 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-spezifische Umgebungsvariablen setzen für bessere Flask-Kompatibilität + if os.name == 'nt' and debug_mode: + # Entferne problematische Werkzeug-Variablen + os.environ.pop('WERKZEUG_SERVER_FD', None) + os.environ.pop('WERKZEUG_RUN_MAIN', None) + + # Setze saubere Umgebung + os.environ['FLASK_ENV'] = 'development' + os.environ['PYTHONIOENCODING'] = 'utf-8' + os.environ['PYTHONUTF8'] = '1' + + # 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.stop() + 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() + create_initial_admin() + + # Template-Hilfsfunktionen registrieren + register_template_helpers(app) + + # Queue-Manager für automatische Drucker-Überwachung starten + # Nur im Produktionsmodus starten (nicht im Debug-Modus) + if not debug_mode: + try: + queue_manager = start_queue_manager() + app_logger.info("✅ Printer Queue Manager erfolgreich gestartet") + + # 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("🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung") + + # Scheduler starten (falls aktiviert) + if SCHEDULER_ENABLED: + try: + scheduler.start() + app_logger.info("Job-Scheduler gestartet") + except Exception as e: + app_logger.error(f"Fehler beim Starten des Schedulers: {str(e)}") + + if debug_mode: + # Debug-Modus: HTTP auf Port 5000 + app_logger.info("Starte Debug-Server auf 0.0.0.0:5000 (HTTP)") + + # Windows-spezifische Flask-Konfiguration + run_kwargs = { + "host": "0.0.0.0", + "port": 5000, + "debug": True, + "threaded": True + } + + if os.name == 'nt': + # Windows: Deaktiviere Auto-Reload um WERKZEUG_SERVER_FD Fehler zu vermeiden + run_kwargs["use_reloader"] = False + run_kwargs["passthrough_errors"] = False + app_logger.info("Windows-Debug-Modus: Auto-Reload deaktiviert") + + app.run(**run_kwargs) + else: + # Produktions-Modus: HTTPS auf Port 443 + ssl_context = get_ssl_context() + + if ssl_context: + app_logger.info("Starte HTTPS-Server auf 0.0.0.0:443") + app.run( + host="0.0.0.0", + port=443, + debug=False, + ssl_context=ssl_context, + threaded=True + ) + else: + app_logger.info("Starte HTTP-Server auf 0.0.0.0:8080") + app.run( + host="0.0.0.0", + port=8080, + debug=False, + 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) \ No newline at end of file diff --git a/backend/app/database/myp.db-shm b/backend/app/database/myp.db-shm index 945c6ab5..c6c8532f 100644 Binary files a/backend/app/database/myp.db-shm and b/backend/app/database/myp.db-shm differ