#!/bin/bash ####################################################################### # MYP AIO-Installer - Desktop Environment & Kiosk Module # # Dieses Modul behandelt die Installation von: # - LXDE Desktop Environment (leichtgewichtig für Raspberry Pi) # - Chromium Browser im Kiosk-Modus # - Desktop-Konfiguration für automatischen Kiosk-Start # - Autostart-Mechanismen # - Desktop-Icons und Shortcuts ####################################################################### # Funktionsdeklarationen für Desktop & Kiosk Setup setup_desktop_environment() { log "INFO" "=== DESKTOP ENVIRONMENT EINRICHTEN ===" # LXDE Desktop installieren install_lxde_desktop # Chromium installieren install_chromium # Kiosk-Konfiguration erstellen configure_kiosk_mode # Desktop-Umgebung konfigurieren configure_desktop_environment # Autostart einrichten setup_autostart # Desktop-Icons erstellen create_desktop_icons # Automatische Anmeldung konfigurieren configure_auto_login log "INFO" "Desktop Environment Einrichtung abgeschlossen" } install_lxde_desktop() { log "INFO" "Installiere LXDE Desktop Environment..." # LXDE Core-Packages (minimal für Performance) local lxde_packages=( "lxde-core" # Kern-Desktop "lxde-common" # Gemeinsame Dateien "lxpanel" # Panel "pcmanfm" # Dateimanager "lxsession" # Session-Manager "openbox" # Window Manager "obconf" # Openbox-Konfiguration "lxterminal" # Terminal "lxappearance" # Theme-Manager "lxinput" # Input-Konfiguration "lxrandr" # Display-Konfiguration "lxshortcut" # Keyboard-Shortcuts # X11 Grundlagen "xorg" # X11-Server "xinit" # X11-Initialisierung "x11-xserver-utils" # X11-Utilities "xdotool" # X11-Automatisierung # Display Manager "lightdm" # Leichtgewichtiger Display Manager "lightdm-gtk-greeter" # GTK-Greeter für LightDM # Zusätzliche Tools "gvfs" # Virtual Filesystem "gvfs-backends" # VFS-Backends "pulseaudio" # Audio (minimal) "alsa-utils" # Audio-Utilities ) log "INFO" "Installiere LXDE-Packages (${#lxde_packages[@]} Packages)..." # Installation in Batches für bessere Kontrolle local batch_size=5 for ((i=0; i<${#lxde_packages[@]}; i+=batch_size)); do local batch=("${lxde_packages[@]:i:batch_size}") log "INFO" "Installiere LXDE-Batch: ${batch[*]}" if ! DEBIAN_FRONTEND=noninteractive apt-get install -y "${batch[@]}"; then log "WARN" "LXDE-Batch hatte Probleme, installiere einzeln..." for package in "${batch[@]}"; do if ! DEBIAN_FRONTEND=noninteractive apt-get install -y "$package"; then log "WARN" "LXDE-Package fehlgeschlagen: $package" fi done fi done # LightDM als Standard-Display-Manager setzen echo "/usr/sbin/lightdm" > /etc/X11/default-display-manager # LightDM aktivieren systemctl enable lightdm log "INFO" "LXDE Desktop Environment installiert" } install_chromium() { log "INFO" "Installiere Chromium Browser..." # Versuche verschiedene Installationsmethoden if install_chromium_apt; then log "INFO" "Chromium über APT installiert" elif install_chromium_snap; then log "INFO" "Chromium über Snap installiert" elif install_chromium_flatpak; then log "INFO" "Chromium über Flatpak installiert" else log "ERROR" "Chromium Installation fehlgeschlagen" return 1 fi # Chromium für Kiosk-Modus konfigurieren configure_chromium_for_kiosk log "INFO" "Chromium Installation abgeschlossen" } install_chromium_apt() { log "INFO" "Versuche Chromium Installation über APT..." # Standard Chromium-Packages local chromium_packages=( "chromium-browser" "chromium-browser-l10n" "chromium-codecs-ffmpeg" ) # Alternative Package-Namen für verschiedene Distributionen local chromium_alternatives=( "chromium" "chromium-bsu" ) # Versuche Standard-Packages for package in "${chromium_packages[@]}"; do if apt-cache search "$package" | grep -q "$package"; then if DEBIAN_FRONTEND=noninteractive apt-get install -y "$package"; then log "INFO" "Chromium-Package installiert: $package" return 0 fi fi done # Versuche Alternative-Packages for package in "${chromium_alternatives[@]}"; do if apt-cache search "$package" | grep -q "$package"; then if DEBIAN_FRONTEND=noninteractive apt-get install -y "$package"; then log "INFO" "Chromium-Alternative installiert: $package" return 0 fi fi done log "WARN" "Chromium APT-Installation fehlgeschlagen" return 1 } install_chromium_snap() { log "INFO" "Versuche Chromium Installation über Snap..." # Snap installieren falls nicht vorhanden if ! command -v snap >/dev/null 2>&1; then DEBIAN_FRONTEND=noninteractive apt-get install -y snapd systemctl enable --now snapd.socket sleep 10 # Warte auf Snap-Initialisierung fi # Chromium über Snap installieren if snap install chromium; then # Symlink für Kompatibilität erstellen ln -sf /snap/bin/chromium /usr/local/bin/chromium-browser ln -sf /snap/bin/chromium /usr/local/bin/chromium return 0 fi log "WARN" "Chromium Snap-Installation fehlgeschlagen" return 1 } install_chromium_flatpak() { log "INFO" "Versuche Chromium Installation über Flatpak..." # Flatpak installieren falls nicht vorhanden if ! command -v flatpak >/dev/null 2>&1; then DEBIAN_FRONTEND=noninteractive apt-get install -y flatpak # Flathub Repository hinzufügen flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo fi # Chromium über Flatpak installieren if flatpak install -y flathub org.chromium.Chromium; then # Wrapper-Script für Kompatibilität erstellen cat > /usr/local/bin/chromium-browser << 'EOF' #!/bin/bash exec flatpak run org.chromium.Chromium "$@" EOF chmod +x /usr/local/bin/chromium-browser return 0 fi log "WARN" "Chromium Flatpak-Installation fehlgeschlagen" return 1 } configure_chromium_for_kiosk() { log "INFO" "Konfiguriere Chromium für Kiosk-Modus..." # Chromium-Konfigurationsverzeichnis erstellen local chromium_config_dir="/home/$PROJECT_USER/.config/chromium" mkdir -p "$chromium_config_dir/Default" # Kiosk-freundliche Preferences cat > "$chromium_config_dir/Default/Preferences" << EOF { "browser": { "check_default_browser": false, "show_home_button": false }, "profile": { "default_content_setting_values": { "notifications": 2 }, "exit_type": "Normal", "password_manager_enabled": false }, "bookmark_bar": { "show_on_all_tabs": false }, "distribution": { "import_bookmarks": false, "make_chrome_default": false, "show_welcome_page": false }, "first_run_tabs": [], "homepage": "https://localhost", "homepage_is_newtabpage": false, "session": { "restore_on_startup": 4, "startup_urls": ["https://localhost"] } } EOF # Chromium-Flags für optimale Kiosk-Performance cat > "$chromium_config_dir/chrome_flags.conf" << EOF # MYP Kiosk Chromium Flags --kiosk --disable-infobars --disable-session-crashed-bubble --disable-restore-session-state --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-renderer-backgrounding --disable-features=TranslateUI --disable-web-security --disable-features=VizDisplayCompositor --no-first-run --autoplay-policy=no-user-gesture-required --disable-dev-shm-usage --no-sandbox --disable-gpu-sandbox --ignore-certificate-errors --ignore-ssl-errors --ignore-certificate-errors-spki-list --ignore-ssl-errors-spki-list --allow-running-insecure-content --disable-extensions --disable-plugins --disable-background-networking --disable-background-timer-throttling --disable-client-side-phishing-detection --disable-default-apps --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --metrics-recording-only --no-default-browser-check --no-pings --password-store=basic --use-mock-keychain --force-device-scale-factor=1 EOF # Berechtigungen setzen chown -R "$PROJECT_USER:$PROJECT_GROUP" "$chromium_config_dir" log "INFO" "Chromium für Kiosk-Modus konfiguriert" } configure_kiosk_mode() { log "INFO" "Konfiguriere Kiosk-Modus..." # Kiosk-Start-Script erstellen create_kiosk_start_script # Systemd-Service für Kiosk erstellen create_kiosk_systemd_service # Kiosk-Umgebung konfigurieren configure_kiosk_environment log "INFO" "Kiosk-Modus konfiguriert" } create_kiosk_start_script() { log "INFO" "Erstelle Kiosk-Start-Script..." local kiosk_script="/usr/local/bin/myp-kiosk.sh" cat > "$kiosk_script" << EOF #!/bin/bash ####################################################################### # MYP Kiosk-Modus Start-Script # # Startet das MYP-System im Vollbild-Kiosk-Modus ####################################################################### set -euo pipefail # Konfiguration PROJECT_USER="$PROJECT_USER" MYP_URL="https://localhost" DISPLAY_NUM=":0" CHROMIUM_CONFIG="/home/\$PROJECT_USER/.config/chromium" # Logging exec >> /var/log/myp-kiosk.log 2>&1 echo "[\$(date)] MYP Kiosk-Modus wird gestartet..." # Warte auf X11-Server wait_for_x11() { echo "Warte auf X11-Server..." for i in {1..30}; do if DISPLAY=\$DISPLAY_NUM xdpyinfo >/dev/null 2>&1; then echo "X11-Server verfügbar" return 0 fi sleep 2 done echo "X11-Server nicht verfügbar nach 60 Sekunden" return 1 } # Warte auf Netzwerk wait_for_network() { echo "Warte auf Netzwerk..." for i in {1..15}; do if ping -c 1 127.0.0.1 >/dev/null 2>&1; then echo "Netzwerk verfügbar" return 0 fi sleep 2 done echo "Netzwerk nicht verfügbar nach 30 Sekunden" return 1 } # Warte auf MYP-Service wait_for_myp_service() { echo "Warte auf MYP-Service..." for i in {1..30}; do if systemctl is-active --quiet myp-https; then echo "MYP-Service aktiv" sleep 5 # Zusätzliche Zeit für vollständigen Start return 0 fi sleep 2 done echo "MYP-Service nicht verfügbar nach 60 Sekunden" return 1 } # Bildschirm-Saver deaktivieren disable_screensaver() { echo "Deaktiviere Bildschirmschoner..." DISPLAY=\$DISPLAY_NUM xset s off 2>/dev/null || true DISPLAY=\$DISPLAY_NUM xset -dpms 2>/dev/null || true DISPLAY=\$DISPLAY_NUM xset s noblank 2>/dev/null || true } # Mauszeiger verstecken hide_cursor() { echo "Verstecke Mauszeiger..." DISPLAY=\$DISPLAY_NUM unclutter -display \$DISPLAY_NUM -idle 0.1 -root 2>/dev/null & } # Chromium-Cache bereinigen clean_chromium_cache() { echo "Bereinige Chromium-Cache..." rm -rf "\$CHROMIUM_CONFIG/Default/Application Cache" 2>/dev/null || true rm -rf "\$CHROMIUM_CONFIG/Default/Cache" 2>/dev/null || true rm -rf "\$CHROMIUM_CONFIG/Default/Code Cache" 2>/dev/null || true } # Hauptfunktion main() { echo "=== MYP Kiosk-Modus Start ===" # Warte auf alle Abhängigkeiten wait_for_x11 || exit 1 wait_for_network || exit 1 wait_for_myp_service || exit 1 # Umgebung vorbereiten disable_screensaver hide_cursor clean_chromium_cache # Bestimme Chromium-Executable CHROMIUM_BIN="" for bin in chromium-browser chromium /snap/bin/chromium; do if command -v "\$bin" >/dev/null 2>&1; then CHROMIUM_BIN="\$bin" break fi done if [[ -z "\$CHROMIUM_BIN" ]]; then echo "FEHLER: Chromium nicht gefunden" exit 1 fi echo "Verwende Chromium: \$CHROMIUM_BIN" # Chromium im Kiosk-Modus starten echo "Starte Chromium im Kiosk-Modus..." echo "URL: \$MYP_URL" DISPLAY=\$DISPLAY_NUM "\$CHROMIUM_BIN" \\ --kiosk \\ --disable-infobars \\ --disable-session-crashed-bubble \\ --disable-restore-session-state \\ --disable-background-timer-throttling \\ --disable-backgrounding-occluded-windows \\ --disable-renderer-backgrounding \\ --disable-features=TranslateUI \\ --disable-web-security \\ --disable-features=VizDisplayCompositor \\ --no-first-run \\ --autoplay-policy=no-user-gesture-required \\ --disable-dev-shm-usage \\ --no-sandbox \\ --disable-gpu-sandbox \\ --ignore-certificate-errors \\ --ignore-ssl-errors \\ --ignore-certificate-errors-spki-list \\ --ignore-ssl-errors-spki-list \\ --allow-running-insecure-content \\ --disable-extensions \\ --disable-plugins \\ --disable-background-networking \\ --disable-background-timer-throttling \\ --disable-client-side-phishing-detection \\ --disable-default-apps \\ --disable-hang-monitor \\ --disable-popup-blocking \\ --disable-prompt-on-repost \\ --disable-sync \\ --metrics-recording-only \\ --no-default-browser-check \\ --no-pings \\ --password-store=basic \\ --use-mock-keychain \\ --force-device-scale-factor=1 \\ --user-data-dir="\$CHROMIUM_CONFIG" \\ "\$MYP_URL" 2>&1 echo "Chromium beendet mit Exit-Code: \$?" } # Script starten main "\$@" EOF chmod +x "$kiosk_script" chown root:root "$kiosk_script" log "INFO" "Kiosk-Start-Script erstellt: $kiosk_script" } create_kiosk_systemd_service() { log "INFO" "Erstelle Kiosk SystemD-Service..." cat > "/etc/systemd/system/${KIOSK_SERVICE}.service" << EOF [Unit] Description=MYP Kiosk Mode Documentation=https://github.com/mercedes-benz/myp After=graphical-session.target After=myp-https.service Wants=myp-https.service PartOf=graphical-session.target [Service] Type=simple User=$PROJECT_USER Group=$PROJECT_GROUP Environment=DISPLAY=:0 Environment=HOME=/home/$PROJECT_USER ExecStartPre=/bin/sleep 10 ExecStart=/usr/local/bin/myp-kiosk.sh Restart=always RestartSec=5 StandardOutput=append:/var/log/myp-kiosk.log StandardError=append:/var/log/myp-kiosk.log # Sicherheits-Einstellungen NoNewPrivileges=true PrivateTmp=true ProtectHome=false ProtectSystem=strict ReadWritePaths=/home/$PROJECT_USER ReadWritePaths=/tmp ReadWritePaths=/var/log [Install] WantedBy=graphical-session.target EOF # Service aktivieren systemctl daemon-reload systemctl enable "$KIOSK_SERVICE" log "INFO" "Kiosk SystemD-Service erstellt und aktiviert" } configure_kiosk_environment() { log "INFO" "Konfiguriere Kiosk-Umgebung..." # Unclutter für Mauszeiger-Verstecken installieren DEBIAN_FRONTEND=noninteractive apt-get install -y unclutter || { log "WARN" "unclutter konnte nicht installiert werden" } # Bildschirmschoner komplett deaktivieren DEBIAN_FRONTEND=noninteractive apt-get remove -y xscreensaver* || true # DPMS-Energiesparmodus deaktivieren cat > "/home/$PROJECT_USER/.xprofile" << 'EOF' # MYP Kiosk X11-Konfiguration xset s off xset -dpms xset s noblank EOF chown "$PROJECT_USER:$PROJECT_GROUP" "/home/$PROJECT_USER/.xprofile" log "INFO" "Kiosk-Umgebung konfiguriert" } configure_desktop_environment() { log "INFO" "Konfiguriere Desktop-Umgebung..." # LXDE-Konfiguration configure_lxde # LightDM-Konfiguration configure_lightdm # Openbox-Konfiguration configure_openbox log "INFO" "Desktop-Umgebung konfiguriert" } configure_lxde() { log "INFO" "Konfiguriere LXDE..." local lxde_config_dir="/home/$PROJECT_USER/.config/lxsession/LXDE" mkdir -p "$lxde_config_dir" # LXDE Desktop-Konfiguration cat > "$lxde_config_dir/desktop.conf" << 'EOF' [Session] window_manager=openbox-lxde windows_manager/command=openbox windows_manager/session=LXDE disable_autostart=no polkit/command=lxpolkit clipboard/command=lxclipboard xrandr/command=lxrandr keyring/command=ssh-agent quit_manager/command=lxsession-logout quit_manager/image=/usr/share/lxde/images/logout-banner.png quit_manager/layout=top [GTK] sNet/ThemeName=Clearlooks sNet/IconThemeName=nuoveXT2 sGtk/FontName=Sans 10 iGtk/ToolbarStyle=3 iGtk/ButtonImages=1 iGtk/MenuImages=1 iGtk/CursorThemeSize=18 iXft/Antialias=1 iXft/Hinting=1 iXft/HintStyle=hintslight iXft/RGBA=rgb [Mouse] AccFactor=20 AccThreshold=10 LeftHanded=0 [Keyboard] Delay=500 Interval=30 Beep=1 [State] guess_default=true [Dbus] lxde=true [Environment] menu_prefix=lxde- EOF # Autostart-Konfiguration cat > "$lxde_config_dir/autostart" << 'EOF' @lxpanel --profile LXDE @pcmanfm --desktop --profile LXDE @xscreensaver -no-splash EOF chown -R "$PROJECT_USER:$PROJECT_GROUP" "/home/$PROJECT_USER/.config" log "INFO" "LXDE konfiguriert" } configure_lightdm() { log "INFO" "Konfiguriere LightDM..." # LightDM Haupt-Konfiguration cat > "/etc/lightdm/lightdm.conf" << EOF [Seat:*] autologin-guest=false autologin-user=$PROJECT_USER autologin-user-timeout=0 autologin-session=LXDE user-session=LXDE greeter-session=lightdm-gtk-greeter greeter-hide-users=false greeter-allow-guest=false greeter-show-manual-login=false greeter-show-remote-login=false session-wrapper=/etc/lightdm/Xsession display-setup-script=/etc/lightdm/display_setup.sh EOF # LightDM GTK-Greeter Konfiguration cat > "/etc/lightdm/lightdm-gtk-greeter.conf" << 'EOF' [greeter] background=/usr/share/pixmaps/myp-background.jpg theme-name=Clearlooks icon-theme-name=nuoveXT2 font-name=Sans 11 xft-antialias=true xft-dpi=96 xft-hintstyle=hintslight xft-rgba=rgb show-indicators=~host;~spacer;~clock;~spacer;~session;~language;~a11y;~power show-clock=true clock-format=%H:%M keyboard= position=50%,center 50%,center default-user-image=/usr/share/pixmaps/myp-user.png hide-user-image=false round-user-image=false highlight-logged-user=true panel-position=bottom idle-timeout=60 EOF # Display-Setup-Script cat > "/etc/lightdm/display_setup.sh" << 'EOF' #!/bin/bash # MYP Display Setup xset s off xset -dpms xset s noblank EOF chmod +x "/etc/lightdm/display_setup.sh" log "INFO" "LightDM konfiguriert" } configure_openbox() { log "INFO" "Konfiguriere Openbox..." local openbox_config_dir="/home/$PROJECT_USER/.config/openbox" mkdir -p "$openbox_config_dir" # Openbox RC-Konfiguration cat > "$openbox_config_dir/rc.xml" << 'EOF' 10 20 yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 MYP 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g 1 500 400 false menu.xml 200 no 100 400 yes yes no true
EOF chown -R "$PROJECT_USER:$PROJECT_GROUP" "$openbox_config_dir" log "INFO" "Openbox konfiguriert" } setup_autostart() { log "INFO" "Richte Autostart ein..." # Systemd-Target für Desktop create_desktop_target # User-Autostart configure_user_autostart log "INFO" "Autostart eingerichtet" } create_desktop_target() { log "INFO" "Erstelle Desktop SystemD-Target..." cat > "/etc/systemd/system/myp-desktop.target" << 'EOF' [Unit] Description=MYP Desktop Environment Documentation=https://github.com/mercedes-benz/myp Requires=graphical-session.target After=graphical-session.target AllowIsolate=yes [Install] WantedBy=graphical.target EOF systemctl daemon-reload systemctl enable myp-desktop.target log "INFO" "Desktop SystemD-Target erstellt" } configure_user_autostart() { log "INFO" "Konfiguriere Benutzer-Autostart..." local autostart_dir="/home/$PROJECT_USER/.config/autostart" mkdir -p "$autostart_dir" # MYP Kiosk Autostart cat > "$autostart_dir/myp-kiosk.desktop" << 'EOF' [Desktop Entry] Type=Application Name=MYP Kiosk Comment=Mercedes-Benz 3D Printer Management System Exec=/usr/local/bin/myp-kiosk.sh Terminal=false Hidden=false X-GNOME-Autostart-enabled=true StartupNotify=false EOF chown -R "$PROJECT_USER:$PROJECT_GROUP" "$autostart_dir" log "INFO" "Benutzer-Autostart konfiguriert" } create_desktop_icons() { log "INFO" "Erstelle Desktop-Icons..." local desktop_dir="/home/$PROJECT_USER/Desktop" mkdir -p "$desktop_dir" # MYP-System Desktop-Icon cat > "$desktop_dir/MYP-System.desktop" << 'EOF' [Desktop Entry] Version=1.0 Type=Application Name=MYP System Comment=Mercedes-Benz 3D Printer Management System Exec=chromium-browser --kiosk https://localhost Icon=/usr/share/pixmaps/myp-icon.png Terminal=false StartupNotify=true Categories=Office; EOF # Terminal Desktop-Icon (für Wartung) cat > "$desktop_dir/Terminal.desktop" << 'EOF' [Desktop Entry] Version=1.0 Type=Application Name=Terminal Comment=Terminal für Systemwartung Exec=lxterminal Icon=utilities-terminal Terminal=false StartupNotify=true Categories=System; EOF # Icons ausführbar machen chmod +x "$desktop_dir"/*.desktop chown -R "$PROJECT_USER:$PROJECT_GROUP" "$desktop_dir" log "INFO" "Desktop-Icons erstellt" } configure_auto_login() { log "INFO" "Konfiguriere automatische Anmeldung..." # Gruppe autologin erstellen falls nicht vorhanden groupadd -f autologin # Benutzer zur autologin-Gruppe hinzufügen usermod -a -G autologin "$PROJECT_USER" # LightDM für automatische Anmeldung konfigurieren (bereits in configure_lightdm erledigt) log "INFO" "Automatische Anmeldung konfiguriert" } verify_desktop_environment() { log "INFO" "Überprüfe Desktop Environment..." local errors=0 # Wichtige Packages prüfen local required_packages=( "lxde-core" "lightdm" "openbox" ) for package in "${required_packages[@]}"; do if ! dpkg -l | grep -q "^ii.*$package"; then log "ERROR" "Desktop-Package fehlt: $package" errors=$((errors + 1)) fi done # Chromium prüfen if ! command -v chromium-browser >/dev/null 2>&1 && ! command -v chromium >/dev/null 2>&1; then log "ERROR" "Chromium nicht verfügbar" errors=$((errors + 1)) fi # Services prüfen if ! systemctl is-enabled --quiet lightdm; then log "ERROR" "LightDM nicht aktiviert" errors=$((errors + 1)) fi if ! systemctl is-enabled --quiet "$KIOSK_SERVICE"; then log "ERROR" "Kiosk-Service nicht aktiviert" errors=$((errors + 1)) fi if [[ $errors -eq 0 ]]; then log "INFO" "Desktop Environment Verifikation erfolgreich" return 0 else log "ERROR" "Desktop Environment Verifikation fehlgeschlagen ($errors Fehler)" return 1 fi }