Projektarbeit-MYP/backend/app/schnellstart_raspberry_pi.sh

994 lines
30 KiB
Bash

#!/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"
}
# ========================== WARTUNGSTOOLS ERSTELLEN ==========================
create_maintenance_tools() {
log "=== WARTUNGSTOOLS ERSTELLEN ==="
progress "Erstelle Wartungs-Skript..."
# 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 lightdm
echo "Services gestartet."
;;
stop)
echo "Stoppe alle MYP-Services..."
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 lightdm
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-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 "LightDM-Logs:"
journalctl -u lightdm -f &
echo "Session-Logs:"
tail -f /var/log/kiosk-session.log 2>/dev/null &
wait
;;
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 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
;;
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"
;;
check-health)
echo "=== SYSTEM-GESUNDHEITSCHECK ==="
echo
# Services-Check
echo "📋 Service-Status:"
for service in myp-druckerverwaltung nginx lightdm; 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
;;
*)
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 "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 " enable-ssh SSH für Remote-Wartung aktivieren"
echo " disable-ssh SSH wieder deaktivieren"
echo
;;
esac
EOF
chmod +x "/usr/local/bin/myp-maintenance"
# Kiosk-Starter-Skript
progress "Erstelle Kiosk-Starter-Skript..."
KIOSK_HOME="/home/$KIOSK_USER"
cat > "$KIOSK_HOME/start-kiosk.sh" << EOF
#!/bin/bash
# MYP Kiosk-Starter
export DISPLAY=:0
# Logging für Debugging
exec > >(tee -a /var/log/kiosk-session.log) 2>&1
echo "\$(date): Kiosk-Session gestartet für Benutzer $KIOSK_USER"
# 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
# Starte Chromium im Kiosk-Modus
if command -v chromium &> /dev/null; then
CHROMIUM_BIN="chromium"
elif command -v chromium-browser &> /dev/null; then
CHROMIUM_BIN="chromium-browser"
else
echo "Chromium nicht gefunden! Versuche alternativ Firefox..."
if command -v firefox &> /dev/null; then
firefox --kiosk http://localhost:5000
exit 0
else
echo "Kein unterstützter Browser gefunden!"
exit 1
fi
fi
echo "Starte \$CHROMIUM_BIN im Kiosk-Modus..."
\$CHROMIUM_BIN --kiosk --no-sandbox --disable-infobars --disable-session-crashed-bubble http://localhost:5000
echo "\$(date): Kiosk-Session beendet"
EOF
chmod +x "$KIOSK_HOME/start-kiosk.sh"
chown "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME/start-kiosk.sh"
# Erstelle leere Log-Dateien
touch /var/log/kiosk-session.log
touch /var/log/kiosk-watchdog.log
touch /var/log/kiosk-autostart.log
touch /var/log/kiosk-fallback.log
chmod 666 /var/log/kiosk-session.log
chmod 666 /var/log/kiosk-watchdog.log
chmod 666 /var/log/kiosk-autostart.log
chmod 666 /var/log/kiosk-fallback.log
log "✅ Wartungstools erstellt"
}
# ========================== SERVICE-DATEIEN ERSTELLEN ==========================
create_service_files() {
log "=== SERVICE-DATEIEN ERSTELLEN ==="
progress "Erstelle myp-druckerverwaltung.service..."
# Service-Datei für die Hauptanwendung
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
# Erstelle eine einfache app.py falls keine vorhanden ist
if [ ! -f "$APP_DIR/app.py" ]; then
progress "Erstelle einfache app.py als Platzhalter..."
mkdir -p "$APP_DIR"
cat > "$APP_DIR/app.py" << 'EOF'
#!/usr/bin/python3
# Einfache Flask-Anwendung als Platzhalter
from flask import Flask, render_template_string
app = Flask(__name__)
@app.route('/')
def home():
return render_template_string("""
<!DOCTYPE html>
<html>
<head>
<title>MYP Druckerverwaltung</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 0; background: #f5f5f5; }
.container { max-width: 800px; margin: 0 auto; padding: 20px; }
h1 { color: #333; }
.box { background: white; border-radius: 5px; padding: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
</style>
</head>
<body>
<div class="container">
<h1>MYP Druckerverwaltung</h1>
<div class="box">
<h2>System erfolgreich gestartet</h2>
<p>Die MYP Druckerverwaltung läuft im Kiosk-Modus.</p>
<p>Sie können diese Anwendung nun durch Ihre eigentliche Anwendung ersetzen.</p>
</div>
</div>
</body>
</html>
""")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
chmod +x "$APP_DIR/app.py"
chown "$APP_USER:$APP_USER" "$APP_DIR/app.py"
# Installiere Flask falls nicht vorhanden
if ! python3 -c "import flask" &>/dev/null; then
progress "Installiere Flask..."
pip3 install flask --break-system-packages || true
fi
fi
# Erstelle Templates-Verzeichnis falls nicht vorhanden
if [ ! -d "$APP_DIR/templates" ]; then
mkdir -p "$APP_DIR/templates"
chown "$APP_USER:$APP_USER" "$APP_DIR/templates"
fi
# Erstelle Static-Verzeichnis falls nicht vorhanden
if [ ! -d "$APP_DIR/static" ]; then
mkdir -p "$APP_DIR/static"
chown "$APP_USER:$APP_USER" "$APP_DIR/static"
fi
# Systemd neu laden
systemctl daemon-reload
log "✅ Service-Dateien erstellt"
}
# ========================== HAUPTFUNKTION ==========================
main() {
log "=== RASPBERRY PI SCHNELLSTART-OPTIMIERUNG GESTARTET ==="
check_root
check_system
install_essential_packages
create_service_files
optimize_boot
strengthen_autologin
optimize_kiosk_user
create_maintenance_tools
strengthen_watchdog
optimize_services
optimize_system_parameters
log "=== OPTIMIERUNG ABGESCHLOSSEN ==="
log ""
log "🎉 RASPBERRY PI SCHNELLSTART-OPTIMIERUNG ERFOLGREICH!"
log ""
log "📋 ZUSAMMENFASSUNG:"
log " ✅ Service-Dateien erstellt"
log " ✅ Boot-Parameter optimiert"
log " ✅ Autologin verstärkt"
log " ✅ Kiosk-Benutzer optimiert"
log " ✅ Wartungstools erstellt"
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 "$@"