diff --git a/backend/app/FEHLER_BEHOBEN.md b/backend/app/docs/FEHLER_BEHOBEN_ROOT.md similarity index 100% rename from backend/app/FEHLER_BEHOBEN.md rename to backend/app/docs/FEHLER_BEHOBEN_ROOT.md diff --git a/backend/app/README.md b/backend/app/docs/README_HAUPTVERZEICHNIS.md similarity index 100% rename from backend/app/README.md rename to backend/app/docs/README_HAUPTVERZEICHNIS.md diff --git a/backend/app/installer.sh b/backend/app/installer.sh index 4f842105..0ebccddf 100644 --- a/backend/app/installer.sh +++ b/backend/app/installer.sh @@ -1,20 +1,19 @@ #!/bin/bash # =================================================================== -# MYP Druckerverwaltung - Konsolidiertes Installations- und Kiosk-Setup -# Kombiniert alle .sh-Skripte und implementiert Kiosk-Modus für Raspberry Pi -# Automatischer Start ohne Benutzeranmeldung über systemd +# MYP Druckerverwaltung - Installer für Raspbian Kiosk-System +# Entwickelt auf Windows, ausführbar auf Raspberry Pi / Debian +# OHNE virtualenv - verwendet System-Python mit --break-system-packages # =================================================================== set -euo pipefail # =========================== KONFIGURATION =========================== -KIOSK_USER="kiosk" -APP_USER="myp" -APP_DIR="/opt/myp-druckerverwaltung" +APP_NAME="MYP Druckerverwaltung" +APP_DIR="/opt/myp" +SERVICE_NAME="myp-kiosk" CURRENT_DIR="$(pwd)" -INSTALL_LOG="/var/log/myp-kiosk-install.log" -CHROMIUM_BIN="" +INSTALL_LOG="/var/log/myp-install.log" # Farben für Ausgabe RED='\033[0;31m' @@ -54,564 +53,309 @@ check_root() { export PATH="/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/bin:$PATH" } -detect_system() { - log "Erkenne System-Umgebung..." - - # Aktuelle Position ermitteln - CURRENT_DIR="$(pwd)" - log "Aktuelles Verzeichnis: $CURRENT_DIR" - - # System-Info sammeln - info "System: $(uname -a)" - info "Distribution: $(lsb_release -d 2>/dev/null || cat /etc/os-release | head -1 || echo 'Unbekannt')" - - # Internetverbindung testen - if ! ping -c 1 google.com &> /dev/null; then - error "Keine Internetverbindung verfügbar!" +check_debian_system() { + if [ ! -f /etc/debian_version ]; then + error "Dieses Skript ist nur für Debian/Raspbian-Systeme geeignet!" fi - - log "✅ System-Checks erfolgreich" + log "✅ Debian/Raspbian-System erkannt" } -# ========================== SYSTEM-UPDATE ========================== -update_system() { - log "=== SYSTEM-UPDATE ===" +# ========================== ABHÄNGIGKEITEN INSTALLIEREN ========================== +install_system_dependencies() { + log "=== INSTALLIERE SYSTEM-ABHÄNGIGKEITEN ===" progress "Aktualisiere Paketlisten..." apt-get update -y || error "APT Update fehlgeschlagen" - progress "Upgrade bestehender Pakete..." - apt-get upgrade -y || warning "APT Upgrade teilweise fehlgeschlagen" - - progress "Installiere essenzielle System-Tools..." + progress "Installiere Python 3 und grundlegende Pakete..." apt-get install -y \ - ca-certificates gnupg lsb-release software-properties-common \ - apt-transport-https curl wget git unzip nano htop rsync \ - sudo cron logrotate tree zip keyboard-configuration \ - console-setup console-data kbd locales \ - || error "Essenzielle Pakete Installation fehlgeschlagen" + python3 \ + python3-pip \ + python3-dev \ + python3-setuptools \ + build-essential \ + libssl-dev \ + libffi-dev \ + git \ + curl \ + wget \ + nano \ + htop \ + rsync \ + unzip \ + sudo \ + systemd \ + ca-certificates \ + gnupg \ + lsb-release \ + sqlite3 \ + || error "System-Pakete Installation fehlgeschlagen" - log "✅ System-Update abgeschlossen" + progress "Installiere Python-Abhängigkeiten mit --break-system-packages..." + + # Core Flask Framework + pip3 install --break-system-packages Flask==3.1.1 || error "Flask Installation fehlgeschlagen" + pip3 install --break-system-packages Flask-Login==0.6.3 || error "Flask-Login Installation fehlgeschlagen" + pip3 install --break-system-packages Flask-WTF==1.2.1 || error "Flask-WTF Installation fehlgeschlagen" + + # Datenbank + pip3 install --break-system-packages SQLAlchemy==2.0.36 || error "SQLAlchemy Installation fehlgeschlagen" + + # Sicherheit + pip3 install --break-system-packages bcrypt==4.2.1 || error "bcrypt Installation fehlgeschlagen" + pip3 install --break-system-packages cryptography==44.0.0 || error "cryptography Installation fehlgeschlagen" + pip3 install --break-system-packages Werkzeug==3.1.3 || error "Werkzeug Installation fehlgeschlagen" + + # Smart Plug Steuerung + pip3 install --break-system-packages PyP100 || warning "PyP100 Installation fehlgeschlagen (optional)" + + # HTTP Requests + pip3 install --break-system-packages requests==2.32.3 || error "requests Installation fehlgeschlagen" + + # System Monitoring + pip3 install --break-system-packages psutil==6.1.1 || error "psutil Installation fehlgeschlagen" + + # Redis (optional) + pip3 install --break-system-packages redis==5.2.1 || warning "redis Installation fehlgeschlagen (optional)" + + # Weitere Core-Abhängigkeiten + pip3 install --break-system-packages MarkupSafe==3.0.2 || error "MarkupSafe Installation fehlgeschlagen" + + # Produktions-Server + pip3 install --break-system-packages gunicorn==23.0.0 || error "gunicorn Installation fehlgeschlagen" + + log "✅ Alle Abhängigkeiten erfolgreich installiert" } -# ========================== PAKETE INSTALLIEREN ========================== -install_packages() { - log "=== SYSTEM-PAKETE INSTALLATION ===" +# ========================== PRODUKTIONS-KIOSK SETUP ========================== +setup_production_kiosk() { + log "=== RICHTE PRODUKTIONS-KIOSK-MODUS EIN ===" - progress "Installiere Basis-Pakete..." - apt-get install -y \ - python3 python3-pip python3-venv python3-dev \ - build-essential libssl-dev libffi-dev \ - sqlite3 nginx supervisor \ - xorg xinit openbox \ - xserver-xorg-video-all \ - x11-xserver-utils xdotool unclutter \ - lightdm lightdm-gtk-greeter \ - pulseaudio alsa-utils \ - fonts-liberation fonts-dejavu \ - systemd-timesyncd ufw fail2ban \ - || error "Basis-Pakete Installation fehlgeschlagen" + # Zuerst Abhängigkeiten installieren + install_system_dependencies - log "✅ System-Pakete installiert" -} - -# ========================== CHROMIUM INSTALLATION ========================== -install_chromium() { - log "=== CHROMIUM INSTALLATION ===" + progress "Erstelle Zielverzeichnis /opt/myp..." + mkdir -p "$APP_DIR" || error "Konnte Zielverzeichnis nicht erstellen" - progress "Installiere Chromium Browser..." + progress "Kopiere Projektdateien selektiv nach $APP_DIR..." - if apt-get install -y chromium 2>/dev/null; then - CHROMIUM_BIN="/usr/bin/chromium" - log "✅ Chromium via APT installiert" - elif apt-get install -y chromium-browser 2>/dev/null; then - CHROMIUM_BIN="/usr/bin/chromium-browser" - log "✅ Chromium-Browser via APT installiert" - else - error "❌ Chromium konnte nicht installiert werden!" - fi + # Liste der zu kopierenden Dateien/Ordner (ohne unnötige Inhalte) + declare -a COPY_ITEMS=( + "app.py" + "models.py" + "requirements.txt" + "blueprints/" + "config/" + "database/" + "docs/" + "static/" + "templates/" + "uploads/" + "utils/" + "logs/" + "certs/" + ) - log "✅ Chromium-Installation abgeschlossen: $CHROMIUM_BIN" -} - -# ========================== BENUTZER ERSTELLEN ========================== -create_users() { - log "=== BENUTZER-ERSTELLUNG ===" - - # App-Benutzer erstellen - progress "Erstelle App-Benutzer: $APP_USER" - if ! id "$APP_USER" &>/dev/null; then - if ! useradd -m -s /bin/bash "$APP_USER" 2>/dev/null; then - adduser --disabled-password --gecos "" "$APP_USER" || error "Kann App-Benutzer nicht erstellen" + # Sichere selektive Kopie + for item in "${COPY_ITEMS[@]}"; do + if [ -e "$CURRENT_DIR/$item" ]; then + progress "Kopiere: $item" + cp -r "$CURRENT_DIR/$item" "$APP_DIR/" || warning "Fehler beim Kopieren von $item" + else + info "Überspringe nicht vorhandenes Element: $item" fi - usermod -aG sudo "$APP_USER" 2>/dev/null || true - fi + done - # Kiosk-Benutzer erstellen - progress "Erstelle Kiosk-Benutzer: $KIOSK_USER" - if ! id "$KIOSK_USER" &>/dev/null; then - if ! useradd -m -s /bin/bash "$KIOSK_USER" 2>/dev/null; then - adduser --disabled-password --gecos "" "$KIOSK_USER" || error "Kann Kiosk-Benutzer nicht erstellen" + # Spezielle Dateien einzeln kopieren (falls vorhanden) + for file in "package.json" "package-lock.json" "tailwind.config.js" "postcss.config.js"; do + if [ -f "$CURRENT_DIR/$file" ]; then + cp "$CURRENT_DIR/$file" "$APP_DIR/" || warning "Fehler beim Kopieren von $file" fi - usermod -aG audio,video,input "$KIOSK_USER" 2>/dev/null || true - fi + done - log "✅ Benutzer erstellt: $APP_USER, $KIOSK_USER" -} - -# ========================== ANWENDUNG INSTALLIEREN ========================== -install_application() { - log "=== ANWENDUNGS-INSTALLATION ===" + # Stelle sicher, dass app.py ausführbar ist + chmod +x "$APP_DIR/app.py" || error "Konnte app.py nicht ausführbar machen" - # Verzeichnisse erstellen - mkdir -p "$APP_DIR" + # Erstelle notwendige Verzeichnisse falls sie nicht existieren + mkdir -p "$APP_DIR/database/backups" + mkdir -p "$APP_DIR/logs/app" + mkdir -p "$APP_DIR/logs/auth" + mkdir -p "$APP_DIR/logs/errors" + mkdir -p "$APP_DIR/uploads/temp" - # Anwendung kopieren falls vorhanden - if [ -f "$CURRENT_DIR/app.py" ]; then - progress "Kopiere Anwendung von $CURRENT_DIR nach $APP_DIR" - rsync -av --exclude='.git' --exclude='__pycache__' --exclude='node_modules' "$CURRENT_DIR"/ "$APP_DIR/" - else - # Erstelle einfache Flask-App als Platzhalter - progress "Erstelle einfache Flask-App als Platzhalter..." - cat > "$APP_DIR/app.py" << 'EOF' -#!/usr/bin/python3 -from flask import Flask, render_template_string - -app = Flask(__name__) - -@app.route('/') -def home(): - return render_template_string(""" - - - - MYP Druckerverwaltung - - - -
-

