"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.
|
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
|
## Job-Scheduler und Steckdosensteuerung
|
||||||
|
|
||||||
### Steckdose kann nicht eingeschaltet werden
|
### Steckdose kann nicht eingeschaltet werden
|
||||||
|
@@ -718,57 +718,25 @@ def finish_job(job_id):
|
|||||||
@app.route("/api/printers", methods=["GET"])
|
@app.route("/api/printers", methods=["GET"])
|
||||||
@login_required
|
@login_required
|
||||||
def get_printers():
|
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()
|
db_session = get_db_session()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
printers = db_session.query(Printer).all()
|
printers = db_session.query(Printer).all()
|
||||||
|
|
||||||
# Drucker-Daten für Status-Check vorbereiten
|
# Drucker-Liste ohne Status-Check erstellen (für schnelleres Laden)
|
||||||
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
|
|
||||||
printer_list = []
|
printer_list = []
|
||||||
for printer in printers:
|
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 = printer.to_dict()
|
||||||
printer_data["status"] = frontend_status
|
# Verwende den gespeicherten Status oder setze auf "offline" als Standard
|
||||||
printer_data["active"] = active
|
printer_data["status"] = printer.status if printer.status else "offline"
|
||||||
printer_data["last_checked"] = datetime.now().isoformat()
|
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)
|
printer_list.append(printer_data)
|
||||||
|
|
||||||
# Speichere Updates
|
|
||||||
db_session.commit()
|
|
||||||
db_session.close()
|
db_session.close()
|
||||||
|
|
||||||
online_count = len([p for p in printer_list if p["status"] == "available"])
|
printers_logger.info(f"Drucker-Liste geladen: {len(printer_list)} Drucker")
|
||||||
printers_logger.info(f"Drucker-Status-Check abgeschlossen: {online_count} von {len(printer_list)} Drucker verfügbar")
|
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"printers": printer_list
|
"printers": printer_list
|
||||||
|
Reference in New Issue
Block a user