📚 Improved backend structure & logs organization 🎉

This commit is contained in:
2025-06-10 10:03:25 +02:00
parent ccd11f0f41
commit af7838e77b
25 changed files with 675 additions and 9 deletions

Binary file not shown.

View File

@ -3777,3 +3777,28 @@ jinja2.exceptions.UndefinedError: 'stats' is undefined
2025-06-09 19:32:13 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/stats
2025-06-09 19:32:13 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/admin/system-health
2025-06-09 19:32:18 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/stats
2025-06-10 10:01:57 - [app] app - [WARNING] WARNING - DatabaseCleanupManager nicht verfügbar - Fallback auf Legacy-Cleanup
2025-06-10 10:01:57 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-10 10:01:58 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
2025-06-10 10:01:58 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-10 10:01:58 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-10 10:01:58 - [app] app - [INFO] INFO - [START] Server startet auf 0.0.0.0:5000
2025-06-10 10:02:14 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-10 10:02:26 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-10 10:02:30 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-10 10:02:32 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-10 10:02:34 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-10 10:02:35 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/printers
2025-06-10 10:02:35 - [app] app - [ERROR] ERROR - Fehler beim Laden des Benutzers 1: (sqlite3.InterfaceError) bad parameter or other API misuse
[SQL: SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.password_hash AS users_password_hash, users.name AS users_name, users.role AS users_role, users.active AS users_active, users.created_at AS users_created_at, users.last_login AS users_last_login, users.updated_at AS users_updated_at, users.settings AS users_settings, users.last_activity AS users_last_activity, users.department AS users_department, users.position AS users_position, users.phone AS users_phone, users.bio AS users_bio, users.theme_preference AS users_theme_preference, users.language_preference AS users_language_preference, users.email_notifications AS users_email_notifications, users.browser_notifications AS users_browser_notifications, users.dashboard_layout AS users_dashboard_layout, users.compact_mode AS users_compact_mode, users.show_completed_jobs AS users_show_completed_jobs, users.auto_refresh_interval AS users_auto_refresh_interval, users.auto_logout_timeout AS users_auto_logout_timeout
FROM users
WHERE users.id = ?
LIMIT ? OFFSET ?]
[parameters: (1, 1, 0)]
(Background on this error at: https://sqlalche.me/e/20/rvf5)
2025-06-10 10:02:35 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-10 10:02:36 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-10 10:02:38 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-10 10:02:40 - [app] app - [ERROR] ERROR - Fehler beim Laden des Benutzers 1: tuple index out of range
2025-06-10 10:02:40 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-10 10:02:40 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system

View File

@ -23,3 +23,7 @@
2025-06-09 19:31:05 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2025-06-09 19:31:05 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet
2025-06-09 19:32:21 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich abgemeldet
2025-06-10 10:02:16 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2025-06-10 10:02:16 - [auth] auth - [WARNING] WARNING - Fehlgeschlagener Login-Versuch für Benutzer admin@example.com
2025-06-10 10:02:24 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2025-06-10 10:02:24 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet

View File

@ -51,3 +51,4 @@
2025-06-09 19:21:30 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-09 19:26:04 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-09 19:30:59 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-10 10:01:58 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert

View File

@ -530,3 +530,14 @@
2025-06-09 19:31:08 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.106): UNREACHABLE (Ping fehlgeschlagen)
2025-06-09 19:31:08 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.102): UNREACHABLE (Ping fehlgeschlagen)
2025-06-09 19:31:08 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 6 Drucker
2025-06-10 10:01:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-10 10:01:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-10 10:02:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-10 10:02:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Prüfe Status von 6 aktiven Druckern...
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.101): UNREACHABLE (Ping fehlgeschlagen)
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.100): UNREACHABLE (Ping fehlgeschlagen)
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.104): UNREACHABLE (Ping fehlgeschlagen)
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.106): UNREACHABLE (Ping fehlgeschlagen)
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.102): UNREACHABLE (Ping fehlgeschlagen)
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.103): UNREACHABLE (Ping fehlgeschlagen)
2025-06-10 10:02:35 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 6 Drucker

View File

@ -309,3 +309,6 @@
2025-06-09 19:32:13 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-09 19:32:13 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 6 Drucker
2025-06-09 19:32:13 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.53ms
2025-06-10 10:02:26 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-10 10:02:35 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 6 Drucker
2025-06-10 10:02:35 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 9039.95ms

View File

