diff --git a/backend/app/templates/printers.html b/backend/app/templates/printers.html index ac440e64..fa244d75 100644 --- a/backend/app/templates/printers.html +++ b/backend/app/templates/printers.html @@ -87,6 +87,21 @@ background: linear-gradient(90deg, rgba(139, 92, 246, 0.1) 0%, rgba(124, 58, 237, 0.05) 100%); } + .status-standby { + border-left: 4px solid #f59e0b; + background: linear-gradient(90deg, rgba(245, 158, 11, 0.1) 0%, rgba(217, 119, 6, 0.05) 100%); + } + + .status-unreachable { + border-left: 4px solid #6b7280; + background: linear-gradient(90deg, rgba(107, 114, 128, 0.1) 0%, rgba(75, 85, 99, 0.05) 100%); + } + + .status-unconfigured { + border-left: 4px solid #6366f1; + background: linear-gradient(90deg, rgba(99, 102, 241, 0.1) 0%, rgba(79, 70, 229, 0.05) 100%); + } + /* Real-time Status Indicators */ .status-pulse { animation: pulse-status 2s infinite; @@ -661,10 +676,13 @@ diff --git a/backend/app/utils/printer_monitor.py b/backend/app/utils/printer_monitor.py index cd3aa66a..2d25db97 100644 --- a/backend/app/utils/printer_monitor.py +++ b/backend/app/utils/printer_monitor.py @@ -228,10 +228,21 @@ class PrinterMonitor: db_session = get_db_session() printers = db_session.query(Printer).filter(Printer.active == True).all() + # Wenn keine aktiven Drucker vorhanden sind, gebe leeres Dict zurück + if not printers: + monitor_logger.info("ℹ️ Keine aktiven Drucker gefunden") + db_session.close() + return status_dict + + monitor_logger.info(f"🔍 Prüfe Status von {len(printers)} aktiven Druckern...") + # Parallel-Status-Prüfung mit ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor, as_completed - with ThreadPoolExecutor(max_workers=min(len(printers), 8)) as executor: + # Sicherstellen, dass max_workers mindestens 1 ist + max_workers = min(max(len(printers), 1), 8) + + with ThreadPoolExecutor(max_workers=max_workers) as executor: future_to_printer = { executor.submit(self._check_single_printer_status, printer): printer for printer in printers @@ -265,6 +276,8 @@ class PrinterMonitor: db_session.commit() db_session.close() + monitor_logger.info(f"✅ Status-Update abgeschlossen für {len(status_dict)} Drucker") + except Exception as e: monitor_logger.error(f"❌ Kritischer Fehler beim Abrufen des Live-Status: {str(e)}") diff --git a/backend/app/utils/rate_limiter.py b/backend/app/utils/rate_limiter.py index 7ff9be47..86785e0d 100644 --- a/backend/app/utils/rate_limiter.py +++ b/backend/app/utils/rate_limiter.py @@ -34,11 +34,11 @@ RATE_LIMITS = { 'printer_status': RateLimit(300, 300, "Zu viele Drucker-Status-Anfragen."), 'job_creation': RateLimit(50, 3600, "Zu viele Job-Erstellungen. Versuchen Sie es in einer Stunde erneut."), - # Drucker-Monitor Rate-Limits - 'printer_monitor_live': RateLimit(5, 60, "Zu viele Live-Status-Anfragen. Versuchen Sie es in einer Minute erneut."), - 'printer_monitor_summary': RateLimit(10, 30, "Zu viele Zusammenfassungs-Anfragen. Versuchen Sie es in 30 Sekunden erneut."), - 'printer_monitor_cache': RateLimit(3, 120, "Zu viele Cache-Lösch-Anfragen. Versuchen Sie es in 2 Minuten erneut."), - 'printer_monitor_init': RateLimit(2, 300, "Zu viele Initialisierungs-Anfragen. Versuchen Sie es in 5 Minuten erneut."), + # Drucker-Monitor Rate-Limits (gelockert für Live-Updates) + 'printer_monitor_live': RateLimit(30, 60, "Zu viele Live-Status-Anfragen. Versuchen Sie es in einer Minute erneut."), + 'printer_monitor_summary': RateLimit(60, 60, "Zu viele Zusammenfassungs-Anfragen. Versuchen Sie es in einer Minute erneut."), + 'printer_monitor_cache': RateLimit(10, 120, "Zu viele Cache-Lösch-Anfragen. Versuchen Sie es in 2 Minuten erneut."), + 'printer_monitor_init': RateLimit(5, 300, "Zu viele Initialisierungs-Anfragen. Versuchen Sie es in 5 Minuten erneut."), # Sicherheitskritische Endpunkte 'password_reset': RateLimit(3, 3600, "Zu viele Passwort-Reset-Anfragen. Versuchen Sie es in einer Stunde erneut."),