#!/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 # =================================================================== set -euo pipefail # =========================== KONFIGURATION =========================== KIOSK_USER="kiosk" APP_USER="myp" APP_DIR="/opt/myp-druckerverwaltung" CURRENT_DIR="$(pwd)" INSTALL_LOG="/var/log/myp-kiosk-install.log" CHROMIUM_BIN="" # 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 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!" fi log "✅ System-Checks erfolgreich" } # ========================== SYSTEM-UPDATE ========================== update_system() { log "=== SYSTEM-UPDATE ===" 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..." 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" log "✅ System-Update abgeschlossen" } # ========================== PAKETE INSTALLIEREN ========================== install_packages() { log "=== SYSTEM-PAKETE INSTALLATION ===" 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" log "✅ System-Pakete installiert" } # ========================== CHROMIUM INSTALLATION ========================== install_chromium() { log "=== CHROMIUM INSTALLATION ===" progress "Installiere Chromium Browser..." 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 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" fi usermod -aG sudo "$APP_USER" 2>/dev/null || true fi # 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" fi usermod -aG audio,video,input "$KIOSK_USER" 2>/dev/null || true fi log "✅ Benutzer erstellt: $APP_USER, $KIOSK_USER" } # ========================== ANWENDUNG INSTALLIEREN ========================== install_application() { log "=== ANWENDUNGS-INSTALLATION ===" # Verzeichnisse erstellen mkdir -p "$APP_DIR" # 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 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 [Unit] Description=MYP Druckerverwaltung Flask Application After=network.target [Service] Type=simple User=$APP_USER Group=$APP_USER WorkingDirectory=$APP_DIR Environment=PATH=/usr/local/bin:/usr/bin:/bin Environment=PYTHONPATH=$APP_DIR ExecStart=/usr/bin/python3 $APP_DIR/app.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [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 "Konfiguriere LightDM für automatischen Login..." # 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 # 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 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" else echo "❌ http://localhost:5000 NICHT erreichbar" 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" # Log-Dateien erstellen touch /var/log/kiosk-session.log chmod 666 /var/log/kiosk-session.log log "✅ Wartungstools erstellt" } # ========================== HAUPTFUNKTION ========================== main() { log "=== MYP KIOSK-INSTALLATION GESTARTET ===" 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 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 "" warning "WICHTIG: Führen Sie jetzt 'sudo reboot' aus, um die Kiosk-Konfiguration zu aktivieren!" } # Skript ausführen main "$@"