@ -251,3 +251,14 @@
2025-06-09 19:32:29 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop
2025-06-09 19:32:29 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet
2025-06-09 19:32:29 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestoppt
2025-06-10 10:01:58 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Initialisiere neuen Queue-Manager...
2025-06-10 10:01:58 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Zentrale Shutdown-Verwaltung erkannt - deaktiviere lokale Signal-Handler
2025-06-10 10:01:58 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Starte Printer Queue Manager...
2025-06-10 10:01:58 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden)
2025-06-10 10:01:58 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet
2025-06-10 10:01:58 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet
2025-06-10 10:02:43 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Stoppe Queue-Manager...
2025-06-10 10:02:43 - [queue_manager] queue_manager - [INFO] INFO - ⏳ Warte auf Monitor-Thread...
2025-06-10 10:02:43 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop
2025-06-10 10:02:43 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet
2025-06-10 10:02:43 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestoppt

View File

@ -112,3 +112,6 @@
2025-06-09 19:30:59 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-09 19:30:59 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-09 19:30:59 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
2025-06-10 10:01:58 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-10 10:01:58 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-10 10:01:58 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet

View File

@ -51,3 +51,4 @@
2025-06-09 19:21:30 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-09 19:26:04 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-09 19:30:59 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-10 10:01:58 - [security] security - [INFO] INFO - 🔒 Security System initialisiert

View File

@ -393,3 +393,12 @@
2025-06-09 19:30:59 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: /cbin/C0S1-cernel/C02L2/Dateiverwaltung/nextcloud/core/files/3_Beruf_Ausbildung_und_Schule/IHK-Abschlussprüfung/Projektarbeit-MYP/backend
2025-06-09 19:30:59 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-09T19:30:59.553304
2025-06-09 19:30:59 - [startup] startup - [INFO] INFO - ==================================================
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - ==================================================
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-10T10:01:58.167336
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-10 10:01:58 - [startup] startup - [INFO] INFO - ==================================================

View File

@ -15,3 +15,11 @@
2025-06-09 19:31:23 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.104 nicht erreichbar
2025-06-09 19:31:25 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.106 nicht erreichbar
2025-06-09 19:31:25 - [tapo_control] tapo_control - [INFO] INFO - Dashboard geladen: 6 Steckdosen, 0 online
2025-06-10 10:02:28 - [tapo_control] tapo_control - [INFO] INFO - Tapo Dashboard aufgerufen von Benutzer: Administrator
2025-06-10 10:02:30 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.100 nicht erreichbar
2025-06-10 10:02:32 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.101 nicht erreichbar
2025-06-10 10:02:34 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.102 nicht erreichbar
2025-06-10 10:02:36 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.103 nicht erreichbar
2025-06-10 10:02:38 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.104 nicht erreichbar
2025-06-10 10:02:40 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.106 nicht erreichbar
2025-06-10 10:02:40 - [tapo_control] tapo_control - [INFO] INFO - Dashboard geladen: 6 Steckdosen, 0 online

View File

@ -273,3 +273,13 @@
2025-06-09 19:31:01 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 6/6: 192.168.0.105
2025-06-09 19:31:01 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ steckdosen-erkennung abgeschlossen: 0/6 steckdosen gefunden in 0.0s
2025-06-09 19:31:17 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ tapo controller initialisiert
2025-06-10 10:01:58 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ tapo controller initialisiert
2025-06-10 10:02:00 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 starte automatische tapo-steckdosenerkennung...
2025-06-10 10:02:00 - [tapo_controller] tapo_controller - [INFO] INFO - 🔄 teste 6 standard-ips aus der konfiguration
2025-06-10 10:02:00 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 1/6: 192.168.0.103
2025-06-10 10:02:06 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 2/6: 192.168.0.104
2025-06-10 10:02:12 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 3/6: 192.168.0.100
2025-06-10 10:02:18 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 4/6: 192.168.0.101
2025-06-10 10:02:24 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 5/6: 192.168.0.102
2025-06-10 10:02:30 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 6/6: 192.168.0.105
2025-06-10 10:02:36 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ steckdosen-erkennung abgeschlossen: 0/6 steckdosen gefunden in 36.0s

View File

@ -92,3 +92,4 @@
2025-06-09 19:32:03 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-09 19:32:06 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-09 19:32:13 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-10 10:02:26 - [user] user - [INFO] INFO - User admin retrieved settings via API

View File

@ -54,3 +54,7 @@
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-05 11:12:31 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-10 10:01:57 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-10 10:01:57 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-10 10:01:57 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-10 10:01:57 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet

View File

