feat: Implementierung einer Windows-kompatiblen Timeout-Logik für Datenbankabfragen in der Druckerabfrage. Verwendung von Threads zur Vermeidung von Blockierungen und Verbesserung der Fehlerprotokollierung. Aktualisierung des Kiosk-Installationsskripts zur Installation zusätzlicher Pakete und Konfiguration des Kiosk-Modus mit Openbox für eine verbesserte Benutzererfahrung.

This commit is contained in:
2025-05-27 10:58:15 +02:00
parent f1232bf900
commit b289501d00
8 changed files with 929 additions and 24 deletions

View File

@@ -1684,19 +1684,28 @@ def get_printers():
db_session = get_db_session()
try:
# Set timeout for database query
import signal
# Windows-kompatible Timeout-Implementierung
import threading
import time
def timeout_handler(signum, frame):
raise TimeoutError("Database query timeout")
printers = None
timeout_occurred = False
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5) # 5 second timeout for basic printer loading (reduziert)
def fetch_printers():
nonlocal printers, timeout_occurred
try:
printers = db_session.query(Printer).all()
except Exception as e:
printers_logger.error(f"Datenbankfehler beim Laden der Drucker: {str(e)}")
timeout_occurred = True
try:
printers = db_session.query(Printer).all()
signal.alarm(0) # Clear alarm
except TimeoutError:
# Starte Datenbankabfrage in separatem Thread
thread = threading.Thread(target=fetch_printers)
thread.daemon = True
thread.start()
thread.join(timeout=5) # 5 Sekunden Timeout
if thread.is_alive() or timeout_occurred or printers is None:
printers_logger.warning("Database timeout when fetching printers for basic loading")
return jsonify({
'error': 'Database timeout beim Laden der Drucker',
@@ -1734,7 +1743,6 @@ def get_printers():
})
except Exception as e:
signal.alarm(0) # Clear any remaining alarm
db_session.rollback()
db_session.close()
printers_logger.error(f"Fehler beim Abrufen der Drucker: {str(e)}")
@@ -1750,19 +1758,28 @@ def get_printers_with_status():
db_session = get_db_session()
try:
# Set timeout for database query
import signal
# Windows-kompatible Timeout-Implementierung
import threading
import time
def timeout_handler(signum, frame):
raise TimeoutError("Database query timeout")
printers = None
timeout_occurred = False
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(8) # 8 second timeout for status check loading
def fetch_printers():
nonlocal printers, timeout_occurred
try:
printers = db_session.query(Printer).all()
except Exception as e:
printers_logger.error(f"Datenbankfehler beim Status-Check: {str(e)}")
timeout_occurred = True
try:
printers = db_session.query(Printer).all()
signal.alarm(0) # Clear alarm
except TimeoutError:
# Starte Datenbankabfrage in separatem Thread
thread = threading.Thread(target=fetch_printers)
thread.daemon = True
thread.start()
thread.join(timeout=8) # 8 Sekunden Timeout für Status-Check
if thread.is_alive() or timeout_occurred or printers is None:
printers_logger.warning("Database timeout when fetching printers for status check")
return jsonify({
'error': 'Database timeout beim Status-Check der Drucker',
@@ -1852,7 +1869,6 @@ def get_printers_with_status():
return jsonify(status_data)
except Exception as e:
signal.alarm(0) # Clear any remaining alarm
db_session.rollback()
db_session.close()
printers_logger.error(f"Fehler beim Status-Check der Drucker: {str(e)}")