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."),