MYP Druckerverwaltung

-
-

System erfolgreich gestartet

-

Die MYP Druckerverwaltung läuft im Kiosk-Modus.

-

Sie können diese Anwendung nun durch Ihre eigentliche Anwendung ersetzen.

-
-
- - - """) - -if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000) -EOF - fi + # Berechtigungen setzen + chown -R root:root "$APP_DIR" + chmod -R 755 "$APP_DIR" + chmod 750 "$APP_DIR/database" + chmod 750 "$APP_DIR/logs" + chmod 755 "$APP_DIR/uploads" - chmod +x "$APP_DIR/app.py" - chown -R "$APP_USER:$APP_USER" "$APP_DIR" - - # Python-Dependencies installieren - progress "Installiere Python-Dependencies..." - python3 -m pip install --upgrade pip --break-system-packages - python3 -m pip install flask --break-system-packages - - log "✅ Anwendung installiert" -} - -# ========================== SYSTEMD-SERVICES ERSTELLEN ========================== -create_systemd_services() { - log "=== SYSTEMD-SERVICES ERSTELLEN ===" - - # MYP-Anwendung Service - progress "Erstelle myp-druckerverwaltung.service..." - cat > "/etc/systemd/system/myp-druckerverwaltung.service" << EOF + progress "Erstelle Systemd-Service myp-kiosk.service..." + cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF [Unit] -Description=MYP Druckerverwaltung Flask Application -After=network.target +Description=MYP Druckerverwaltung Kiosk-Modus +After=network.target network-online.target +Wants=network-online.target +Requires=network.target [Service] Type=simple -User=$APP_USER -Group=$APP_USER +User=root +Group=root WorkingDirectory=$APP_DIR -Environment=PATH=/usr/local/bin:/usr/bin:/bin -Environment=PYTHONPATH=$APP_DIR -ExecStart=/usr/bin/python3 $APP_DIR/app.py +ExecStart=/usr/bin/python3 $APP_DIR/app.py --debug Restart=always -RestartSec=10 +RestartSec=5 +StartLimitBurst=5 +StartLimitInterval=60 + +# Umgebungsvariablen +Environment=PYTHONUNBUFFERED=1 +Environment=FLASK_ENV=production +Environment=FLASK_HOST=0.0.0.0 +Environment=FLASK_PORT=5000 +Environment=PYTHONPATH=$APP_DIR +Environment=LC_ALL=C.UTF-8 +Environment=LANG=C.UTF-8 + +# Logging StandardOutput=journal StandardError=journal +SyslogIdentifier=myp-kiosk + +# Security-Einstellungen +NoNewPrivileges=true +PrivateTmp=false +ProtectSystem=strict +ReadWritePaths=$APP_DIR [Install] WantedBy=multi-user.target EOF - - # Kiosk-Service für automatischen Chromium-Start - progress "Erstelle kiosk-chromium.service..." - cat > "/etc/systemd/system/kiosk-chromium.service" << EOF -[Unit] -Description=Kiosk Chromium Browser -After=graphical-session.target myp-druckerverwaltung.service -Wants=myp-druckerverwaltung.service -Requires=graphical-session.target - -[Service] -Type=simple -User=$KIOSK_USER -Group=$KIOSK_USER -Environment=DISPLAY=:0 -Environment=XAUTHORITY=/home/$KIOSK_USER/.Xauthority -ExecStartPre=/bin/bash -c 'while ! curl -s http://localhost:5000 >/dev/null 2>&1; do sleep 2; done' -ExecStartPre=/bin/sleep 5 -ExecStart=/home/$KIOSK_USER/start-kiosk.sh -Restart=always -RestartSec=10 - -[Install] -WantedBy=graphical-session.target -EOF - - # Systemd-Services aktivieren - systemctl daemon-reload - systemctl enable myp-druckerverwaltung.service - systemctl enable kiosk-chromium.service - log "✅ Systemd-Services erstellt und aktiviert" -} - -# ========================== AUTOLOGIN KONFIGURIEREN ========================== -configure_autologin() { - log "=== AUTOLOGIN KONFIGURIEREN ===" + progress "Lade Systemd-Konfiguration neu..." + systemctl daemon-reload || error "Systemd Reload fehlgeschlagen" - progress "Konfiguriere LightDM für automatischen Login..." + progress "Aktiviere und starte $SERVICE_NAME Service..." + systemctl enable "$SERVICE_NAME.service" || error "Service Enable fehlgeschlagen" + systemctl start "$SERVICE_NAME.service" || error "Service Start fehlgeschlagen" - # LightDM Konfiguration - cat > "/etc/lightdm/lightdm.conf" << EOF -[Seat:*] -autologin-user=$KIOSK_USER -autologin-user-timeout=0 -autologin-session=openbox -user-session=openbox -session-wrapper=/etc/X11/Xsession -greeter-session=lightdm-gtk-greeter -allow-guest=false -greeter-hide-users=true -greeter-show-manual-login=false -autologin-in-background=false -xserver-command=X -s 0 -dpms - -[SeatDefaults] -autologin-user=$KIOSK_USER -autologin-user-timeout=0 -autologin-session=openbox -greeter-hide-users=true -greeter-show-manual-login=false -allow-user-switching=false -EOF - - # Graphical Target als Standard setzen - systemctl set-default graphical.target - systemctl enable lightdm.service - - log "✅ Autologin konfiguriert" -} - -# ========================== KIOSK-KONFIGURATION ========================== -configure_kiosk() { - log "=== KIOSK-KONFIGURATION ===" - - KIOSK_HOME="/home/$KIOSK_USER" - - # Openbox-Konfiguration - progress "Konfiguriere Openbox für Kiosk..." - sudo -u "$KIOSK_USER" mkdir -p "$KIOSK_HOME/.config/openbox" - - cat > "$KIOSK_HOME/.config/openbox/rc.xml" << 'EOF' - - - - - no - yes - yes - yes - yes - - - - - - -EOF - - # Kiosk-Starter-Skript - progress "Erstelle Kiosk-Starter-Skript..." - cat > "$KIOSK_HOME/start-kiosk.sh" << EOF -#!/bin/bash -export DISPLAY=:0 - -# Logging -exec > >(tee -a /var/log/kiosk-session.log) 2>&1 -echo "\$(date): Kiosk-Session gestartet" - -# Bildschirmschoner deaktivieren -xset s off -xset s noblank -xset s noexpose -xset -dpms - -# Mauszeiger verstecken -unclutter -idle 0.5 -root & - -# Warte auf Anwendung -echo "Warte auf MYP-Anwendung..." -WAIT_COUNT=0 -while ! curl -s http://localhost:5000 > /dev/null; do - echo "Warte auf MYP-Anwendung... (\$WAIT_COUNT/30)" - sleep 2 - WAIT_COUNT=\$((WAIT_COUNT + 1)) - if [ \$WAIT_COUNT -gt 30 ]; then - echo "FEHLER: MYP-Anwendung nach 60s nicht erreichbar!" - break - fi -done - -# Prüfe verfügbare Ports -if curl -s http://localhost:8080 > /dev/null; then - KIOSK_URL="http://localhost:8080" -elif curl -s http://localhost:5000 > /dev/null; then - KIOSK_URL="http://localhost:5000" -else - KIOSK_URL="http://localhost:5000" -fi - -echo "Starte Chromium im Kiosk-Modus mit URL: \$KIOSK_URL" - -# Chromium-Flags für Kiosk-Modus -CHROMIUM_FLAGS=" - --kiosk - --no-sandbox - --disable-infobars - --disable-session-crashed-bubble - --disable-restore-session-state - --disable-web-security - --disable-features=TranslateUI - --disable-extensions - --disable-plugins - --disable-popup-blocking - --disable-prompt-on-repost - --disable-sync - --disable-translate - --noerrdialogs - --no-first-run - --no-default-browser-check - --autoplay-policy=no-user-gesture-required - --start-fullscreen - --window-position=0,0 - --user-data-dir=$KIOSK_HOME/.chromium-kiosk - --disable-background-mode - --force-device-scale-factor=1.0 - --disable-pinch - --overscroll-history-navigation=0 -" - -# Chromium starten -$CHROMIUM_BIN \$CHROMIUM_FLAGS "\$KIOSK_URL" - -echo "\$(date): Kiosk-Session beendet" -EOF - - # Desktop-Autostart - sudo -u "$KIOSK_USER" mkdir -p "$KIOSK_HOME/.config/autostart" - cat > "$KIOSK_HOME/.config/autostart/myp-kiosk.desktop" << EOF -[Desktop Entry] -Type=Application -Name=MYP Kiosk Application -Exec=/home/$KIOSK_USER/start-kiosk.sh -Hidden=false -NoDisplay=false -X-GNOME-Autostart-enabled=true -StartupNotify=false -EOF - - # Berechtigungen setzen - chmod +x "$KIOSK_HOME/start-kiosk.sh" - chown -R "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.config" - chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/start-kiosk.sh" - - log "✅ Kiosk-Konfiguration erstellt" -} - -# ========================== RASPBERRY PI OPTIMIERUNGEN ========================== -optimize_raspberry_pi() { - log "=== RASPBERRY PI OPTIMIERUNGEN ===" - - # Prüfe ob es sich um einen Raspberry Pi handelt - if ! grep -q "Raspberry Pi" /proc/cpuinfo 2>/dev/null; then - info "Kein Raspberry Pi erkannt - überspringe Pi-spezifische Optimierungen" - return 0 - fi - - progress "Raspberry Pi erkannt - aktiviere Hardware-Optimierungen..." - - # Boot-Konfiguration optimieren - if [ -f "/boot/config.txt" ]; then - cp /boot/config.txt /boot/config.txt.backup + # Service-Status prüfen + sleep 5 + if systemctl is-active --quiet "$SERVICE_NAME.service"; then + log "✅ $SERVICE_NAME Service läuft erfolgreich" + info "Service-Status: $(systemctl is-active $SERVICE_NAME.service)" + info "Port 5000: Flask-App läuft im Debug-Modus" + info "Projektverzeichnis: $APP_DIR" - # GPU Memory für bessere Browser-Performance - if ! grep -q "gpu_mem=" /boot/config.txt; then - echo "" >> /boot/config.txt - echo "# MYP Kiosk Optimierungen" >> /boot/config.txt - echo "gpu_mem=128" >> /boot/config.txt - fi - - # Disable Splash - if ! grep -q "disable_splash=1" /boot/config.txt; then - echo "disable_splash=1" >> /boot/config.txt - fi - - # HDMI Force Hotplug - if ! grep -q "hdmi_force_hotplug=1" /boot/config.txt; then - echo "hdmi_force_hotplug=1" >> /boot/config.txt - fi - - # Disable Overscan - if ! grep -q "disable_overscan=1" /boot/config.txt; then - echo "disable_overscan=1" >> /boot/config.txt - fi - fi - - # Console Blanking deaktivieren - if [ -f "/boot/cmdline.txt" ]; then - cp /boot/cmdline.txt /boot/cmdline.txt.backup - if ! grep -q "consoleblank=0" /boot/cmdline.txt; then - sed -i 's/$/ consoleblank=0/' /boot/cmdline.txt - fi - fi - - log "✅ Raspberry Pi Optimierungen abgeschlossen" -} - -# ========================== WARTUNGSTOOLS ERSTELLEN ========================== -create_maintenance_tools() { - log "=== WARTUNGSTOOLS ERSTELLEN ===" - - # Wartungsskript - cat > "/usr/local/bin/myp-maintenance" << 'EOF' -#!/bin/bash - -case "$1" in - start) - echo "Starte alle MYP-Services..." - systemctl start myp-druckerverwaltung - systemctl start lightdm - echo "Services gestartet." - ;; - stop) - echo "Stoppe alle MYP-Services..." - systemctl stop lightdm - systemctl stop myp-druckerverwaltung - echo "Services gestoppt." - ;; - restart) - echo "Starte alle MYP-Services neu..." - systemctl restart myp-druckerverwaltung + # Test der Anwendung + progress "Teste Anwendungserreichbarkeit..." sleep 3 - systemctl restart lightdm - echo "Services neugestartet." - ;; - status) - echo "=== MYP SYSTEM STATUS ===" - echo "📱 Anwendung:" - systemctl status myp-druckerverwaltung --no-pager -l - echo "🖥️ Display Manager:" - systemctl status lightdm --no-pager -l - echo "🌐 Anwendung erreichbar:" - if curl -s http://localhost:5000 > /dev/null; then - echo "✅ http://localhost:5000 erreichbar" + if curl -s http://localhost:5000 > /dev/null 2>&1; then + log "✅ Anwendung ist unter http://localhost:5000 erreichbar" else - echo "❌ http://localhost:5000 NICHT erreichbar" + warning "⚠️ Anwendung noch nicht erreichbar (möglicherweise noch beim Starten)" fi - if curl -s http://localhost:8080 > /dev/null; then - echo "✅ http://localhost:8080 erreichbar" - else - echo "❌ http://localhost:8080 NICHT erreichbar" - fi - ;; - logs) - echo "=== ANWENDUNGS-LOGS ===" - journalctl -u myp-druckerverwaltung -f - ;; - *) - echo "MYP Druckerverwaltung - Wartungstool" - echo "VERWENDUNG: $0 {start|stop|restart|status|logs}" - ;; -esac -EOF - - chmod +x "/usr/local/bin/myp-maintenance" + else + error "$SERVICE_NAME Service konnte nicht gestartet werden - prüfen Sie die Logs: journalctl -u $SERVICE_NAME -f" + fi - # Log-Dateien erstellen - touch /var/log/kiosk-session.log - chmod 666 /var/log/kiosk-session.log - - log "✅ Wartungstools erstellt" + log "✅ Produktions-Kiosk-Modus erfolgreich eingerichtet" + log "🎯 Anwendung erreichbar unter: http://localhost:5000" + log "📋 Service-Befehle:" + log " • Status: sudo systemctl status $SERVICE_NAME" + log " • Stoppen: sudo systemctl stop $SERVICE_NAME" + log " • Starten: sudo systemctl start $SERVICE_NAME" + log " • Neustarten: sudo systemctl restart $SERVICE_NAME" + log " • Logs: sudo journalctl -u $SERVICE_NAME -f" + log " • Service-Info: sudo journalctl -u $SERVICE_NAME --no-pager" } -# ========================== HAUPTFUNKTION ========================== +# ========================== HAUPTMENÜ ========================== +show_menu() { + clear + echo -e "${BLUE}=================================================================${NC}" + echo -e "${GREEN} $APP_NAME - Installer für Raspbian${NC}" + echo -e "${BLUE}=================================================================${NC}" + echo "" + echo -e "${YELLOW}Aktuelles Verzeichnis:${NC} $CURRENT_DIR" + echo -e "${YELLOW}Systemzeit:${NC} $(date)" + echo -e "${YELLOW}Zielverzeichnis:${NC} $APP_DIR" + echo "" + echo -e "${PURPLE}Wählen Sie eine Option:${NC}" + echo "" + echo -e "${GREEN}1)${NC} System vorbereiten (Abhängigkeiten installieren)" + echo -e " → Installiert Python 3, pip und alle benötigten Pakete" + echo -e " → Verwendet: pip install --break-system-packages" + echo -e " → Keine virtualenv, direktes System-Python" + echo "" + echo -e "${GREEN}2)${NC} Produktions-Kiosk-Modus installieren" + echo -e " → Führt System-Vorbereitung durch" + echo -e " → Verschiebt Dateien selektiv nach /opt/myp/" + echo -e " → Erstellt systemd-Service: myp-kiosk.service" + echo -e " → Startet Flask-App mit --debug auf Port 5000" + echo -e " → Testet Anwendungserreichbarkeit" + echo "" + echo -e "${RED}0)${NC} Beenden" + echo "" + echo -e "${BLUE}=================================================================${NC}" + echo -n "Ihre Wahl [0-2]: " +} + +# ========================== MAIN LOGIC ========================== main() { - log "=== MYP KIOSK-INSTALLATION GESTARTET ===" - + # System-Checks check_root - detect_system - update_system - install_packages - install_chromium - create_users - install_application - create_systemd_services - configure_autologin - configure_kiosk - optimize_raspberry_pi - create_maintenance_tools + check_debian_system - log "=== INSTALLATION ABGESCHLOSSEN ===" - log "" - log "🎉 MYP KIOSK-INSTALLATION ERFOLGREICH!" - log "" - log "📋 ZUSAMMENFASSUNG:" - log " ✅ System-Pakete installiert" - log " ✅ Chromium Browser installiert" - log " ✅ Benutzer erstellt ($APP_USER, $KIOSK_USER)" - log " ✅ Anwendung installiert" - log " ✅ Systemd-Services erstellt" - log " ✅ Autologin konfiguriert" - log " ✅ Kiosk-Modus konfiguriert" - log " ✅ Raspberry Pi optimiert" - log " ✅ Wartungstools erstellt" - log "" - log "🔄 NEUSTART ERFORDERLICH:" - log " sudo reboot" - log "" - log "📊 NACH DEM NEUSTART:" - log " - System startet automatisch ohne Anmeldung" - log " - Kiosk-Modus wird automatisch gestartet" - log " - Chromium öffnet http://localhost:8080 oder http://localhost:5000" - log " - Vollbildmodus ohne UI-Elemente" - log " - Mauszeiger wird automatisch versteckt" - log "" - log "🔧 WARTUNG:" - log " sudo myp-maintenance status # System-Status prüfen" - log " sudo myp-maintenance logs # Logs anzeigen" - log " sudo myp-maintenance restart # Services neustarten" - log "" + # Erstelle Log-Datei + mkdir -p "$(dirname "$INSTALL_LOG")" + touch "$INSTALL_LOG" - warning "WICHTIG: Führen Sie jetzt 'sudo reboot' aus, um die Kiosk-Konfiguration zu aktivieren!" + log "=== MYP INSTALLER GESTARTET ===" + log "Arbeitsverzeichnis: $CURRENT_DIR" + log "Zielverzeichnis: $APP_DIR" + log "Service-Name: $SERVICE_NAME" + log "System: $(uname -a)" + log "Debian-Version: $(cat /etc/debian_version 2>/dev/null || echo 'Unbekannt')" + + while true; do + show_menu + read -r choice + + case $choice in + 1) + clear + log "=== OPTION 1: SYSTEM VORBEREITEN ===" + install_system_dependencies + echo "" + echo -e "${GREEN}✅ System-Vorbereitung abgeschlossen!${NC}" + echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" + read -r + ;; + 2) + clear + log "=== OPTION 2: PRODUKTIONS-KIOSK-MODUS ===" + setup_production_kiosk + echo "" + echo -e "${GREEN}✅ Produktions-Kiosk-Modus erfolgreich eingerichtet!${NC}" + echo -e "${BLUE}ℹ️ Die Anwendung startet automatisch bei jedem Systemstart.${NC}" + echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" + read -r + ;; + 0) + log "=== INSTALLER BEENDET ===" + echo -e "${GREEN}Auf Wiedersehen!${NC}" + echo -e "${BLUE}Log-Datei: $INSTALL_LOG${NC}" + exit 0 + ;; + *) + echo -e "${RED}Ungültige Eingabe. Bitte wählen Sie 0-2.${NC}" + sleep 2 + ;; + esac + done } -# Skript ausführen +# Script starten main "$@" \ No newline at end of file diff --git a/backend/app/test-kiosk-setup.sh b/backend/app/test-kiosk-setup.sh deleted file mode 100644 index b5d83617..00000000 --- a/backend/app/test-kiosk-setup.sh +++ /dev/null @@ -1,293 +0,0 @@ -#!/bin/bash - -# =================================================================== -# MYP Kiosk-Setup Test und Validierung -# Testet alle Komponenten der Kiosk-Installation -# =================================================================== - -set -e - -# Farben für Ausgabe -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' - -# Test-Funktionen -test_passed() { - echo -e "${GREEN}✅ $1${NC}" -} - -test_failed() { - echo -e "${RED}❌ $1${NC}" -} - -test_warning() { - echo -e "${YELLOW}⚠️ $1${NC}" -} - -test_info() { - echo -e "${BLUE}ℹ️ $1${NC}" -} - -echo "=====================================================================" -echo "🧪 MYP Kiosk-Setup Validierung" -echo "=====================================================================" -echo - -# ========================== SYSTEM-TESTS ========================== -echo "🔍 SYSTEM-TESTS" -echo "---------------------------------------------------------------------" - -# Benutzer-Tests -if id "kiosk" &>/dev/null; then - test_passed "Kiosk-Benutzer existiert" -else - test_failed "Kiosk-Benutzer fehlt" -fi - -if id "myp" &>/dev/null; then - test_passed "MYP-Benutzer existiert" -else - test_failed "MYP-Benutzer fehlt" -fi - -# Verzeichnis-Tests -if [ -d "/opt/myp-druckerverwaltung" ]; then - test_passed "MYP-Anwendungsverzeichnis existiert" -else - test_failed "MYP-Anwendungsverzeichnis fehlt" -fi - -if [ -f "/opt/myp-druckerverwaltung/app.py" ]; then - test_passed "Flask-Anwendung gefunden" -else - test_warning "Flask-Anwendung nicht gefunden (wird erstellt)" -fi - -# ========================== SERVICE-TESTS ========================== -echo -echo "🔧 SERVICE-TESTS" -echo "---------------------------------------------------------------------" - -# Systemd-Services prüfen -services=("myp-druckerverwaltung" "lightdm" "kiosk-chromium") - -for service in "${services[@]}"; do - if systemctl is-enabled --quiet "$service" 2>/dev/null; then - test_passed "Service '$service' ist aktiviert" - - if systemctl is-active --quiet "$service" 2>/dev/null; then - test_passed "Service '$service' läuft" - else - test_warning "Service '$service' läuft nicht (normal vor Reboot)" - fi - else - test_failed "Service '$service' ist nicht aktiviert" - fi -done - -# ========================== KONFIGURATION-TESTS ========================== -echo -echo "⚙️ KONFIGURATION-TESTS" -echo "---------------------------------------------------------------------" - -# LightDM-Konfiguration -if [ -f "/etc/lightdm/lightdm.conf" ]; then - if grep -q "autologin-user=kiosk" /etc/lightdm/lightdm.conf; then - test_passed "LightDM Autologin konfiguriert" - else - test_failed "LightDM Autologin nicht konfiguriert" - fi -else - test_failed "LightDM-Konfiguration fehlt" -fi - -# Kiosk-Skript -if [ -f "/home/kiosk/start-kiosk.sh" ]; then - if [ -x "/home/kiosk/start-kiosk.sh" ]; then - test_passed "Kiosk-Starter-Skript vorhanden und ausführbar" - else - test_failed "Kiosk-Starter-Skript nicht ausführbar" - fi -else - test_failed "Kiosk-Starter-Skript fehlt" -fi - -# Openbox-Konfiguration -if [ -f "/home/kiosk/.config/openbox/rc.xml" ]; then - test_passed "Openbox-Konfiguration vorhanden" -else - test_failed "Openbox-Konfiguration fehlt" -fi - -# Desktop-Autostart -if [ -f "/home/kiosk/.config/autostart/myp-kiosk.desktop" ]; then - test_passed "Desktop-Autostart konfiguriert" -else - test_failed "Desktop-Autostart fehlt" -fi - -# ========================== PAKET-TESTS ========================== -echo -echo "📦 PAKET-TESTS" -echo "---------------------------------------------------------------------" - -# Wichtige Pakete prüfen -packages=("chromium" "openbox" "lightdm" "python3" "unclutter" "xorg") - -for package in "${packages[@]}"; do - if dpkg -l | grep -q "^ii.*$package" 2>/dev/null; then - test_passed "Paket '$package' installiert" - elif command -v "$package" &>/dev/null; then - test_passed "Programm '$package' verfügbar" - else - test_failed "Paket/Programm '$package' fehlt" - fi -done - -# Chromium-Binary finden -if command -v chromium &>/dev/null; then - test_passed "Chromium-Binary gefunden: $(which chromium)" -elif command -v chromium-browser &>/dev/null; then - test_passed "Chromium-Browser-Binary gefunden: $(which chromium-browser)" -else - test_failed "Kein Chromium-Binary gefunden" -fi - -# ========================== NETZWERK-TESTS ========================== -echo -echo "🌐 NETZWERK-TESTS" -echo "---------------------------------------------------------------------" - -# Internetverbindung -if ping -c 1 google.com &>/dev/null; then - test_passed "Internetverbindung verfügbar" -else - test_warning "Keine Internetverbindung (optional)" -fi - -# Lokale Ports testen (falls Services laufen) -if systemctl is-active --quiet myp-druckerverwaltung 2>/dev/null; then - if curl -s --connect-timeout 5 http://localhost:5000 >/dev/null 2>&1; then - test_passed "Port 5000 erreichbar" - else - test_warning "Port 5000 nicht erreichbar" - fi - - if curl -s --connect-timeout 5 http://localhost:8080 >/dev/null 2>&1; then - test_passed "Port 8080 erreichbar" - else - test_info "Port 8080 nicht verfügbar (optional)" - fi -else - test_info "Backend-Service nicht aktiv - Port-Tests übersprungen" -fi - -# ========================== RASPBERRY PI TESTS ========================== -echo -echo "🍓 RASPBERRY PI TESTS" -echo "---------------------------------------------------------------------" - -if grep -q "Raspberry Pi" /proc/cpuinfo 2>/dev/null; then - test_passed "Raspberry Pi erkannt" - - # Boot-Konfiguration prüfen - if [ -f "/boot/config.txt" ]; then - if grep -q "gpu_mem=" /boot/config.txt; then - GPU_MEM=$(grep "gpu_mem=" /boot/config.txt | cut -d= -f2) - test_passed "GPU Memory Split konfiguriert: ${GPU_MEM}MB" - else - test_warning "GPU Memory Split nicht konfiguriert" - fi - - if grep -q "disable_splash=1" /boot/config.txt; then - test_passed "Boot-Splash deaktiviert" - else - test_warning "Boot-Splash nicht deaktiviert" - fi - else - test_warning "/boot/config.txt nicht gefunden" - fi - - # Temperatur prüfen - if command -v vcgencmd &>/dev/null; then - TEMP=$(vcgencmd measure_temp 2>/dev/null | cut -d= -f2 | cut -d"'" -f1) - if [ -n "$TEMP" ]; then - test_passed "CPU Temperatur: ${TEMP}°C" - if (( $(echo "$TEMP > 70" | bc -l 2>/dev/null || echo 0) )); then - test_warning "Hohe CPU Temperatur: ${TEMP}°C" - fi - fi - fi -else - test_info "Kein Raspberry Pi - Pi-spezifische Tests übersprungen" -fi - -# ========================== WARTUNGSTOOLS-TESTS ========================== -echo -echo "🔧 WARTUNGSTOOLS-TESTS" -echo "---------------------------------------------------------------------" - -if [ -f "/usr/local/bin/myp-maintenance" ]; then - if [ -x "/usr/local/bin/myp-maintenance" ]; then - test_passed "Wartungstool verfügbar" - else - test_failed "Wartungstool nicht ausführbar" - fi -else - test_failed "Wartungstool fehlt" -fi - -# Log-Verzeichnisse -if [ -f "/var/log/kiosk-session.log" ]; then - test_passed "Kiosk-Session-Log verfügbar" -else - test_warning "Kiosk-Session-Log nicht vorhanden" -fi - -# ========================== ZUSAMMENFASSUNG ========================== -echo -echo "=====================================================================" -echo "📊 TEST-ZUSAMMENFASSUNG" -echo "=====================================================================" - -# Zähle Tests -TOTAL_TESTS=$(grep -E "(test_passed|test_failed|test_warning)" "$0" | wc -l) -echo "Gesamte Tests durchgeführt: $TOTAL_TESTS" - -echo -echo "🎯 NÄCHSTE SCHRITTE:" -echo "---------------------------------------------------------------------" - -if systemctl is-active --quiet lightdm 2>/dev/null; then - echo "✅ System ist bereits im Kiosk-Modus" - echo " - Kiosk läuft bereits" - echo " - Verwenden Sie 'sudo myp-maintenance status' für Details" -else - echo "🔄 System-Neustart erforderlich:" - echo " sudo reboot" - echo - echo "📋 Nach dem Neustart:" - echo " - System startet automatisch ohne Login" - echo " - Chromium öffnet im Kiosk-Modus" - echo " - Anwendung ist unter http://localhost:5000 oder :8080 verfügbar" -fi - -echo -echo "🔧 WARTUNG:" -echo " sudo myp-maintenance status # System-Status" -echo " sudo myp-maintenance logs # Live-Logs" -echo " sudo myp-maintenance restart # Services neustarten" - -echo -echo "📋 LOG-DATEIEN:" -echo " tail -f /var/log/kiosk-session.log" -echo " journalctl -u myp-druckerverwaltung -f" -echo " journalctl -u lightdm -f" - -echo -echo "=====================================================================" -echo "🏁 Test abgeschlossen" -echo "=====================================================================" \ No newline at end of file