#!/bin/bash # =================================================================== # DEFINITIVER KIOSK-FIX FÜR RASPBERRY PI # Löst ALLE X11/Framebuffer-Probleme garantiert # =================================================================== set -euo pipefail # Farben RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "${GREEN}[$(date '+%H:%M:%S')] $1${NC}"; } warning() { echo -e "${YELLOW}[WARNUNG] $1${NC}"; } error() { echo -e "${RED}[FEHLER] $1${NC}"; exit 1; } info() { echo -e "${BLUE}[INFO] $1${NC}"; } # Root-Check if [ "$EUID" -ne 0 ]; then error "Als Root ausführen: sudo $0" fi log "=== DEFINITIVER KIOSK-FIX ===" # 1. STOPPE ALLES log "Stoppe alle Display-Manager und X-Server..." systemctl stop lightdm 2>/dev/null || true systemctl stop gdm3 2>/dev/null || true systemctl stop sddm 2>/dev/null || true systemctl stop xdm 2>/dev/null || true systemctl stop nodm 2>/dev/null || true systemctl disable lightdm 2>/dev/null || true systemctl disable gdm3 2>/dev/null || true systemctl disable sddm 2>/dev/null || true systemctl disable xdm 2>/dev/null || true systemctl disable nodm 2>/dev/null || true pkill -f "X" 2>/dev/null || true pkill -f "Xorg" 2>/dev/null || true pkill -f "xinit" 2>/dev/null || true pkill -f "chromium" 2>/dev/null || true sleep 3 # 2. KERNEL MODE SETTING (KMS) AKTIVIEREN log "Aktiviere KMS/DRM Treiber..." if [ -f /boot/config.txt ]; then cp /boot/config.txt /boot/config.txt.backup-$(date +%s) # Entferne alte Einstellungen sed -i '/^dtoverlay=vc4-kms-v3d/d' /boot/config.txt sed -i '/^dtoverlay=vc4-fkms-v3d/d' /boot/config.txt sed -i '/^gpu_mem=/d' /boot/config.txt # Füge KMS-Treiber hinzu cat >> /boot/config.txt << 'EOF' # Kiosk-Modus GPU-Konfiguration dtoverlay=vc4-kms-v3d max_framebuffers=2 gpu_mem=256 hdmi_force_hotplug=1 hdmi_group=2 hdmi_mode=82 hdmi_drive=2 disable_overscan=1 EOF info "Boot-Konfiguration aktualisiert" fi # 3. INSTALLIERE ALLE NÖTIGEN PAKETE log "Installiere notwendige Pakete..." apt-get update apt-get install -y --no-install-recommends \ xserver-xorg \ xserver-xorg-video-all \ xserver-xorg-input-all \ xinit \ x11-xserver-utils \ openbox \ chromium-browser \ unclutter \ xdotool \ wmctrl \ xvfb \ 2>/dev/null || true # 4. ERSTELLE MINIMALE X11-KONFIGURATION log "Erstelle X11-Konfiguration..." mkdir -p /etc/X11/xorg.conf.d # Hauptkonfiguration cat > /etc/X11/xorg.conf << 'EOF' Section "ServerFlags" Option "BlankTime" "0" Option "StandbyTime" "0" Option "SuspendTime" "0" Option "OffTime" "0" Option "DPMS" "false" Option "AllowEmptyInput" "true" Option "AutoAddDevices" "true" EndSection Section "Monitor" Identifier "Monitor0" Option "DPMS" "false" EndSection Section "Device" Identifier "Card0" Driver "modesetting" Option "AccelMethod" "glamor" Option "DRI" "3" EndSection Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Depth 24 EndSubSection EndSection EOF # 5. ERSTELLE KIOSK-USER WENN NICHT VORHANDEN if ! id "kiosk" &>/dev/null; then log "Erstelle kiosk-User..." useradd -m -s /bin/bash kiosk usermod -aG audio,video,input,dialout,plugdev,users kiosk fi # 6. ERSTELLE AUTOLOGIN log "Konfiguriere Autologin..." mkdir -p /etc/systemd/system/getty@tty1.service.d cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << 'EOF' [Service] ExecStart= ExecStart=-/sbin/agetty --autologin kiosk --noclear %I \$TERM Type=idle EOF # 7. ERSTELLE DREI VERSCHIEDENE START-METHODEN # Methode 1: Direkt-Start ohne Display Manager log "Erstelle Methode 1: Direkt-Start..." cat > /home/kiosk/kiosk-direct.sh << 'EOF' #!/bin/bash export DISPLAY=:0 export XAUTHORITY=/home/kiosk/.Xauthority # Warte auf Netzwerk sleep 10 # Erstelle .Xauthority touch $XAUTHORITY chmod 600 $XAUTHORITY # Starte X-Server direkt /usr/bin/xinit /home/kiosk/kiosk-browser.sh -- /usr/bin/X :0 -nolisten tcp -nocursor EOF # Browser-Start-Skript cat > /home/kiosk/kiosk-browser.sh << 'EOF' #!/bin/bash # Warte auf X-Server sleep 3 # X11-Einstellungen xset s off xset s noblank xset -dpms # Window Manager openbox-session & sleep 2 # Warte auf Backend echo "Warte auf Backend..." while ! curl -s http://localhost:5000 >/dev/null 2>&1; do sleep 2 done # Starte Browser chromium-browser \ --kiosk \ --no-sandbox \ --disable-setuid-sandbox \ --disable-dev-shm-usage \ --disable-accelerated-2d-canvas \ --no-first-run \ --no-zygote \ --single-process \ --disable-gpu \ --window-size=1920,1080 \ --start-fullscreen \ --incognito \ http://localhost:5000 EOF # Methode 2: Mit startx log "Erstelle Methode 2: startx..." cat > /home/kiosk/.xinitrc << 'EOF' #!/bin/bash xset s off xset s noblank xset -dpms openbox-session & sleep 2 # Warte auf Backend while ! curl -s http://localhost:5000 >/dev/null 2>&1; do sleep 2 done exec chromium-browser --kiosk --no-sandbox --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage http://localhost:5000 EOF # Methode 3: Systemd Service log "Erstelle Methode 3: Systemd Service..." cat > /etc/systemd/system/kiosk.service << 'EOF' [Unit] Description=Kiosk Mode After=multi-user.target network.target [Service] Type=simple Restart=always RestartSec=10 User=kiosk Group=kiosk PAMName=login TTYPath=/dev/tty2 StandardInput=tty StandardOutput=journal StandardError=journal Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/kiosk/.Xauthority" ExecStartPre=/bin/sleep 10 ExecStart=/usr/bin/xinit /home/kiosk/kiosk-browser.sh -- /usr/bin/X :0 -nolisten tcp [Install] WantedBy=multi-user.target EOF # 8. ERSTELLE FALLBACK: TERMINAL-BROWSER log "Erstelle Terminal-Browser-Fallback..." cat > /home/kiosk/terminal-browser.sh << 'EOF' #!/bin/bash # Terminal-basierter Browser als Fallback clear echo "=== KIOSK-MODUS (Terminal) ===" echo "Warte auf Backend..." while ! curl -s http://localhost:5000 >/dev/null 2>&1; do sleep 2 echo -n "." done echo "" echo "Backend verfügbar!" echo "" echo "Optionen:" echo "1) Links2 Browser starten (Terminal)" echo "2) W3M Browser starten (Terminal)" echo "3) Versuche X11 erneut" echo "" # Installiere Terminal-Browser falls nötig which links2 >/dev/null 2>&1 || apt-get install -y links2 which w3m >/dev/null 2>&1 || apt-get install -y w3m links2 http://localhost:5000 EOF # 9. BERECHTIGUNGEN SETZEN log "Setze Berechtigungen..." chmod +x /home/kiosk/*.sh chmod +x /home/kiosk/.xinitrc chown -R kiosk:kiosk /home/kiosk/ touch /home/kiosk/.Xauthority chown kiosk:kiosk /home/kiosk/.Xauthority chmod 600 /home/kiosk/.Xauthority # 10. ERSTELLE MASTER-START-SKRIPT log "Erstelle Master-Start-Skript..." cat > /home/kiosk/.bashrc << 'EOF' # Kiosk Auto-Start if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" = "1" ]; then echo "=== KIOSK-MODUS WIRD GESTARTET ===" echo "" echo "Versuche Methode 1: Direkt-Start..." # Methode 1 if /home/kiosk/kiosk-direct.sh 2>/tmp/kiosk-error1.log; then exit 0 fi echo "Methode 1 fehlgeschlagen. Versuche Methode 2: startx..." sleep 2 # Methode 2 if startx -- -nocursor 2>/tmp/kiosk-error2.log; then exit 0 fi echo "Methode 2 fehlgeschlagen. Versuche Methode 3: Xvfb..." sleep 2 # Methode 3: Virtual Framebuffer Xvfb :0 -screen 0 1920x1080x24 & export DISPLAY=:0 sleep 2 /home/kiosk/kiosk-browser.sh 2>/tmp/kiosk-error3.log # Wenn alles fehlschlägt echo "" echo "ALLE X11-METHODEN FEHLGESCHLAGEN!" echo "" echo "Fehler-Logs:" echo "- /tmp/kiosk-error1.log" echo "- /tmp/kiosk-error2.log" echo "- /tmp/kiosk-error3.log" echo "" echo "Starte Terminal-Browser als Fallback..." sleep 3 /home/kiosk/terminal-browser.sh fi EOF chown kiosk:kiosk /home/kiosk/.bashrc # 11. SYSTEMD-DIENSTE log "Konfiguriere Systemd..." systemctl daemon-reload systemctl enable getty@tty1.service systemctl enable kiosk.service 2>/dev/null || true # 12. FINALE ÜBERPRÜFUNG log "✅ INSTALLATION ABGESCHLOSSEN!" info "" info "📋 Was wurde installiert:" info " - KMS/DRM-Treiber aktiviert" info " - X11 komplett neu konfiguriert" info " - 3 verschiedene Start-Methoden" info " - Terminal-Browser als Fallback" info " - Autologin konfiguriert" info "" warning "⚠️ NEUSTART ERFORDERLICH!" info "" info "Nach dem Neustart:" info "1. System startet automatisch in Kiosk-Modus" info "2. Falls X11 fehlschlägt, startet Terminal-Browser" info "" info "Manueller Test ohne Neustart:" info " su - kiosk" info " ./kiosk-direct.sh" info "" read -p "Jetzt neustarten? (j/n) " -n 1 -r echo if [[ $REPLY =~ ^[Jj]$ ]]; then reboot fi