Projektarbeit-MYP/backend/debug/fix-kiosk-definitiv.sh
2025-06-05 01:34:10 +02:00

370 lines
8.6 KiB
Bash

#!/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