#!/bin/bash # =================================================================== # MYP Druckerverwaltung - Raspberry Pi Schnellstart Optimierung # Optimiert automatischen Start ohne Benutzeranmeldung # Für bereits installierte Systeme # =================================================================== set -e # =========================== KONFIGURATION =========================== KIOSK_USER="kiosk" APP_USER="myp" APP_DIR="/opt/myp-druckerverwaltung" INSTALL_LOG="/var/log/myp-schnellstart.log" # Farben für Ausgabe RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' NC='\033[0m' # ========================== LOGGING-SYSTEM ========================== log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}" | tee -a "$INSTALL_LOG" } error() { echo -e "${RED}[FEHLER] $1${NC}" | tee -a "$INSTALL_LOG" exit 1 } warning() { echo -e "${YELLOW}[WARNUNG] $1${NC}" | tee -a "$INSTALL_LOG" } info() { echo -e "${BLUE}[INFO] $1${NC}" | tee -a "$INSTALL_LOG" } progress() { echo -e "${PURPLE}[FORTSCHRITT] $1${NC}" | tee -a "$INSTALL_LOG" } # ========================== SYSTEM-CHECKS ========================== check_root() { if [ "$EUID" -ne 0 ]; then error "Dieses Skript muss als Root ausgeführt werden: sudo $0" fi } check_system() { log "=== RASPBERRY PI SCHNELLSTART-OPTIMIERUNG ===" # Prüfe ob Kiosk-Benutzer existiert if ! id "$KIOSK_USER" &>/dev/null; then # Kiosk-Benutzer erstellen falls nicht vorhanden progress "Erstelle Kiosk-Benutzer: $KIOSK_USER" if ! useradd -m -s /bin/bash "$KIOSK_USER" 2>/dev/null; then adduser --disabled-password --gecos "" "$KIOSK_USER" || error "Kann Kiosk-Benutzer nicht erstellen" fi # Kiosk-Benutzer zu Audio/Video-Gruppen hinzufügen usermod -aG audio,video,input "$KIOSK_USER" 2>/dev/null || true info "Kiosk-Benutzer erstellt" else info "Kiosk-Benutzer existiert bereits" fi # Prüfe ob App-Verzeichnis existiert if [ ! -d "$APP_DIR" ]; then # App-Verzeichnis erstellen falls nicht vorhanden progress "Erstelle App-Verzeichnis: $APP_DIR" mkdir -p "$APP_DIR" chown -R "$APP_USER:$APP_USER" "$APP_DIR" 2>/dev/null || true info "App-Verzeichnis erstellt" else info "App-Verzeichnis existiert bereits" fi # Prüfe ob App-Benutzer existiert if ! id "$APP_USER" &>/dev/null; then # App-Benutzer erstellen falls nicht vorhanden progress "Erstelle App-Benutzer: $APP_USER" if ! useradd -m -s /bin/bash "$APP_USER" 2>/dev/null; then adduser --disabled-password --gecos "" "$APP_USER" || error "Kann App-Benutzer nicht erstellen" fi usermod -aG sudo "$APP_USER" 2>/dev/null || true info "App-Benutzer erstellt" else info "App-Benutzer existiert bereits" fi info "System-Checks erfolgreich" } # ========================== ESSENZIELLE PAKETE INSTALLIEREN ========================== install_essential_packages() { log "=== ESSENZIELLE PAKETE INSTALLIEREN ===" progress "Aktualisiere Paketlisten..." apt-get update -y || warning "APT Update teilweise fehlgeschlagen" progress "Installiere essenzielle Pakete..." apt-get install -y \ curl wget git unzip \ python3 python3-pip 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 \ ca-certificates apt-transport-https \ || warning "Paket-Installation teilweise fehlgeschlagen" log "✅ Essenzielle Pakete installiert" } # ========================== BOOT-OPTIMIERUNG ========================== optimize_boot() { log "=== BOOT-OPTIMIERUNG ===" progress "Optimiere Raspberry Pi Boot-Parameter..." # Raspberry Pi Boot-Konfiguration if [ -f "/boot/config.txt" ]; then # GPU Memory für bessere Performance if ! grep -q "gpu_mem=" /boot/config.txt; then echo "gpu_mem=128" >> /boot/config.txt info "GPU Memory auf 128MB gesetzt" fi # Disable Boot-Splash für schnelleren Start if ! grep -q "disable_splash=" /boot/config.txt; then echo "disable_splash=1" >> /boot/config.txt info "Boot-Splash deaktiviert" fi # Boot-Delay reduzieren if ! grep -q "boot_delay=" /boot/config.txt; then echo "boot_delay=0" >> /boot/config.txt info "Boot-Delay auf 0 gesetzt" fi # HDMI-Hotplug für bessere Display-Erkennung if ! grep -q "hdmi_force_hotplug=" /boot/config.txt; then echo "hdmi_force_hotplug=1" >> /boot/config.txt info "HDMI-Hotplug aktiviert" fi # Disable Rainbow-Splash if ! grep -q "disable_overscan=" /boot/config.txt; then echo "disable_overscan=1" >> /boot/config.txt info "Overscan deaktiviert" fi fi # Kernel-Parameter optimieren if [ -f "/boot/cmdline.txt" ]; then # Backup erstellen cp /boot/cmdline.txt /boot/cmdline.txt.backup # Entferne Boot-Splash und optimiere sed -i 's/splash//g' /boot/cmdline.txt # Füge Performance-Parameter hinzu if ! grep -q "quiet" /boot/cmdline.txt; then sed -i 's/$/ quiet/' /boot/cmdline.txt fi if ! grep -q "loglevel=3" /boot/cmdline.txt; then sed -i 's/$/ loglevel=3/' /boot/cmdline.txt fi if ! grep -q "logo.nologo" /boot/cmdline.txt; then sed -i 's/$/ logo.nologo/' /boot/cmdline.txt fi if ! grep -q "vt.global_cursor_default=0" /boot/cmdline.txt; then sed -i 's/$/ vt.global_cursor_default=0/' /boot/cmdline.txt fi info "Kernel-Parameter optimiert" fi log "✅ Boot-Optimierung abgeschlossen" } # ========================== AUTOLOGIN VERSTÄRKEN ========================== strengthen_autologin() { log "=== AUTOLOGIN-VERSTÄRKUNG ===" progress "Verstärke automatischen Login..." # Sicherstellen dass graphical.target Standard ist systemctl set-default graphical.target info "Graphical.target als Standard gesetzt" # Getty Auto-Login verstärken 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_USER --noclear %I \$TERM Type=simple Restart=always RestartSec=3 EOF # Getty Service aktivieren systemctl enable getty@tty1.service info "Getty Auto-Login konfiguriert" # LightDM Auto-Login verstärken if [ -f "/etc/lightdm/lightdm.conf" ]; then # Backup erstellen cp /etc/lightdm/lightdm.conf /etc/lightdm/lightdm.conf.backup # Neue Konfiguration cat > "/etc/lightdm/lightdm.conf" << EOF [Seat:*] # Automatischer Login für Kiosk-Benutzer 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 # Kein Benutzer-Wechsel möglich greeter-hide-users=true greeter-show-manual-login=false # Automatischer Start ohne Verzögerung autologin-in-background=false # Session-Setup session-setup-script=/usr/share/lightdm/setup-kiosk-session.sh [SeatDefaults] # Zusätzliche Sicherheitseinstellungen 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 info "LightDM Auto-Login verstärkt" fi # LightDM Service-Override mkdir -p "/etc/systemd/system/lightdm.service.d" cat > "/etc/systemd/system/lightdm.service.d/autologin-override.conf" << EOF [Unit] After=multi-user.target network.target myp-druckerverwaltung.service Wants=myp-druckerverwaltung.service [Service] # Automatischer Restart bei Fehlern Restart=always RestartSec=3 # Umgebungsvariablen für Kiosk Environment=DISPLAY=:0 Environment=KIOSK_MODE=1 # Verzögerung für Backend-Start ExecStartPre=/bin/bash -c 'for i in {1..30}; do if curl -s http://localhost:5000 >/dev/null 2>&1; then break; fi; sleep 2; done' EOF systemctl enable lightdm.service info "LightDM Service-Override konfiguriert" log "✅ Autologin-Verstärkung abgeschlossen" } # ========================== KIOSK-BENUTZER OPTIMIERUNG ========================== optimize_kiosk_user() { log "=== KIOSK-BENUTZER OPTIMIERUNG ===" KIOSK_HOME="/home/$KIOSK_USER" progress "Optimiere Kiosk-Benutzer Autostart..." # Verstärkte .bashrc cat >> "$KIOSK_HOME/.bashrc" << 'EOF' # ===== VERSTÄRKTER KIOSK AUTOSTART ===== if [ -z "$SSH_CLIENT" ] && [ -z "$SSH_TTY" ] && [ -z "$KIOSK_STARTED" ]; then export KIOSK_STARTED=1 # Logge Autostart-Versuch echo "$(date): Bashrc Autostart-Versuch auf $(tty)" >> /var/log/kiosk-autostart.log # Prüfe ob wir auf tty1 sind und X noch nicht läuft if [ "$(tty)" = "/dev/tty1" ] && [ -z "$DISPLAY" ]; then echo "$(date): Starte X-Session automatisch via bashrc" >> /var/log/kiosk-autostart.log exec startx fi # Falls X läuft aber Kiosk-App nicht, starte sie if [ -n "$DISPLAY" ] && ! pgrep -f "chromium.*kiosk" > /dev/null; then echo "$(date): Starte Kiosk-Anwendung via bashrc" >> /var/log/kiosk-autostart.log exec $HOME/start-kiosk.sh fi fi EOF # Verstärkte .profile cat >> "$KIOSK_HOME/.profile" << 'EOF' # ===== VERSTÄRKTER KIOSK AUTOSTART (PROFILE) ===== if [ -z "$SSH_CLIENT" ] && [ -z "$SSH_TTY" ] && [ -z "$KIOSK_STARTED" ]; then export KIOSK_STARTED=1 # Logge Profile-Autostart echo "$(date): Profile Autostart-Versuch auf $(tty)" >> /var/log/kiosk-autostart.log # Starte X-Session falls nicht vorhanden if [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then echo "$(date): Starte X-Session via profile" >> /var/log/kiosk-autostart.log exec startx fi fi EOF # Optimierte .xinitrc cat > "$KIOSK_HOME/.xinitrc" << EOF #!/bin/bash # Optimierte Xinit-Konfiguration für Kiosk-Modus # Logge X-Start echo "\$(date): X-Session gestartet via xinitrc" >> /var/log/kiosk-autostart.log # Export Display export DISPLAY=:0 # Session-Setup xset s off xset s noblank xset s noexpose xset -dpms # Verstecke Mauszeiger unclutter -idle 0.5 -root & # Warte kurz auf System-Stabilisierung sleep 3 # Starte Openbox exec openbox-session EOF chmod +x "$KIOSK_HOME/.xinitrc" # Desktop Autostart verstärken mkdir -p "$KIOSK_HOME/.config/autostart" cat > "$KIOSK_HOME/.config/autostart/kiosk-app.desktop" << EOF [Desktop Entry] Type=Application Name=MYP Kiosk Application Comment=Startet die MYP Kiosk-Anwendung automatisch Exec=$KIOSK_HOME/start-kiosk.sh Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true StartupNotify=false Terminal=false EOF # Berechtigungen setzen chown -R "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.config" chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.bashrc" chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.profile" chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.xinitrc" info "Kiosk-Benutzer Autostart optimiert" log "✅ Kiosk-Benutzer Optimierung abgeschlossen" } # ========================== WATCHDOG VERSTÄRKEN ========================== strengthen_watchdog() { log "=== WATCHDOG-VERSTÄRKUNG ===" progress "Verstärke Kiosk-Überwachung..." # Verstärkter Kiosk-Watchdog Service cat > "/etc/systemd/system/kiosk-watchdog-enhanced.service" << EOF [Unit] Description=Enhanced Kiosk Watchdog Service After=multi-user.target lightdm.service Wants=lightdm.service myp-druckerverwaltung.service [Service] Type=simple User=root ExecStart=/bin/bash -c ' while true; do # Prüfe Backend-Service if ! systemctl is-active --quiet myp-druckerverwaltung; then echo "\$(date): Backend-Service nicht aktiv - starte neu" >> /var/log/kiosk-watchdog-enhanced.log systemctl start myp-druckerverwaltung sleep 5 fi # Prüfe Backend-Erreichbarkeit if ! curl -s http://localhost:5000 >/dev/null 2>&1; then echo "\$(date): Backend nicht erreichbar - starte Service neu" >> /var/log/kiosk-watchdog-enhanced.log systemctl restart myp-druckerverwaltung sleep 10 fi # Prüfe LightDM if ! systemctl is-active --quiet lightdm; then echo "\$(date): LightDM nicht aktiv - starte neu" >> /var/log/kiosk-watchdog-enhanced.log systemctl start lightdm sleep 5 fi # Prüfe Kiosk-Benutzer Session if ! pgrep -u $KIOSK_USER > /dev/null; then echo "\$(date): Kiosk-Benutzer nicht angemeldet - starte LightDM neu" >> /var/log/kiosk-watchdog-enhanced.log systemctl restart lightdm sleep 10 fi # Prüfe Chromium Kiosk-Prozess if ! pgrep -u $KIOSK_USER -f "chromium.*kiosk" > /dev/null; then echo "\$(date): Chromium-Kiosk nicht gefunden - starte Kiosk-Session neu" >> /var/log/kiosk-watchdog-enhanced.log # Versuche Kiosk-Neustart als Kiosk-Benutzer sudo -u $KIOSK_USER DISPLAY=:0 /home/$KIOSK_USER/start-kiosk.sh & sleep 5 fi # Prüfe X-Server if ! pgrep -f "X.*:0" > /dev/null; then echo "\$(date): X-Server nicht gefunden - starte LightDM neu" >> /var/log/kiosk-watchdog-enhanced.log systemctl restart lightdm sleep 10 fi sleep 20 done ' Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF # Alten Watchdog deaktivieren und neuen aktivieren systemctl disable kiosk-watchdog.service 2>/dev/null || true systemctl enable kiosk-watchdog-enhanced.service # Cron-Watchdog verstärken cat > "/etc/cron.d/kiosk-watchdog-enhanced" << EOF # Verstärkter Kiosk-Watchdog: Prüft alle 2 Minuten */2 * * * * $KIOSK_USER /bin/bash -c 'if ! pgrep -f "chromium.*kiosk" > /dev/null; then echo "\$(date): Cron-Watchdog startet Kiosk neu" >> /var/log/kiosk-cron-watchdog.log; DISPLAY=:0 $HOME/start-kiosk.sh & fi' # System-Watchdog: Prüft Services alle 5 Minuten */5 * * * * root /bin/bash -c 'if ! systemctl is-active --quiet lightdm; then echo "\$(date): Cron startet LightDM neu" >> /var/log/system-cron-watchdog.log; systemctl start lightdm; fi' EOF # RC.Local verstärken cat > "/etc/rc.local" << EOF #!/bin/bash # Verstärkter rc.local - Kiosk-Fallback # Logge Start echo "\$(date): rc.local gestartet" >> /var/log/kiosk-fallback.log # Warte auf System-Initialisierung sleep 20 # Starte Backend-Service falls nicht läuft if ! systemctl is-active --quiet myp-druckerverwaltung; then echo "\$(date): Starte Backend-Service" >> /var/log/kiosk-fallback.log systemctl start myp-druckerverwaltung sleep 10 fi # Warte auf Backend-Verfügbarkeit for i in {1..30}; do if curl -s http://localhost:5000 >/dev/null 2>&1; then echo "\$(date): Backend verfügbar nach \$i Versuchen" >> /var/log/kiosk-fallback.log break fi sleep 2 done # Starte LightDM falls nicht läuft if ! systemctl is-active --quiet lightdm; then echo "\$(date): Starte LightDM" >> /var/log/kiosk-fallback.log systemctl start lightdm sleep 5 fi # Prüfe nach 30 Sekunden ob Kiosk-Benutzer angemeldet ist sleep 30 if ! pgrep -u $KIOSK_USER > /dev/null; then echo "\$(date): Kiosk-Benutzer nicht angemeldet - starte LightDM neu" >> /var/log/kiosk-fallback.log systemctl restart lightdm fi echo "\$(date): rc.local Kiosk-Fallback abgeschlossen" >> /var/log/kiosk-fallback.log exit 0 EOF chmod +x "/etc/rc.local" info "Watchdog-Services verstärkt" log "✅ Watchdog-Verstärkung abgeschlossen" } # ========================== SYSTEM-SERVICES OPTIMIEREN ========================== optimize_services() { log "=== SERVICE-OPTIMIERUNG ===" progress "Optimiere System-Services für schnelleren Start..." # Deaktiviere unnötige Services DISABLE_SERVICES=( "bluetooth" "hciuart" "triggerhappy" "avahi-daemon" "cups" "cups-browsed" "ModemManager" "wpa_supplicant" ) for service in "${DISABLE_SERVICES[@]}"; do if systemctl is-enabled --quiet "$service" 2>/dev/null; then systemctl disable "$service" 2>/dev/null || true info "Service '$service' deaktiviert" fi done # Optimiere wichtige Services systemctl enable myp-druckerverwaltung systemctl enable lightdm systemctl enable kiosk-watchdog-enhanced # Systemd-Daemon neu laden systemctl daemon-reload info "Services optimiert" log "✅ Service-Optimierung abgeschlossen" } # ========================== SYSTEM-PARAMETER OPTIMIEREN ========================== optimize_system_parameters() { log "=== SYSTEM-PARAMETER OPTIMIERUNG ===" progress "Optimiere System-Parameter..." # Systemd-Logind für Kiosk optimieren mkdir -p "/etc/systemd/logind.conf.d" cat > "/etc/systemd/logind.conf.d/kiosk.conf" << EOF [Login] # Verhindere dass System bei Inaktivität heruntergefahren wird IdleAction=ignore IdleActionSec=infinity # Verhindere Suspend/Hibernate HandlePowerKey=ignore HandleSuspendKey=ignore HandleHibernateKey=ignore HandleLidSwitch=ignore # Session-Einstellungen für Kiosk KillUserProcesses=no UserStopDelaySec=10 # Automatic VT allocation ReserveVT=1 EOF # Kernel-Parameter für bessere Performance cat > "/etc/sysctl.d/99-kiosk-performance.conf" << EOF # Kiosk-Performance Optimierungen vm.swappiness=10 vm.dirty_ratio=15 vm.dirty_background_ratio=5 kernel.sched_autogroup_enabled=0 EOF # Tmpfs für bessere Performance if ! grep -q "tmpfs.*tmp" /etc/fstab; then echo "tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0" >> /etc/fstab info "Tmpfs für /tmp konfiguriert" fi info "System-Parameter optimiert" log "✅ System-Parameter Optimierung abgeschlossen" } # ========================== HAUPTFUNKTION ========================== main() { log "=== RASPBERRY PI SCHNELLSTART-OPTIMIERUNG GESTARTET ===" check_root check_system install_essential_packages optimize_boot strengthen_autologin optimize_kiosk_user strengthen_watchdog optimize_services optimize_system_parameters log "=== OPTIMIERUNG ABGESCHLOSSEN ===" log "" log "🎉 RASPBERRY PI SCHNELLSTART-OPTIMIERUNG ERFOLGREICH!" log "" log "📋 ZUSAMMENFASSUNG:" log " ✅ Boot-Parameter optimiert" log " ✅ Autologin verstärkt" log " ✅ Kiosk-Benutzer optimiert" log " ✅ Watchdog-Services verstärkt" log " ✅ System-Services optimiert" log " ✅ System-Parameter optimiert" 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 " - Web-UI ist sofort verfügbar" log " - Mehrfache Überwachung aktiv" 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 "" warning "WICHTIG: Führen Sie jetzt 'sudo reboot' aus, um die Optimierungen zu aktivieren!" } # Skript ausführen main "$@"