From d3b8bf282064ce35813fa962fd97f29294f9fe37 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 26 May 2025 12:17:18 +0200 Subject: [PATCH] "feat: Update README --- README.md | 1 + backend/app/app.py | 66 +- backend/app/blueprints/user.py | 6 + backend/app/templates/admin.html | 1004 ++++++++++++++++++------------ backend/install/kiosk.sh | 24 - backend/install/setup.sh | 90 --- backend/install/watchdog.sh | 40 -- 7 files changed, 673 insertions(+), 558 deletions(-) create mode 100644 README.md delete mode 100755 backend/install/kiosk.sh delete mode 100755 backend/install/setup.sh delete mode 100755 backend/install/watchdog.sh diff --git a/README.md b/README.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/app/app.py b/backend/app/app.py index 394120c2..afa7d487 100644 --- a/backend/app/app.py +++ b/backend/app/app.py @@ -590,14 +590,38 @@ def get_printers(): try: printers = db_session.query(Printer).all() - printer_list = [printer.to_dict() for printer in printers] + # Optimierte Drucker-Liste mit schneller Status-Bestimmung + printer_list = [] + for printer in printers: + # Bestimme Status basierend auf hardkodierten Druckern + printer_config = PRINTERS.get(printer.name) + if printer_config: + status = "available" # Drucker verfügbar + active = True + else: + status = "offline" + active = False + + # Aktualisiere Status in der Datenbank + printer.status = status + printer.active = active + + printer_data = printer.to_dict() + printer_data["status"] = status + printer_data["active"] = active + printer_list.append(printer_data) + + # Speichere Updates + db_session.commit() db_session.close() + return jsonify({ "printers": printer_list }) except Exception as e: printers_logger.error(f"Fehler beim Abrufen der Drucker: {str(e)}") + db_session.rollback() db_session.close() return jsonify({"error": "Interner Serverfehler"}), 500 @@ -715,23 +739,47 @@ def get_activity(): @app.route("/api/printers/status", methods=["GET"]) @login_required def get_printers_status(): - """Gibt den Status aller Drucker zurück.""" + """Gibt den Status aller Drucker zurück - optimiert für schnelle Antwort.""" db_session = get_db_session() try: printers = db_session.query(Printer).all() - status_data = [ - { + + # Schnelle Status-Bestimmung basierend auf hardkodierten Druckern + status_data = [] + for printer in printers: + # Bestimme Status basierend auf IP-Adresse aus der Konfiguration + printer_config = PRINTERS.get(printer.name) + if printer_config: + # Drucker ist in der Konfiguration -> als online betrachten + status = "online" + active = True + else: + # Drucker nicht in Konfiguration -> offline + status = "offline" + active = False + + # Aktualisiere den Status in der Datenbank für Konsistenz + printer.status = status + printer.active = active + + status_data.append({ "id": printer.id, "name": printer.name, - "status": printer.status, - "active": printer.active - } - for printer in printers - ] + "status": status, + "active": active, + "ip_address": printer.ip_address, + "location": printer.location + }) + + # Speichere die aktualisierten Status + db_session.commit() db_session.close() + return jsonify(status_data) except Exception as e: + db_session.rollback() db_session.close() + printers_logger.error(f"Fehler beim Abrufen des Drucker-Status: {str(e)}") return jsonify({"error": str(e)}), 500 @app.route("/api/jobs/current", methods=["GET"]) diff --git a/backend/app/blueprints/user.py b/backend/app/blueprints/user.py index 0d8ceefe..9b34f48e 100644 --- a/backend/app/blueprints/user.py +++ b/backend/app/blueprints/user.py @@ -94,6 +94,12 @@ def update_profile(): finally: db_session.close() +@user_bp.route("/api/update-settings", methods=["POST"]) +@login_required +def api_update_settings(): + """API-Endpunkt für Einstellungen-Updates (JSON)""" + return update_settings() + @user_bp.route("/update-settings", methods=["POST"]) @login_required def update_settings(): diff --git a/backend/app/templates/admin.html b/backend/app/templates/admin.html index e165c08b..f8e433b8 100644 --- a/backend/app/templates/admin.html +++ b/backend/app/templates/admin.html @@ -1,411 +1,599 @@ {% extends "base.html" %} -{% block title %}Admin Panel - MYP Platform{% endblock %} +{% block title %}Admin Panel - Mercedes-Benz MYP Platform{% endblock %} {% block head %} {{ super() }} + {% endblock %} {% block content %} -
-

Admin Panel

- -
-
-
- +
+ +
+
+
+

+ Mercedes-Benz Admin Panel +

+

+ Verwalten Sie Ihr MYP-System mit modernster Technologie und Mercedes-Benz Qualität +

+
+
+
+ +
+ +
+
+
+ + + +
+
Benutzer
+
{{ stats.total_users }}
+
Registrierte Benutzer
+
+ +
+
+ + + +
+
Drucker
+
{{ stats.total_printers }}
+
Verbundene Drucker
+
+ +
+
+ + + +
+
Aktive Jobs
+
{{ stats.active_jobs }}
+
Laufende Druckaufträge
+
+ +
+
+ + + +
+
Erfolgsrate
+
{{ stats.success_rate }}%
+
Erfolgreiche Druckaufträge
+
+
+ + + -
Benutzer
-
{{ stats.total_users }}
-
Registrierte Benutzer
-
- - - -
- - - -
+ + {% if active_tab == 'users' %} -
-
-
-

Benutzer

-
- -
-
-
- - - - - - - - - - - {% for user in users %} - - + + + {% endfor %} + +
BenutzerRolleStatusAktionen
-
-
- {{ user.email[0]|upper if user.email else 'U' }} -
-
-
{{ user.name }}
-
{{ user.email }}
-
+
+
+

Benutzerverwaltung

+
+ +
+
+ +
+ + + + + + + + + + + {% for user in users %} + + - - + + - - - {% endfor %} - -
BenutzerRolleStatusAktionen
+
+
+ {{ user.email[0]|upper if user.email else 'U' }}
-
- - {{ 'Administrator' if user.is_admin else 'Benutzer' }} - - - +
+
{{ user.name }}
+
{{ user.email }}
+
+ +
+ + {{ 'Administrator' if user.is_admin else 'Benutzer' }} + + +
+
+ {{ 'Aktiv' if user.active else 'Inaktiv' }} -
-
- - -
-
-
- -
-

Neuen Benutzer hinzufügen

-
- -
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
-
- {% endif %} - - {% if active_tab == 'printers' %} -
-
-
-

Drucker

-
- -
-
-
- {% for printer in printers %} -
-
-

{{ printer.name }}

-
-
+
+
+ - - - -
-
- Modell: - {{ printer.model }} -
-
- IP-Adresse: - {{ printer.ip_address }} -
-
- Standort: - {{ printer.location or 'Nicht angegeben' }} -
-
-
-
- {{ 'Online' if printer.status == 'online' else 'Offline' }} -
+
+
+ + +
+

Neuen Benutzer hinzufügen

+
+ +
+ +
- {% endfor %} -
- -
-

Neuen Drucker hinzufügen

- - -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
- -
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
{% endif %} - - {% if active_tab == 'scheduler' %} -
-
-
-

Scheduler Status

-
-
- - -
-
- - -
-
-
-
-
-
-
- {{ 'Aktiv' if scheduler_status.running else 'Inaktiv' }} -
-
{{ scheduler_status.message }}
-
-
-

Scheduler Informationen

-
-

- Der Scheduler ist verantwortlich für die automatische Zuweisung und Ausführung von Druckaufträgen. Er überwacht kontinuierlich den Status der Drucker und der anstehenden Jobs. -

-
    -
  • Der Scheduler sollte während des normalen Betriebs immer aktiv sein
  • -
  • Bei Wartungsarbeiten kann der Scheduler vorübergehend deaktiviert werden
  • -
  • Nach einem Neustart des Systems muss der Scheduler manuell gestartet werden
  • -
-
-
-
-
-
- {% endif %} - + + {% if active_tab == 'system' %} -
+
+

System-Übersicht

+
-
-

System Ressourcen

+
+

System Ressourcen

CPU Auslastung - {{ system_info.cpu }}% + {{ system_info.cpu if system_info else '0' }}% +
+
+
- {{ render_progress_bar(system_info.cpu, 'blue')|safe }}
Arbeitsspeicher - {{ system_info.memory }}% + {{ system_info.memory if system_info else '0' }}% +
+
+
- {{ render_progress_bar(system_info.memory, 'green')|safe }}
Festplattenspeicher - {{ system_info.disk }}% + {{ system_info.disk if system_info else '0' }}%
- {{ render_progress_bar(system_info.disk, 'purple')|safe }} -
-
-
- System Uptime - {{ system_info.uptime }} Tage +
+
-
-

Dienste Status

+ +
+

Dienste Status

-
+
-
- Webserver +
+ Webserver
- Online + Online
-
+
-
- Scheduler +
+ Scheduler
- + {{ 'Online' if scheduler_status.running else 'Offline' }}
-
+
-
- Datenbank +
+ Datenbank
- Online -
-
-
-
- Drucker-Manager -
- Online + Online
+
-
{% endif %} - - {% if active_tab == 'logs' %} -
-
-
-

System Logs

-
- -
- - -
- -
+ + + {% if active_tab == 'scheduler' %} +
+
+

Scheduler Verwaltung

+
+
+ + +
+
+ + +
-
- {% if logs %} - {% for log in logs %} -
-
-
{{ log.timestamp }}
-
-
- - {{ log.level }} - - [{{ log.category }}] -
-
{{ log.message }}
-
-
-
- {% endfor %} - {% else %} -

Keine Logs gefunden.

- {% endif %} +
+ +
+
+
+
+ + {{ 'Aktiv' if scheduler_status.running else 'Inaktiv' }} + +
+
{{ scheduler_status.message }}
+
+ +
+

Scheduler Informationen

+
+

Der Scheduler ist verantwortlich für die automatische Zuweisung und Ausführung von Druckaufträgen. Er überwacht kontinuierlich den Status der Drucker und der anstehenden Jobs.

+
    +
  • Der Scheduler sollte während des normalen Betriebs immer aktiv sein
  • +
  • Bei Wartungsarbeiten kann der Scheduler vorübergehend deaktiviert werden
  • +
  • Nach einem Neustart des Systems muss der Scheduler manuell gestartet werden
  • +
+
{% endif %} + +
{% endblock %} {% block scripts %} - {% endblock %} \ No newline at end of file diff --git a/backend/install/kiosk.sh b/backend/install/kiosk.sh deleted file mode 100755 index c82a7ebf..00000000 --- a/backend/install/kiosk.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -# Bildschirm-Blanking verhindern -xset s off -xset s noblank -xset -dpms - -# Mauszeiger ausblenden -unclutter -idle 0.5 -root & - -# Chromium-Crash-Dialoge unterdrücken -sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' \ - "$HOME/.config/chromium/Default/Preferences" 2>/dev/null || true -sed -i 's/"exit_type":"Crashed"/"exit_type":"Normal"/' \ - "$HOME/.config/chromium/Default/Preferences" 2>/dev/null || true - -# Hostname und IP ermitteln -HOSTNAME=$(hostname -f) -IP_ADDRESS=$(hostname -I | awk '{print $1}') - -# Browser starten mit SSL-Warnung deaktiviert -chromium-browser --kiosk --noerrdialogs --disable-infobars \ - --window-position=0,0 --ignore-certificate-errors \ - --app=https://${IP_ADDRESS}:5000/ & \ No newline at end of file diff --git a/backend/install/setup.sh b/backend/install/setup.sh deleted file mode 100755 index 1f77ac7e..00000000 --- a/backend/install/setup.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env bash -# MYP Kiosk-Modus Einrichtungsskript - -# Fehlerabbruch aktivieren -set -e - -echo "===== MYP Kiosk-Modus Einrichtungsskript =====" -echo "Dieses Skript richtet MYP für den automatischen Start im Kiosk-Modus ein." -echo "" - -# 1. Benötigte Pakete installieren -echo "1. Installiere benötigte Pakete..." -sudo apt update -sudo apt install -y python3 python3-pip python3-venv chromium-browser \ - unclutter xdotool xscreensaver git - -# 2. Verzeichnis für MYP erstellen und Projekt kopieren -echo "2. Kopiere MYP nach /opt/myp..." -sudo mkdir -p /opt/myp -sudo chown $USER:$USER /opt/myp - -# Aktuelle Verzeichnisstruktur ermitteln -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" -echo "Kopiere Dateien von $SCRIPT_DIR nach /opt/myp..." -cp -r "$SCRIPT_DIR"/* /opt/myp/ - -# 3. Python-Umgebung und Abhängigkeiten einrichten -echo "3. Richte Python-Umgebung ein..." -cd /opt/myp -python3 -m venv .venv -source .venv/bin/activate -pip install -r requirements.txt - -# 4. Systemd-Dienst für Flask-Backend einrichten -echo "4. Richte Flask-Backend-Dienst ein..." -sudo cp /opt/myp/myp.service /etc/systemd/system/ -sudo systemctl daemon-reload -sudo systemctl enable myp.service -sudo systemctl start myp.service - -# 5. Kiosk-Script einrichten -echo "5. Richte Kiosk-Script ein..." -cp /opt/myp/kiosk.sh /home/pi/ -chmod +x /home/pi/kiosk.sh - -# 6. Systemd-User-Dienst für Kiosk einrichten -echo "6. Richte Kiosk-Dienst ein..." -mkdir -p /home/pi/.config/systemd/user -cp /opt/myp/kiosk.service /home/pi/.config/systemd/user/ -systemctl --user daemon-reload -systemctl --user enable kiosk.service - -# 7. Linger für den pi-Benutzer aktivieren -echo "7. Aktiviere User-Linger für pi-Benutzer..." -sudo loginctl enable-linger pi - -# 8. Watchdog-Script einrichten -echo "8. Richte Watchdog-Script ein..." -cp /opt/myp/watchdog.sh /home/pi/ -chmod +x /home/pi/watchdog.sh - -# 9. Cron-Job für Watchdog einrichten -echo "9. Richte Cron-Job für Watchdog ein..." -(crontab -l 2>/dev/null || echo "") | grep -v "watchdog.sh" | { cat; echo "*/5 * * * * /home/pi/watchdog.sh > /dev/null 2>&1"; } | crontab - - -# 10. Automatischen Login einrichten -echo "10. Automatischer Login wird manuell über raspi-config eingerichtet" -echo " Führe 'sudo raspi-config' aus und wähle:" -echo " 1 System Options → S5 Boot/Auto Login → B4 Desktop Autologin" - -# 11. Bildschirm nie ausschalten -echo "11. Deaktiviere Bildschirmschoner..." -sudo sed -i 's/#BLANK_TIME=.*/BLANK_TIME=0/' /etc/xdg/lxsession/LXDE-pi/autostart - -echo "" -echo "===== Installation abgeschlossen =====" -echo "Um die Einrichtung zu vervollständigen, führe 'sudo raspi-config' aus" -echo "und aktiviere den automatischen Login: " -echo "1 System Options → S5 Boot/Auto Login → B4 Desktop Autologin" -echo "" -echo "Nach einem Neustart sollte der Raspberry Pi automatisch:" -echo "1. Die MYP-Flask-Anwendung starten" -echo "2. Den Chromium-Browser im Kiosk-Modus öffnen" -echo "" -echo "MYP ist erreichbar unter: http://localhost:5000/" -echo "" -echo "Ein Watchdog-Script überwacht alle 5 Minuten, ob Chromium und der MYP-Dienst" -echo "noch laufen und startet sie bei Bedarf neu." -echo "" -echo "Starte den Raspberry Pi neu mit 'sudo reboot'" \ No newline at end of file diff --git a/backend/install/watchdog.sh b/backend/install/watchdog.sh deleted file mode 100755 index cf28986c..00000000 --- a/backend/install/watchdog.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash -# MYP Watchdog für Chromium Browser -# Empfohlene Ausführung über crontab: */5 * * * * /home/pi/watchdog.sh > /dev/null 2>&1 - -# Funktion zum Loggen von Nachrichten -log() { - echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> /home/pi/myp-watchdog.log -} - -# Prüfen, ob Chromium läuft -if ! pgrep -x "chromium-browse" > /dev/null; then - log "Chromium nicht gefunden - starte neu" - - # Alle eventuell noch vorhandenen Chromium-Prozesse beenden - pkill -f chromium || true - - # Warten bis alle Prozesse beendet sind - sleep 2 - - # Kiosk-Script neu starten - /home/pi/kiosk.sh - - log "Chromium neugestartet" -else - # Optional: Nur für Debug-Zwecke - # log "Chromium läuft normal" - : -fi - -# Prüfen, ob MYP Flask-Dienst läuft -if ! systemctl is-active --quiet myp.service; then - log "MYP Flask-Dienst ist nicht aktiv - starte neu" - - # Dienst neustarten - sudo systemctl restart myp.service - - log "MYP Flask-Dienst neugestartet" -fi - -exit 0 \ No newline at end of file