feat: Erweiterung der Druckerstatusüberprüfung durch Implementierung einer Steckdosenabfrage für Drucker. Verbesserung der Benutzeroberfläche mit optimierten Dark Mode-Elementen und neuen Statusanzeigen für Drucker. Anpassungen in den Templates zur Unterstützung dynamischer Statusinformationen und zur Verbesserung der Benutzererfahrung. Aktualisierung der CSS-Styles für ein ansprechenderes Design und bessere Benutzerinteraktion.
This commit is contained in:
@@ -1110,10 +1110,10 @@ def kiosk_restart_system():
|
||||
|
||||
def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
|
||||
"""
|
||||
Überprüft den Status eines Druckers über Ping mit Timeout.
|
||||
Überprüft den Status eines Druckers über Steckdosenabfrage mit Timeout.
|
||||
|
||||
Args:
|
||||
ip_address: IP-Adresse des Druckers
|
||||
ip_address: IP-Adresse der Drucker-Steckdose
|
||||
timeout: Timeout in Sekunden (Standard: 7)
|
||||
|
||||
Returns:
|
||||
@@ -1132,7 +1132,7 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
|
||||
printers_logger.warning(f"Ungültige IP-Adresse: {ip_address}")
|
||||
return "offline", False
|
||||
|
||||
# Windows-spezifischer Ping-Befehl mit Timeout
|
||||
# Zuerst prüfen, ob die Steckdose erreichbar ist
|
||||
if os.name == 'nt': # Windows
|
||||
cmd = ['ping', '-n', '1', '-w', str(timeout * 1000), ip_address.strip()]
|
||||
else: # Unix/Linux/macOS
|
||||
@@ -1150,19 +1150,66 @@ def check_printer_status(ip_address: str, timeout: int = 7) -> Tuple[str, bool]:
|
||||
timeout=timeout + 2 # Zusätzlicher Timeout für subprocess
|
||||
)
|
||||
|
||||
# Erfolgreicher Ping (Return Code 0)
|
||||
if result.returncode == 0:
|
||||
printers_logger.debug(f"Ping erfolgreich für {ip_address}")
|
||||
return "online", True
|
||||
else:
|
||||
# Wenn Steckdose nicht erreichbar ist, ist der Drucker offline
|
||||
if result.returncode != 0:
|
||||
printers_logger.debug(f"Ping fehlgeschlagen für {ip_address} (Return Code: {result.returncode})")
|
||||
return "offline", False
|
||||
|
||||
# Jetzt den tatsächlichen Steckdosenstatus abfragen
|
||||
db_session = get_db_session()
|
||||
printer = db_session.query(Printer).filter(Printer.plug_ip == ip_address).first()
|
||||
|
||||
if not printer:
|
||||
printers_logger.warning(f"Kein Drucker mit Steckdosen-IP {ip_address} gefunden")
|
||||
db_session.close()
|
||||
return "offline", False
|
||||
|
||||
# Smart Plug Status prüfen
|
||||
import requests
|
||||
from requests.exceptions import RequestException
|
||||
|
||||
# Standardwerte aus der Datenbank verwenden
|
||||
username = printer.plug_username
|
||||
password = printer.plug_password
|
||||
|
||||
try:
|
||||
# Für TP-Link Smart Plugs oder kompatible Steckdosen
|
||||
auth = (username, password)
|
||||
response = requests.get(f"http://{ip_address}/status", auth=auth, timeout=timeout)
|
||||
|
||||
if response.status_code == 200:
|
||||
try:
|
||||
status_data = response.json()
|
||||
# Überprüfen ob die Steckdose eingeschaltet ist
|
||||
if 'system' in status_data and 'get_sysinfo' in status_data['system']:
|
||||
if status_data['system']['get_sysinfo'].get('relay_state') == 1:
|
||||
printers_logger.debug(f"Steckdose {ip_address} ist eingeschaltet")
|
||||
db_session.close()
|
||||
return "online", True
|
||||
except (ValueError, KeyError) as e:
|
||||
printers_logger.debug(f"Fehler beim Parsen der Steckdosen-Antwort: {str(e)}")
|
||||
|
||||
# Zweiter Versuch mit einfacher GET-Anfrage
|
||||
response = requests.get(f"http://{ip_address}", auth=auth, timeout=timeout)
|
||||
if response.status_code == 200:
|
||||
printers_logger.debug(f"Steckdose {ip_address} antwortet auf HTTP-Anfrage")
|
||||
# Wenn wir hier ankommen, ist die Steckdose online, aber wir wissen nicht sicher, ob sie eingeschaltet ist
|
||||
# Da wir nur die Verfügbarkeit prüfen, nehmen wir an, dass sie aktiv ist, wenn sie antwortet
|
||||
db_session.close()
|
||||
return "online", True
|
||||
|
||||
except RequestException as e:
|
||||
printers_logger.debug(f"Fehler bei HTTP-Anfrage an Steckdose {ip_address}: {str(e)}")
|
||||
|
||||
# Wenn beide API-Anfragen fehlschlagen, können wir annehmen, dass die Steckdose nicht eingeschaltet ist
|
||||
db_session.close()
|
||||
return "offline", False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
printers_logger.warning(f"Ping-Timeout für Drucker {ip_address} nach {timeout} Sekunden")
|
||||
return "offline", False
|
||||
except Exception as e:
|
||||
printers_logger.error(f"Fehler beim Ping für Drucker {ip_address}: {str(e)}")
|
||||
printers_logger.error(f"Fehler beim Status-Check für Drucker {ip_address}: {str(e)}")
|
||||
return "offline", False
|
||||
|
||||
def check_multiple_printers_status(printers: List[Dict], timeout: int = 7) -> Dict[int, Tuple[str, bool]]:
|
||||
|
Reference in New Issue
Block a user