1614 lines
54 KiB
Bash

#!/bin/bash
# ===================================================================
# MYP Druckerverwaltung - KONSOLIDIERTES SETUP-SKRIPT
# Kombiniert alle Installationsfunktionen in einer einzigen Datei
# Optimiert für Debian/Linux (Raspberry Pi OS) - KEIN Windows-Support
# HTTPS auf Port 443 mit automatischer SSL-Zertifikat-Generierung
# Kiosk-Modus mit Chromium-Autostart ohne Desktop-Environment
# Version: 4.0.0
# ===================================================================
set -euo pipefail
# =========================== GLOBALE KONFIGURATION ===========================
readonly APP_NAME="MYP Druckerverwaltung"
readonly APP_VERSION="4.0.0"
readonly APP_DIR="/opt/myp"
readonly HTTPS_SERVICE_NAME="myp-https"
readonly KIOSK_SERVICE_NAME="myp-kiosk"
readonly WATCHDOG_SERVICE_NAME="kiosk-watchdog"
readonly WATCHDOG_PYTHON_SERVICE_NAME="kiosk-watchdog-python"
readonly FIREWALL_SERVICE_NAME="myp-firewall"
readonly KIOSK_USER="kiosk"
readonly CURRENT_DIR="$(pwd)"
readonly INSTALL_LOG="/var/log/myp-install.log"
readonly HTTPS_PORT="443"
readonly HTTPS_URL="https://localhost:${HTTPS_PORT}"
readonly SYSTEMD_DIR="$CURRENT_DIR/systemd"
readonly SYSTEM_SYSTEMD_DIR="/etc/systemd/system"
# Farben für Ausgabe
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly PURPLE='\033[0;35m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m'
# =========================== LOGGING-FUNKTIONEN ===========================
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"
}
success() {
echo -e "${CYAN}[ERFOLG] $1${NC}" | tee -a "$INSTALL_LOG"
}
# =========================== SYSTEM-VALIDIERUNG ===========================
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"
log "✅ Root-Berechtigung bestätigt"
}
check_debian_system() {
if [ ! -f /etc/debian_version ]; then
error "Dieses Skript ist nur für Debian/Raspbian-Systeme geeignet!"
fi
local debian_version=$(cat /etc/debian_version 2>/dev/null || echo "Unbekannt")
log "✅ Debian/Raspbian-System erkannt (Version: $debian_version)"
# Prüfe auf Raspberry Pi
if [ -f /proc/device-tree/model ]; then
local pi_model=$(cat /proc/device-tree/model 2>/dev/null || echo "Unbekannt")
info "Raspberry Pi Modell: $pi_model"
fi
}
check_internet_connection() {
progress "Prüfe Internetverbindung..."
local test_urls=("8.8.8.8" "1.1.1.1" "google.com")
local connection_ok=false
for url in "${test_urls[@]}"; do
if ping -c 1 -W 3 "$url" >/dev/null 2>&1; then
connection_ok=true
break
fi
done
if [ "$connection_ok" = true ]; then
log "✅ Internetverbindung verfügbar"
else
warning "⚠️ Keine Internetverbindung - Installation könnte fehlschlagen"
fi
}
# =========================== SYSTEM-VORBEREITUNG ===========================
update_system() {
log "=== SYSTEM-UPDATE ==="
progress "Aktualisiere Paketlisten..."
apt-get update -y || error "APT Update fehlgeschlagen"
progress "Führe System-Upgrade durch..."
apt-get upgrade -y || warning "System-Upgrade teilweise fehlgeschlagen"
progress "Installiere grundlegende System-Tools..."
apt-get install -y \
curl \
wget \
git \
nano \
htop \
rsync \
unzip \
sudo \
systemd \
ca-certificates \
gnupg \
lsb-release \
apt-transport-https \
software-properties-common \
bc \
|| error "Grundlegende Tools Installation fehlgeschlagen"
log "✅ System-Update abgeschlossen"
}
# =========================== NETZWERK-SICHERHEIT ===========================
configure_network_security() {
log "=== KONFIGURIERE ERWEITERTE NETZWERK-SICHERHEIT ==="
# IPv6 vollständig deaktivieren
progress "Deaktiviere IPv6..."
# IPv6 in GRUB deaktivieren
if [ -f /etc/default/grub ]; then
cp /etc/default/grub /etc/default/grub.backup
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& ipv6.disable=1/' /etc/default/grub
sed -i 's/GRUB_CMDLINE_LINUX="[^"]*/& ipv6.disable=1/' /etc/default/grub
update-grub 2>/dev/null || true
fi
# IPv6 in sysctl deaktivieren
cat >> /etc/sysctl.conf << 'EOF'
# ===================================================================
# MYP Netzwerk-Sicherheitskonfiguration
# ===================================================================
# IPv6 vollständig deaktivieren
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# IP-Spoofing-Schutz aktivieren
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Source-Routing deaktivieren (verhindert IP-Spoofing)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# ICMP-Redirects ignorieren (verhindert Man-in-the-Middle)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Secure ICMP-Redirects ignorieren
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
# SYN-Flood-Schutz aktivieren
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# TCP-RFC-Compliance (verhindert aggressive Paketwiederholungen)
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_orphan_retries = 3
# TCP-Window-Skalierung optimieren (geringere Netzwerkauslastung)
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 5000
# Broadcast-Pings ignorieren (verhindert Smurf-Angriffe)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Bogus ICMP-Antworten ignorieren
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Paketweiterleitung verhindern (Router-Funktionalität deaktivieren)
net.ipv4.ip_forward = 0
# Martian-Pakete loggen (verdächtige Pakete)
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# TCP-Timestamps deaktivieren (verhindert Fingerprinting)
net.ipv4.tcp_timestamps = 0
# TCP-SACK deaktivieren (verhindert bestimmte Angriffe)
net.ipv4.tcp_sack = 0
# TCP-Keepalive optimieren
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
# Memory-Limits für Netzwerk-Buffers
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# Schutz vor Time-Wait-Assassination
net.ipv4.tcp_rfc1337 = 1
EOF
# Sysctl-Einstellungen sofort anwenden
sysctl -p || warning "Einige sysctl-Einstellungen konnten nicht angewendet werden"
# IPv6 in Netzwerk-Interfaces deaktivieren
progress "Deaktiviere IPv6 in Netzwerk-Interfaces..."
# Für systemd-networkd
if systemctl is-enabled systemd-networkd 2>/dev/null; then
mkdir -p /etc/systemd/network
cat > /etc/systemd/network/99-disable-ipv6.network << 'EOF'
[Match]
Name=*
[Network]
IPv6AcceptRA=no
LinkLocalAddressing=no
EOF
systemctl restart systemd-networkd 2>/dev/null || true
fi
# Für NetworkManager
if systemctl is-enabled NetworkManager 2>/dev/null; then
cat > /etc/NetworkManager/conf.d/99-disable-ipv6.conf << 'EOF'
[main]
plugins=keyfile
[keyfile]
unmanaged-devices=none
[connection]
ipv6.method=ignore
EOF
systemctl restart NetworkManager 2>/dev/null || true
fi
# IPv6 in /etc/hosts auskommentieren
sed -i 's/^::1/#::1/' /etc/hosts 2>/dev/null || true
log "✅ Erweiterte Netzwerk-Sicherheit konfiguriert:"
log " 🚫 IPv6 vollständig deaktiviert"
log " 🛡️ IP-Spoofing-Schutz aktiviert"
log " 🔒 SYN-Flood-Schutz aktiviert"
log " 📝 Verdächtige Pakete werden geloggt"
log " 🚫 Paketweiterleitung deaktiviert"
log " ⚡ TCP-Performance optimiert"
log " 🔐 RFC-Compliance für TCP aktiviert"
}
# =========================== DESKTOP-ENVIRONMENT ENTFERNUNG ===========================
remove_desktop_environments() {
log "=== ENTFERNE DESKTOP ENVIRONMENTS FÜR KIOSK-MODUS ==="
progress "Stoppe alle Desktop-Services..."
local desktop_services=("lightdm" "gdm3" "sddm" "xdm" "nodm")
for service in "${desktop_services[@]}"; do
systemctl stop "$service" 2>/dev/null || true
systemctl disable "$service" 2>/dev/null || true
done
progress "Entferne Desktop-Pakete vollständig..."
# Raspberry Pi OS Desktop-Pakete
apt-get remove --purge -y \
raspberrypi-ui-mods \
pi-package \
desktop-base \
lxde* \
xfce4* \
gnome* \
kde* \
mate* \
cinnamon* \
openbox \
pcmanfm \
file-manager* \
task-lxde-desktop \
task-xfce-desktop \
task-gnome-desktop \
task-kde-desktop \
2>/dev/null || true
# Display Manager entfernen
apt-get remove --purge -y \
lightdm* \
gdm3* \
sddm* \
xdm* \
nodm* \
2>/dev/null || true
# Unnötige Anwendungen entfernen
apt-get remove --purge -y \
libreoffice* \
thunderbird* \
firefox* \
vlc* \
gimp* \
scratch* \
minecraft-pi \
sonic-pi \
2>/dev/null || true
# Aufräumen
apt-get autoremove --purge -y
apt-get autoclean
log "✅ Desktop Environments vollständig entfernt"
}
# =========================== MINIMALE X11-UMGEBUNG ===========================
install_minimal_x11() {
log "=== INSTALLIERE MINIMALE X11-UMGEBUNG FÜR KIOSK ==="
progress "Installiere minimale X11-Pakete..."
apt-get install -y \
xserver-xorg-core \
xserver-xorg-input-all \
xserver-xorg-video-fbdev \
xserver-xorg-video-vesa \
xinit \
x11-xserver-utils \
xdotool \
unclutter \
openbox \
|| error "X11 Installation fehlgeschlagen"
# Browser-Installation mit Fallback-Mechanismus
progress "Installiere Browser für Kiosk-Modus..."
local browser_installed=false
# Versuche Chromium zu installieren
if apt-get install -y chromium 2>/dev/null; then
log "✅ Chromium erfolgreich installiert"
browser_installed=true
elif apt-get install -y chromium-browser 2>/dev/null; then
log "✅ Chromium-Browser erfolgreich installiert"
browser_installed=true
elif apt-get install -y firefox-esr 2>/dev/null; then
warning "⚠️ Chromium nicht verfügbar - Firefox ESR als Fallback installiert"
browser_installed=true
fi
if [ "$browser_installed" = false ]; then
error "❌ Kein Browser verfügbar (chromium, chromium-browser, firefox-esr)"
fi
log "✅ Minimale X11-Umgebung installiert"
}
# =========================== KIOSK-BENUTZER MANAGEMENT ===========================
create_kiosk_user() {
log "=== KIOSK-BENUTZER SETUP ==="
if ! id "$KIOSK_USER" &>/dev/null; then
progress "Erstelle Kiosk-Benutzer: $KIOSK_USER"
useradd -m -s /bin/bash "$KIOSK_USER" || error "Kann Kiosk-Benutzer nicht erstellen"
# Gruppen hinzufügen
usermod -aG audio,video,input,dialout,plugdev,users "$KIOSK_USER" 2>/dev/null || true
else
info "Kiosk-Benutzer $KIOSK_USER existiert bereits"
fi
# Passwort entfernen für automatischen Login
passwd -d "$KIOSK_USER" || warning "Konnte Passwort nicht entfernen"
log "✅ Kiosk-Benutzer konfiguriert: $KIOSK_USER"
}
configure_autologin() {
log "=== KONFIGURIERE AUTOLOGIN FÜR KIOSK-BENUTZER ==="
# Getty-Service für automatischen Login konfigurieren
progress "Konfiguriere automatischen Login auf tty1..."
local getty_override_dir="/etc/systemd/system/getty@tty1.service.d"
mkdir -p "$getty_override_dir"
cat > "$getty_override_dir/override.conf" << EOF
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin $KIOSK_USER --noclear %I \$TERM
EOF
# Systemd-Konfiguration neu laden
systemctl daemon-reload
systemctl enable getty@tty1.service
log "✅ Autologin für $KIOSK_USER konfiguriert"
}
configure_kiosk_autostart() {
log "=== KONFIGURIERE AUTOMATISCHEN KIOSK-START ==="
# Erstelle .bashrc für automatischen X-Server und Browser-Start
progress "Konfiguriere automatischen Kiosk-Start für $KIOSK_USER..."
local kiosk_home="/home/$KIOSK_USER"
# .bashrc für automatischen Start erstellen
cat > "$kiosk_home/.bashrc" << 'EOF'
# Automatischer Kiosk-Start beim Login
if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" = "1" ]; then
echo "Starte Kiosk-Modus..."
# X-Server im Hintergrund starten
startx /home/kiosk/.xinitrc -- :0 vt1 &
# Warte bis X-Server bereit ist
sleep 5
# Setze DISPLAY-Variable
export DISPLAY=:0
# Warte auf HTTPS-Backend
echo "Warte auf HTTPS-Backend..."
for i in {1..60}; do
if curl -k -s https://localhost:443 >/dev/null 2>&1; then
echo "HTTPS-Backend erreichbar"
break
fi
echo "Warte... ($i/60)"
sleep 2
done
# Bildschirmschoner deaktivieren
xset s off
xset s noblank
xset -dpms
# Mauszeiger verstecken
unclutter -idle 0.1 -root -noevents &
# Browser im Kiosk-Modus starten
if command -v chromium >/dev/null 2>&1; then
BROWSER="chromium"
elif command -v chromium-browser >/dev/null 2>&1; then
BROWSER="chromium-browser"
else
BROWSER="firefox-esr"
fi
echo "Starte $BROWSER im Kiosk-Modus..."
if [[ "$BROWSER" == "chromium"* ]]; then
exec $BROWSER \
--kiosk \
--no-sandbox \
--disable-infobars \
--disable-session-crashed-bubble \
--disable-restore-session-state \
--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 \
--start-maximized \
--user-data-dir=/home/kiosk/.chromium-kiosk \
--disable-background-mode \
--force-device-scale-factor=1.0 \
--disable-pinch \
--overscroll-history-navigation=0 \
--disable-dev-shm-usage \
--memory-pressure-off \
--max_old_space_size=512 \
--disable-background-timer-throttling \
--disable-backgrounding-occluded-windows \
--disable-renderer-backgrounding \
--disable-features=VizDisplayCompositor \
--enable-features=OverlayScrollbar \
--hide-scrollbars \
--ignore-certificate-errors \
--ignore-ssl-errors \
--ignore-certificate-errors-spki-list \
--disable-web-security \
--allow-running-insecure-content \
--unsafely-treat-insecure-origin-as-secure=https://localhost:443 \
https://localhost:443
else
exec firefox-esr \
--kiosk \
https://localhost:443
fi
fi
EOF
# .xinitrc für X-Server-Konfiguration erstellen
cat > "$kiosk_home/.xinitrc" << 'EOF'
#!/bin/bash
# Minimale X-Session für Kiosk-Modus
exec openbox-session
EOF
# Berechtigungen setzen
chown "$KIOSK_USER:$KIOSK_USER" "$kiosk_home/.bashrc"
chown "$KIOSK_USER:$KIOSK_USER" "$kiosk_home/.xinitrc"
chmod +x "$kiosk_home/.xinitrc"
# Erstelle Kiosk-Verzeichnisse
mkdir -p "$kiosk_home/.chromium-kiosk"
chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_home/.chromium-kiosk"
log "✅ Automatischer Kiosk-Start konfiguriert"
info "Der Kiosk-Modus startet automatisch beim Login des $KIOSK_USER"
}
# =========================== PYTHON & NODE.JS INSTALLATION ===========================
install_python_dependencies() {
log "=== PYTHON-ABHÄNGIGKEITEN INSTALLATION ==="
progress "Installiere Python 3 und Entwicklungstools..."
apt-get install -y \
python3 \
python3-pip \
python3-dev \
python3-setuptools \
python3-venv \
build-essential \
libssl-dev \
libffi-dev \
sqlite3 \
|| error "Python Installation fehlgeschlagen"
# pip auf neueste Version aktualisieren
progress "Aktualisiere pip..."
python3 -m pip install --upgrade pip --break-system-packages || warning "pip Update fehlgeschlagen"
# SSL-Konfiguration für pip
mkdir -p /root/.pip
cat > /root/.pip/pip.conf << EOF
[global]
trusted-host = pypi.org
pypi.python.org
files.pythonhosted.org
cert = /etc/ssl/certs/ca-certificates.crt
timeout = 60
retries = 3
no-cache-dir = true
[install]
trusted-host = pypi.org
pypi.python.org
files.pythonhosted.org
no-warn-script-location = true
EOF
log "✅ Python-Umgebung vorbereitet"
}
install_nodejs_npm() {
log "=== NODE.JS UND NPM INSTALLATION ==="
# Alte Node.js-Installationen entfernen
progress "Entferne alte Node.js-Installationen..."
apt-get remove --purge -y nodejs npm 2>/dev/null || true
apt-get autoremove -y 2>/dev/null || true
# NodeSource Repository für Node.js LTS hinzufügen
progress "Installiere Node.js LTS..."
if curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - 2>/dev/null; then
apt-get update -y
apt-get install -y nodejs || error "Node.js Installation fehlgeschlagen"
else
warning "NodeSource Repository nicht verfügbar - verwende Debian-Repository"
apt-get install -y nodejs npm || error "Node.js Fallback Installation fehlgeschlagen"
fi
# Versionen prüfen
if command -v node >/dev/null 2>&1; then
local node_version=$(node --version)
log "✅ Node.js installiert: $node_version"
else
error "❌ Node.js Installation fehlgeschlagen"
fi
if command -v npm >/dev/null 2>&1; then
local npm_version=$(npm --version)
log "✅ npm installiert: $npm_version"
# npm-Konfiguration optimieren
npm config set fund false 2>/dev/null || true
npm config set audit-level moderate 2>/dev/null || true
else
error "❌ npm Installation fehlgeschlagen"
fi
log "✅ Node.js und npm erfolgreich installiert"
}
install_python_packages() {
log "=== PYTHON-PAKETE INSTALLATION ==="
local pip_opts="--break-system-packages --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --timeout 60 --retries 3"
progress "Installiere Flask-Framework..."
pip3 install $pip_opts Flask==3.1.1 || pip3 install $pip_opts Flask || error "Flask Installation fehlgeschlagen"
pip3 install $pip_opts Flask-Login==0.6.3 || pip3 install $pip_opts Flask-Login || error "Flask-Login Installation fehlgeschlagen"
pip3 install $pip_opts Flask-WTF==1.2.1 || pip3 install $pip_opts Flask-WTF || error "Flask-WTF Installation fehlgeschlagen"
progress "Installiere Datenbank-Komponenten..."
pip3 install $pip_opts SQLAlchemy==2.0.36 || pip3 install $pip_opts SQLAlchemy || error "SQLAlchemy Installation fehlgeschlagen"
progress "Installiere Sicherheits-Komponenten..."
pip3 install $pip_opts bcrypt==4.2.1 || pip3 install $pip_opts bcrypt || error "bcrypt Installation fehlgeschlagen"
pip3 install $pip_opts cryptography==44.0.0 || pip3 install $pip_opts cryptography || error "cryptography Installation fehlgeschlagen"
pip3 install $pip_opts Werkzeug==3.1.3 || pip3 install $pip_opts Werkzeug || error "Werkzeug Installation fehlgeschlagen"
progress "Installiere weitere Abhängigkeiten..."
pip3 install $pip_opts requests==2.32.3 || pip3 install $pip_opts requests || error "requests Installation fehlgeschlagen"
pip3 install $pip_opts psutil==6.1.1 || pip3 install $pip_opts psutil || error "psutil Installation fehlgeschlagen"
pip3 install $pip_opts MarkupSafe==3.0.2 || pip3 install $pip_opts MarkupSafe || error "MarkupSafe Installation fehlgeschlagen"
pip3 install $pip_opts gunicorn==23.0.0 || pip3 install $pip_opts gunicorn || error "gunicorn Installation fehlgeschlagen"
# Optionale Pakete
pip3 install $pip_opts PyP100 || warning "PyP100 Installation fehlgeschlagen (optional)"
pip3 install $pip_opts redis==5.2.1 || warning "redis Installation fehlgeschlagen (optional)"
log "✅ Python-Pakete erfolgreich installiert"
}
# =========================== SSL-ZERTIFIKATE ===========================
install_ssl_certificates() {
log "=== SSL-ZERTIFIKATE KONFIGURATION ==="
progress "Aktualisiere CA-Zertifikate..."
apt-get install -y ca-certificates openssl || error "CA-Zertifikate Installation fehlgeschlagen"
update-ca-certificates || warning "CA-Zertifikate Update fehlgeschlagen"
# Mercedes Corporate Zertifikate (falls vorhanden)
if [ -d "$CURRENT_DIR/certs/mercedes" ] && [ "$(ls -A $CURRENT_DIR/certs/mercedes 2>/dev/null)" ]; then
progress "Installiere Mercedes Corporate Zertifikate..."
find "$CURRENT_DIR/certs/mercedes" -type f \( -name "*.crt" -o -name "*.pem" -o -name "*.cer" \) | while read cert_file; do
local cert_basename=$(basename "$cert_file")
local cert_name="${cert_basename%.*}"
progress "Verarbeite Mercedes-Zertifikat: $cert_basename"
# Zertifikat validieren und installieren
if openssl x509 -in "$cert_file" -text -noout >/dev/null 2>&1; then
cp "$cert_file" "/usr/local/share/ca-certificates/${cert_name}.crt"
log "✅ Zertifikat installiert: ${cert_name}.crt"
elif openssl x509 -in "$cert_file" -inform DER -text -noout >/dev/null 2>&1; then
openssl x509 -in "$cert_file" -inform DER -out "/usr/local/share/ca-certificates/${cert_name}.crt" -outform PEM
log "✅ DER-Zertifikat konvertiert und installiert: ${cert_name}.crt"
else
warning "⚠️ Ungültiges Zertifikat übersprungen: $cert_file"
fi
done
update-ca-certificates || warning "Mercedes Zertifikate Update fehlgeschlagen"
fi
# SSL-Umgebungsvariablen setzen
export SSL_CERT_FILE="/etc/ssl/certs/ca-certificates.crt"
export REQUESTS_CA_BUNDLE="/etc/ssl/certs/ca-certificates.crt"
export CURL_CA_BUNDLE="/etc/ssl/certs/ca-certificates.crt"
log "✅ SSL-Zertifikate konfiguriert"
}
# =========================== ANWENDUNGS-DEPLOYMENT ===========================
deploy_application() {
log "=== ANWENDUNGS-DEPLOYMENT ==="
progress "Erstelle Zielverzeichnis: $APP_DIR"
mkdir -p "$APP_DIR" || error "Konnte Zielverzeichnis nicht erstellen"
progress "Kopiere Anwendungsdateien..."
# Liste der zu kopierenden Dateien/Ordner
local copy_items=(
"app.py"
"models.py"
"requirements.txt"
"blueprints/"
"config/"
"database/"
"static/"
"templates/"
"uploads/"
"utils/"
"logs/"
"certs/"
)
# Sichere selektive Kopie
for item in "${copy_items[@]}"; do
if [ -e "$CURRENT_DIR/$item" ]; then
progress "Kopiere: $item"
cp -r "$CURRENT_DIR/$item" "$APP_DIR/" || warning "Fehler beim Kopieren von $item"
else
info "Überspringe nicht vorhandenes Element: $item"
fi
done
# Spezielle Dateien
for file in "package.json" "package-lock.json" "tailwind.config.js" "postcss.config.js"; do
if [ -f "$CURRENT_DIR/$file" ]; then
cp "$CURRENT_DIR/$file" "$APP_DIR/" || warning "Fehler beim Kopieren von $file"
fi
done
# Erstelle notwendige Verzeichnisse
mkdir -p "$APP_DIR"/{database/backups,logs/{app,auth,errors},uploads/temp,certs/localhost}
# Berechtigungen setzen
chown -R root:root "$APP_DIR"
chmod -R 755 "$APP_DIR"
chmod 750 "$APP_DIR"/{database,logs,certs}
chmod +x "$APP_DIR/app.py"
log "✅ Anwendung erfolgreich deployed"
}
install_npm_dependencies() {
log "=== NPM-ABHÄNGIGKEITEN INSTALLATION ==="
if [ -f "$APP_DIR/package.json" ]; then
progress "Installiere npm-Abhängigkeiten..."
cd "$APP_DIR"
# npm install mit verschiedenen Fallback-Strategien
if npm install --no-optional --no-audit --no-fund 2>/dev/null; then
log "✅ npm install erfolgreich (Standard)"
elif npm install --legacy-peer-deps --no-optional 2>/dev/null; then
log "✅ npm install erfolgreich (Legacy-Modus)"
elif npm install --force 2>/dev/null; then
log "✅ npm install erfolgreich (Force-Modus)"
else
warning "⚠️ npm install fehlgeschlagen - überspringe"
fi
cd "$CURRENT_DIR"
else
info "Keine package.json gefunden - überspringe npm-Installation"
fi
log "✅ NPM-Abhängigkeiten verarbeitet"
}
# =========================== SSL-ZERTIFIKAT GENERIERUNG ===========================
generate_ssl_certificate() {
log "=== SSL-ZERTIFIKAT GENERIERUNG ==="
progress "Generiere selbstsigniertes SSL-Zertifikat für localhost..."
local cert_dir="$APP_DIR/certs/localhost"
mkdir -p "$cert_dir"
# Generiere privaten Schlüssel
openssl genrsa -out "$cert_dir/localhost.key" 2048 || error "Fehler beim Generieren des privaten Schlüssels"
# Generiere Zertifikat
openssl req -new -x509 -key "$cert_dir/localhost.key" -out "$cert_dir/localhost.crt" -days 365 \
-subj "/C=DE/ST=Baden-Wuerttemberg/L=Stuttgart/O=Mercedes-Benz/OU=IT/CN=localhost" \
|| error "Fehler beim Generieren des SSL-Zertifikats"
# Berechtigungen setzen
chmod 600 "$cert_dir/localhost.key"
chmod 644 "$cert_dir/localhost.crt"
log "✅ SSL-Zertifikat erfolgreich generiert"
}
# =========================== SYSTEMD-SERVICES ===========================
install_systemd_services() {
log "=== SYSTEMD-SERVICES INSTALLATION ==="
# Prüfe ob systemd-Verzeichnis existiert
if [ ! -d "$SYSTEMD_DIR" ]; then
error "systemd-Verzeichnis nicht gefunden: $SYSTEMD_DIR"
fi
progress "Kopiere Service-Dateien nach $SYSTEM_SYSTEMD_DIR..."
# Kopiere alle Service-Dateien
local service_files=(
"$HTTPS_SERVICE_NAME.service"
"$KIOSK_SERVICE_NAME.service"
"$WATCHDOG_SERVICE_NAME.service"
"$WATCHDOG_PYTHON_SERVICE_NAME.service"
"$FIREWALL_SERVICE_NAME.service"
)
for service_file in "${service_files[@]}"; do
if [ -f "$SYSTEMD_DIR/$service_file" ]; then
progress "Kopiere Service: $service_file"
cp "$SYSTEMD_DIR/$service_file" "$SYSTEM_SYSTEMD_DIR/" || error "Fehler beim Kopieren von $service_file"
else
warning "Service-Datei nicht gefunden: $service_file"
fi
done
# Systemd-Konfiguration neu laden
progress "Lade systemd-Konfiguration neu..."
systemctl daemon-reload || error "systemctl daemon-reload fehlgeschlagen"
log "✅ Systemd-Services installiert"
}
enable_and_start_services() {
log "=== SERVICES AKTIVIEREN UND STARTEN ==="
# HTTPS-Service aktivieren und starten
progress "Aktiviere und starte HTTPS-Service..."
systemctl enable "$HTTPS_SERVICE_NAME" || error "Fehler beim Aktivieren des HTTPS-Service"
systemctl start "$HTTPS_SERVICE_NAME" || error "Fehler beim Starten des HTTPS-Service"
# Warte kurz und prüfe Status
sleep 5
if systemctl is-active --quiet "$HTTPS_SERVICE_NAME"; then
log "✅ HTTPS-Service läuft erfolgreich"
else
error "❌ HTTPS-Service konnte nicht gestartet werden"
fi
# Kiosk-Service aktivieren (aber nicht starten - wird beim nächsten Boot gestartet)
progress "Aktiviere Kiosk-Service..."
systemctl enable "$KIOSK_SERVICE_NAME" || warning "Fehler beim Aktivieren des Kiosk-Service"
# Watchdog-Service aktivieren und starten
progress "Aktiviere und starte Watchdog-Service..."
systemctl enable "$WATCHDOG_SERVICE_NAME" || warning "Fehler beim Aktivieren des Watchdog-Service"
systemctl start "$WATCHDOG_SERVICE_NAME" || warning "Fehler beim Starten des Watchdog-Service"
# Firewall-Service aktivieren (falls vorhanden)
if [ -f "$SYSTEM_SYSTEMD_DIR/$FIREWALL_SERVICE_NAME.service" ]; then
progress "Aktiviere Firewall-Service..."
systemctl enable "$FIREWALL_SERVICE_NAME" || warning "Fehler beim Aktivieren des Firewall-Service"
fi
log "✅ Services erfolgreich konfiguriert"
}
# =========================== SYSTEM-TEST ===========================
test_application() {
log "=== SYSTEM-TEST ==="
progress "Teste HTTPS-Verbindung..."
# Warte auf Service-Start
local max_attempts=30
local attempt=1
while [ $attempt -le $max_attempts ]; do
if curl -k -s --connect-timeout 5 "$HTTPS_URL" >/dev/null 2>&1; then
success "✅ HTTPS-Backend erreichbar unter $HTTPS_URL"
break
fi
progress "Warte auf HTTPS-Backend... ($attempt/$max_attempts)"
sleep 2
((attempt++))
done
if [ $attempt -gt $max_attempts ]; then
error "❌ HTTPS-Backend nicht erreichbar nach $max_attempts Versuchen"
fi
# Teste SSL-Zertifikat
progress "Teste SSL-Zertifikat..."
if openssl s_client -connect localhost:443 -servername localhost </dev/null 2>/dev/null | openssl x509 -noout -text >/dev/null 2>&1; then
success "✅ SSL-Zertifikat gültig"
else
warning "⚠️ SSL-Zertifikat-Test fehlgeschlagen"
fi
log "✅ System-Test abgeschlossen"
}
# =========================== AUFRÄUMEN ===========================
cleanup_old_files() {
log "=== AUFRÄUMEN ALTE DATEIEN ==="
progress "Entferne alte Shell-Skripte..."
# Entferne alte Skripte (falls vorhanden)
local old_scripts=("combined.sh" "installer.sh")
for script in "${old_scripts[@]}"; do
if [ -f "$CURRENT_DIR/$script" ]; then
progress "Entferne: $script"
rm -f "$CURRENT_DIR/$script" || warning "Fehler beim Entfernen von $script"
fi
done
log "✅ Aufräumen abgeschlossen"
}
# =========================== HAUPTMENÜ ===========================
show_menu() {
clear
echo -e "${CYAN}=================================================================${NC}"
echo -e "${CYAN} $APP_NAME - Setup-Skript v$APP_VERSION${NC}"
echo -e "${CYAN}=================================================================${NC}"
echo ""
echo -e "${YELLOW}Bitte wählen Sie eine Option:${NC}"
echo ""
echo -e "${GREEN}1)${NC} Abhängigkeiten installieren und System für manuelles Testen vorbereiten"
echo -e " ${BLUE}→ Python, Node.js, SSL-Zertifikate, Anwendung deployed, minimaler Test${NC}"
echo -e " ${BLUE}→ System bereit für manuelle Tests und Entwicklung${NC}"
echo ""
echo -e "${GREEN}2)${NC} Vollständige Kiosk-Installation mit Remote-Zugang"
echo -e " ${BLUE}→ Komplette Produktionsinstallation mit automatischem Kiosk-Start${NC}"
echo -e " ${BLUE}→ RDP (root:744563017196A), SSH (user:raspberry), Firewall${NC}"
echo -e " ${BLUE}→ Automatischer Login und Kiosk-Modus beim Boot${NC}"
echo ""
echo -e "${GREEN}3)${NC} Beenden"
echo ""
echo -e "${CYAN}=================================================================${NC}"
echo -n "Ihre Wahl [1-3]: "
}
# =========================== INSTALLATIONS-MODI ===========================
install_dependencies_only() {
log "=== MODUS: ABHÄNGIGKEITEN INSTALLIEREN FÜR MANUELLES TESTEN ==="
check_root
check_debian_system
check_internet_connection
configure_hostname
update_system
configure_network_security
install_python_dependencies
install_nodejs_npm
install_ssl_certificates
install_python_packages
deploy_application
install_npm_dependencies
generate_ssl_certificate
# Minimaler Test
progress "Starte minimalen Test..."
cd "$APP_DIR"
# Teste Python-Import
if python3 -c "import sys; sys.path.insert(0, '$APP_DIR'); from app import app; print('✅ Flask-App erfolgreich importiert')" 2>/dev/null; then
success "✅ Python-Abhängigkeiten funktionieren"
else
error "❌ Python-Import fehlgeschlagen"
fi
cd "$CURRENT_DIR"
success "✅ Abhängigkeiten-Installation abgeschlossen!"
info "Das System ist bereit für manuelle Tests und Entwicklung"
info "Hostname wurde auf 'raspberrypi' gesetzt"
info "HTTPS-Backend kann manuell gestartet werden mit:"
info " cd /opt/myp && python3 app.py"
}
install_full_production_system() {
log "=== MODUS: VOLLSTÄNDIGE KIOSK-INSTALLATION MIT REMOTE-ZUGANG ==="
check_root
check_debian_system
check_internet_connection
# Hostname zuerst setzen
configure_hostname
# Führe zuerst Abhängigkeiten-Installation durch (falls noch nicht geschehen)
if [ ! -d "$APP_DIR" ] || [ ! -f "$APP_DIR/app.py" ]; then
warning "Anwendung noch nicht deployed - führe Abhängigkeiten-Installation durch..."
update_system
configure_network_security
install_python_dependencies
install_nodejs_npm
install_ssl_certificates
install_python_packages
deploy_application
install_npm_dependencies
generate_ssl_certificate
else
# Netzwerk-Sicherheit auch bei bestehender Installation konfigurieren
configure_network_security
fi
# Desktop-Environments entfernen und minimale X11 installieren
remove_desktop_environments
install_minimal_x11
# Remote-Zugang konfigurieren
install_remote_access
configure_firewall
# Kiosk-Benutzer und Autologin konfigurieren
create_kiosk_user
configure_autologin
configure_kiosk_autostart
# Services installieren und aktivieren
install_systemd_services
enable_and_start_services
# System-Test
test_application
test_remote_access
# Aufräumen
cleanup_old_files
success "✅ Vollständige Kiosk-Installation abgeschlossen!"
info "Das System ist vollständig konfiguriert:"
info " 🖥️ Hostname: raspberrypi"
info " 🖥️ Automatischer Kiosk-Modus beim Boot"
info " 📡 SSH: ssh user@<ip> (Passwort: raspberry)"
info " 🖥️ RDP: <ip>:3389 (Benutzer: root, Passwort: 744563017196A)"
info " 🔒 Firewall: 192.168.0.0/16 + localhost + raspberrypi + m040tbaraspi001"
warning "⚠️ Neustart erforderlich für automatischen Kiosk-Start: sudo reboot"
}
# =========================== RDP & SSH ZUGANG ===========================
install_remote_access() {
log "=== INSTALLIERE REMOTE-ZUGANG (RDP & SSH) ==="
# SSH-Server installieren und konfigurieren
progress "Installiere und konfiguriere SSH-Server..."
apt-get install -y openssh-server || error "SSH-Server Installation fehlgeschlagen"
# SSH-Service aktivieren
systemctl enable ssh
systemctl start ssh
# SSH-Benutzer 'user' erstellen (falls nicht vorhanden)
if ! id "user" &>/dev/null; then
progress "Erstelle SSH-Benutzer: user"
useradd -m -s /bin/bash user || error "Kann SSH-Benutzer nicht erstellen"
echo "user:raspberry" | chpasswd || error "Kann Passwort für SSH-Benutzer nicht setzen"
usermod -aG sudo user 2>/dev/null || true
log "✅ SSH-Benutzer 'user' erstellt mit Passwort 'raspberry'"
else
info "SSH-Benutzer 'user' existiert bereits"
echo "user:raspberry" | chpasswd || warning "Konnte Passwort für SSH-Benutzer nicht aktualisieren"
fi
# RDP-Server (xrdp) installieren
progress "Installiere RDP-Server (xrdp)..."
# Minimale Desktop-Umgebung für RDP installieren
progress "Installiere minimale Desktop-Umgebung für RDP..."
# XFCE als leichtgewichtige Desktop-Umgebung installieren
progress "Installiere XFCE Desktop-Umgebung..."
apt-get install -y xfce4 xfce4-goodies dbus-x11 || error "XFCE Installation fehlgeschlagen"
# xrdp installieren
apt-get install -y xrdp || error "xrdp Installation fehlgeschlagen"
# xrdp-Benutzer zur ssl-cert Gruppe hinzufügen
usermod -aG ssl-cert xrdp 2>/dev/null || true
# Erstelle xrdp-Session-Konfiguration für XFCE
progress "Konfiguriere XFCE für xrdp..."
# Erstelle .xsession für alle Benutzer
cat > /etc/skel/.xsession << 'EOF'
#!/bin/bash
# XFCE Session für xrdp
export XDG_SESSION_DESKTOP=xfce
export XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg/xdg-xfce:/etc/xdg
startxfce4
EOF
# Kopiere .xsession für root
cp /etc/skel/.xsession /root/.xsession
chmod +x /root/.xsession
# Kopiere .xsession für user (falls vorhanden)
if id "user" &>/dev/null; then
cp /etc/skel/.xsession /home/user/.xsession
chown user:user /home/user/.xsession
chmod +x /home/user/.xsession
fi
# xrdp-Konfiguration vereinfachen
progress "Konfiguriere xrdp..."
cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.backup
cat > /etc/xrdp/xrdp.ini << 'EOF'
[Globals]
ini_version=1
fork=true
port=3389
tcp_nodelay=true
tcp_keepalive=true
security_layer=rdp
autorun=
allow_channels=true
allow_multimon=true
bitmap_cache=true
bitmap_compression=true
bulk_compression=true
max_bpp=32
new_cursors=true
use_fastpath=both
require_credentials=true
ask_for_reconnect_reason=true
enable_token_login=false
[Xorg]
name=Xorg
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=20
[Xvnc]
name=Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=10
EOF
# xrdp-sesman Konfiguration
progress "Konfiguriere xrdp-sesman..."
cp /etc/xrdp/sesman.ini /etc/xrdp/sesman.ini.backup
cat > /etc/xrdp/sesman.ini << 'EOF'
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=true
UserWindowManager=startxfce4
DefaultWindowManager=startxfce4
ReconnectSh=/etc/xrdp/reconnectwm.sh
[Security]
AllowRootLogin=true
MaxLoginRetry=4
TerminalServerUsers=tsusers
TerminalServerAdmins=tsadmins
AlwaysGroupCheck=false
RestrictOutboundClipboard=false
RestrictInboundClipboard=false
[Sessions]
X11DisplayOffset=10
MaxSessions=50
KillDisconnected=false
IdleTimeLimit=0
DisconnectedTimeLimit=0
Policy=UBD
[Logging]
LogFile=xrdp-sesman.log
LogLevel=INFO
EnableSyslog=true
SyslogLevel=INFO
[Xorg]
param1=-bs
param2=-nolisten
param3=tcp
param4=-dpi
param5=96
[Xvnc]
param1=-bs
param2=-nolisten
param3=tcp
param4=-localhost
param5=-dpi
param6=96
EOF
# Root-Passwort für RDP setzen
progress "Setze Root-Passwort für RDP-Zugang..."
echo "root:744563017196A" | chpasswd || error "Kann Root-Passwort nicht setzen"
# Polkit-Regel für xrdp erstellen
progress "Erstelle Polkit-Regeln für xrdp..."
mkdir -p /etc/polkit-1/localauthority/50-local.d
cat > /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla << 'EOF'
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
# xrdp-Service aktivieren und starten
progress "Starte xrdp-Services..."
systemctl enable xrdp
systemctl enable xrdp-sesman
# Services stoppen falls sie laufen
systemctl stop xrdp 2>/dev/null || true
systemctl stop xrdp-sesman 2>/dev/null || true
# Services neu starten
systemctl start xrdp-sesman
sleep 2
systemctl start xrdp
# Warte und prüfe Status
sleep 3
cd "$CURRENT_DIR"
# Status prüfen
if systemctl is-active --quiet xrdp; then
log "✅ Remote-Zugang konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
log " 🖥️ RDP: root:744563017196A (Port 3389)"
else
warning "⚠️ xrdp-Service konnte nicht gestartet werden - starte Debugging..."
debug_xrdp_issues
# Nach Debugging nochmal prüfen
if systemctl is-active --quiet xrdp; then
log "✅ Remote-Zugang nach Debugging konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
log " 🖥️ RDP: root:744563017196A (Port 3389)"
else
log "✅ SSH-Zugang konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
warning "⚠️ RDP-Zugang konnte nicht konfiguriert werden"
info "Manuelle Fehlerbehebung erforderlich - siehe Logs"
fi
fi
}
# =========================== FIREWALL KONFIGURATION ===========================
configure_firewall() {
log "=== KONFIGURIERE FIREWALL (firewalld) ==="
# firewalld installieren
progress "Installiere firewalld..."
apt-get install -y firewalld || error "firewalld Installation fehlgeschlagen"
# firewalld aktivieren und starten
systemctl enable firewalld
systemctl start firewalld
# Warte kurz bis firewalld vollständig gestartet ist
sleep 3
progress "Konfiguriere firewalld-Zonen und -Regeln..."
# Zone definieren
firewall-cmd --permanent --new-zone=myp-backend 2>/dev/null || true
# Erweiterte Netzwerk-Quellen definieren (nur IPv4)
firewall-cmd --permanent --zone=myp-backend --add-source=192.168.0.0/16
firewall-cmd --permanent --zone=myp-backend --add-source=127.0.0.1/32
# Lokaler Hostname "raspberrypi" hinzufügen
local local_hostname="raspberrypi"
progress "Füge lokalen Hostname hinzu: $local_hostname"
local local_ip=$(getent hosts "$local_hostname" | awk '{print $1}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1 2>/dev/null || true)
if [ -n "$local_ip" ]; then
firewall-cmd --permanent --zone=myp-backend --add-source="$local_ip/32" 2>/dev/null || true
log "✅ Lokaler Hostname $local_hostname hinzugefügt: $local_ip"
else
info "Lokaler Hostname $local_hostname nicht auflösbar - wird beim nächsten Boot verfügbar sein"
fi
# Frontend-Server m040tbaraspi001 hinzufügen (falls auflösbar)
progress "Füge Frontend-Server hinzu: m040tbaraspi001"
local frontend_ip=$(getent hosts "m040tbaraspi001" | awk '{print $1}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1 2>/dev/null || true)
if [ -n "$frontend_ip" ]; then
firewall-cmd --permanent --zone=myp-backend --add-source="$frontend_ip/32" 2>/dev/null || true
log "✅ Frontend-Server m040tbaraspi001 hinzugefügt: $frontend_ip"
else
# Versuche auch mit FQDN
local frontend_fqdn_ip=$(getent hosts "m040tbaraspi001.de040.corpintra.net" | awk '{print $1}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1 2>/dev/null || true)
if [ -n "$frontend_fqdn_ip" ]; then
firewall-cmd --permanent --zone=myp-backend --add-source="$frontend_fqdn_ip/32" 2>/dev/null || true
log "✅ Frontend-Server m040tbaraspi001.de040.corpintra.net hinzugefügt: $frontend_fqdn_ip"
else
info "Frontend-Server m040tbaraspi001 nicht auflösbar - überspringe"
fi
fi
# HTTPS für API & Kiosk zulassen
firewall-cmd --permanent --zone=myp-backend --add-port=443/tcp
# SSH für Wartung
firewall-cmd --permanent --zone=myp-backend --add-service=ssh
# RDP für Remote-Desktop
firewall-cmd --permanent --zone=myp-backend --add-port=3389/tcp
# IPv6 in firewalld deaktivieren
progress "Deaktiviere IPv6 in firewalld..."
firewall-cmd --permanent --set-target=DROP --zone=public --family=ipv6 2>/dev/null || true
firewall-cmd --permanent --set-target=DROP --zone=myp-backend --family=ipv6 2>/dev/null || true
# Default-Zone setzen
firewall-cmd --set-default-zone=myp-backend
# Änderungen übernehmen
firewall-cmd --reload
# Firewall-Status anzeigen
progress "Firewall-Konfiguration:"
firewall-cmd --list-all-zones | grep -A 15 "myp-backend" || true
log "✅ Firewall konfiguriert:"
log " 🔒 Zone: myp-backend"
log " 🌐 Netzwerk: 192.168.0.0/16 (nur IPv4)"
log " 🏠 Localhost: 127.0.0.1"
log " 🖥️ Lokaler Host: raspberrypi"
log " 📡 Frontend-Server: m040tbaraspi001"
log " 🔌 Ports: 443/tcp (HTTPS), 22/tcp (SSH), 3389/tcp (RDP)"
log " 🚫 IPv6 vollständig blockiert"
}
# =========================== REMOTE-ZUGANG TESTEN ===========================
test_remote_access() {
log "=== TESTE REMOTE-ZUGANG ==="
# SSH-Service testen
progress "Teste SSH-Service..."
if systemctl is-active --quiet ssh; then
success "✅ SSH-Service läuft"
# SSH-Port testen
if ss -tlnp | grep -q ":22 "; then
success "✅ SSH-Port 22 ist offen"
else
warning "⚠️ SSH-Port 22 nicht erreichbar"
fi
else
warning "⚠️ SSH-Service läuft nicht - versuche Neustart..."
systemctl restart ssh 2>/dev/null || true
sleep 2
if systemctl is-active --quiet ssh; then
success "✅ SSH-Service nach Neustart aktiv"
else
error "❌ SSH-Service konnte nicht gestartet werden"
fi
fi
# RDP-Service testen
progress "Teste RDP-Service..."
# Prüfe xrdp-sesman zuerst
if systemctl is-active --quiet xrdp-sesman; then
success "✅ xrdp-sesman läuft"
else
warning "⚠️ xrdp-sesman läuft nicht - versuche Neustart..."
systemctl restart xrdp-sesman 2>/dev/null || true
sleep 2
fi
# Prüfe xrdp
if systemctl is-active --quiet xrdp; then
success "✅ RDP-Service läuft"
# RDP-Port testen
if ss -tlnp | grep -q ":3389 "; then
success "✅ RDP-Port 3389 ist offen"
else
warning "⚠️ RDP-Port 3389 nicht erreichbar"
fi
else
warning "⚠️ RDP-Service läuft nicht - versuche Neustart..."
systemctl restart xrdp 2>/dev/null || true
sleep 3
if systemctl is-active --quiet xrdp; then
success "✅ RDP-Service nach Neustart aktiv"
else
warning "⚠️ RDP-Service konnte nicht gestartet werden"
info "Prüfe Logs mit: journalctl -u xrdp -f"
info "Prüfe sesman Logs mit: journalctl -u xrdp-sesman -f"
fi
fi
# Firewall-Status testen
progress "Teste Firewall-Status..."
if systemctl is-active --quiet firewalld; then
success "✅ Firewall läuft"
# Aktive Zone anzeigen
local active_zone=$(firewall-cmd --get-active-zones 2>/dev/null | head -1 || echo "Keine Zone aktiv")
info "Aktive Zone: $active_zone"
# Prüfe ob Ports offen sind
if firewall-cmd --zone=myp-backend --query-port=22/tcp 2>/dev/null; then
success "✅ SSH-Port in Firewall freigegeben"
else
warning "⚠️ SSH-Port nicht in Firewall freigegeben"
fi
if firewall-cmd --zone=myp-backend --query-port=3389/tcp 2>/dev/null; then
success "✅ RDP-Port in Firewall freigegeben"
else
warning "⚠️ RDP-Port nicht in Firewall freigegeben"
fi
else
warning "⚠️ Firewall läuft nicht"
fi
# Netzwerk-Interface testen
progress "Teste Netzwerk-Konfiguration..."
local ip_address=$(ip route get 1.1.1.1 2>/dev/null | awk '{print $7}' | head -1 || echo "Unbekannt")
if [ "$ip_address" != "Unbekannt" ]; then
success "✅ Netzwerk-Interface aktiv: $ip_address"
info "SSH-Zugang: ssh user@$ip_address"
info "RDP-Zugang: $ip_address:3389"
else
warning "⚠️ Keine Netzwerk-IP ermittelt"
fi
log "✅ Remote-Zugang-Test abgeschlossen"
}
# =========================== HOSTNAME KONFIGURATION ===========================
configure_hostname() {
log "=== KONFIGURIERE HOSTNAME ==="
local target_hostname="raspberrypi"
local current_hostname=$(hostname)
if [ "$current_hostname" != "$target_hostname" ]; then
progress "Setze Hostname von '$current_hostname' auf '$target_hostname'..."
# Hostname sofort setzen
hostnamectl set-hostname "$target_hostname" || error "Fehler beim Setzen des Hostnames"
# /etc/hostname aktualisieren
echo "$target_hostname" > /etc/hostname
# /etc/hosts aktualisieren
cp /etc/hosts /etc/hosts.backup
sed -i "s/127.0.1.1.*/127.0.1.1\t$target_hostname/" /etc/hosts
# Falls kein 127.0.1.1 Eintrag existiert, hinzufügen
if ! grep -q "127.0.1.1" /etc/hosts; then
echo "127.0.1.1 $target_hostname" >> /etc/hosts
fi
log "✅ Hostname erfolgreich auf '$target_hostname' gesetzt"
else
log "✅ Hostname bereits korrekt: '$target_hostname'"
fi
# Hostname-Auflösung testen
if getent hosts "$target_hostname" >/dev/null 2>&1; then
local resolved_ip=$(getent hosts "$target_hostname" | awk '{print $1}' | head -1)
log "✅ Hostname-Auflösung funktioniert: $target_hostname -> $resolved_ip"
else
warning "⚠️ Hostname-Auflösung für '$target_hostname' fehlgeschlagen"
fi
}
# =========================== XRDP DEBUGGING ===========================
debug_xrdp_issues() {
log "=== XRDP DEBUGGING ==="
progress "Analysiere xrdp-Probleme..."
# Prüfe xrdp-Logs
if [ -f /var/log/xrdp.log ]; then
local xrdp_errors=$(tail -20 /var/log/xrdp.log | grep -i "error\|fail\|denied" | wc -l)
if [ "$xrdp_errors" -gt 0 ]; then
warning "⚠️ Fehler in xrdp.log gefunden:"
tail -10 /var/log/xrdp.log | grep -i "error\|fail\|denied" || true
fi
fi
# Prüfe sesman-Logs
if [ -f /var/log/xrdp-sesman.log ]; then
local sesman_errors=$(tail -20 /var/log/xrdp-sesman.log | grep -i "error\|fail\|denied" | wc -l)
if [ "$sesman_errors" -gt 0 ]; then
warning "⚠️ Fehler in xrdp-sesman.log gefunden:"
tail -10 /var/log/xrdp-sesman.log | grep -i "error\|fail\|denied" || true
fi
fi
# Prüfe Berechtigungen
progress "Prüfe xrdp-Berechtigungen..."
if [ ! -r /etc/xrdp/xrdp.ini ]; then
warning "⚠️ xrdp.ini nicht lesbar"
fi
if [ ! -r /etc/xrdp/sesman.ini ]; then
warning "⚠️ sesman.ini nicht lesbar"
fi
# Prüfe ob XFCE installiert ist
if ! command -v startxfce4 >/dev/null 2>&1; then
warning "⚠️ XFCE nicht gefunden - installiere..."
apt-get install -y xfce4 xfce4-goodies dbus-x11 || true
fi
# Prüfe Polkit
if [ ! -f /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla ]; then
warning "⚠️ Polkit-Regel fehlt - erstelle..."
mkdir -p /etc/polkit-1/localauthority/50-local.d
cat > /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla << 'EOF'
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
fi
# Versuche Services neu zu starten
progress "Starte xrdp-Services neu..."
systemctl stop xrdp xrdp-sesman 2>/dev/null || true
sleep 2
systemctl start xrdp-sesman
sleep 2
systemctl start xrdp
sleep 3
if systemctl is-active --quiet xrdp; then
success "✅ xrdp nach Debugging erfolgreich gestartet"
else
warning "⚠️ xrdp konnte auch nach Debugging nicht gestartet werden"
info "Manuelle Prüfung erforderlich:"
info " journalctl -u xrdp -f"
info " journalctl -u xrdp-sesman -f"
info " tail -f /var/log/xrdp.log"
fi
}
# =========================== HAUPTPROGRAMM ===========================
main() {
# Erstelle Log-Datei
touch "$INSTALL_LOG" || true
while true; do
show_menu
read -r choice
case $choice in
1)
install_dependencies_only
echo ""
echo -n "Drücken Sie Enter um fortzufahren..."
read -r
;;
2)
install_full_production_system
echo ""
echo -n "Drücken Sie Enter um fortzufahren..."
read -r
;;
3)
log "Setup-Skript beendet"
exit 0
;;
*)
error "Ungültige Auswahl. Bitte wählen Sie 1-3."
;;
esac
done
}
# Skript starten
main "$@"