@ -5285,10 +5285,14 @@ show_main_menu() {
echo -e "${GREEN}[4]${NC} ${YELLOW}Credentials anpassen${NC}"
echo -e " → Passwörter und Zugangsdaten ändern"
echo ""
echo -e "${GREEN}[5]${NC} ${PURPLE}Desktop-Verknüpfung erstellen${NC}"
echo -e " → Mercedes-Icon auf Desktop für Kiosk-Start"
echo -e " → Manuelle Kiosk-Aktivierung per Klick"
echo ""
echo -e "${GREEN}[0]${NC} ${RED}Beenden${NC}"
echo ""
echo -e "${CYAN}=================================================================${NC}"
echo -n "Ihre Auswahl [0-4]: "
echo -n "Ihre Auswahl [0-5]: "
}
handle_menu_selection() {
@ -5312,6 +5316,10 @@ handle_menu_selection() {
interactive_credentials_setup
save_credentials_override
;;
5)
log "🖥️ Benutzer wählte: Desktop-Verknüpfung erstellen"
create_desktop_shortcut_interactive
;;
0)
log "👋 Benutzer beendet das Setup"
echo -e "\n${GREEN}Auf Wiedersehen! 👋${NC}"
@ -5319,7 +5327,7 @@ handle_menu_selection() {
;;
*)
warning "❌ Ungültige Auswahl: $choice"
echo -e "\n${RED}Bitte wählen Sie eine Zahl zwischen 0 und 4.${NC}"
echo -e "\n${RED}Bitte wählen Sie eine Zahl zwischen 0 und 5.${NC}"
sleep 2
;;
esac
@ -5457,6 +5465,383 @@ show_system_status() {
read
}
create_desktop_shortcut_interactive() {
clear
echo -e "${CYAN}=================================================================${NC}"
echo -e "${CYAN} DESKTOP-VERKNÜPFUNG ERSTELLEN${NC}"
echo -e "${CYAN}=================================================================${NC}"
echo ""
echo -e "${YELLOW}🖥️ Was wird erstellt:${NC}"
echo -e " • Desktop-Icon mit Mercedes-Logo"
echo -e " • Kiosk-Start per Doppelklick"
echo -e " • Automatische Browser-Erkennung"
echo -e " • Intelligente URL-Ermittlung"
echo ""
echo -e "${PURPLE}📍 Verfügbare Desktop-Umgebungen:${NC}"
# Erkenne verfügbare Desktop-Umgebungen
local desktops_found=()
if [ -d "/home/$USER/Desktop" ]; then
desktops_found+=("Aktueller Benutzer: /home/$USER/Desktop")
fi
if [ -d "/home/kiosk/Desktop" ]; then
desktops_found+=("Kiosk-Benutzer: /home/kiosk/Desktop")
fi
if [ -d "/etc/skel/Desktop" ]; then
desktops_found+=("System-Standard: /etc/skel/Desktop")
fi
if [ ${#desktops_found[@]} -eq 0 ]; then
echo -e " ${RED}❌ Keine Desktop-Verzeichnisse gefunden${NC}"
echo -e " ${YELLOW}💡 Desktop-Environment möglicherweise nicht installiert${NC}"
echo ""
echo -n "Trotzdem fortfahren und Desktop-Verzeichnisse erstellen? (j/N): "
read -r create_desktop
if [[ ! "$create_desktop" =~ ^[jJyY]$ ]]; then
echo -e "${YELLOW}Abgebrochen.${NC}"
sleep 1
return
fi
else
for desktop in "${desktops_found[@]}"; do
echo -e "$desktop"
done
fi
echo ""
echo -n "Desktop-Verknüpfung erstellen? (j/N): "
read -r confirm
if [[ "$confirm" =~ ^[jJyY]$ ]]; then
log "✅ Benutzer bestätigte Desktop-Verknüpfung-Erstellung"
create_desktop_shortcut
echo ""
echo -e "${GREEN}✅ Desktop-Verknüpfung erfolgreich erstellt!${NC}"
echo -e "${BLUE}🖱️ Doppelklick auf das Mercedes-Icon zum Starten${NC}"
echo ""
echo -n "Drücken Sie Enter um zum Hauptmenü zurückzukehren..."
read
else
log "❌ Benutzer brach Desktop-Verknüpfung-Erstellung ab"
echo -e "${YELLOW}Erstellung abgebrochen.${NC}"
sleep 1
fi
}
create_desktop_shortcut() {
log "=== ERSTELLE DESKTOP-VERKNÜPFUNG ==="
# Erstelle Kiosk-Start-Skript
create_kiosk_launcher_script
# Erstelle Desktop-Einträge für alle verfügbaren Benutzer
create_desktop_entries
# Setze korrekte Berechtigungen
fix_desktop_permissions
log "✅ Desktop-Verknüpfung erfolgreich erstellt"
}
create_kiosk_launcher_script() {
log "=== ERSTELLE KIOSK-LAUNCHER-SKRIPT ==="
mkdir -p "$APP_DIR/scripts"
cat > "$APP_DIR/scripts/launch_kiosk.sh" << 'EOF'
#!/bin/bash
# MYP Kiosk-Modus Launcher
# Startet die MYP-Anwendung im Kiosk-Modus
# Logging-Setup
LOG_FILE="/var/log/myp-desktop-launcher.log"
exec 1> >(tee -a "$LOG_FILE")
exec 2>&1
echo "=== MYP Kiosk Desktop-Start $(date) ==="
# Prüfe ob bereits ein Kiosk-Prozess läuft
if pgrep -f "chromium.*kiosk.*localhost:5000" >/dev/null 2>&1; then
echo "⚠️ Kiosk-Modus bereits aktiv - bringe Fenster in den Vordergrund"
# Versuche existierendes Fenster zu aktivieren
if command -v wmctrl >/dev/null 2>&1; then
wmctrl -a "MYP Druckerverwaltung" 2>/dev/null || true
fi
exit 0
fi
# Ermittle optimale URL
if [ -x /opt/myp/scripts/get_kiosk_url.sh ]; then
TARGET_URL=$(/opt/myp/scripts/get_kiosk_url.sh)
else
TARGET_URL="http://localhost:5000"
fi
echo "🔗 Verwende URL: $TARGET_URL"
# Prüfe Backend-Verfügbarkeit
echo "🔍 Prüfe Backend-Verfügbarkeit..."
for i in {1..30}; do
if curl -s --connect-timeout 3 --max-time 5 "$TARGET_URL" >/dev/null 2>&1; then
echo "✅ Backend erreichbar"
break
fi
echo "⏳ Warte auf Backend... ($i/30)"
sleep 2
done
# Browser-Auswahl
BROWSER=""
if command -v chromium >/dev/null 2>&1; then
BROWSER="chromium"
elif command -v chromium-browser >/dev/null 2>&1; then
BROWSER="chromium-browser"
elif command -v google-chrome >/dev/null 2>&1; then
BROWSER="google-chrome"
elif command -v firefox-esr >/dev/null 2>&1; then
BROWSER="firefox-esr"
elif command -v firefox >/dev/null 2>&1; then
BROWSER="firefox"
else
echo "❌ Kein unterstützter Browser gefunden!"
zenity --error --text="Kein unterstützter Browser gefunden!\n\nBitte installieren Sie Chromium oder Firefox." --title="MYP Kiosk-Fehler" 2>/dev/null || \
notify-send "MYP Kiosk-Fehler" "Kein unterstützter Browser gefunden!" 2>/dev/null || \
echo "FEHLER: Kein Browser verfügbar"
exit 1
fi
echo "🌐 Verwende Browser: $BROWSER"
# Bildschirmauflösung ermitteln
if [ -n "$DISPLAY" ]; then
RESOLUTION=$(xrandr 2>/dev/null | grep -E '\*|\+' | head -1 | awk '{print $1}' || echo "1920x1080")
WIDTH=$(echo $RESOLUTION | cut -d'x' -f1)
HEIGHT=$(echo $RESOLUTION | cut -d'x' -f2)
echo "📺 Bildschirmauflösung: ${WIDTH}x${HEIGHT}"
else
WIDTH=1920
HEIGHT=1080
echo "📺 Verwende Standard-Auflösung: ${WIDTH}x${HEIGHT}"
fi
# Browser-spezifische Argumente
if [[ "$BROWSER" == "chromium"* ]] || [[ "$BROWSER" == "google-chrome"* ]]; then
BROWSER_ARGS=(
--kiosk
--no-sandbox
--disable-dev-shm-usage
--disable-gpu-sandbox
--disable-software-rasterizer
--disable-background-timer-throttling
--disable-backgrounding-occluded-windows
--disable-renderer-backgrounding
--disable-features=TranslateUI
--force-device-scale-factor=1.0
--window-size=$WIDTH,$HEIGHT
--window-position=0,0
--user-data-dir=/tmp/myp-kiosk-desktop
--disable-infobars
--disable-session-crashed-bubble
--disable-restore-session-state
--disable-extensions
--disable-plugins
--disable-popup-blocking
--disable-sync
--disable-translate
--noerrdialogs
--no-first-run
--no-default-browser-check
--autoplay-policy=no-user-gesture-required
--disable-background-mode
--disable-pinch
--hide-scrollbars
--ignore-certificate-errors
--ignore-ssl-errors
--disable-web-security
--allow-running-insecure-content
--app="$TARGET_URL"
)
else
# Firefox-Argumente
BROWSER_ARGS=(
--kiosk
--width=$WIDTH
--height=$HEIGHT
--no-remote
--new-instance
"$TARGET_URL"
)
fi
echo "🚀 Starte $BROWSER im Kiosk-Modus..."
# Browser starten
"$BROWSER" "${BROWSER_ARGS[@]}" &
BROWSER_PID=$!
echo "✅ Browser gestartet (PID: $BROWSER_PID)"
echo "🎯 Kiosk-Modus aktiv für URL: $TARGET_URL"
# Optional: Warte auf Browser-Beendigung
wait $BROWSER_PID
echo "🔚 Kiosk-Modus beendet"
EOF
chmod +x "$APP_DIR/scripts/launch_kiosk.sh"
log "✅ Kiosk-Launcher-Skript erstellt: $APP_DIR/scripts/launch_kiosk.sh"
}
create_desktop_entries() {
log "=== ERSTELLE DESKTOP-EINTRÄGE ==="
# Mercedes-Icon kopieren an zentrale Stelle
local icon_dir="/usr/share/pixmaps"
local icon_source="$CURRENT_DIR/static/mercedes.svg"
# Fallback-Pfade für das Mercedes-Icon
if [ ! -f "$icon_source" ]; then
icon_source="$APP_DIR/static/mercedes.svg"
fi
if [ ! -f "$icon_source" ]; then
icon_source="$(find "$CURRENT_DIR" -name "mercedes.svg" 2>/dev/null | head -1)"
fi
local icon_target="$icon_dir/myp-mercedes.svg"
if [ -f "$icon_source" ]; then
cp "$icon_source" "$icon_target" 2>/dev/null || {
# Fallback: Icon in App-Verzeichnis
mkdir -p "$APP_DIR/static"
cp "$icon_source" "$APP_DIR/static/mercedes.svg"
icon_target="$APP_DIR/static/mercedes.svg"
}
log "✅ Mercedes-Icon kopiert: $icon_target"
else
warning "⚠️ Mercedes-Icon nicht gefunden: $icon_source"
icon_target="applications-graphics" # Fallback-Icon
fi
# Desktop-Entry-Inhalt
local desktop_content="[Desktop Entry]
Version=1.0
Type=Application
Name=MYP Druckerverwaltung (Kiosk)
Comment=Starte MYP Druckerverwaltung im Kiosk-Modus
Exec=$APP_DIR/scripts/launch_kiosk.sh
Icon=$icon_target
Terminal=false
Categories=Office;Graphics;3DGraphics;Engineering;
StartupNotify=true
StartupWMClass=chromium-browser
Keywords=3D;Printing;Drucker;Kiosk;MYP;Mercedes;
MimeType=model/stl;model/obj;text/x.gcode;
Actions=OpenBrowser;OpenSettings;
[Desktop Action OpenBrowser]
Name=Im Browser öffnen
Exec=xdg-open http://localhost:5000
[Desktop Action OpenSettings]
Name=Einstellungen
Exec=$APP_DIR/scripts/launch_kiosk.sh --settings"
# Desktop-Einträge für verschiedene Benutzer erstellen
local desktop_dirs=(
"/home/$USER/Desktop"
"/home/kiosk/Desktop"
"/etc/skel/Desktop"
"/usr/share/applications" # System-weit verfügbar
)
for desktop_dir in "${desktop_dirs[@]}"; do
if [ "$desktop_dir" = "/usr/share/applications" ] || [ -d "$(dirname "$desktop_dir")" ]; then
mkdir -p "$desktop_dir" 2>/dev/null || continue
local desktop_file="$desktop_dir/myp-kiosk.desktop"
echo "$desktop_content" > "$desktop_file" 2>/dev/null && {
chmod +x "$desktop_file" 2>/dev/null || true
log "✅ Desktop-Eintrag erstellt: $desktop_file"
}
fi
done
# Spezielle Behandlung für aktuellen Benutzer-Desktop
if [ -n "$SUDO_USER" ] && [ "$SUDO_USER" != "root" ]; then
local user_desktop="/home/$SUDO_USER/Desktop"
mkdir -p "$user_desktop" 2>/dev/null || true
if [ -d "$user_desktop" ]; then
local user_desktop_file="$user_desktop/myp-kiosk.desktop"
echo "$desktop_content" > "$user_desktop_file" 2>/dev/null && {
chmod +x "$user_desktop_file" 2>/dev/null || true
chown "$SUDO_USER:$SUDO_USER" "$user_desktop_file" 2>/dev/null || true
log "✅ Benutzer-Desktop-Eintrag erstellt: $user_desktop_file"
}
fi
fi
}
fix_desktop_permissions() {
log "=== KORRIGIERE DESKTOP-BERECHTIGUNGEN ==="
# Desktop-Dateien für verschiedene Benutzer korrigieren
local users=("$USER" "kiosk")
if [ -n "$SUDO_USER" ] && [ "$SUDO_USER" != "root" ]; then
users+=("$SUDO_USER")
fi
for user in "${users[@]}"; do
if id "$user" >/dev/null 2>&1; then
local user_desktop="/home/$user/Desktop"
if [ -d "$user_desktop" ]; then
chown -R "$user:$user" "$user_desktop" 2>/dev/null || true
find "$user_desktop" -name "*.desktop" -exec chmod +x {} \; 2>/dev/null || true
log "✅ Berechtigungen korrigiert für: $user"
fi
fi
done
# System-weite Desktop-Datei
if [ -f "/usr/share/applications/myp-kiosk.desktop" ]; then
chmod 644 "/usr/share/applications/myp-kiosk.desktop" 2>/dev/null || true
log "✅ System-weite Desktop-Datei konfiguriert"
fi
# Update Desktop-Datenbank
if command -v update-desktop-database >/dev/null 2>&1; then
update-desktop-database /usr/share/applications 2>/dev/null || true
log "✅ Desktop-Datenbank aktualisiert"
fi
}
install_desktop_tools() {
log "=== INSTALLIERE DESKTOP-TOOLS ==="
# Tools für bessere Desktop-Integration installieren
local desktop_packages=(
"wmctrl" # Fenster-Management
"xdotool" # X11-Automatisierung
"zenity" # GUI-Dialoge
"notify-osd" # Desktop-Benachrichtigungen
"libnotify-bin" # notify-send Kommando
"unclutter" # Mauszeiger verstecken
)
progress "Installiere Desktop-Integration-Tools..."
for package in "${desktop_packages[@]}"; do
if ! dpkg -l | grep -q "^ii.*$package" 2>/dev/null; then
if apt-get install -y "$package" 2>/dev/null; then
log "$package installiert"
else
warning "⚠️ $package konnte nicht installiert werden"
fi
else
log "$package bereits installiert"
fi
done
log "✅ Desktop-Tools-Installation abgeschlossen"
}
# =========================== HAUPTPROGRAMM (INTERAKTIV) ===========================
main() {
# Stelle sicher, dass wir im richtigen Verzeichnis sind
@ -5566,6 +5951,9 @@ install_dependencies_only_auto() {
deploy_application
install_npm_dependencies
# Desktop-Tools für bessere Benutzererfahrung installieren
install_desktop_tools
# Credentials deployen
deploy_credentials
@ -5577,6 +5965,20 @@ install_dependencies_only_auto() {
install_systemd_services
enable_and_start_services
# Intelligente Kiosk-URL-Ermittlung erstellen
create_smart_kiosk_url_script
# Desktop-Verknüpfung für einfachen Zugang erstellen
if [ -n "$DISPLAY" ] || [ -d "/home/*/Desktop" ] 2>/dev/null; then
if create_desktop_shortcut 2>/dev/null; then
info "✅ Desktop-Verknüpfung mit Mercedes-Icon erstellt"
else
warning "⚠️ Desktop-Verknüpfung konnte nicht erstellt werden"
fi
else
info " Keine Desktop-Umgebung erkannt - Desktop-Verknüpfung übersprungen"
fi
# Performance-Optimierungen auch für manuelles Testen
optimize_webapp_performance
optimize_static_assets
@ -5642,6 +6044,9 @@ install_full_production_system_auto() {
deploy_application
install_npm_dependencies
# Desktop-Tools für bessere Benutzererfahrung installieren
install_desktop_tools
# Credentials deployen
deploy_credentials
@ -5673,6 +6078,16 @@ install_full_production_system_auto() {
install_systemd_services
enable_and_start_services
# Intelligente Kiosk-URL-Ermittlung erstellen
create_smart_kiosk_url_script
# Desktop-Verknüpfung für einfachen Zugang erstellen
if create_desktop_shortcut 2>/dev/null; then
info "✅ Desktop-Verknüpfung mit Mercedes-Icon erstellt"
else
warning "⚠️ Desktop-Verknüpfung konnte nicht erstellt werden"
fi
# Performance-Optimierungen für Raspberry Pi Webapp
optimize_webapp_performance
@ -5758,6 +6173,7 @@ show_final_summary() {
echo -e " ✅ Automatischer Kiosk-Start beim Boot"
echo -e " ✅ Firewall und Sicherheitskonfiguration"
echo -e " ✅ Performance-Optimierungen"
echo -e " ✅ Desktop-Verknüpfung mit Mercedes-Icon"
echo ""
echo -e "${YELLOW}🚀 System-Status:${NC}"
echo -e " 🌐 Webapp: $HTTP_URL"
@ -5779,6 +6195,7 @@ show_final_summary() {
echo -e " ✅ Anwendung deployed nach: $APP_DIR"
echo -e " ✅ Systemd-Services installiert"
echo -e " ✅ Performance-Optimierungen"
echo -e " ✅ Desktop-Verknüpfung mit Mercedes-Icon"
echo ""
echo -e "${YELLOW}🚀 System-Status:${NC}"
echo -e " 🌐 Webapp: $HTTP_URL"
@ -5786,9 +6203,10 @@ show_final_summary() {
echo ""
echo -e "${PURPLE}💡 Nächste Schritte:${NC}"
echo -e " 1. Webapp testen: $HTTP_URL"
echo -e " 2. Manuelle Tests durchführen"
echo -e " 3. Entwicklung starten: cd $APP_DIR"
echo -e " 4. Für Kiosk-Modus: sudo $0 --production"
echo -e " 2. Kiosk-Modus testen: Doppelklick auf Mercedes-Icon"
echo -e " 3. Manuelle Tests durchführen"
echo -e " 4. Entwicklung starten: cd $APP_DIR"
echo -e " 5. Für Produktions-Kiosk: sudo $0 --production"
;;
esac
@ -5808,5 +6226,110 @@ show_final_summary() {
echo -e "${CYAN}=================================================================${NC}"
}
# =========================== INTELLIGENTE KIOSK-URL KONFIGURATION ===========================
get_kiosk_url() {
log "=== ERMITTLE OPTIMALE KIOSK-URL ==="
local kiosk_url="http://localhost:5000"
local intranet_url="https://m040tbaraspi001.de040.corpintra.net"
# Prüfe ob localhost erreichbar ist
if curl -s --connect-timeout 3 --max-time 5 "http://localhost:5000" >/dev/null 2>&1; then
log "✅ Localhost erreichbar - verwende lokale URL"
echo "$kiosk_url"
return
fi
# Prüfe ob Intranet erreichbar ist
if curl -s --connect-timeout 5 --max-time 10 "$intranet_url" >/dev/null 2>&1; then
log "✅ Intranet erreichbar - verwende Intranet-URL"
echo "$intranet_url"
return
fi
# Fallback: Versuche lokale IP-Adresse
local local_ip=$(ip route get 1 2>/dev/null | awk '{print $7}' | head -1)
if [ -n "$local_ip" ] && [ "$local_ip" != "127.0.0.1" ]; then
local ip_url="http://$local_ip:5000"
if curl -s --connect-timeout 3 --max-time 5 "$ip_url" >/dev/null 2>&1; then
log "✅ Lokale IP erreichbar - verwende IP-URL: $ip_url"
echo "$ip_url"
return
fi
fi
# Finaler Fallback: localhost
log "⚠️ Fallback auf localhost - Backend möglicherweise noch nicht gestartet"
echo "$kiosk_url"
}
create_smart_kiosk_url_script() {
log "=== ERSTELLE INTELLIGENTE KIOSK-URL ERMITTLUNG ==="
cat > "$APP_DIR/scripts/get_kiosk_url.sh" << 'EOF'
#!/bin/bash
# Intelligente Kiosk-URL-Ermittlung für MYP
# Priorisiert lokale Verbindung, fällt auf Intranet zurück
LOCALHOST_URL="http://localhost:5000"
INTRANET_URL="https://m040tbaraspi001.de040.corpintra.net"
# Funktion: URL testen
test_url() {
local url="$1"
local timeout="${2:-5}"
curl -s --connect-timeout "$timeout" --max-time "$timeout" "$url" >/dev/null 2>&1
return $?
}
# Priorisierte URL-Tests
echo "[$(date)] Ermittle optimale Kiosk-URL..." >> /var/log/kiosk-url.log
# 1. Priorität: Localhost (schnellste Option für Kiosk)
if test_url "$LOCALHOST_URL" 3; then
echo "[$(date)] Localhost verfügbar: $LOCALHOST_URL" >> /var/log/kiosk-url.log
echo "$LOCALHOST_URL"
exit 0
fi
# 2. Priorität: Intranet-URL (für Remote-Zugang)
if test_url "$INTRANET_URL" 8; then
echo "[$(date)] Intranet verfügbar: $INTRANET_URL" >> /var/log/kiosk-url.log
echo "$INTRANET_URL"
exit 0
fi
# 3. Priorität: Lokale IP-Adresse
LOCAL_IP=$(ip route get 1 2>/dev/null | awk '{print $7}' | head -1)
if [ -n "$LOCAL_IP" ] && [ "$LOCAL_IP" != "127.0.0.1" ]; then
IP_URL="http://$LOCAL_IP:5000"
if test_url "$IP_URL" 5; then
echo "[$(date)] Lokale IP verfügbar: $IP_URL" >> /var/log/kiosk-url.log
echo "$IP_URL"
exit 0
fi
fi
# 4. Fallback: Hostname-URL
HOSTNAME_URL="http://$(hostname):5000"
if test_url "$HOSTNAME_URL" 5; then
echo "[$(date)] Hostname verfügbar: $HOSTNAME_URL" >> /var/log/kiosk-url.log
echo "$HOSTNAME_URL"
exit 0
fi
# Finaler Fallback: Localhost (auch wenn nicht erreichbar)
echo "[$(date)] Fallback auf Localhost: $LOCALHOST_URL" >> /var/log/kiosk-url.log
echo "$LOCALHOST_URL"
EOF
chmod +x "$APP_DIR/scripts/get_kiosk_url.sh"
log "✅ Intelligente Kiosk-URL-Ermittlung erstellt: $APP_DIR/scripts/get_kiosk_url.sh"
}
# =========================== KIOSK-KONFIGURATION MIT INTELLIGENTER URL ===========================
# Skript starten mit automatischer Modus-Erkennung
main "$@"
main "$@"

View File

@ -162,8 +162,9 @@ ExecStart=/bin/bash -c '\
--new-instance"; \
fi; \
\
# URL mit Fallback \
TARGET_URL="http://localhost:5000"; \
# URL mit intelligenter Ermittlung \
TARGET_URL=$(/opt/myp/scripts/get_kiosk_url.sh); \
[ -z "$TARGET_URL" ] && TARGET_URL="http://localhost:5000"; \
\
# Browser starten mit Fehlerbehandlung \
echo "🖥️ Starte $BROWSER im Kiosk-Modus..."; \

View File

@ -167,6 +167,55 @@ MAIL_USE_TLS = get_env_variable('MAIL_USE_TLS', 'true').lower() in ['true', 'on'
MAIL_USERNAME = get_env_variable('MAIL_USERNAME')
MAIL_PASSWORD = get_env_variable('MAIL_PASSWORD')
# ===== NETZWERK-KONFIGURATION =====
# Host-Konfiguration für lokalen und Intranet-Zugang
FLASK_HOST = get_env_variable("FLASK_HOST", "0.0.0.0")
FLASK_PORT = int(get_env_variable("FLASK_PORT", "5000"))
FLASK_FALLBACK_PORT = 8080
# Hostname-Konfiguration für Intranet-Zugang
HOSTNAME = "m040tbaraspi001"
INTRANET_DOMAIN = "de040.corpintra.net"
FULL_HOSTNAME = f"{HOSTNAME}.{INTRANET_DOMAIN}"
# Erlaubte Hosts für CORS und Security
ALLOWED_HOSTS = [
"localhost",
"127.0.0.1",
HOSTNAME,
FULL_HOSTNAME,
"0.0.0.0"
]
# URL-Konfiguration
BASE_URL_LOCAL = f"http://localhost:{FLASK_PORT}"
BASE_URL_INTRANET = f"https://{FULL_HOSTNAME}"
# Automatische URL-Ermittlung basierend auf Request
def get_base_url(request=None):
"""
Ermittelt die korrekte Base-URL basierend auf dem Request
Args:
request: Flask Request Objekt (optional)
Returns:
str: Base URL für die Anwendung
"""
if request:
host = request.host
if FULL_HOSTNAME in host:
return BASE_URL_INTRANET
elif "localhost" in host or "127.0.0.1" in host:
return BASE_URL_LOCAL
else:
# Fallback basierend auf Request-Schema
scheme = "https" if request.is_secure else "http"
return f"{scheme}://{host}"
# Fallback ohne Request
return BASE_URL_LOCAL
# ===== HILFSFUNKTIONEN =====
def get_log_file(category: str) -> str:

View File

@ -124,7 +124,9 @@ subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = *.localhost
DNS.3 = 127.0.0.1
DNS.3 = m040tbaraspi001
DNS.4 = m040tbaraspi001.de040.corpintra.net
DNS.5 = *.de040.corpintra.net
IP.1 = 127.0.0.1
IP.2 = 0.0.0.0
"""