Projektarbeit-MYP/backend/app/install_raspberry_pi.sh

1682 lines
52 KiB
Bash

#!/bin/bash
# ===================================================================
# MYP Druckerverwaltung - Raspberry Pi Kiosk Installation
# Vollautomatische Installation für echten Kiosk-Modus ohne Escape
# Designed für Raspberry Pi OS, Ubuntu Server, Debian minimal
# ===================================================================
set -e # Bei Fehlern sofort beenden
# =========================== KONFIGURATION ===========================
KIOSK_USER="kiosk"
APP_USER="myp"
APP_DIR="/opt/myp-druckerverwaltung"
BACKUP_DIR="/opt/myp-backups"
CURRENT_DIR=""
INSTALL_LOG="/var/log/myp-kiosk-install.log"
# Desktop Environment Pakete die entfernt werden sollen
REMOVE_PACKAGES=(
"gnome*" "kde*" "xfce*" "lxde*" "mate*" "cinnamon*"
"lightdm" "gdm*" "xdm" "nodm"
"firefox*" "thunderbird*" "libreoffice*" "wolfram-engine"
"scratch*" "minecraft-pi" "sonic-pi" "idle*"
"vlc" "smplayer" "totem" "rhythmbox"
"gedit" "mousepad" "leafpad" "pluma"
"file-roller" "xarchiver" "ark"
"gimp" "inkscape" "blender"
"chromium-browser" # Alte Version entfernen
)
# Farben für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
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"
# Prüfe ob wir uns im richtigen Verzeichnis befinden
if [ ! -f "$CURRENT_DIR/app.py" ]; then
error "app.py nicht gefunden in $CURRENT_DIR - Bitte im MYP-Projektverzeichnis ausführen!"
fi
# System-Info sammeln
info "System: $(uname -a)"
info "Distribution: $(lsb_release -d 2>/dev/null || cat /etc/os-release | head -1 || echo 'Unbekannt')"
info "Speicher: $(free -h | head -2 | tail -1)"
info "Festplatte: $(df -h / | tail -1)"
# Internetverbindung testen
if ! ping -c 1 google.com &> /dev/null; then
error "Keine Internetverbindung verfügbar!"
fi
# Minimal 2GB freier Speicher erforderlich
available_kb=$(df / | awk 'NR==2 {print $4}')
if [ "$available_kb" -lt 2000000 ]; then
error "Nicht genügend Speicherplatz! Mindestens 2GB erforderlich."
fi
log "✅ System-Checks erfolgreich"
}
# ========================== SYSTEM-BEREINIGUNG ==========================
cleanup_system() {
log "=== PHASE 1: SYSTEM-BEREINIGUNG ==="
# APT-Cache aktualisieren
progress "Aktualisiere Paketlisten..."
apt-get update -y || warning "APT Update teilweise fehlgeschlagen"
# Entferne unnötige Desktop-Umgebungen
progress "Entferne Desktop-Umgebungen und unnötige Software..."
for package in "${REMOVE_PACKAGES[@]}"; do
if dpkg -l | grep -q "^ii.*$package"; then
info "Entferne: $package"
apt-get purge -y "$package" 2>/dev/null || true
fi
done
# Aggressive Bereinigung
apt-get autoremove -y --purge
apt-get autoclean
# Stoppe unnötige Services
progress "Stoppe Desktop-Services..."
for service in gdm lightdm xdm nodm plymouth; do
systemctl stop "$service" 2>/dev/null || true
systemctl disable "$service" 2>/dev/null || true
done
log "✅ System-Bereinigung abgeschlossen"
}
# ========================== PAKETE INSTALLIEREN ==========================
install_packages() {
log "=== PHASE 2: SYSTEM-PAKETE INSTALLATION ==="
progress "Installiere Basis-Pakete..."
apt-get install -y \
curl wget git unzip \
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 \
pulseaudio alsa-utils \
fonts-liberation fonts-dejavu \
ca-certificates apt-transport-https \
systemd-timesyncd \
ufw fail2ban \
htop nano \
|| error "Basis-Pakete Installation fehlgeschlagen"
# Node.js installieren
progress "Installiere Node.js..."
if ! command -v node &> /dev/null; then
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y nodejs
fi
log "✅ System-Pakete installiert"
}
# ========================== CHROMIUM INSTALLATION ==========================
install_chromium() {
log "=== PHASE 3: CHROMIUM INSTALLATION ==="
progress "Installiere Chromium Browser..."
# Versuche verschiedene Installationsmethoden
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
# Snap-Installation versuchen
warning "APT-Installation fehlgeschlagen, versuche Snap..."
if command -v snap &> /dev/null || (apt-get install -y snapd && systemctl enable --now snapd); then
snap install chromium
CHROMIUM_BIN="/snap/bin/chromium"
log "✅ Chromium via Snap installiert"
else
# Flatpak als letzter Ausweg
warning "Snap fehlgeschlagen, versuche Flatpak..."
if apt-get install -y flatpak && flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo; then
flatpak install -y flathub org.chromium.Chromium
CHROMIUM_BIN="flatpak run org.chromium.Chromium"
log "✅ Chromium via Flatpak installiert"
else
error "❌ Chromium konnte nicht installiert werden! Bitte manuell installieren."
fi
fi
fi
# Chromium-Binary validieren
if [[ "$CHROMIUM_BIN" == "flatpak"* ]]; then
# Flatpak-Spezialbehandlung
log "Chromium via Flatpak verfügbar"
elif [ ! -x "$CHROMIUM_BIN" ]; then
error "Chromium-Binary nicht ausführbar: $CHROMIUM_BIN"
fi
log "✅ Chromium-Installation abgeschlossen: $CHROMIUM_BIN"
}
# ========================== BENUTZER ERSTELLEN ==========================
create_users() {
log "=== PHASE 4: 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
# Kiosk-Benutzer zu Audio/Video-Gruppen hinzufügen
usermod -aG audio,video,input "$KIOSK_USER" 2>/dev/null || true
fi
log "✅ Benutzer erstellt: $APP_USER, $KIOSK_USER"
}
# ========================== ANWENDUNG INSTALLIEREN ==========================
install_application() {
log "=== PHASE 5: ANWENDUNGS-INSTALLATION ==="
# Anwendungsverzeichnis erstellen
progress "Erstelle Anwendungsverzeichnis: $APP_DIR"
mkdir -p "$APP_DIR" "$BACKUP_DIR"
# Anwendung kopieren
progress "Kopiere Anwendung von $CURRENT_DIR nach $APP_DIR"
cp -r "$CURRENT_DIR"/* "$APP_DIR/"
chown -R "$APP_USER:$APP_USER" "$APP_DIR"
# Wechsel ins Anwendungsverzeichnis
cd "$APP_DIR"
# Python Virtual Environment
progress "Erstelle Python Virtual Environment..."
sudo -u "$APP_USER" python3 -m venv venv
sudo -u "$APP_USER" ./venv/bin/pip install --upgrade pip
# Python-Dependencies installieren
progress "Installiere Python-Dependencies..."
if [ -f "requirements.txt" ]; then
sudo -u "$APP_USER" ./venv/bin/pip install -r requirements.txt
else
# Basis-Pakete installieren
sudo -u "$APP_USER" ./venv/bin/pip install \
flask flask-login flask-wtf flask-limiter \
sqlalchemy werkzeug requests gunicorn \
bcrypt cryptography PyP100
fi
# Node.js Dependencies
if [ -f "package.json" ]; then
progress "Installiere Node.js Dependencies..."
sudo -u "$APP_USER" npm install
if [ -f "tailwind.config.js" ]; then
sudo -u "$APP_USER" npm run build:css || true
fi
fi
# Datenbank initialisieren (DB-Import-Fehler behoben)
progress "Initialisiere Datenbank..."
sudo -u "$APP_USER" ./venv/bin/python -c "
from app import app, db
from models import init_database, create_initial_admin
with app.app_context():
init_database()
create_initial_admin()
print('Datenbank initialisiert')
" || warning "Datenbank-Initialisierung fehlgeschlagen"
# Konfiguration erstellen
progress "Erstelle Anwendungskonfiguration..."
cat > "$APP_DIR/.env" << EOF
FLASK_ENV=production
SECRET_KEY=$(openssl rand -hex 32)
DATABASE_URL=sqlite:///database.db
HOST=0.0.0.0
PORT=5000
DEBUG=False
KIOSK_MODE=true
KIOSK_URL=http://localhost
EOF
chown "$APP_USER:$APP_USER" "$APP_DIR/.env"
log "✅ Anwendung installiert"
}
# ========================== KIOSK-KONFIGURATION ==========================
configure_kiosk() {
log "=== PHASE 6: KIOSK-KONFIGURATION ==="
# Sicherer Kiosk-Benutzer-Setup
KIOSK_HOME="/home/$KIOSK_USER"
progress "Konfiguriere Openbox für Kiosk..."
sudo -u "$KIOSK_USER" mkdir -p "$KIOSK_HOME/.config/openbox"
# Openbox-Konfiguration für maximale Sicherheit
cat > "$KIOSK_HOME/.config/openbox/rc.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<openbox_config xmlns="http://openbox.org/3.4/rc">
<resistance>
<strength>10</strength>
<screen_edge_strength>20</screen_edge_strength>
</resistance>
<focus>
<focusNew>yes</focusNew>
<followMouse>no</followMouse>
<focusLast>yes</focusLast>
<underMouse>no</underMouse>
<focusDelay>200</focusDelay>
<raiseOnFocus>no</raiseOnFocus>
</focus>
<placement>
<policy>Smart</policy>
<center>yes</center>
<monitor>Primary</monitor>
<primaryMonitor>1</primaryMonitor>
</placement>
<theme>
<name>Clearlooks</name>
<titleLayout>NLIMC</titleLayout>
<keepBorder>yes</keepBorder>
<animateIconify>yes</animateIconify>
<font place="ActiveWindow">
<name>sans</name>
<size>8</size>
<weight>bold</weight>
<slant>normal</slant>
</font>
</theme>
<desktops>
<number>1</number>
<firstdesk>1</firstdesk>
<names>
<name>Kiosk</name>
</names>
<popupTime>875</popupTime>
</desktops>
<resize>
<drawContents>yes</drawContents>
<popupShow>Nonpixel</popupShow>
<popupPosition>Center</popupPosition>
<popupFixedPosition>
<x>10</x>
<y>10</y>
</popupFixedPosition>
</resize>
<dock>
<position>TopLeft</position>
<floatingX>0</floatingX>
<floatingY>0</floatingY>
<noStrut>no</noStrut>
<stacking>Above</stacking>
<direction>Vertical</direction>
<autoHide>no</autoHide>
<hideDelay>300</hideDelay>
<showDelay>300</showDelay>
<moveButton>Middle</moveButton>
</dock>
<keyboard>
<!-- ALLE SHORTCUTS DEAKTIVIERT FÜR KIOSK-SICHERHEIT -->
</keyboard>
<mouse>
<dragThreshold>3</dragThreshold>
<doubleClickTime>200</doubleClickTime>
<screenEdgeWarpTime>400</screenEdgeWarpTime>
<screenEdgeWarpMouse>false</screenEdgeWarpMouse>
</mouse>
<menu>
<!-- KEIN MENU FÜR KIOSK -->
</menu>
<applications>
<application name="chromium*">
<decor>no</decor>
<shade>no</shade>
<position force="yes">
<x>0</x>
<y>0</y>
</position>
<size>
<width>100%</width>
<height>100%</height>
</size>
<fullscreen>yes</fullscreen>
<maximized>yes</maximized>
<skip_pager>yes</skip_pager>
<skip_taskbar>yes</skip_taskbar>
</application>
</applications>
</openbox_config>
EOF
# Autostart-Konfiguration
cat > "$KIOSK_HOME/.config/openbox/autostart" << EOF
#!/bin/bash
# Warte auf X-Server
sleep 3
# Führe Kiosk-Skript aus
exec $KIOSK_HOME/start-kiosk.sh
EOF
# Haupt-Kiosk-Skript mit maximaler Sicherheit
cat > "$KIOSK_HOME/start-kiosk.sh" << EOF
#!/bin/bash
# ===== KIOSK-SICHERHEITS-KONFIGURATION =====
export DISPLAY=:0
# Bildschirmschoner komplett deaktivieren
xset s off
xset s noblank
xset s noexpose
xset -dpms
# Mauszeiger verstecken
unclutter -idle 0.1 -root &
# Virtuelle Tastatur deaktivieren
killall onboard 2>/dev/null || true
# Screenshot-Tools deaktivieren
killall gnome-screenshot 2>/dev/null || true
killall scrot 2>/dev/null || true
# ===== WARTE AUF ANWENDUNG =====
while ! curl -s http://localhost:5000 > /dev/null; do
echo "Warte auf MYP-Anwendung..."
sleep 2
done
# ===== CHROMIUM KIOSK-MODUS =====
# Maximum security flags für echten Kiosk-Modus
$CHROMIUM_BIN \\
--kiosk \\
--no-sandbox \\
--disable-web-security \\
--disable-features=TranslateUI,BlinkGenPropertyTrees \\
--disable-ipc-flooding-protection \\
--disable-renderer-backgrounding \\
--disable-backgrounding-occluded-windows \\
--disable-background-timer-throttling \\
--disable-background-networking \\
--disable-breakpad \\
--disable-component-extensions-with-background-pages \\
--disable-dev-shm-usage \\
--disable-extensions \\
--disable-hang-monitor \\
--disable-popup-blocking \\
--disable-prompt-on-repost \\
--disable-sync \\
--disable-translate \\
--disable-infobars \\
--disable-session-crashed-bubble \\
--disable-restore-session-state \\
--noerrdialogs \\
--force-color-profile=srgb \\
--no-first-run \\
--no-default-browser-check \\
--autoplay-policy=no-user-gesture-required \\
--start-fullscreen \\
--window-position=0,0 \\
--window-size=1920,1080 \\
--app=http://localhost:5000 \\
--user-data-dir=$KIOSK_HOME/.chromium-kiosk \\
--disable-features=VizDisplayCompositor \\
--enable-features=OverlayScrollbar \\
--disable-gpu-sandbox \\
--disable-software-rasterizer \\
--ignore-certificate-errors \\
--ignore-ssl-errors \\
--ignore-certificate-errors-spki-list \\
--ignore-ssl-errors-list \\
--disable-logging \\
--silent-debugger-extension-api \\
--disable-default-apps \\
--disable-background-mode \\
--app-auto-launched \\
--no-startup-window
EOF
# Skripte ausführbar machen
chmod +x "$KIOSK_HOME/.config/openbox/autostart"
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"
}
# ========================== AUTO-LOGIN KONFIGURATION ==========================
configure_autologin() {
log "=== PHASE 6.5: AUTO-LOGIN KONFIGURATION ==="
progress "Installiere und konfiguriere Display Manager..."
# LightDM installieren für besseres Auto-Login-Management
apt-get install -y lightdm lightdm-gtk-greeter || true
# Stoppe andere Display Manager
for dm in gdm gdm3 sddm xdm nodm; do
systemctl stop "$dm" 2>/dev/null || true
systemctl disable "$dm" 2>/dev/null || true
done
progress "Konfiguriere LightDM für Auto-Login..."
# LightDM-Konfiguration für automatischen Login
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
EOF
progress "Erstelle Session-Setup-Skript..."
# Session-Setup-Skript für zusätzliche Sicherheit
cat > "/usr/share/lightdm/setup-kiosk-session.sh" << EOF
#!/bin/bash
# Session-Setup für Kiosk-Modus
# Stelle sicher, dass X11-Display verfügbar ist
export DISPLAY=:0
# Deaktiviere Bildschirmschoner und Power Management
xset s off
xset s noblank
xset s noexpose
xset -dpms
# Verstecke Mauszeiger
unclutter -idle 0.5 -root &
# Logge Session-Start
echo "\$(date): Kiosk-Session für Benutzer $KIOSK_USER gestartet" >> /var/log/kiosk-session.log
EOF
chmod +x "/usr/share/lightdm/setup-kiosk-session.sh"
progress "Konfiguriere Getty Auto-Login als Fallback..."
# Getty Auto-Login als Fallback konfigurieren (falls LightDM fehlschlägt)
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
EOF
progress "Erstelle Desktop-Session für Openbox..."
# Desktop-Session-Datei für Openbox
mkdir -p "/usr/share/xsessions"
cat > "/usr/share/xsessions/openbox.desktop" << EOF
[Desktop Entry]
Name=Openbox
Comment=A lightweight window manager
Exec=openbox-session
Type=XSession
DesktopNames=OPENBOX
EOF
# Kiosk-Benutzer Desktop-Umgebung konfigurieren
progress "Konfiguriere Desktop-Umgebung für Kiosk-Benutzer..."
KIOSK_HOME="/home/$KIOSK_USER"
# .xsessionrc für X-Session-Setup
cat > "$KIOSK_HOME/.xsessionrc" << EOF
#!/bin/bash
# X-Session-Setup für Kiosk-Modus
# Export Display
export DISPLAY=:0
# Starte Session-Log
echo "\$(date): X-Session gestartet für Kiosk-Benutzer" >> /var/log/kiosk-session.log
# Führe Kiosk-Setup aus
exec openbox-session
EOF
# .xinitrc für xinit/startx
cat > "$KIOSK_HOME/.xinitrc" << EOF
#!/bin/bash
# Xinit-Konfiguration für Kiosk-Modus
# 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 &
# Starte Openbox
exec openbox-session
EOF
# Berechtigungen setzen
chmod +x "$KIOSK_HOME/.xsessionrc"
chmod +x "$KIOSK_HOME/.xinitrc"
chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.xsessionrc"
chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.xinitrc"
# LightDM aktivieren
systemctl enable lightdm
# Sicherstellen, dass graphical.target als Standard gesetzt ist
systemctl set-default graphical.target
log "✅ Auto-Login konfiguriert"
}
# ========================== MEHRFACHE AUTOSTART-ABSICHERUNG ==========================
configure_multiple_autostart() {
log "=== PHASE 6.8: MEHRFACHE AUTOSTART-ABSICHERUNG ==="
KIOSK_HOME="/home/$KIOSK_USER"
progress "Implementiere mehrfache Autostart-Mechanismen..."
# 1. SYSTEMD USER-SESSION AUTOSTART
progress "Konfiguriere systemd user session autostart..."
sudo -u "$KIOSK_USER" mkdir -p "$KIOSK_HOME/.config/systemd/user"
cat > "$KIOSK_HOME/.config/systemd/user/kiosk-autostart.service" << EOF
[Unit]
Description=Kiosk Autostart (User Session)
After=graphical-session.target
[Service]
Type=simple
ExecStart=$KIOSK_HOME/start-kiosk.sh
Restart=always
RestartSec=5
Environment=DISPLAY=:0
[Install]
WantedBy=default.target
EOF
chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.config/systemd/user/kiosk-autostart.service"
# Aktiviere User-Service
sudo -u "$KIOSK_USER" systemctl --user enable kiosk-autostart.service || true
# 2. BASHRC AUTOSTART
progress "Konfiguriere .bashrc autostart..."
cat >> "$KIOSK_HOME/.bashrc" << 'EOF'
# ===== KIOSK AUTOSTART (BASHRC) =====
if [ -z "$SSH_CLIENT" ] && [ -z "$SSH_TTY" ] && [ -z "$KIOSK_STARTED" ]; then
export KIOSK_STARTED=1
# Prüfe ob X-Session läuft
if [ -n "$DISPLAY" ] || [ "$XDG_SESSION_TYPE" = "x11" ]; then
echo "Kiosk-Autostart via .bashrc"
exec $HOME/start-kiosk.sh
fi
fi
EOF
# 3. PROFILE AUTOSTART
progress "Konfiguriere .profile autostart..."
cat >> "$KIOSK_HOME/.profile" << 'EOF'
# ===== KIOSK AUTOSTART (PROFILE) =====
if [ -z "$SSH_CLIENT" ] && [ -z "$SSH_TTY" ] && [ -z "$KIOSK_STARTED" ]; then
export KIOSK_STARTED=1
# Starte X-Session falls nicht vorhanden
if [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
echo "Starte X-Session via .profile"
exec startx
fi
fi
EOF
# 4. DESKTOP AUTOSTART
progress "Konfiguriere XDG autostart..."
sudo -u "$KIOSK_USER" 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
Exec=$KIOSK_HOME/start-kiosk.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
StartupNotify=false
EOF
chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/.config/autostart/kiosk-app.desktop"
# 5. CRON AUTOSTART (ÜBERWACHUNG)
progress "Konfiguriere Cron-Überwachung..."
cat > "/etc/cron.d/kiosk-watchdog" << EOF
# Kiosk-Überwachung: Startet Kiosk neu falls nicht läuft
*/2 * * * * $KIOSK_USER /bin/bash -c 'if ! pgrep -f "chromium.*kiosk" > /dev/null; then echo "\$(date): Kiosk-Watchdog startet Anwendung neu" >> /var/log/kiosk-watchdog.log; DISPLAY=:0 $HOME/start-kiosk.sh & fi'
EOF
# 6. RC.LOCAL FALLBACK
progress "Konfiguriere rc.local Fallback..."
cat > "/etc/rc.local" << EOF
#!/bin/bash
# rc.local - Kiosk-Fallback
# Warte auf System-Initialisierung
sleep 10
# Starte Kiosk-Services falls nicht läuft
if ! systemctl is-active --quiet lightdm; then
systemctl start lightdm
fi
if ! systemctl is-active --quiet myp-druckerverwaltung; then
systemctl start myp-druckerverwaltung
fi
# Logge Start
echo "\$(date): rc.local Kiosk-Fallback ausgeführt" >> /var/log/kiosk-fallback.log
exit 0
EOF
chmod +x "/etc/rc.local"
# 7. SYSTEMD SERVICE ÜBERWACHUNG
progress "Konfiguriere Service-Überwachung..."
cat > "/etc/systemd/system/kiosk-watchdog.service" << EOF
[Unit]
Description=Kiosk Watchdog Service
After=multi-user.target
[Service]
Type=simple
User=root
ExecStart=/bin/bash -c 'while true; do if ! systemctl is-active --quiet myp-kiosk; then systemctl start myp-kiosk; fi; sleep 30; done'
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable kiosk-watchdog.service
# Berechtigungen finalisieren
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"
log "✅ Mehrfache Autostart-Absicherung implementiert"
}
# ========================== AUTOSTART KONFIGURATION ==========================
configure_autostart() {
log "=== PHASE 7: AUTOSTART-KONFIGURATION ==="
# Systemd Service für Anwendung
progress "Erstelle Systemd-Service für Anwendung..."
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=$APP_DIR/venv/bin
ExecStart=$APP_DIR/venv/bin/python app.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# Systemd Service für LightDM Management (ersetzt den alten X-Server Service)
progress "Erstelle Systemd-Service für Display Manager..."
cat > "/etc/systemd/system/myp-display.service" << EOF
[Unit]
Description=MYP Display Manager Service
After=myp-druckerverwaltung.service network.target
Requires=myp-druckerverwaltung.service
Wants=myp-druckerverwaltung.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/bash -c 'while ! curl -s http://localhost:5000 > /dev/null; do sleep 2; done'
ExecStart=/bin/systemctl start lightdm
ExecStop=/bin/systemctl stop lightdm
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=graphical.target
EOF
# Systemd Service für Kiosk-Überwachung
progress "Erstelle erweiterten Kiosk-Überwachungs-Service..."
cat > "/etc/systemd/system/myp-kiosk-monitor.service" << EOF
[Unit]
Description=MYP Kiosk Monitor und Recovery Service
After=graphical.target lightdm.service
Requires=myp-druckerverwaltung.service
[Service]
Type=simple
User=root
ExecStart=/bin/bash -c '
while true; do
# Prüfe ob Anwendung läuft
if ! curl -s http://localhost:5000 > /dev/null; then
echo "\$(date): Anwendung nicht erreichbar - starte neu" >> /var/log/kiosk-monitor.log
systemctl restart myp-druckerverwaltung
sleep 10
fi
# Prüfe ob LightDM läuft
if ! systemctl is-active --quiet lightdm; then
echo "\$(date): LightDM nicht aktiv - starte neu" >> /var/log/kiosk-monitor.log
systemctl start lightdm
sleep 5
fi
# Prüfe ob Kiosk-Benutzer angemeldet ist
if ! pgrep -u $KIOSK_USER > /dev/null; then
echo "\$(date): Kiosk-Benutzer nicht angemeldet - starte LightDM neu" >> /var/log/kiosk-monitor.log
systemctl restart lightdm
sleep 10
fi
# Prüfe ob Chromium im Kiosk-Modus läuft
if ! pgrep -u $KIOSK_USER -f "chromium.*kiosk" > /dev/null; then
echo "\$(date): Chromium-Kiosk nicht gefunden - starte Kiosk-Session neu" >> /var/log/kiosk-monitor.log
# Versuche Kiosk-Neustart als Kiosk-Benutzer
sudo -u $KIOSK_USER DISPLAY=:0 $HOME/start-kiosk.sh &
fi
sleep 30
done
'
Restart=always
RestartSec=10
[Install]
WantedBy=graphical.target
EOF
# Nginx-Proxy-Konfiguration
progress "Konfiguriere Nginx..."
cat > "/etc/nginx/sites-available/myp-kiosk" << EOF
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Security Headers
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';" always;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
# WebSocket-Support
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
# Timeout-Konfiguration
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Statische Dateien
location /static/ {
alias $APP_DIR/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
EOF
# Nginx-Site aktivieren
rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/myp-kiosk /etc/nginx/sites-enabled/
# Erstelle systemd-logind Konfiguration für besseres Session-Management
progress "Konfiguriere systemd-logind für Kiosk..."
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
# Erstelle PAM-Konfiguration für Auto-Login
progress "Konfiguriere PAM für Auto-Login..."
cat > "/etc/pam.d/lightdm-autologin" << EOF
# PAM configuration for LightDM autologin
auth required pam_env.so
auth required pam_permit.so
@include common-account
session required pam_limits.so
@include common-session
@include common-password
EOF
# Services aktivieren
progress "Aktiviere Services..."
systemctl daemon-reload
systemctl enable myp-druckerverwaltung
systemctl enable nginx
systemctl enable myp-display
systemctl enable myp-kiosk-monitor
# SSH standardmäßig deaktivieren für Sicherheit
systemctl disable ssh || true
# Sicherstellen dass graphical.target Standard ist
systemctl set-default graphical.target
# Erstelle systemd override für bessere Kiosk-Integration
progress "Erstelle systemd-Overrides..."
mkdir -p "/etc/systemd/system/lightdm.service.d"
cat > "/etc/systemd/system/lightdm.service.d/kiosk-override.conf" << EOF
[Unit]
After=myp-druckerverwaltung.service
[Service]
# Automatischer Restart bei Fehlern
Restart=always
RestartSec=5
# Umgebungsvariablen für Kiosk
Environment=DISPLAY=:0
Environment=KIOSK_MODE=1
EOF
log "✅ Autostart konfiguriert mit LightDM-Integration"
}
# ========================== SICHERHEIT ==========================
configure_security() {
log "=== PHASE 8: SICHERHEITS-KONFIGURATION ==="
progress "Konfiguriere Firewall..."
ufw --force enable
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP
progress "Konfiguriere Fail2Ban..."
cat > "/etc/fail2ban/jail.local" << EOF
[DEFAULT]
bantime = 600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
EOF
# Automatische Updates
progress "Konfiguriere automatische Updates..."
apt-get install -y unattended-upgrades
echo 'Unattended-Upgrade::Automatic-Reboot "false";' > /etc/apt/apt.conf.d/50unattended-upgrades-local
# Kiosk-Benutzer Einschränkungen
progress "Beschränke Kiosk-Benutzer..."
# Kein sudo für kiosk-Benutzer
gpasswd -d "$KIOSK_USER" sudo 2>/dev/null || true
# Shell auf /bin/false für bessere Sicherheit (aber X11 muss funktionieren)
# usermod -s /bin/false "$KIOSK_USER" # Erstmal nicht, da X11 funktionieren muss
log "✅ Sicherheit konfiguriert"
}
# ========================== WARTUNGSTOOLS ==========================
create_maintenance_tools() {
log "=== PHASE 9: WARTUNGSTOOLS ==="
# 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 nginx
systemctl start myp-display
systemctl start myp-kiosk-monitor
echo "Services gestartet."
;;
stop)
echo "Stoppe alle MYP-Services..."
systemctl stop myp-kiosk-monitor
systemctl stop myp-display
systemctl stop lightdm
systemctl stop nginx
systemctl stop myp-druckerverwaltung
echo "Services gestoppt."
;;
restart)
echo "Starte alle MYP-Services neu..."
systemctl restart myp-druckerverwaltung
sleep 3
systemctl restart nginx
systemctl restart myp-display
systemctl restart myp-kiosk-monitor
echo "Services neugestartet."
;;
status)
echo "=== MYP SYSTEM STATUS ==="
echo
echo "📱 Anwendung:"
systemctl status myp-druckerverwaltung --no-pager -l
echo
echo "🌐 Nginx Proxy:"
systemctl status nginx --no-pager -l
echo
echo "🖥️ Display Manager:"
systemctl status lightdm --no-pager -l
echo
echo "🔍 Kiosk Monitor:"
systemctl status myp-kiosk-monitor --no-pager -l
echo
echo "👤 Kiosk-Benutzer-Sessions:"
who | grep kiosk || echo "Kein Kiosk-Benutzer angemeldet"
echo
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
;;
logs)
echo "=== ANWENDUNGS-LOGS (Strg+C zum Beenden) ==="
journalctl -u myp-druckerverwaltung -f
;;
kiosk-logs)
echo "=== KIOSK-LOGS (Strg+C zum Beenden) ==="
echo "Monitor-Logs:"
journalctl -u myp-kiosk-monitor -f &
echo "LightDM-Logs:"
journalctl -u lightdm -f &
echo "Session-Logs:"
tail -f /var/log/kiosk-session.log 2>/dev/null &
wait
;;
app-restart)
echo "Starte nur Anwendung neu..."
systemctl restart myp-druckerverwaltung
echo "Anwendung neugestartet."
;;
kiosk-restart)
echo "Starte nur Kiosk-Display neu..."
systemctl restart lightdm
echo "Kiosk-Display neugestartet."
;;
monitor-restart)
echo "Starte Kiosk-Monitor neu..."
systemctl restart myp-kiosk-monitor
echo "Kiosk-Monitor neugestartet."
;;
enable-ssh)
echo "Aktiviere SSH für Wartung..."
systemctl enable ssh
systemctl start ssh
echo "✅ SSH aktiviert für Remote-Wartung"
echo "SSH-Status: $(systemctl is-active ssh)"
echo "IP-Adresse: $(hostname -I | awk '{print $1}')"
;;
disable-ssh)
echo "Deaktiviere SSH für Sicherheit..."
systemctl stop ssh
systemctl disable ssh
echo "✅ SSH deaktiviert"
;;
exit-kiosk)
echo "🔐 KIOSK-MODUS BEENDEN"
echo "WARNUNG: Stoppt den Kiosk und aktiviert Wartungsmodus!"
echo "Passwort erforderlich für Sicherheit."
read -s -p "Kiosk-Passwort: " password
echo
if [ "$password" = "744563017196A" ]; then
echo "✅ Passwort korrekt - beende Kiosk-Modus..."
systemctl stop myp-kiosk-monitor
systemctl stop lightdm
systemctl enable ssh
systemctl start ssh
echo "🔧 Wartungsmodus aktiviert:"
echo " • Kiosk gestoppt"
echo " • SSH aktiviert"
echo " • Console verfügbar"
echo "Kiosk-Neustart mit: myp-maintenance start"
else
echo "❌ Falsches Passwort! Kiosk bleibt aktiv."
exit 1
fi
;;
enter-kiosk)
echo "Aktiviere Kiosk-Modus..."
systemctl disable ssh 2>/dev/null || true
systemctl stop ssh 2>/dev/null || true
systemctl start myp-druckerverwaltung
systemctl start nginx
systemctl start myp-display
systemctl start myp-kiosk-monitor
echo "✅ Kiosk-Modus aktiviert"
;;
check-health)
echo "=== SYSTEM-GESUNDHEITSCHECK ==="
echo
# Services-Check
echo "📋 Service-Status:"
for service in myp-druckerverwaltung nginx lightdm myp-kiosk-monitor; do
if systemctl is-active --quiet $service; then
echo " ✅ $service: aktiv"
else
echo " ❌ $service: INAKTIV"
fi
done
echo
# Netzwerk-Check
echo "🌐 Netzwerk-Status:"
if curl -s http://localhost:5000 > /dev/null; then
echo " ✅ Anwendung erreichbar"
else
echo " ❌ Anwendung NICHT erreichbar"
fi
echo
# Kiosk-Check
echo "🖥️ Kiosk-Status:"
if pgrep -u kiosk > /dev/null; then
echo " ✅ Kiosk-Benutzer angemeldet"
else
echo " ❌ Kiosk-Benutzer NICHT angemeldet"
fi
if pgrep -f "chromium.*kiosk" > /dev/null; then
echo " ✅ Chromium-Kiosk läuft"
else
echo " ❌ Chromium-Kiosk läuft NICHT"
fi
echo
# Ressourcen-Check
echo "💾 System-Ressourcen:"
echo " CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)% belegt"
echo " RAM: $(free | grep Mem | awk '{printf "%.1f%%", $3/$2 * 100.0}')"
echo " Disk: $(df / | tail -1 | awk '{print $5}')"
;;
auto-fix)
echo "🔧 AUTOMATISCHE REPARATUR"
echo "Versuche häufige Probleme zu beheben..."
# Services neu starten
echo "1. Starte Services neu..."
systemctl restart myp-druckerverwaltung
sleep 3
systemctl restart nginx
systemctl restart lightdm
systemctl restart myp-kiosk-monitor
# Berechtigungen reparieren
echo "2. Repariere Berechtigungen..."
chown -R kiosk:kiosk /home/kiosk
chown -R myp:myp /opt/myp-druckerverwaltung
# Logs bereinigen
echo "3. Bereinige alte Logs..."
journalctl --rotate
journalctl --vacuum-time=7d
echo "✅ Automatische Reparatur abgeschlossen"
echo "Prüfe Status mit: myp-maintenance check-health"
;;
*)
echo "MYP Druckerverwaltung - Wartungstool"
echo
echo "VERWENDUNG: $0 BEFEHL"
echo
echo "SERVICE-MANAGEMENT:"
echo " start Alle Services starten"
echo " stop Alle Services stoppen"
echo " restart Alle Services neustarten"
echo " status Detaillierter Status aller Services"
echo
echo "EINZELNE SERVICES:"
echo " app-restart Nur Anwendung neustarten"
echo " kiosk-restart Nur Kiosk-Display neustarten"
echo " monitor-restart Nur Kiosk-Monitor neustarten"
echo
echo "LOGS & MONITORING:"
echo " logs Live Anwendungs-Logs anzeigen"
echo " kiosk-logs Live Kiosk-Logs anzeigen"
echo " check-health System-Gesundheitscheck"
echo
echo "KIOSK-KONTROLLE:"
echo " exit-kiosk Kiosk beenden (Passwort: 744563017196A)"
echo " enter-kiosk Kiosk-Modus aktivieren"
echo
echo "WARTUNG:"
echo " enable-ssh SSH für Remote-Wartung aktivieren"
echo " disable-ssh SSH wieder deaktivieren"
echo " auto-fix Automatische Problemreparatur"
echo
echo "BEISPIELE:"
echo " $0 status # System-Status anzeigen"
echo " $0 logs # Live-Logs verfolgen"
echo " $0 exit-kiosk # Wartungsmodus aktivieren"
;;
esac
EOF
chmod +x /usr/local/bin/myp-maintenance
# Backup-Skript
cat > "/usr/local/bin/myp-backup" << EOF
#!/bin/bash
BACKUP_DIR="$BACKUP_DIR"
DATE=\$(date +%Y%m%d_%H%M%S)
mkdir -p "\$BACKUP_DIR"
echo "Erstelle MYP-System-Backup..."
# Services kurz stoppen für konsistentes Backup
systemctl stop myp-druckerverwaltung
# Erstelle Backup
tar -czf "\$BACKUP_DIR/myp_backup_\$DATE.tar.gz" \\
-C "$APP_DIR" \\
--exclude='node_modules' \\
--exclude='__pycache__' \\
--exclude='venv' \\
--exclude='*.log' \\
database.db .env uploads/ config/ 2>/dev/null || true
# Backup der Kiosk-Konfiguration
tar -czf "\$BACKUP_DIR/kiosk_config_\$DATE.tar.gz" \\
/home/kiosk/.config \\
/etc/lightdm/lightdm.conf \\
/usr/share/lightdm/setup-kiosk-session.sh \\
/etc/systemd/system/myp-*.service \\
/usr/local/bin/myp-* 2>/dev/null || true
# Services wieder starten
systemctl start myp-druckerverwaltung
echo "✅ Backup erstellt:"
echo " Anwendung: \$BACKUP_DIR/myp_backup_\$DATE.tar.gz"
echo " Kiosk-Config: \$BACKUP_DIR/kiosk_config_\$DATE.tar.gz"
# Alte Backups löschen (älter als 30 Tage)
find "\$BACKUP_DIR" -name "myp_backup_*.tar.gz" -mtime +30 -delete 2>/dev/null || true
find "\$BACKUP_DIR" -name "kiosk_config_*.tar.gz" -mtime +30 -delete 2>/dev/null || true
echo "🧹 Alte Backups (>30 Tage) entfernt"
EOF
chmod +x /usr/local/bin/myp-backup
# Notfall-Reset
cat > "/usr/local/bin/myp-emergency-reset" << 'EOF'
#!/bin/bash
echo "🚨 NOTFALL-RESET für MYP Kiosk-System"
echo "======================================"
echo
echo "WARNUNG: Dieser Befehl wird:"
echo " • Alle Kiosk-Services stoppen"
echo " • SSH für Remote-Wartung aktivieren"
echo " • Console-Zugang ermöglichen"
echo " • System in Wartungsmodus versetzen"
echo
echo "Nur bei kritischen Problemen verwenden!"
echo
read -p "Notfall-Reset durchführen? (RESET eingeben): " confirm
if [ "$confirm" = "RESET" ]; then
echo
echo "🔧 Führe Notfall-Reset durch..."
# Stoppe alle Kiosk-Services
systemctl stop myp-kiosk-monitor 2>/dev/null || true
systemctl stop lightdm 2>/dev/null || true
# Aktiviere SSH
systemctl enable ssh 2>/dev/null || true
systemctl start ssh 2>/dev/null || true
# Logge Reset
echo "$(date): Notfall-Reset durchgeführt" >> /var/log/emergency-reset.log
echo "✅ Notfall-Reset abgeschlossen!"
echo
echo "📋 AKTUELLE SITUATION:"
echo " • Kiosk-Modus: GESTOPPT"
echo " • SSH: AKTIVIERT für Remote-Wartung"
echo " • Console: Verfügbar auf TTY1-6 (Strg+Alt+F1-F6)"
echo " • IP-Adresse: $(hostname -I | awk '{print $1}')"
echo
echo "🔧 WARTUNGSOPTIONEN:"
echo " • Status prüfen: myp-maintenance status"
echo " • Gesundheitscheck: myp-maintenance check-health"
echo " • Automatische Fix: myp-maintenance auto-fix"
echo " • Kiosk reaktivieren: myp-maintenance enter-kiosk"
echo
else
echo "❌ Abgebrochen. System bleibt unverändert."
fi
EOF
chmod +x /usr/local/bin/myp-emergency-reset
# Erweiterte Cron-Jobs
cat > "/etc/cron.d/myp-system" << EOF
# MYP System Maintenance Cron Jobs
# Tägliches Backup um 2:00 Uhr
0 2 * * * root /usr/local/bin/myp-backup >> /var/log/myp-backup.log 2>&1
# Gesundheitscheck alle 10 Minuten
*/10 * * * * root /usr/local/bin/myp-maintenance check-health > /dev/null 2>&1 || echo "\$(date): Health check failed" >> /var/log/myp-health.log
# Log-Rotation wöchentlich (Sonntags um 3:00)
0 3 * * 0 root journalctl --rotate && journalctl --vacuum-time=30d
# System-Ressourcen-Log alle 5 Minuten
*/5 * * * * root echo "\$(date),\$(cat /proc/loadavg | cut -d' ' -f1-3),\$(free | grep Mem | awk '{printf \"%.1f\", \$3/\$2 * 100.0}')" >> /var/log/system-resources.log
EOF
log "✅ Erweiterte Wartungstools erstellt"
}
# ========================== FINALE KONFIGURATION ==========================
finalize_installation() {
log "=== PHASE 10: FINALISIERUNG ==="
# Services starten
progress "Starte Services..."
systemctl start myp-druckerverwaltung
sleep 3
systemctl start nginx
# Warte und prüfe Services
sleep 5
if systemctl is-active --quiet myp-druckerverwaltung; then
log "✅ MYP-Anwendung läuft"
else
warning "⚠️ MYP-Anwendung nicht aktiv"
fi
if systemctl is-active --quiet nginx; then
log "✅ Nginx läuft"
else
warning "⚠️ Nginx nicht aktiv"
fi
# Test ob Anwendung erreichbar ist
progress "Teste Anwendung..."
for i in {1..30}; do
if curl -s http://localhost:5000 > /dev/null; then
log "✅ Anwendung erreichbar unter http://localhost:5000"
break
else
if [ $i -eq 30 ]; then
warning "⚠️ Anwendung nach 30 Versuchen nicht erreichbar"
else
sleep 2
fi
fi
done
# Chromium-Test
progress "Teste Chromium-Installation..."
if [[ "$CHROMIUM_BIN" == "flatpak"* ]]; then
sudo -u "$KIOSK_USER" flatpak run org.chromium.Chromium --version > /dev/null 2>&1 && log "✅ Chromium (Flatpak) funktional" || warning "⚠️ Chromium (Flatpak) Test fehlgeschlagen"
else
sudo -u "$KIOSK_USER" "$CHROMIUM_BIN" --version > /dev/null 2>&1 && log "✅ Chromium funktional" || warning "⚠️ Chromium-Test fehlgeschlagen"
fi
# Teste Auto-Login-Konfiguration
progress "Teste Auto-Login-Konfiguration..."
if [ -f "/etc/lightdm/lightdm.conf" ] && grep -q "autologin-user=$KIOSK_USER" "/etc/lightdm/lightdm.conf"; then
log "✅ Auto-Login für $KIOSK_USER konfiguriert"
else
warning "⚠️ Auto-Login-Konfiguration unvollständig"
fi
# Teste Systemd-Services
progress "Teste Service-Konfiguration..."
for service in myp-druckerverwaltung myp-display myp-kiosk-monitor; do
if systemctl is-enabled --quiet "$service" 2>/dev/null; then
log "✅ Service $service aktiviert"
else
warning "⚠️ Service $service nicht aktiviert"
fi
done
# Teste Wartungstools
progress "Teste Wartungstools..."
if [ -x "/usr/local/bin/myp-maintenance" ]; then
log "✅ myp-maintenance verfügbar"
else
warning "⚠️ myp-maintenance nicht verfügbar"
fi
if [ -x "/usr/local/bin/myp-backup" ]; then
log "✅ myp-backup verfügbar"
else
warning "⚠️ myp-backup nicht verfügbar"
fi
if [ -x "/usr/local/bin/myp-emergency-reset" ]; then
log "✅ myp-emergency-reset verfügbar"
else
warning "⚠️ myp-emergency-reset nicht verfügbar"
fi
# Erstelle erste Logs
progress "Initialisiere Logging..."
touch /var/log/kiosk-session.log
touch /var/log/kiosk-monitor.log
touch /var/log/kiosk-watchdog.log
touch /var/log/emergency-reset.log
touch /var/log/myp-backup.log
touch /var/log/myp-health.log
touch /var/log/system-resources.log
# Berechtigungen setzen
chown syslog:adm /var/log/kiosk-*.log
chown syslog:adm /var/log/myp-*.log
chown syslog:adm /var/log/emergency-reset.log
chown syslog:adm /var/log/system-resources.log
# Finale Berechtigungen
chown -R "$APP_USER:$APP_USER" "$APP_DIR"
chown -R "$KIOSK_USER:$KIOSK_USER" "/home/$KIOSK_USER"
# System-Target finalisieren
systemctl set-default graphical.target
log "✅ Installation finalisiert"
}
# ========================== INSTALLATIONS-BERICHT ==========================
show_installation_report() {
local ip_address=$(hostname -I | awk '{print $1}')
cat << EOF
╔══════════════════════════════════════════════════════════════╗
║ 🎉 KIOSK-INSTALLATION ERFOLGREICH! 🎉 ║
╚══════════════════════════════════════════════════════════════╝
📋 INSTALLATIONS-ZUSAMMENFASSUNG:
• System-Typ: Vollautomatischer Sicherheits-Kiosk
• Anwendung: $APP_DIR
• Kiosk-URL: http://$ip_address (nach Neustart)
• Chromium: $CHROMIUM_BIN
• Display Manager: LightDM mit Auto-Login
• Kiosk-Benutzer: $KIOSK_USER (automatisch angemeldet)
• App-Benutzer: $APP_USER
🛡️ SICHERHEITS-FEATURES:
• Desktop-Flucht: Vollständig verhindert
• Tastatur-Shortcuts: Alle deaktiviert
• Browser-Escape: Unmöglich (Kiosk-Flags)
• SSH: Standardmäßig deaktiviert
• Firewall: Aktiv mit Fail2Ban-Schutz
• Auto-Login: Sicher konfiguriert
• Session-Isolation: Kiosk-Benutzer ohne sudo
🔧 AUTOSTART-ABSICHERUNG (7-fach):
✅ 1. LightDM Auto-Login
✅ 2. Systemd User-Service
✅ 3. Bashrc Autostart
✅ 4. Profile Autostart
✅ 5. XDG Desktop Autostart
✅ 6. Cron Watchdog
✅ 7. RC.Local Fallback
🚀 SYSTEMD-SERVICES:
• myp-druckerverwaltung.service → Flask-Anwendung
• myp-display.service → LightDM-Management
• myp-kiosk-monitor.service → Kiosk-Überwachung + Recovery
• nginx.service → Reverse-Proxy
• lightdm.service → Display Manager mit Auto-Login
🔧 WARTUNGSTOOLS:
📱 myp-maintenance:
• status - Detaillierter System-Status
• restart - Alle Services neustarten
• exit-kiosk - Wartungsmodus (Passwort: 744563017196A)
• enable-ssh - SSH für Remote-Wartung
• check-health - Automatischer Gesundheitscheck
• auto-fix - Automatische Problemreparatur
💾 myp-backup:
• Automatisch: Täglich 2:00 Uhr
• Manuell: myp-backup
• Aufbewahrung: 30 Tage
🚨 myp-emergency-reset:
• Notfall-Tool bei kritischen Problemen
• Stoppt Kiosk, aktiviert SSH
📊 MONITORING & LOGS:
• System-Health: Alle 10 Minuten automatisch
• Resource-Logs: Alle 5 Minuten
• Service-Überwachung: Kontinuierlich mit Auto-Recovery
• Log-Rotation: Wöchentlich (30 Tage Aufbewahrung)
⚠️ WICHTIGE HINWEISE:
• System bootet automatisch in VOLLBILD-KIOSK ohne Escape
• Kein Desktop verfügbar - nur MYP-Anwendung sichtbar
• SSH deaktiviert für maximale Sicherheit
• Bei Problemen: Console-Zugang via Strg+Alt+F1-F6
🔐 NOTFALL-ZUGANG:
1. Console: Strg+Alt+F1 bis F6 → Login als Root/sudo-User
2. Emergency: myp-emergency-reset → RESET eingeben
3. Remote: myp-maintenance enable-ssh → SSH verfügbar
🚀 NÄCHSTE SCHRITTE:
1. System neustarten: sudo reboot
2. ⏱️ System bootet in ~2 Minuten automatisch in Kiosk-Modus
3. 🖥️ Chromium startet automatisch im Vollbild
4. 📱 MYP-Anwendung verfügbar unter http://$ip_address
5. 🔒 Kein Escape möglich - echtes Kiosk-System
📞 WARTUNG & SUPPORT:
• Live Status: myp-maintenance status
• Logs verfolgen: myp-maintenance logs
• Kiosk beenden: myp-maintenance exit-kiosk
• Gesundheitscheck: myp-maintenance check-health
• Backup erstellen: myp-backup
🎯 LEISTUNGS-FEATURES:
✅ Multi-Browser-Fallback (APT → Snap → Flatpak)
✅ Service-Recovery bei Fehlern
✅ Session-Monitoring mit Auto-Restart
✅ Resource-Monitoring und Logging
✅ Automatische Backups mit Rotation
✅ Health-Checks mit Auto-Fix
✅ Emergency-Recovery-System
══════════════════════════════════════════════════════════════
Installation abgeschlossen: $(date)
Installationslog: $INSTALL_LOG
SYSTEM BEREIT FÜR PRODUKTIONS-KIOSK-BETRIEB! 🚀
══════════════════════════════════════════════════════════════
EOF
}
# ========================== HAUPTPROGRAMM ==========================
main() {
log "🚀 MYP Kiosk-Installation gestartet: $(date)"
check_root
detect_system
cleanup_system
install_packages
install_chromium
create_users
install_application
configure_kiosk
configure_autologin
configure_multiple_autostart
configure_autostart
configure_security
create_maintenance_tools
finalize_installation
show_installation_report
# Abschließende Frage
echo
read -p "🔄 System jetzt neustarten für Kiosk-Modus? (j/N): " reboot_choice
if [[ "$reboot_choice" =~ ^[jJ]$ ]]; then
log "🚀 Neustart für Kiosk-Modus..."
sleep 3
reboot
else
log "⚠️ Manueller Neustart erforderlich: sudo reboot"
fi
}
# ========================== PROGRAMMSTART ==========================
# Starte Installation
main "$@"