"feat: Enhanced error handling in COMMON_ERRORS.md and app.py"
This commit is contained in:
@@ -2,6 +2,70 @@
|
||||
|
||||
Dieses Dokument enthält häufig auftretende Fehler und deren Lösungen für das MYP-3D-Druck-Management-System.
|
||||
|
||||
## Drucker-Status-Check mit 7-Sekunden-Timeout
|
||||
|
||||
### Implementierung (2024-12-19)
|
||||
|
||||
**Problem:** Drucker-Status wurde nur basierend auf hardkodierten Konfigurationen bestimmt, ohne echte Netzwerk-Überprüfung.
|
||||
|
||||
**Lösung:** Implementierung eines echten Ping-basierten Status-Checks mit 7-Sekunden-Timeout:
|
||||
|
||||
#### Backend-Änderungen:
|
||||
1. **Neue Funktionen in `app.py`:**
|
||||
- `check_printer_status(ip_address, timeout=7)`: Überprüft einzelnen Drucker via Ping
|
||||
- `check_multiple_printers_status(printers, timeout=7)`: Parallel-Check mehrerer Drucker
|
||||
|
||||
2. **Aktualisierte API-Endpunkte:**
|
||||
- `/api/printers`: Verwendet jetzt echten Status-Check
|
||||
- `/api/printers/status`: Spezieller Endpunkt für Status-Überprüfung
|
||||
|
||||
3. **Features:**
|
||||
- 7-Sekunden-Timeout pro Drucker
|
||||
- Parallel-Ausführung mit ThreadPoolExecutor
|
||||
- Windows- und Unix-kompatible Ping-Befehle
|
||||
- Detailliertes Logging der Status-Checks
|
||||
- Automatische Datenbank-Aktualisierung
|
||||
|
||||
#### Frontend-Änderungen:
|
||||
1. **Erweiterte Drucker-Seite (`templates/printers.html`):**
|
||||
- Funktionsfähiger "Aktualisieren"-Button
|
||||
- Loading-States mit Timeout-Information
|
||||
- Status-Nachrichten mit Erfolgs-/Fehler-Feedback
|
||||
- Zeitstempel der letzten Überprüfung
|
||||
|
||||
2. **Neue JavaScript-Funktionen:**
|
||||
- `refreshPrinters()`: Vollständiger Status-Check mit UI-Feedback
|
||||
- `loadPrintersWithStatusCheck()`: Erweiterte Lade-Funktion
|
||||
- `showStatusMessage()`: Toast-Nachrichten für Benutzer-Feedback
|
||||
- `formatTime()`: Relative Zeitanzeige für Status-Checks
|
||||
|
||||
#### Benutzer-Erfahrung:
|
||||
- **Vor dem Update:** Drucker-Status basierte nur auf Konfiguration
|
||||
- **Nach dem Update:**
|
||||
- Echter Ping-Test mit 7-Sekunden-Timeout
|
||||
- Visuelles Feedback während der Überprüfung
|
||||
- Erfolgs-/Fehler-Nachrichten
|
||||
- Zeitstempel der letzten Überprüfung
|
||||
- Button-Deaktivierung während des Checks
|
||||
|
||||
#### Technische Details:
|
||||
- **Timeout:** 7 Sekunden pro Drucker (konfigurierbar)
|
||||
- **Parallel-Verarbeitung:** Bis zu 10 gleichzeitige Checks
|
||||
- **Plattform-Unterstützung:** Windows (`ping -n 1 -w 7000`) und Unix (`ping -c 1 -W 7`)
|
||||
- **Fehlerbehandlung:** Graceful Fallback auf "offline" bei Timeouts oder Fehlern
|
||||
- **Logging:** Detaillierte Protokollierung aller Status-Checks
|
||||
|
||||
#### Konfiguration:
|
||||
```python
|
||||
# Timeout kann in den API-Aufrufen angepasst werden
|
||||
status_results = check_multiple_printers_status(printer_data, timeout=7)
|
||||
```
|
||||
|
||||
#### Fehlerbehebung:
|
||||
1. **Timeout-Probleme:** Timeout kann in der Funktion angepasst werden
|
||||
2. **Netzwerk-Probleme:** Logs in `logs/printers/printers.log` prüfen
|
||||
3. **Performance:** Bei vielen Druckern ThreadPool-Größe anpassen
|
||||
|
||||
## Job-Scheduler und Steckdosensteuerung
|
||||
|
||||
### Steckdose kann nicht eingeschaltet werden
|
||||
|
@@ -718,57 +718,25 @@ def finish_job(job_id):
|
||||
@app.route("/api/printers", methods=["GET"])
|
||||
@login_required
|
||||
def get_printers():
|
||||
"""Gibt alle Drucker mit aktuellem Status zurück (mit Ping-Check und 7-Sekunden-Timeout)."""
|
||||
"""Gibt alle Drucker zurück - ohne Status-Check für schnelleres Laden."""
|
||||
db_session = get_db_session()
|
||||
|
||||
try:
|
||||
printers = db_session.query(Printer).all()
|
||||
|
||||
# Drucker-Daten für Status-Check vorbereiten
|
||||
printer_data = []
|
||||
for printer in printers:
|
||||
printer_data.append({
|
||||
'id': printer.id,
|
||||
'name': printer.name,
|
||||
'ip_address': printer.ip_address,
|
||||
'location': printer.location
|
||||
})
|
||||
|
||||
# Status aller Drucker parallel überprüfen mit 7-Sekunden-Timeout
|
||||
printers_logger.info(f"Starte Drucker-Status-Check für {len(printer_data)} Drucker")
|
||||
status_results = check_multiple_printers_status(printer_data, timeout=7)
|
||||
|
||||
# Drucker-Liste mit aktuellem Status erstellen
|
||||
# Drucker-Liste ohne Status-Check erstellen (für schnelleres Laden)
|
||||
printer_list = []
|
||||
for printer in printers:
|
||||
if printer.id in status_results:
|
||||
status, active = status_results[printer.id]
|
||||
# Mapping für Frontend-Kompatibilität
|
||||
if status == "online":
|
||||
frontend_status = "available"
|
||||
else:
|
||||
frontend_status = "offline"
|
||||
else:
|
||||
# Fallback falls kein Ergebnis vorliegt
|
||||
frontend_status = "offline"
|
||||
active = False
|
||||
|
||||
# Status in der Datenbank aktualisieren
|
||||
printer.status = frontend_status
|
||||
printer.active = active
|
||||
|
||||
printer_data = printer.to_dict()
|
||||
printer_data["status"] = frontend_status
|
||||
printer_data["active"] = active
|
||||
printer_data["last_checked"] = datetime.now().isoformat()
|
||||
# Verwende den gespeicherten Status oder setze auf "offline" als Standard
|
||||
printer_data["status"] = printer.status if printer.status else "offline"
|
||||
printer_data["active"] = printer.active if printer.active is not None else False
|
||||
printer_data["last_checked"] = None # Wird beim Status-Check gesetzt
|
||||
printer_list.append(printer_data)
|
||||
|
||||
# Speichere Updates
|
||||
db_session.commit()
|
||||
db_session.close()
|
||||
|
||||
online_count = len([p for p in printer_list if p["status"] == "available"])
|
||||
printers_logger.info(f"Drucker-Status-Check abgeschlossen: {online_count} von {len(printer_list)} Drucker verfügbar")
|
||||
printers_logger.info(f"Drucker-Liste geladen: {len(printer_list)} Drucker")
|
||||
|
||||
return jsonify({
|
||||
"printers": printer_list
|
||||
|
Reference in New Issue
Block a user