diff --git a/backend/app.py b/backend/app.py index 36d9cabf..907bb999 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1828,16 +1828,19 @@ def einstellungen_redirect(): """Leitet zur neuen Einstellungsseite im User-Blueprint weiter (deutsche URL).""" return redirect(url_for("user_settings")) -@app.route("/admin") +@app.route("/admin-dashboard") @login_required -def admin(): - if not current_user.is_admin: - flash("Nur Administratoren haben Zugriff auf diesen Bereich.", "error") - return redirect(url_for("index")) - +@admin_required +def admin_page(): + """Admin-Dashboard-Seite mit Live-Funktionen""" # Daten für das Template sammeln (gleiche Logik wie admin-dashboard) db_session = get_db_session() try: + # Erfolgsrate berechnen + completed_jobs = db_session.query(Job).filter(Job.status == 'completed').count() if db_session else 0 + total_jobs = db_session.query(Job).count() if db_session else 0 + success_rate = round((completed_jobs / total_jobs * 100), 1) if total_jobs > 0 else 0 + # Statistiken sammeln stats = { 'total_users': db_session.query(User).count(), @@ -1845,7 +1848,56 @@ def admin(): 'online_printers': db_session.query(Printer).filter(Printer.status == 'online').count(), 'active_jobs': db_session.query(Job).filter(Job.status.in_(['running', 'queued'])).count(), 'queued_jobs': db_session.query(Job).filter(Job.status == 'queued').count(), - 'success_rate': calculate_success_rate(db_session) # Berechnung der tatsächlichen Erfolgsrate + 'success_rate': success_rate + } + + # Tab-Parameter + active_tab = request.args.get('tab', 'users') + + # Benutzer laden (für users tab) + users = [] + if active_tab == 'users': + users = db_session.query(User).all() + + # Drucker laden (für printers tab) + printers = [] + if active_tab == 'printers': + printers = db_session.query(Printer).all() + + db_session.close() + + return render_template("admin.html", + stats=stats, + active_tab=active_tab, + users=users, + printers=printers) + except Exception as e: + app_logger.error(f"Fehler beim Laden der Admin-Daten: {str(e)}") + db_session.close() + flash("Fehler beim Laden des Admin-Bereichs.", "error") + return redirect(url_for("index")) + +@app.route("/admin") +@login_required +@admin_required +def admin(): + """Admin-Dashboard-Seite mit Live-Funktionen""" + # Daten für das Template sammeln (gleiche Logik wie admin-dashboard) + db_session = get_db_session() + try: + # Erfolgsrate berechnen + completed_jobs = db_session.query(Job).filter(Job.status == 'completed').count() if db_session else 0 + total_jobs = db_session.query(Job).count() if db_session else 0 + success_rate = round((completed_jobs / total_jobs * 100), 1) if total_jobs > 0 else 0 + + # Statistiken sammeln + stats = { + 'total_users': db_session.query(User).count(), + 'total_printers': db_session.query(Printer).count(), + 'online_printers': db_session.query(Printer).filter(Printer.status == 'online').count(), + 'active_jobs': db_session.query(Job).filter(Job.status.in_(['running', 'queued'])).count(), + 'queued_jobs': db_session.query(Job).filter(Job.status == 'queued').count(), + 'success_rate': success_rate } # Tab-Parameter @@ -1914,50 +1966,6 @@ def stats_page(): """Zeigt die Statistiken-Seite an""" return render_template("stats.html", title="Statistiken") -@app.route("/admin-dashboard") -@login_required -@admin_required -def admin_page(): - """Erweiterte Admin-Dashboard-Seite mit Live-Funktionen""" - # Daten für das Template sammeln - db_session = get_db_session() - try: - # Statistiken sammeln - stats = { - 'total_users': db_session.query(User).count(), - 'total_printers': db_session.query(Printer).count(), - 'online_printers': db_session.query(Printer).filter(Printer.status == 'online').count(), - 'active_jobs': db_session.query(Job).filter(Job.status.in_(['running', 'queued'])).count(), - 'queued_jobs': db_session.query(Job).filter(Job.status == 'queued').count(), - 'success_rate': calculate_success_rate(db_session) # Berechnung der tatsächlichen Erfolgsrate - } - - # Tab-Parameter - active_tab = request.args.get('tab', 'users') - - # Benutzer laden (für users tab) - users = [] - if active_tab == 'users': - users = db_session.query(User).all() - - # Drucker laden (für printers tab) - printers = [] - if active_tab == 'printers': - printers = db_session.query(Printer).all() - - db_session.close() - - return render_template("admin.html", - title="Admin Dashboard", - stats=stats, - active_tab=active_tab, - users=users, - printers=printers) - except Exception as e: - app_logger.error(f"Fehler beim Laden der Admin-Dashboard-Daten: {str(e)}") - db_session.close() - flash("Fehler beim Laden des Admin-Dashboards.", "error") - return redirect(url_for("index")) # ===== RECHTLICHE SEITEN ===== diff --git a/backend/combined.sh b/backend/combined.sh deleted file mode 100644 index 20b3f2b5..00000000 --- a/backend/combined.sh +++ /dev/null @@ -1,1222 +0,0 @@ -#!/bin/bash - -# =================================================================== -# MYP Druckerverwaltung - KONSOLIDIERTES INSTALLATIONS-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: 3.6.1 -# =================================================================== - -set -euo pipefail - -# =========================== GLOBALE KONFIGURATION =========================== -readonly APP_NAME="MYP Druckerverwaltung" -readonly APP_VERSION="3.6.1" -readonly APP_DIR="/opt/myp" -readonly HTTPS_SERVICE_NAME="myp-https" -readonly KIOSK_SERVICE_NAME="myp-kiosk" -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}" - -# 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 \ - || error "Grundlegende Tools Installation fehlgeschlagen" - - log "✅ System-Update abgeschlossen" -} - -# =========================== 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" -} - -# =========================== 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 --no-optional --no-audit --no-fund --legacy-peer-deps 2>/dev/null; then - log "✅ npm install erfolgreich (mit --legacy-peer-deps)" - elif npm install --no-optional --no-audit --no-fund --force 2>/dev/null; then - log "✅ npm install erfolgreich (mit --force)" - else - warning "⚠️ npm install fehlgeschlagen - versuche manuelle Installation..." - - # Manuelle Installation wichtiger Pakete - npm install tailwindcss --no-audit --no-fund --force 2>/dev/null || warning "TailwindCSS Installation fehlgeschlagen" - npm install @tailwindcss/forms --no-audit --no-fund --force 2>/dev/null || warning "@tailwindcss/forms Installation fehlgeschlagen" - npm install chart.js --no-audit --no-fund --force 2>/dev/null || warning "Chart.js Installation fehlgeschlagen" - fi - - # TailwindCSS Build - if npx tailwindcss --help >/dev/null 2>&1; then - progress "Kompiliere TailwindCSS..." - if npm run build:css 2>/dev/null || npx tailwindcss -i ./static/css/input.css -o ./static/css/tailwind.min.css --minify 2>/dev/null; then - log "✅ TailwindCSS erfolgreich kompiliert" - else - warning "⚠️ TailwindCSS Build fehlgeschlagen" - fi - fi - - cd "$CURRENT_DIR" - else - info "Keine package.json gefunden - überspringe npm-Abhängigkeiten" - fi - - log "✅ Frontend-Dependencies verarbeitet" -} - -# =========================== SYSTEMD-SERVICES =========================== -create_https_service() { - log "=== HTTPS-SERVICE KONFIGURATION ===" - - progress "Erstelle systemd-Service für HTTPS Backend..." - - # Service-Datei aus dem Projekt kopieren oder erstellen - if [ -f "$CURRENT_DIR/myp-https.service" ]; then - cp "$CURRENT_DIR/myp-https.service" "/etc/systemd/system/${HTTPS_SERVICE_NAME}.service" - else - # Fallback: Service-Datei erstellen - cat > "/etc/systemd/system/${HTTPS_SERVICE_NAME}.service" << EOF -[Unit] -Description=MYP Druckerverwaltung HTTPS Backend (Port 443) -After=network.target network-online.target -Wants=network-online.target -Requires=network.target - -[Service] -Type=simple -User=root -Group=root -WorkingDirectory=$APP_DIR -ExecStartPre=/usr/bin/python3 -c "import sys; sys.path.insert(0, '$APP_DIR'); from utils.ssl_config import ensure_ssl_certificates; ensure_ssl_certificates('$APP_DIR')" -ExecStart=/usr/bin/python3 -c "import sys; sys.path.insert(0, '$APP_DIR'); from app import app; from utils.ssl_config import get_ssl_context; ssl_ctx = get_ssl_context('$APP_DIR'); app.run(host='0.0.0.0', port=443, debug=False, ssl_context=ssl_ctx, threaded=True)" -Restart=always -RestartSec=10 -StartLimitBurst=5 -StartLimitInterval=300 - -Environment=PYTHONUNBUFFERED=1 -Environment=FLASK_ENV=production -Environment=FLASK_HOST=0.0.0.0 -Environment=FLASK_PORT=443 -Environment=PYTHONPATH=$APP_DIR -Environment=LC_ALL=C.UTF-8 -Environment=LANG=C.UTF-8 - -StandardOutput=journal -StandardError=journal -SyslogIdentifier=myp-https - -NoNewPrivileges=true -PrivateTmp=false -ProtectSystem=strict -ReadWritePaths=$APP_DIR -ReadWritePaths=/var/log -ReadWritePaths=/tmp - -AmbientCapabilities=CAP_NET_BIND_SERVICE -CapabilityBoundingSet=CAP_NET_BIND_SERVICE - -[Install] -WantedBy=multi-user.target -EOF - fi - - log "✅ HTTPS-Service erstellt: ${HTTPS_SERVICE_NAME}.service" -} - -create_kiosk_service() { - log "=== KIOSK-SERVICE KONFIGURATION ===" - - progress "Erstelle systemd-Service für Kiosk-Browser..." - - # Service-Datei aus dem Projekt kopieren oder erstellen - if [ -f "$CURRENT_DIR/myp-kiosk.service" ]; then - cp "$CURRENT_DIR/myp-kiosk.service" "/etc/systemd/system/${KIOSK_SERVICE_NAME}.service" - else - # Fallback: Service-Datei erstellen - cat > "/etc/systemd/system/${KIOSK_SERVICE_NAME}.service" << EOF -[Unit] -Description=MYP Kiosk Browser Autostart (Chromium HTTPS) -After=graphical-session.target ${HTTPS_SERVICE_NAME}.service -Wants=${HTTPS_SERVICE_NAME}.service -Requires=graphical-session.target - -[Service] -Type=simple -User=$KIOSK_USER -Group=$KIOSK_USER -Environment=DISPLAY=:0 -Environment=XAUTHORITY=/home/$KIOSK_USER/.Xauthority -WorkingDirectory=/home/$KIOSK_USER - -ExecStartPre=/bin/bash -c 'for i in {1..60}; do if curl -k -s $HTTPS_URL >/dev/null 2>&1; then break; fi; sleep 2; done' -ExecStart=/bin/bash -c 'DISPLAY=:0 xset s off; DISPLAY=:0 xset -dpms; DISPLAY=:0 unclutter -idle 0.1 -root & exec chromium --kiosk --no-sandbox --ignore-certificate-errors $HTTPS_URL' - -Restart=always -RestartSec=15 -StartLimitBurst=3 -StartLimitInterval=300 - -StandardOutput=journal -StandardError=journal -SyslogIdentifier=myp-kiosk - -[Install] -WantedBy=graphical-session.target -EOF - fi - - log "✅ Kiosk-Service erstellt: ${KIOSK_SERVICE_NAME}.service" -} - -configure_kiosk_environment() { - log "=== KIOSK-UMGEBUNG KONFIGURATION ===" - - local kiosk_home="/home/$KIOSK_USER" - - # .bashrc für automatischen X-Start - progress "Konfiguriere automatischen X-Start..." - cat >> "$kiosk_home/.bashrc" << 'EOF' - -# Automatischer X-Start für Kiosk-Modus -if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then - exec startx -fi -EOF - - # .xinitrc für Kiosk-Session - progress "Erstelle Kiosk X-Session..." - cat > "$kiosk_home/.xinitrc" << EOF -#!/bin/bash - -# Bildschirmschoner deaktivieren -xset s off -xset s noblank -xset -dpms - -# Mauszeiger verstecken -unclutter -idle 0.1 -root -noevents & - -# Openbox starten -openbox & - -# Warte auf HTTPS Backend und starte Browser -sleep 5 -systemctl --user start ${KIOSK_SERVICE_NAME} || true - -# Session am Leben halten -wait -EOF - - chmod +x "$kiosk_home/.xinitrc" - chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_home" - - log "✅ Kiosk-Umgebung konfiguriert" -} - -# =========================== SERVICE-MANAGEMENT =========================== -enable_and_start_services() { - log "=== SERVICE-AKTIVIERUNG ===" - - progress "Lade systemd-Konfiguration neu..." - systemctl daemon-reload || error "Systemd Reload fehlgeschlagen" - - progress "Aktiviere HTTPS-Service..." - systemctl enable "${HTTPS_SERVICE_NAME}.service" || error "HTTPS-Service Enable fehlgeschlagen" - - progress "Starte HTTPS-Service..." - systemctl start "${HTTPS_SERVICE_NAME}.service" || error "HTTPS-Service Start fehlgeschlagen" - - # Service-Status prüfen - sleep 5 - if systemctl is-active --quiet "${HTTPS_SERVICE_NAME}.service"; then - log "✅ ${HTTPS_SERVICE_NAME} Service läuft erfolgreich" - else - warning "⚠️ ${HTTPS_SERVICE_NAME} Service läuft nicht - prüfen Sie: journalctl -u ${HTTPS_SERVICE_NAME} -f" - fi - - # HTTPS-Erreichbarkeit testen - progress "Teste HTTPS-Erreichbarkeit..." - sleep 3 - - if curl -k -s "$HTTPS_URL" >/dev/null 2>&1; then - log "✅ HTTPS Backend erreichbar: $HTTPS_URL" - else - warning "⚠️ HTTPS Backend nicht erreichbar: $HTTPS_URL" - fi - - log "✅ Services erfolgreich konfiguriert" -} - -# =========================== SYSTEM-TESTS =========================== -run_system_tests() { - log "=== SYSTEM-TESTS ===" - - progress "Teste Python-Installation..." - if python3 -c "import flask, sqlalchemy, bcrypt; print('✅ Python-Pakete OK')" 2>/dev/null; then - log "✅ Python-Umgebung funktional" - else - warning "⚠️ Python-Umgebung problematisch" - fi - - progress "Teste SSL-Zertifikate..." - if [ -f "$APP_DIR/certs/localhost/localhost.crt" ]; then - local cert_expiry=$(openssl x509 -in "$APP_DIR/certs/localhost/localhost.crt" -noout -enddate | cut -d= -f2) - log "✅ SSL-Zertifikat vorhanden (läuft ab: $cert_expiry)" - else - warning "⚠️ SSL-Zertifikat nicht gefunden" - fi - - progress "Teste Browser-Installation..." - if command -v chromium >/dev/null 2>&1 || command -v chromium-browser >/dev/null 2>&1; then - log "✅ Chromium Browser verfügbar" - elif command -v firefox-esr >/dev/null 2>&1; then - log "✅ Firefox ESR Browser verfügbar" - else - warning "⚠️ Kein Browser gefunden" - fi - - log "✅ System-Tests abgeschlossen" -} - -# =========================== HAUPTINSTALLATIONS-FUNKTIONEN =========================== -install_system_dependencies() { - log "=== SYSTEM-ABHÄNGIGKEITEN INSTALLATION ===" - - check_internet_connection - update_system - install_python_dependencies - install_nodejs_npm - install_ssl_certificates - install_python_packages - - log "✅ System-Abhängigkeiten vollständig installiert" -} - -# =========================== WATCHDOG-SERVICES =========================== -create_watchdog_service() { - log "=== WATCHDOG-SERVICE KONFIGURATION ===" - - progress "Erstelle intelligenten Watchdog-Service..." - - # Prüfe Python-Dependencies für erweiterten Watchdog - local python_watchdog_available=false - if python3 -c "import psutil, requests" 2>/dev/null; then - python_watchdog_available=true - log "✅ Python-Dependencies für erweiterten Watchdog verfügbar" - else - warning "⚠️ Python-Dependencies fehlen - verwende Bash-Watchdog" - fi - - # Kopiere Watchdog-Service-Dateien - if [ -f "$CURRENT_DIR/kiosk-watchdog.service" ]; then - cp "$CURRENT_DIR/kiosk-watchdog.service" "/etc/systemd/system/kiosk-watchdog.service" - log "✅ Bash-Watchdog-Service installiert" - fi - - if [ "$python_watchdog_available" = true ] && [ -f "$CURRENT_DIR/kiosk-watchdog-python.service" ]; then - cp "$CURRENT_DIR/kiosk-watchdog-python.service" "/etc/systemd/system/kiosk-watchdog-python.service" - log "✅ Python-Watchdog-Service installiert" - - # Installiere Python-Dependencies falls nicht vorhanden - local pip_opts="--break-system-packages --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org" - pip3 install $pip_opts psutil requests 2>/dev/null || warning "Python-Watchdog-Dependencies Installation fehlgeschlagen" - fi - - # Aktiviere bevorzugten Watchdog-Service - if [ "$python_watchdog_available" = true ]; then - progress "Aktiviere Python-Watchdog-Service..." - systemctl enable kiosk-watchdog-python.service || warning "Python-Watchdog Enable fehlgeschlagen" - systemctl disable kiosk-watchdog.service 2>/dev/null || true - log "✅ Python-Watchdog als primärer Service konfiguriert" - else - progress "Aktiviere Bash-Watchdog-Service..." - systemctl enable kiosk-watchdog.service || warning "Bash-Watchdog Enable fehlgeschlagen" - systemctl disable kiosk-watchdog-python.service 2>/dev/null || true - log "✅ Bash-Watchdog als primärer Service konfiguriert" - fi - - log "✅ Watchdog-Service erfolgreich konfiguriert" -} - -start_watchdog_service() { - log "=== WATCHDOG-SERVICE START ===" - - # Prüfe welcher Watchdog-Service aktiviert ist - if systemctl is-enabled --quiet kiosk-watchdog-python.service 2>/dev/null; then - progress "Starte Python-Watchdog-Service..." - systemctl start kiosk-watchdog-python.service || warning "Python-Watchdog Start fehlgeschlagen" - - sleep 5 - if systemctl is-active --quiet kiosk-watchdog-python.service; then - log "✅ Python-Watchdog-Service läuft erfolgreich" - else - warning "⚠️ Python-Watchdog-Service läuft nicht - prüfen Sie: journalctl -u kiosk-watchdog-python -f" - fi - elif systemctl is-enabled --quiet kiosk-watchdog.service 2>/dev/null; then - progress "Starte Bash-Watchdog-Service..." - systemctl start kiosk-watchdog.service || warning "Bash-Watchdog Start fehlgeschlagen" - - sleep 5 - if systemctl is-active --quiet kiosk-watchdog.service; then - log "✅ Bash-Watchdog-Service läuft erfolgreich" - else - warning "⚠️ Bash-Watchdog-Service läuft nicht - prüfen Sie: journalctl -u kiosk-watchdog -f" - fi - else - warning "⚠️ Kein Watchdog-Service aktiviert" - fi - - log "✅ Watchdog-Service-Start abgeschlossen" -} - -# =========================== AKTUALISIERTE HAUPTFUNKTIONEN =========================== -setup_production_kiosk() { - log "=== PRODUKTIONS-KIOSK SETUP ===" - - # Vollständige Installation - install_system_dependencies - remove_desktop_environments - install_minimal_x11 - create_kiosk_user - configure_autologin - deploy_application - install_npm_dependencies - create_https_service - create_kiosk_service - create_watchdog_service - configure_kiosk_environment - enable_and_start_services - start_watchdog_service - run_system_tests - - log "✅ PRODUKTIONS-KIOSK ERFOLGREICH EINGERICHTET" -} - -# =========================== MENÜ-SYSTEM =========================== -show_main_menu() { - clear - echo -e "${BLUE}=================================================================${NC}" - echo -e "${GREEN} $APP_NAME - KONSOLIDIERTER INSTALLER${NC}" - echo -e "${CYAN} Version: $APP_VERSION${NC}" - echo -e "${BLUE}=================================================================${NC}" - echo "" - echo -e "${YELLOW}Aktuelles Verzeichnis:${NC} $CURRENT_DIR" - echo -e "${YELLOW}Zielverzeichnis:${NC} $APP_DIR" - echo -e "${YELLOW}HTTPS-URL:${NC} $HTTPS_URL" - echo -e "${YELLOW}Kiosk-Benutzer:${NC} $KIOSK_USER" - echo -e "${YELLOW}System:${NC} $(uname -m) - $(cat /etc/debian_version 2>/dev/null || echo 'Unbekannt')" - echo "" - - # Watchdog-Status anzeigen - if systemctl is-active --quiet kiosk-watchdog-python.service 2>/dev/null; then - echo -e "${GREEN}🔍 Watchdog:${NC} Python-Watchdog aktiv" - elif systemctl is-active --quiet kiosk-watchdog.service 2>/dev/null; then - echo -e "${GREEN}🔍 Watchdog:${NC} Bash-Watchdog aktiv" - else - echo -e "${RED}🔍 Watchdog:${NC} Nicht aktiv" - fi - - echo "" - echo -e "${PURPLE}Installationsoptionen:${NC}" - echo "" - echo -e "${GREEN}1)${NC} System-Abhängigkeiten installieren" - echo -e " → Python 3, Node.js, npm, SSL-Zertifikate" - echo -e " → Verwendet: pip install --break-system-packages" - echo -e " → Kein virtuelles Environment" - echo "" - echo -e "${GREEN}2)${NC} VOLLSTÄNDIGER KIOSK-MODUS (HTTPS Port 443)" - echo -e " → ${RED}ENTFERNT ALLE DESKTOP-ENVIRONMENTS!${NC}" - echo -e " → Installiert minimale X11-Umgebung" - echo -e " → Erstellt SSL-Zertifikate automatisch" - echo -e " → Konfiguriert Autologin und Chromium-Kiosk" - echo -e " → ${CYAN}Intelligenter Watchdog-Service${NC}" - echo -e " → ${YELLOW}NEUSTART ERFORDERLICH!${NC}" - echo "" - echo -e "${GREEN}3)${NC} Nur SSL-Zertifikate generieren" - echo -e " → Erstellt selbstsignierte Zertifikate für localhost" - echo -e " → Fügt Zertifikate zum System CA-Store hinzu" - echo "" - echo -e "${GREEN}4)${NC} Services verwalten" - echo -e " → Start/Stop/Restart HTTPS, Kiosk und Watchdog Services" - echo -e " → Service-Status anzeigen" - echo -e " → ${CYAN}Erweiterte Watchdog-Verwaltung${NC}" - echo "" - echo -e "${GREEN}5)${NC} System-Tests ausführen" - echo -e " → Prüft Installation und Konfiguration" - echo -e " → Testet HTTPS-Erreichbarkeit" - echo -e " → Watchdog-Funktionalität testen" - echo "" - echo -e "${RED}0)${NC} Beenden" - echo "" - echo -e "${RED}⚠️ WARNUNG: Option 2 macht das System zu einem reinen Kiosk!${NC}" - echo -e "${GREEN}🔐 HTTPS: Automatische SSL-Zertifikat-Generierung${NC}" - echo -e "${CYAN}🔍 WATCHDOG: Intelligente Python/Bash-basierte Überwachung${NC}" - echo -e "${BLUE}=================================================================${NC}" - echo -n "Ihre Wahl [0-5]: " -} - -manage_services_menu() { - while true; do - clear - echo -e "${BLUE}=== SERVICE-MANAGEMENT ===${NC}" - echo "" - echo -e "${GREEN}1)${NC} HTTPS-Service starten" - echo -e "${GREEN}2)${NC} HTTPS-Service stoppen" - echo -e "${GREEN}3)${NC} HTTPS-Service neustarten" - echo -e "${GREEN}4)${NC} Kiosk-Service starten" - echo -e "${GREEN}5)${NC} Kiosk-Service stoppen" - echo -e "${GREEN}6)${NC} Watchdog-Service verwalten" - echo -e "${GREEN}7)${NC} Service-Status anzeigen" - echo -e "${GREEN}8)${NC} Service-Logs anzeigen" - echo -e "${RED}0)${NC} Zurück zum Hauptmenü" - echo "" - echo -n "Ihre Wahl [0-8]: " - - read -r choice - - case $choice in - 1) - systemctl start "${HTTPS_SERVICE_NAME}.service" - echo -e "${GREEN}HTTPS-Service gestartet${NC}" - ;; - 2) - systemctl stop "${HTTPS_SERVICE_NAME}.service" - echo -e "${YELLOW}HTTPS-Service gestoppt${NC}" - ;; - 3) - systemctl restart "${HTTPS_SERVICE_NAME}.service" - echo -e "${GREEN}HTTPS-Service neugestartet${NC}" - ;; - 4) - systemctl start "${KIOSK_SERVICE_NAME}.service" - echo -e "${GREEN}Kiosk-Service gestartet${NC}" - ;; - 5) - systemctl stop "${KIOSK_SERVICE_NAME}.service" - echo -e "${YELLOW}Kiosk-Service gestoppt${NC}" - ;; - 6) - manage_watchdog_services - ;; - 7) - echo -e "${BLUE}=== SERVICE-STATUS ===${NC}" - systemctl status "${HTTPS_SERVICE_NAME}.service" --no-pager || true - echo "" - systemctl status "${KIOSK_SERVICE_NAME}.service" --no-pager || true - echo "" - # Watchdog-Status - if systemctl is-enabled --quiet kiosk-watchdog-python.service 2>/dev/null; then - systemctl status kiosk-watchdog-python.service --no-pager || true - elif systemctl is-enabled --quiet kiosk-watchdog.service 2>/dev/null; then - systemctl status kiosk-watchdog.service --no-pager || true - fi - ;; - 8) - echo -e "${BLUE}=== SERVICE-LOGS (letzte 20 Zeilen) ===${NC}" - echo -e "${CYAN}HTTPS-Service:${NC}" - journalctl -u "${HTTPS_SERVICE_NAME}.service" -n 20 --no-pager || true - echo "" - echo -e "${CYAN}Kiosk-Service:${NC}" - journalctl -u "${KIOSK_SERVICE_NAME}.service" -n 20 --no-pager || true - echo "" - echo -e "${CYAN}Watchdog-Service:${NC}" - if systemctl is-active --quiet kiosk-watchdog-python.service 2>/dev/null; then - journalctl -u kiosk-watchdog-python.service -n 20 --no-pager || true - elif systemctl is-active --quiet kiosk-watchdog.service 2>/dev/null; then - journalctl -u kiosk-watchdog.service -n 20 --no-pager || true - fi - ;; - 0) - break - ;; - *) - echo -e "${RED}Ungültige Eingabe${NC}" - ;; - esac - - echo "" - echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" - read -r - done -} - -manage_watchdog_services() { - while true; do - clear - echo -e "${BLUE}=== WATCHDOG-SERVICE MANAGEMENT ===${NC}" - echo "" - - # Status anzeigen - if systemctl is-active --quiet kiosk-watchdog-python.service 2>/dev/null; then - echo -e "${GREEN}✅ Python-Watchdog aktiv${NC}" - elif systemctl is-enabled --quiet kiosk-watchdog-python.service 2>/dev/null; then - echo -e "${YELLOW}⚠️ Python-Watchdog aktiviert aber nicht laufend${NC}" - else - echo -e "${RED}❌ Python-Watchdog nicht aktiviert${NC}" - fi - - if systemctl is-active --quiet kiosk-watchdog.service 2>/dev/null; then - echo -e "${GREEN}✅ Bash-Watchdog aktiv${NC}" - elif systemctl is-enabled --quiet kiosk-watchdog.service 2>/dev/null; then - echo -e "${YELLOW}⚠️ Bash-Watchdog aktiviert aber nicht laufend${NC}" - else - echo -e "${RED}❌ Bash-Watchdog nicht aktiviert${NC}" - fi - - echo "" - echo -e "${GREEN}1)${NC} Python-Watchdog aktivieren und starten" - echo -e "${GREEN}2)${NC} Bash-Watchdog aktivieren und starten" - echo -e "${GREEN}3)${NC} Aktiven Watchdog stoppen" - echo -e "${GREEN}4)${NC} Aktiven Watchdog neustarten" - echo -e "${GREEN}5)${NC} Watchdog-Logs anzeigen" - echo -e "${GREEN}6)${NC} Watchdog-Konfiguration testen" - echo -e "${RED}0)${NC} Zurück" - echo "" - echo -n "Ihre Wahl [0-6]: " - - read -r choice - - case $choice in - 1) - # Python-Watchdog aktivieren - systemctl stop kiosk-watchdog.service 2>/dev/null || true - systemctl disable kiosk-watchdog.service 2>/dev/null || true - systemctl enable kiosk-watchdog-python.service - systemctl start kiosk-watchdog-python.service - echo -e "${GREEN}Python-Watchdog aktiviert und gestartet${NC}" - ;; - 2) - # Bash-Watchdog aktivieren - systemctl stop kiosk-watchdog-python.service 2>/dev/null || true - systemctl disable kiosk-watchdog-python.service 2>/dev/null || true - systemctl enable kiosk-watchdog.service - systemctl start kiosk-watchdog.service - echo -e "${GREEN}Bash-Watchdog aktiviert und gestartet${NC}" - ;; - 3) - # Aktiven Watchdog stoppen - systemctl stop kiosk-watchdog-python.service 2>/dev/null || true - systemctl stop kiosk-watchdog.service 2>/dev/null || true - echo -e "${YELLOW}Watchdog-Services gestoppt${NC}" - ;; - 4) - # Aktiven Watchdog neustarten - if systemctl is-enabled --quiet kiosk-watchdog-python.service 2>/dev/null; then - systemctl restart kiosk-watchdog-python.service - echo -e "${GREEN}Python-Watchdog neugestartet${NC}" - elif systemctl is-enabled --quiet kiosk-watchdog.service 2>/dev/null; then - systemctl restart kiosk-watchdog.service - echo -e "${GREEN}Bash-Watchdog neugestartet${NC}" - else - echo -e "${RED}Kein Watchdog-Service aktiviert${NC}" - fi - ;; - 5) - # Watchdog-Logs anzeigen - echo -e "${BLUE}=== WATCHDOG-LOGS ===${NC}" - if systemctl is-active --quiet kiosk-watchdog-python.service 2>/dev/null; then - echo -e "${CYAN}Python-Watchdog (systemd):${NC}" - journalctl -u kiosk-watchdog-python.service -n 30 --no-pager || true - echo "" - echo -e "${CYAN}Python-Watchdog (Datei):${NC}" - tail -n 20 /var/log/kiosk-watchdog-python.log 2>/dev/null || echo "Log-Datei nicht gefunden" - elif systemctl is-active --quiet kiosk-watchdog.service 2>/dev/null; then - echo -e "${CYAN}Bash-Watchdog:${NC}" - journalctl -u kiosk-watchdog.service -n 30 --no-pager || true - echo "" - tail -n 20 /var/log/kiosk-watchdog.log 2>/dev/null || echo "Log-Datei nicht gefunden" - else - echo -e "${RED}Kein aktiver Watchdog-Service${NC}" - fi - ;; - 6) - # Watchdog-Konfiguration testen - echo -e "${BLUE}=== WATCHDOG-KONFIGURATION TEST ===${NC}" - - # Teste Python-Watchdog - if python3 -c "import sys; sys.path.insert(0, '$APP_DIR'); from utils.watchdog_manager import WatchdogManager; print('✅ Python-Watchdog importierbar')" 2>/dev/null; then - echo -e "${GREEN}✅ Python-Watchdog-Konfiguration OK${NC}" - else - echo -e "${RED}❌ Python-Watchdog-Konfiguration fehlerhaft${NC}" - fi - - # Teste SSL-Zertifikate - if [ -f "$APP_DIR/certs/localhost/localhost.crt" ]; then - echo -e "${GREEN}✅ SSL-Zertifikat vorhanden${NC}" - else - echo -e "${RED}❌ SSL-Zertifikat fehlt${NC}" - fi - - # Teste HTTPS-Erreichbarkeit - if curl -k -s --connect-timeout 5 "$HTTPS_URL" >/dev/null 2>&1; then - echo -e "${GREEN}✅ HTTPS Backend erreichbar${NC}" - else - echo -e "${RED}❌ HTTPS Backend nicht erreichbar${NC}" - fi - ;; - 0) - break - ;; - *) - echo -e "${RED}Ungültige Eingabe${NC}" - ;; - esac - - echo "" - echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" - read -r - done -} - -# =========================== HAUPTPROGRAMM =========================== -main() { - # System-Checks - check_root - check_debian_system - - # Log-Datei erstellen - mkdir -p "$(dirname "$INSTALL_LOG")" - touch "$INSTALL_LOG" - - log "=== MYP KONSOLIDIERTER INSTALLER GESTARTET ===" - log "Version: $APP_VERSION" - log "Arbeitsverzeichnis: $CURRENT_DIR" - log "Zielverzeichnis: $APP_DIR" - log "HTTPS-URL: $HTTPS_URL" - log "System: $(uname -a)" - - while true; do - show_main_menu - read -r choice - - case $choice in - 1) - clear - log "=== OPTION 1: SYSTEM-ABHÄNGIGKEITEN ===" - install_system_dependencies - success "✅ System-Abhängigkeiten erfolgreich installiert!" - ;; - 2) - clear - echo -e "${RED}⚠️ WARNUNG: Vollständiger Kiosk-Modus!${NC}" - echo -e "${YELLOW}Das System wird zu einem reinen HTTPS-Kiosk umgebaut.${NC}" - echo -e "${BLUE}Alle Desktop-Environments werden entfernt!${NC}" - echo "" - echo -n "Sind Sie sicher? [ja/NEIN]: " - read -r confirm - - if [ "$confirm" = "ja" ] || [ "$confirm" = "JA" ]; then - clear - log "=== OPTION 2: VOLLSTÄNDIGER KIOSK-MODUS ===" - setup_production_kiosk - success "✅ KIOSK-MODUS ERFOLGREICH EINGERICHTET!" - echo "" - echo -e "${RED}🔄 NEUSTART JETZT ERFORDERLICH: sudo reboot${NC}" - echo -e "${BLUE}🔐 HTTPS-URL: $HTTPS_URL${NC}" - else - echo -e "${BLUE}Installation abgebrochen.${NC}" - fi - ;; - 3) - clear - log "=== OPTION 3: SSL-ZERTIFIKATE GENERIEREN ===" - python3 -c "import sys; sys.path.insert(0, '$CURRENT_DIR'); from utils.ssl_config import ensure_ssl_certificates; ensure_ssl_certificates('$APP_DIR', True)" - success "✅ SSL-Zertifikate generiert!" - ;; - 4) - manage_services_menu - continue - ;; - 5) - clear - log "=== OPTION 5: SYSTEM-TESTS ===" - run_system_tests - success "✅ System-Tests abgeschlossen!" - ;; - 0) - log "=== KONSOLIDIERTER INSTALLER BEENDET ===" - echo -e "${GREEN}Auf Wiedersehen!${NC}" - echo -e "${BLUE}Log-Datei: $INSTALL_LOG${NC}" - exit 0 - ;; - *) - echo -e "${RED}Ungültige Eingabe. Bitte wählen Sie 0-5.${NC}" - sleep 2 - continue - ;; - esac - - echo "" - echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" - read -r - done -} - -# Script starten -main "$@" \ No newline at end of file diff --git a/backend/database/myp.db b/backend/database/myp.db index e6c920b7..00ce585e 100644 Binary files a/backend/database/myp.db and b/backend/database/myp.db differ diff --git a/backend/database/myp.db-shm b/backend/database/myp.db-shm index 32379587..afa41ce9 100644 Binary files a/backend/database/myp.db-shm and b/backend/database/myp.db-shm differ diff --git a/backend/database/myp.db-wal b/backend/database/myp.db-wal index 5dd54322..af6e4805 100644 Binary files a/backend/database/myp.db-wal and b/backend/database/myp.db-wal differ diff --git a/backend/docs/CHANGELOG_SETUP_KONSOLIDIERUNG.md b/backend/docs/CHANGELOG_SETUP_KONSOLIDIERUNG.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/backend/docs/CHANGELOG_SETUP_KONSOLIDIERUNG.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/docs/SETUP_ANLEITUNG.md b/backend/docs/SETUP_ANLEITUNG.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/backend/docs/SETUP_ANLEITUNG.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/installer.sh b/backend/installer.sh deleted file mode 100644 index d3ab1daa..00000000 --- a/backend/installer.sh +++ /dev/null @@ -1,1387 +0,0 @@ -#!/bin/bash - -# =================================================================== -# MYP Druckerverwaltung - VOLLSTÄNDIGER KIOSK-INSTALLER für Raspbian -# Entwickelt auf Windows, ausführbar auf Raspberry Pi / Debian -# OHNE virtualenv - verwendet System-Python mit --break-system-packages -# ECHTER KIOSK-MODUS: Entfernt Desktop, 1 Backend-Instanz HTTPS, Autologin -# =================================================================== - -set -euo pipefail - -# =========================== KONFIGURATION =========================== -APP_NAME="MYP Druckerverwaltung" -APP_DIR="/opt/myp" -SERVICE_NAME="myp-https" -KIOSK_USER="kiosk" -CURRENT_DIR="$(pwd)" -INSTALL_LOG="/var/log/myp-install.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 - export PATH="/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/bin:$PATH" -} - -check_debian_system() { - if [ ! -f /etc/debian_version ]; then - error "Dieses Skript ist nur für Debian/Raspbian-Systeme geeignet!" - fi - log "✅ Debian/Raspbian-System erkannt" -} - -# ========================== DESKTOP ENVIRONMENTS ENTFERNEN ========================== -remove_desktop_environments() { - log "=== ENTFERNE ALLE DESKTOP ENVIRONMENTS ===" - - progress "Stoppe alle Desktop-Services..." - systemctl stop lightdm 2>/dev/null || true - systemctl stop gdm3 2>/dev/null || true - systemctl stop sddm 2>/dev/null || true - systemctl stop xdm 2>/dev/null || true - - systemctl disable lightdm 2>/dev/null || true - systemctl disable gdm3 2>/dev/null || true - systemctl disable sddm 2>/dev/null || true - systemctl disable xdm 2>/dev/null || true - - progress "Entferne Desktop-Pakete vollständig..." - - # Raspberry Pi OS Desktop entfernen - 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 Pakete entfernen - apt-get remove --purge -y \ - libreoffice* \ - thunderbird* \ - firefox* \ - vlc* \ - gimp* \ - scratch* \ - minecraft-pi \ - sonic-pi \ - 2>/dev/null || true - - # Autoremove und Autoclean - apt-get autoremove --purge -y - apt-get autoclean - - log "✅ Desktop Environments vollständig entfernt" -} - -# ========================== KIOSK BENUTZER ERSTELLEN ========================== -create_kiosk_user() { - log "=== ERSTELLE KIOSK-BENUTZER ===" - - # Kiosk-Benutzer erstellen falls nicht vorhanden - 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 erstellt: $KIOSK_USER" -} - -# ========================== MINIMALE X11 INSTALLATION ========================== -install_minimal_x11() { - log "=== INSTALLIERE MINIMALE X11-UMGEBUNG ===" - - 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" - - # Chromium Browser mit Fallback-Mechanismus installieren - progress "Installiere Chromium Browser..." - if apt-get install -y chromium 2>/dev/null; then - log "✅ Chromium erfolgreich installiert" - elif apt-get install -y chromium-browser 2>/dev/null; then - log "✅ Chromium-Browser erfolgreich installiert" - elif apt-get install -y firefox-esr 2>/dev/null; then - warning "⚠️ Chromium nicht verfügbar - Firefox ESR als Fallback installiert" - # Firefox-Konfiguration für Kiosk-Modus anpassen - progress "Konfiguriere Firefox für Kiosk-Modus..." - FIREFOX_BROWSER="firefox-esr" - else - error "❌ Kein Browser verfügbar (chromium, chromium-browser, firefox-esr)" - fi - - log "✅ Minimale X11-Umgebung installiert" -} - -# ========================== MERCEDES ZERTIFIKATE ========================== -install_mercedes_certificates() { - log "=== INSTALLIERE MERCEDES SSL-ZERTIFIKATE ===" - - progress "Aktualisiere CA-Zertifikate..." - - # CA-Zertifikate Paket installieren/aktualisieren - apt-get install -y ca-certificates curl openssl || error "CA-Zertifikate Installation fehlgeschlagen" - - # Standard CA-Bundle aktualisieren - update-ca-certificates || warning "CA-Zertifikate Update teilweise fehlgeschlagen" - - # Mercedes Corporate Zertifikate installieren (falls vorhanden) - if [ -d "$CURRENT_DIR/certs/mercedes" ] && [ "$(ls -A $CURRENT_DIR/certs/mercedes 2>/dev/null)" ]; then - progress "Installiere Mercedes Corporate Zertifikate..." - - # Erstelle temporäres Verzeichnis für Zertifikat-Verarbeitung - TEMP_CERT_DIR="/tmp/mercedes_certs" - mkdir -p "$TEMP_CERT_DIR" - - # Alle Zertifikatsdateien verarbeiten (.crt, .pem, .cer) - find "$CURRENT_DIR/certs/mercedes" -type f \( -name "*.crt" -o -name "*.pem" -o -name "*.cer" \) | while read cert_file; do - cert_basename=$(basename "$cert_file") - cert_name="${cert_basename%.*}" - - progress "Verarbeite Mercedes-Zertifikat: $cert_basename" - - # .cer Dateien in .crt konvertieren (falls nötig) - if [[ "$cert_file" == *.cer ]]; then - progress "Konvertiere .cer zu .crt: $cert_basename" - - # Überprüfe ob es sich um DER- oder PEM-Format handelt - if openssl x509 -in "$cert_file" -text -noout >/dev/null 2>&1; then - # PEM-Format - direkt kopieren mit .crt Endung - cp "$cert_file" "$TEMP_CERT_DIR/${cert_name}.crt" - elif openssl x509 -in "$cert_file" -inform DER -text -noout >/dev/null 2>&1; then - # DER-Format - zu PEM konvertieren - openssl x509 -in "$cert_file" -inform DER -out "$TEMP_CERT_DIR/${cert_name}.crt" -outform PEM - else - warning "Unbekanntes Zertifikatformat: $cert_file" - continue - fi - else - # .crt oder .pem - direkt kopieren - cp "$cert_file" "$TEMP_CERT_DIR/" - fi - - # Zertifikat validieren - if openssl x509 -in "$TEMP_CERT_DIR/${cert_name}.crt" -text -noout >/dev/null 2>&1; then - log "✅ Zertifikat validiert: ${cert_name}.crt" - - # In CA-Zertifikate-Verzeichnis kopieren - cp "$TEMP_CERT_DIR/${cert_name}.crt" "/usr/local/share/ca-certificates/" - else - warning "⚠️ Ungültiges Zertifikat übersprungen: $cert_file" - fi - done - - # Spezielle Mercedes-Zertifikate verarbeiten - if [ -f "$CURRENT_DIR/certs/mercedes/Corp-Pri-Root-CA.cer" ]; then - progress "Installiere Mercedes Corporate Primary Root CA..." - - # Versuche DER-zu-PEM Konvertierung - if openssl x509 -in "$CURRENT_DIR/certs/mercedes/Corp-Pri-Root-CA.cer" -inform DER -out "/usr/local/share/ca-certificates/Mercedes-Corp-Pri-Root-CA.crt" -outform PEM 2>/dev/null; then - log "✅ Corp-Pri-Root-CA.cer erfolgreich als DER konvertiert" - # Versuche direkte PEM-Kopie - elif openssl x509 -in "$CURRENT_DIR/certs/mercedes/Corp-Pri-Root-CA.cer" -text -noout >/dev/null 2>&1; then - cp "$CURRENT_DIR/certs/mercedes/Corp-Pri-Root-CA.cer" "/usr/local/share/ca-certificates/Mercedes-Corp-Pri-Root-CA.crt" - log "✅ Corp-Pri-Root-CA.cer direkt als PEM kopiert" - else - warning "⚠️ Corp-Pri-Root-CA.cer Format nicht erkannt - übersprungen" - fi - fi - - if [ -f "$CURRENT_DIR/certs/mercedes/Corp-Root-CA-G2.cer" ]; then - progress "Installiere Mercedes Corporate Root CA G2..." - - # Versuche DER-zu-PEM Konvertierung - if openssl x509 -in "$CURRENT_DIR/certs/mercedes/Corp-Root-CA-G2.cer" -inform DER -out "/usr/local/share/ca-certificates/Mercedes-Corp-Root-CA-G2.crt" -outform PEM 2>/dev/null; then - log "✅ Corp-Root-CA-G2.cer erfolgreich als DER konvertiert" - # Versuche direkte PEM-Kopie - elif openssl x509 -in "$CURRENT_DIR/certs/mercedes/Corp-Root-CA-G2.cer" -text -noout >/dev/null 2>&1; then - cp "$CURRENT_DIR/certs/mercedes/Corp-Root-CA-G2.cer" "/usr/local/share/ca-certificates/Mercedes-Corp-Root-CA-G2.crt" - log "✅ Corp-Root-CA-G2.cer direkt als PEM kopiert" - else - warning "⚠️ Corp-Root-CA-G2.cer Format nicht erkannt - übersprungen" - fi - fi - - # Temporäres Verzeichnis aufräumen - rm -rf "$TEMP_CERT_DIR" - - # CA-Zertifikate aktualisieren - update-ca-certificates || warning "Mercedes Zertifikate Update fehlgeschlagen" - - # Installierte Mercedes-Zertifikate auflisten - MERCEDES_CERTS=$(ls /usr/local/share/ca-certificates/*Mercedes* 2>/dev/null | wc -l) - if [ "$MERCEDES_CERTS" -gt 0 ]; then - log "✅ $MERCEDES_CERTS Mercedes-Zertifikate erfolgreich installiert" - ls /usr/local/share/ca-certificates/*Mercedes* 2>/dev/null | while read cert; do - log " 📜 $(basename "$cert")" - done - else - warning "⚠️ Keine Mercedes-Zertifikate installiert" - fi - - else - info "Keine Mercedes-Zertifikate gefunden - verwende Standard CA-Bundle" - fi - - # Python SSL-Konfiguration optimieren - progress "Konfiguriere Python SSL-Einstellungen..." - - # pip Konfiguration für SSL mit erweiterten Optionen - 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 - - # Python HTTPS-Konfiguration mit Mercedes-Support - 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" - export PYTHONHTTPSVERIFY=1 - - # Node.js SSL-Konfiguration hinzufügen - export NODE_TLS_REJECT_UNAUTHORIZED=1 - export NODE_EXTRA_CA_CERTS="/etc/ssl/certs/ca-certificates.crt" - - # npm SSL-Konfiguration mit verbesserter Fehlerbehandlung - progress "Konfiguriere npm SSL-Einstellungen..." - npm config set ca "" 2>/dev/null || true - npm config set cafile "/etc/ssl/certs/ca-certificates.crt" 2>/dev/null || true - npm config set strict-ssl true 2>/dev/null || true - npm config set registry "https://registry.npmjs.org/" 2>/dev/null || true - - # Pip auf neueste Version aktualisieren - progress "Aktualisiere pip auf neueste Version..." - python3 -m pip install --upgrade pip --break-system-packages --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org || warning "pip Update fehlgeschlagen" - - # SSL-Tests durchführen - progress "Teste SSL-Verbindungen..." - - # Test PyPI - if python3 -c "import ssl, urllib.request; urllib.request.urlopen('https://pypi.org')" 2>/dev/null; then - log "✅ SSL-Verbindung zu PyPI erfolgreich" - else - warning "⚠️ SSL-Verbindung zu PyPI problematisch" - fi - - # Test npm Registry - if npm ping --registry https://registry.npmjs.org >/dev/null 2>&1; then - log "✅ SSL-Verbindung zu npm Registry erfolgreich" - else - warning "⚠️ SSL-Verbindung zu npm Registry problematisch" - fi - - # Zeige installierte CA-Zertifikate-Anzahl - CA_COUNT=$(ls /etc/ssl/certs/*.pem 2>/dev/null | wc -l) - log "✅ Insgesamt $CA_COUNT CA-Zertifikate im System verfügbar" - - log "✅ Mercedes SSL-Zertifikate und System-Konfiguration abgeschlossen" -} - -# ========================== ABHÄNGIGKEITEN INSTALLIEREN ========================== -install_system_dependencies() { - log "=== INSTALLIERE SYSTEM-ABHÄNGIGKEITEN ===" - - progress "Aktualisiere Paketlisten..." - apt-get update -y || error "APT Update fehlgeschlagen" - - progress "Installiere Python 3 und grundlegende Pakete..." - apt-get install -y \ - python3 \ - python3-pip \ - python3-dev \ - python3-setuptools \ - build-essential \ - libssl-dev \ - libffi-dev \ - git \ - curl \ - wget \ - nano \ - htop \ - rsync \ - unzip \ - sudo \ - systemd \ - ca-certificates \ - gnupg \ - lsb-release \ - sqlite3 \ - || error "System-Pakete Installation fehlgeschlagen" - - # ========================== NODE.JS UND NPM INSTALLATION ========================== - progress "Installiere Node.js und npm..." - - # 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 20.x hinzufügen - progress "Füge NodeSource Repository für Node.js 20.x LTS hinzu..." - curl -fsSL https://deb.nodesource.com/setup_20.x | bash - || { - warning "NodeSource Repository konnte nicht hinzugefügt werden" - - # Fallback: Manueller Download und Installation - progress "Fallback: Installiere Node.js aus Debian-Repository..." - apt-get update -y - apt-get install -y nodejs npm || { - error "Node.js Installation komplett fehlgeschlagen" - } - } - - # Node.js aus NodeSource Repository installieren (falls Repository erfolgreich hinzugefügt) - if [ -f /etc/apt/sources.list.d/nodesource.list ]; then - progress "Installiere Node.js 20.x LTS aus NodeSource Repository..." - apt-get update -y - apt-get install -y nodejs || { - warning "NodeSource Installation fehlgeschlagen - verwende Fallback" - apt-get install -y nodejs npm || error "Node.js Fallback Installation fehlgeschlagen" - } - fi - - # Überprüfe Node.js Installation - if command -v node >/dev/null 2>&1; then - NODE_VERSION=$(node --version) - log "✅ Node.js erfolgreich installiert: $NODE_VERSION" - else - error "❌ Node.js Installation fehlgeschlagen" - fi - - # npm sollte automatisch mit Node.js mitgeliefert werden - if command -v npm >/dev/null 2>&1; then - NPM_VERSION=$(npm --version) - log "✅ npm automatisch installiert: $NPM_VERSION" - - # VORSICHTIG: npm NUR aktualisieren wenn Node.js >= 18 - NODE_MAJOR_VERSION=$(node --version | cut -d'.' -f1 | sed 's/v//') - if [ "$NODE_MAJOR_VERSION" -ge 18 ]; then - progress "Node.js $NODE_MAJOR_VERSION erkannt - npm-Update möglich..." - npm install -g npm@latest --force 2>/dev/null || { - warning "npm-Update fehlgeschlagen - verwende bestehende Version $NPM_VERSION" - } - NPM_VERSION_NEW=$(npm --version) - log "✅ npm Version: $NPM_VERSION_NEW" - else - warning "⚠️ Node.js < 18 - npm-Update übersprungen für Kompatibilität" - fi - else - error "❌ npm nicht verfügbar" - fi - - # npm-Konfiguration für bessere Performance - progress "Konfiguriere npm-Einstellungen..." - npm config set fund false 2>/dev/null || true - npm config set audit-level moderate 2>/dev/null || true - npm config set package-lock true 2>/dev/null || true - - # WICHTIG: Mercedes Zertifikate vor Python-Paketen installieren - install_mercedes_certificates - - progress "Installiere Python-Abhängigkeiten mit Mercedes SSL-Konfiguration..." - - # SSL-freundliche pip-Installation mit Fallback-Optionen - PIP_OPTS="--break-system-packages --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --timeout 60 --retries 3" - - # Core 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" - - # Datenbank - pip3 install $PIP_OPTS SQLAlchemy==2.0.36 || pip3 install $PIP_OPTS SQLAlchemy || error "SQLAlchemy Installation fehlgeschlagen" - - # Sicherheit - 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" - - # Smart Plug Steuerung - pip3 install $PIP_OPTS PyP100 || warning "PyP100 Installation fehlgeschlagen (optional)" - - # HTTP Requests - pip3 install $PIP_OPTS requests==2.32.3 || pip3 install $PIP_OPTS requests || error "requests Installation fehlgeschlagen" - - # System Monitoring - pip3 install $PIP_OPTS psutil==6.1.1 || pip3 install $PIP_OPTS psutil || error "psutil Installation fehlgeschlagen" - - # Redis (optional) - pip3 install $PIP_OPTS redis==5.2.1 || warning "redis Installation fehlgeschlagen (optional)" - - # Weitere Core-Abhängigkeiten - pip3 install $PIP_OPTS MarkupSafe==3.0.2 || pip3 install $PIP_OPTS MarkupSafe || error "MarkupSafe Installation fehlgeschlagen" - - # Produktions-Server - pip3 install $PIP_OPTS gunicorn==23.0.0 || pip3 install $PIP_OPTS gunicorn || error "gunicorn Installation fehlgeschlagen" - - # ========================== NPM-ABHÄNGIGKEITEN INSTALLIEREN ========================== - progress "Prüfe auf package.json für npm-Abhängigkeiten..." - - if [ -f "$CURRENT_DIR/package.json" ]; then - progress "package.json gefunden - installiere npm-Abhängigkeiten..." - - cd "$CURRENT_DIR" - - # npm install OHNE --production um auch devDependencies (TailwindCSS) zu installieren - progress "Installiere alle npm-Abhängigkeiten (inklusive devDependencies für TailwindCSS)..." - - # Erste Versuche: Standard-Installation - if npm install --no-optional --no-audit --no-fund 2>/dev/null; then - log "✅ npm install erfolgreich (Standard)" - # Zweiter Versuch: Mit legacy-peer-deps - elif npm install --no-optional --no-audit --no-fund --legacy-peer-deps 2>/dev/null; then - log "✅ npm install erfolgreich (mit --legacy-peer-deps)" - # Dritter Versuch: Mit force Flag - elif npm install --no-optional --no-audit --no-fund --force 2>/dev/null; then - log "✅ npm install erfolgreich (mit --force)" - # Vierter Versuch: Mit allen Flags - elif npm install --no-optional --no-audit --no-fund --legacy-peer-deps --force 2>/dev/null; then - log "✅ npm install erfolgreich (mit allen Flags)" - else - warning "⚠️ npm install fehlgeschlagen - versuche manuelle Paket-Installation..." - - # Manuelle Installation der wichtigsten Pakete - npm install tailwindcss --no-audit --no-fund --force 2>/dev/null || warning "TailwindCSS Installation fehlgeschlagen" - npm install @tailwindcss/forms --no-audit --no-fund --force 2>/dev/null || warning "@tailwindcss/forms Installation fehlgeschlagen" - npm install chart.js --no-audit --no-fund --force 2>/dev/null || warning "Chart.js Installation fehlgeschlagen" - npm install @fortawesome/fontawesome-free --no-audit --no-fund --force 2>/dev/null || warning "FontAwesome Installation fehlgeschlagen" - fi - - log "✅ npm-Abhängigkeiten-Installation abgeschlossen:" - log " 📦 Dependencies: FontAwesome, FullCalendar, Chart.js, Vite" - log " 🛠️ DevDependencies: TailwindCSS, PostCSS, Autoprefixer" - - # Überprüfe TailwindCSS Installation speziell - if npx tailwindcss --help >/dev/null 2>&1; then - log "✅ TailwindCSS erfolgreich installiert und verfügbar" - else - warning "❌ TailwindCSS nicht verfügbar - versuche globale Installation..." - npm install -g tailwindcss --force 2>/dev/null || error "TailwindCSS Installation komplett fehlgeschlagen" - fi - - # Überprüfe auf Build-Scripts und führe sie aus - if npm run | grep -q "build:css"; then - progress "CSS-Build-Script gefunden - führe npm run build:css aus..." - if npm run build:css 2>/dev/null; then - log "✅ TailwindCSS Build erfolgreich abgeschlossen" - else - warning "⚠️ npm run build:css fehlgeschlagen - versuche direkten npx-Aufruf..." - if npx tailwindcss -i ./static/css/input.css -o ./static/css/tailwind.min.css --minify 2>/dev/null; then - log "✅ TailwindCSS mit npx erfolgreich kompiliert" - else - error "❌ TailwindCSS Build komplett fehlgeschlagen" - fi - fi - fi - - if npm run | grep -q "build" && ! npm run | grep -q "build:css"; then - progress "Haupt-Build-Script gefunden - führe npm run build aus..." - npm run build 2>/dev/null || warning "npm run build fehlgeschlagen" - log "✅ Frontend-Build abgeschlossen" - fi - - # Überprüfe generierte CSS-Dateien - if [ -f "$CURRENT_DIR/static/css/tailwind.min.css" ]; then - TAILWIND_SIZE=$(du -h "$CURRENT_DIR/static/css/tailwind.min.css" | cut -f1) - log "✅ TailwindCSS erfolgreich kompiliert: tailwind.min.css ($TAILWIND_SIZE)" - else - warning "⚠️ tailwind.min.css nicht gefunden - CSS-Build möglicherweise fehlgeschlagen" - fi - - else - info "Keine package.json gefunden - überspringe npm-Abhängigkeiten" - fi - - log "✅ Alle Abhängigkeiten (Python + Node.js + npm) erfolgreich installiert" -} - -# ========================== SSL-ZERTIFIKATE FÜR LOCALHOST ERSTELLEN ========================== -create_localhost_ssl_certificates() { - log "=== ERSTELLE SSL-ZERTIFIKATE FÜR LOCALHOST ===" - - SSL_DIR="$APP_DIR/certs/localhost" - mkdir -p "$SSL_DIR" - - progress "Erstelle SSL-Zertifikate für localhost..." - - # Private Key erstellen - openssl genrsa -out "$SSL_DIR/localhost.key" 2048 || error "Private Key Erstellung fehlgeschlagen" - - # Certificate Signing Request (CSR) erstellen - openssl req -new -key "$SSL_DIR/localhost.key" -out "$SSL_DIR/localhost.csr" -subj "/C=DE/ST=Baden-Wuerttemberg/L=Stuttgart/O=Mercedes-Benz/OU=MYP/CN=localhost" || error "CSR Erstellung fehlgeschlagen" - - # Self-signed Zertifikat erstellen (gültig für 365 Tage) - openssl x509 -req -days 365 -in "$SSL_DIR/localhost.csr" -signkey "$SSL_DIR/localhost.key" -out "$SSL_DIR/localhost.crt" -extensions v3_req -extfile <( -cat < "$APP_DIR/start_https.py" << 'EOF' -#!/usr/bin/env python3 -import sys -import os - -# Füge App-Verzeichnis zum Python-Pfad hinzu -sys.path.insert(0, '/opt/myp') - -# Setze Umgebungsvariablen -os.environ['FLASK_PORT'] = '443' -os.environ['FLASK_HOST'] = '0.0.0.0' -os.environ['FLASK_ENV'] = 'production' - -try: - from app import app, get_ssl_context - - ssl_context = get_ssl_context() - if ssl_context: - print("Starte HTTPS-Server auf Port 443...") - app.run(host='0.0.0.0', port=443, debug=False, ssl_context=ssl_context, threaded=True) - else: - print('SSL-Kontext nicht verfügbar - verwende localhost Zertifikate') - # Fallback auf localhost-Zertifikate - ssl_context = ('/opt/myp/certs/localhost/localhost.crt', '/opt/myp/certs/localhost/localhost.key') - app.run(host='0.0.0.0', port=443, debug=False, ssl_context=ssl_context, threaded=True) -except Exception as e: - print(f"Fehler beim Starten des HTTPS-Servers: {e}") - sys.exit(1) -EOF - - # Skript ausführbar machen - chmod +x "$APP_DIR/start_https.py" - - # HTTPS-Service (Port 443) - progress "Erstelle myp-https.service (Port 443)..." - cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF -[Unit] -Description=MYP HTTPS Backend (Port 443) -After=network.target network-online.target -Wants=network-online.target -Requires=network.target - -[Service] -Type=simple -User=root -Group=root -WorkingDirectory=$APP_DIR -ExecStart=/usr/bin/python3 $APP_DIR/start_https.py -Restart=always -RestartSec=5 -StartLimitBurst=5 -StartLimitInterval=60 - -# Umgebungsvariablen -Environment=PYTHONUNBUFFERED=1 -Environment=FLASK_ENV=production -Environment=FLASK_HOST=0.0.0.0 -Environment=FLASK_PORT=443 -Environment=PYTHONPATH=$APP_DIR -Environment=LC_ALL=C.UTF-8 -Environment=LANG=C.UTF-8 -Environment=SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt -Environment=REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt - -# Logging -StandardOutput=journal -StandardError=journal -SyslogIdentifier=myp-https - -# Security-Einstellungen -NoNewPrivileges=true -PrivateTmp=false -ProtectSystem=strict -ReadWritePaths=$APP_DIR - -[Install] -WantedBy=multi-user.target -EOF - - log "✅ HTTPS Backend-Service erstellt" -} - -# ========================== KIOSK BROWSER KONFIGURATION ========================== -configure_kiosk_browser() { - log "=== KONFIGURIERE KIOSK-BROWSER FÜR HTTPS ===" - - KIOSK_HOME="/home/$KIOSK_USER" - - # Openbox-Konfiguration für randlosen Vollbildmodus - progress "Konfiguriere Openbox für randlosen Vollbildmodus..." - mkdir -p "$KIOSK_HOME/.config/openbox" - - cat > "$KIOSK_HOME/.config/openbox/rc.xml" << 'EOF' - - - - 10 - 20 - - - yes - no - - - Smart -
yes
-
- - Clearlooks - NLIMC - no - yes - - - 1 - 1 - - Desktop 1 - - 875 - - - yes - Nonpixel - Center - - - 0 - 0 - 0 - 0 - - - TopLeft - 0 - 0 - no - Above - Vertical - no - 300 - 300 - Middle - - - - - - 8 - 200 - 400 - - - - - no - no - - 0 - 0 - - - 100% - 100% - - yes - yes - yes - yes - above - - - no - no - - 0 - 0 - - - 100% - 100% - - yes - yes - yes - yes - above - - -
-EOF - - # .bashrc für automatischen X-Start erweitern - progress "Konfiguriere automatischen X-Start..." - cat >> "$KIOSK_HOME/.bashrc" << 'EOF' - -# Automatischer X-Start für Kiosk-Modus -if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then - exec startx -fi -EOF - - # .xinitrc für HTTPS Kiosk-Session erstellen - progress "Erstelle optimierte HTTPS Kiosk X-Session..." - cat > "$KIOSK_HOME/.xinitrc" << 'EOF' -#!/bin/bash - -# Bildschirmauflösung automatisch erkennen -RESOLUTION=$(xrandr | grep '*' | head -1 | awk '{print $1}') -if [ -z "$RESOLUTION" ]; then - RESOLUTION="1920x1080" # Fallback-Auflösung -fi -WIDTH=$(echo $RESOLUTION | cut -d'x' -f1) -HEIGHT=$(echo $RESOLUTION | cut -d'x' -f2) - -echo "Erkannte Bildschirmauflösung: ${WIDTH}x${HEIGHT}" - -# Bildschirmschoner und Energieverwaltung komplett deaktivieren -xset s off -xset s noblank -xset s noexpose -xset -dpms -xset s 0 0 - -# Mauszeiger verstecken (aggressiver) -unclutter -idle 0.1 -root -noevents & - -# Openbox im Hintergrund starten -openbox & - -# Warte auf HTTPS Backend-Service -echo "Warte auf MYP HTTPS Backend-Service..." -WAIT_COUNT=0 -while ! curl -k -s https://localhost:443 > /dev/null; do - echo "Warte auf HTTPS Backend (Port 443)... ($WAIT_COUNT/60)" - sleep 2 - WAIT_COUNT=$((WAIT_COUNT + 1)) - if [ $WAIT_COUNT -gt 60 ]; then - echo "FEHLER: HTTPS Backend nach 120s nicht erreichbar!" - break - fi -done - -echo "HTTPS Backend erreichbar - starte Kiosk-Browser..." - -# Browser-Erkennung und -Start mit HTTPS-optimierten Vollbild-Flags -if command -v chromium >/dev/null 2>&1; then - echo "Starte Chromium Browser mit HTTPS und Auflösung ${WIDTH}x${HEIGHT}..." - exec chromium \ - --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 \ - --window-size=${WIDTH},${HEIGHT} \ - --window-position=0,0 \ - --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 -elif command -v chromium-browser >/dev/null 2>&1; then - echo "Starte Chromium-Browser mit HTTPS und Auflösung ${WIDTH}x${HEIGHT}..." - exec chromium-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 \ - --window-size=${WIDTH},${HEIGHT} \ - --window-position=0,0 \ - --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 -elif command -v firefox-esr >/dev/null 2>&1; then - echo "Starte Firefox ESR mit HTTPS und Auflösung ${WIDTH}x${HEIGHT}..." - # Firefox-Profil für HTTPS Kiosk erstellen - mkdir -p /home/kiosk/.mozilla/firefox/kiosk.default - cat > /home/kiosk/.mozilla/firefox/kiosk.default/user.js << FIREFOXEOF -user_pref("browser.shell.checkDefaultBrowser", false); -user_pref("browser.startup.homepage", "https://localhost:443"); -user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); -user_pref("browser.tabs.warnOnClose", false); -user_pref("browser.sessionstore.resume_from_crash", false); -user_pref("security.tls.insecure_fallback_hosts", "localhost"); -user_pref("security.mixed_content.block_active_content", false); -user_pref("security.mixed_content.block_display_content", false); -user_pref("browser.cache.disk.enable", false); -user_pref("browser.cache.memory.enable", true); -user_pref("browser.cache.offline.enable", false); -user_pref("network.http.use-cache", false); -user_pref("browser.fullscreen.autohide", true); -user_pref("dom.disable_open_during_load", false); -user_pref("privacy.popups.disable_from_plugins", 0); -user_pref("dom.popup_maximum", 0); -user_pref("security.cert_pinning.enforcement_level", 0); -user_pref("security.tls.unrestricted_rc4_fallback", true); -FIREFOXEOF - - # Firefox CSS für randlosen Vollbildmodus - mkdir -p /home/kiosk/.mozilla/firefox/kiosk.default/chrome - cat > /home/kiosk/.mozilla/firefox/kiosk.default/chrome/userChrome.css << FIREFOXCSS -/* Firefox Kiosk Mode - Hide all UI elements */ -#navigator-toolbox { display: none !important; } -#sidebar-box { display: none !important; } -#urlbar-container { display: none !important; } -#TabsToolbar { display: none !important; } -#nav-bar { display: none !important; } -#PersonalToolbar { display: none !important; } -.toolbar-items { display: none !important; } -#main-window[sizemode="fullscreen"] .tabbrowser-tab { - visibility: collapse !important; -} -FIREFOXCSS - - exec firefox-esr \ - --kiosk \ - --width=${WIDTH} \ - --height=${HEIGHT} \ - --profile /home/kiosk/.mozilla/firefox/kiosk.default \ - https://localhost:443 -else - echo "FEHLER: Kein Browser verfügbar!" - exit 1 -fi -EOF - - # Berechtigungen setzen - chmod +x "$KIOSK_HOME/.xinitrc" - chown -R "$KIOSK_USER:$KIOSK_USER" "$KIOSK_HOME" - - log "✅ Kiosk-Browser mit HTTPS-Vollbildmodus konfiguriert" -} - -# ========================== APP.PY SSL-UNTERSTÜTZUNG PRÜFEN ========================== -verify_app_ssl_support() { - log "=== PRÜFE APP.PY SSL-UNTERSTÜTZUNG ===" - - if [ ! -f "$APP_DIR/app.py" ]; then - error "app.py nicht gefunden in $APP_DIR" - fi - - # Prüfe ob get_ssl_context Funktion existiert - if grep -q "def get_ssl_context" "$APP_DIR/app.py"; then - log "✅ get_ssl_context Funktion bereits vorhanden in app.py" - else - progress "Füge SSL-Unterstützung zu app.py hinzu..." - - # Backup der originalen app.py - cp "$APP_DIR/app.py" "$APP_DIR/app.py.backup.$(date +%s)" - - # SSL-Funktion am Ende der Datei hinzufügen (vor dem if __name__ == '__main__' Block) - cat >> "$APP_DIR/app.py" << 'EOF' - -def get_ssl_context(): - """ - SSL-Kontext für HTTPS-Server erstellen - Verwendet localhost-Zertifikate falls verfügbar - """ - import os - - ssl_cert_path = '/opt/myp/certs/localhost/localhost.crt' - ssl_key_path = '/opt/myp/certs/localhost/localhost.key' - - if os.path.exists(ssl_cert_path) and os.path.exists(ssl_key_path): - try: - context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) - context.load_cert_chain(ssl_cert_path, ssl_key_path) - context.check_hostname = False - context.verify_mode = ssl.CERT_NONE - print(f"✅ SSL-Kontext erstellt mit: {ssl_cert_path}") - return context - except Exception as e: - print(f"❌ Fehler beim Erstellen des SSL-Kontexts: {e}") - return None - else: - print(f"❌ SSL-Zertifikate nicht gefunden:") - print(f" Cert: {ssl_cert_path}") - print(f" Key: {ssl_key_path}") - return None - -EOF - - log "✅ SSL-Unterstützung zu app.py hinzugefügt" - fi - - # Prüfe ob SSL-Imports vorhanden sind - if ! grep -q "import ssl" "$APP_DIR/app.py"; then - progress "Füge SSL-Import zu app.py hinzu..." - sed -i '1i import ssl' "$APP_DIR/app.py" - fi - - log "✅ app.py SSL-Unterstützung verifiziert" -} - -# ========================== PRODUKTIONS-KIOSK SETUP ========================== -setup_production_kiosk() { - log "=== RICHTE PRODUKTIONS-KIOSK-MODUS MIT HTTPS EIN ===" - - # 1. System-Abhängigkeiten installieren - install_system_dependencies - - # 2. Desktop-Environments entfernen - remove_desktop_environments - - # 3. Minimale X11-Umgebung installieren - install_minimal_x11 - - # 4. Kiosk-Benutzer erstellen - create_kiosk_user - - # 5. Anwendung kopieren - progress "Erstelle Zielverzeichnis /opt/myp..." - mkdir -p "$APP_DIR" || error "Konnte Zielverzeichnis nicht erstellen" - - progress "Kopiere Projektdateien selektiv nach $APP_DIR..." - - # Liste der zu kopierenden Dateien/Ordner (ohne unnötige Inhalte) - declare -a COPY_ITEMS=( - "app.py" - "models.py" - "requirements.txt" - "blueprints/" - "config/" - "database/" - "docs/" - "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 einzeln kopieren (falls vorhanden) - 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 - - # Stelle sicher, dass app.py ausführbar ist - chmod +x "$APP_DIR/app.py" || error "Konnte app.py nicht ausführbar machen" - - # Erstelle notwendige Verzeichnisse falls sie nicht existieren - mkdir -p "$APP_DIR/database/backups" - mkdir -p "$APP_DIR/logs/app" - mkdir -p "$APP_DIR/logs/auth" - mkdir -p "$APP_DIR/logs/errors" - mkdir -p "$APP_DIR/uploads/temp" - mkdir -p "$APP_DIR/certs/localhost" - - # Berechtigungen setzen - chown -R root:root "$APP_DIR" - chmod -R 755 "$APP_DIR" - chmod 750 "$APP_DIR/database" - chmod 750 "$APP_DIR/logs" - chmod 755 "$APP_DIR/uploads" - chmod 750 "$APP_DIR/certs" - - # 6. App.py SSL-Unterstützung prüfen und hinzufügen - verify_app_ssl_support - - # 7. SSL-Zertifikate für localhost erstellen - create_localhost_ssl_certificates - - # 8. Backend-Service erstellen - create_backend_service - - # 9. Autologin konfigurieren - configure_autologin - - # 10. Kiosk-Browser konfigurieren - configure_kiosk_browser - - # 11. Service aktivieren und starten - progress "Lade Systemd-Konfiguration neu..." - systemctl daemon-reload || error "Systemd Reload fehlgeschlagen" - - progress "Aktiviere HTTPS Backend-Service..." - systemctl enable "$SERVICE_NAME.service" || error "HTTPS-Service Enable fehlgeschlagen" - - progress "Starte HTTPS Backend-Service..." - systemctl start "$SERVICE_NAME.service" || error "HTTPS-Service Start fehlgeschlagen" - - # Service-Status prüfen - sleep 5 - - info "=== SERVICE-STATUS ===" - if systemctl is-active --quiet "$SERVICE_NAME.service"; then - log "✅ $SERVICE_NAME Service läuft erfolgreich" - else - warning "⚠️ $SERVICE_NAME Service läuft nicht - prüfen Sie die Logs: journalctl -u $SERVICE_NAME -f" - fi - - # Backend-Tests - progress "Teste HTTPS Backend-Erreichbarkeit..." - sleep 3 - - if curl -k -s https://localhost:443 > /dev/null 2>&1; then - log "✅ Port 443 (HTTPS) erreichbar" - else - warning "⚠️ Port 443 (HTTPS) nicht erreichbar" - # Zusätzliche Debug-Information - progress "Versuche SSL-Zertifikat zu testen..." - if openssl s_client -connect localhost:443 -servername localhost < /dev/null 2>/dev/null | grep -q "CONNECTED"; then - log "✅ SSL-Verbindung funktioniert" - else - warning "⚠️ SSL-Verbindung fehlgeschlagen" - fi - fi - - # SSL-Zertifikat Status - if [ -f "$APP_DIR/certs/localhost/localhost.crt" ]; then - log "✅ SSL-Zertifikat vorhanden: $APP_DIR/certs/localhost/localhost.crt" - CERT_EXPIRY=$(openssl x509 -in "$APP_DIR/certs/localhost/localhost.crt" -noout -enddate | cut -d= -f2) - log "📅 Zertifikat läuft ab: $CERT_EXPIRY" - else - warning "⚠️ SSL-Zertifikat nicht gefunden" - fi - - log "✅ PRODUKTIONS-KIOSK-MODUS MIT HTTPS ERFOLGREICH EINGERICHTET" - log "" - log "🚀 WICHTIG: NEUSTART ERFORDERLICH!" - log " sudo reboot" - log "" - log "📊 NACH DEM NEUSTART:" - log " • Automatischer Login als Benutzer: $KIOSK_USER" - log " • Automatischer X-Start und Chromium-Kiosk" - log " • Backend läuft auf HTTPS:" - log " - https://localhost:443 (Kiosk-Anzeige mit SSL)" - log " - https://0.0.0.0:443 (Netzwerk-Zugriff)" - log "" - log "🔐 SSL-ZERTIFIKATE:" - log " • Self-Signed Zertifikat für localhost erstellt" - log " • Chromium akzeptiert Zertifikat automatisch" - log " • Zertifikat im System CA-Store installiert" - log "" - log "🔧 SERVICE-BEFEHLE:" - log " • Status: sudo systemctl status $SERVICE_NAME" - log " • Logs: sudo journalctl -u $SERVICE_NAME -f" - log " • Restart: sudo systemctl restart $SERVICE_NAME" - log " • SSL-Test: curl -k https://localhost:443" - log "" - warning "🔄 FÜHRE JETZT 'sudo reboot' AUS, UM DEN HTTPS-KIOSK-MODUS ZU AKTIVIEREN!" -} - -# ========================== HAUPTMENÜ ========================== -show_menu() { - clear - echo -e "${BLUE}=================================================================${NC}" - echo -e "${GREEN} $APP_NAME - HTTPS KIOSK-INSTALLER${NC}" - echo -e "${BLUE}=================================================================${NC}" - echo "" - echo -e "${YELLOW}Aktuelles Verzeichnis:${NC} $CURRENT_DIR" - echo -e "${YELLOW}Systemzeit:${NC} $(date)" - echo -e "${YELLOW}Zielverzeichnis:${NC} $APP_DIR" - echo -e "${YELLOW}Kiosk-Benutzer:${NC} $KIOSK_USER" - echo -e "${YELLOW}HTTPS-Service:${NC} $SERVICE_NAME" - echo "" - echo -e "${PURPLE}Wählen Sie eine Option:${NC}" - echo "" - echo -e "${GREEN}1)${NC} System vorbereiten (Abhängigkeiten installieren)" - echo -e " → Installiert Python 3, pip und alle benötigten Pakete" - echo -e " → Verwendet: pip install --break-system-packages" - echo -e " → Mercedes SSL-Zertifikate werden konfiguriert" - echo -e " → Node.js und npm für Frontend-Build" - echo "" - echo -e "${GREEN}2)${NC} VOLLSTÄNDIGER HTTPS KIOSK-MODUS installieren" - echo -e " → ${RED}ENTFERNT ALLE DESKTOP-ENVIRONMENTS!${NC}" - echo -e " → Installiert minimale X11-Umgebung" - echo -e " → Erstellt Self-Signed SSL-Zertifikate für localhost" - echo -e " → Erstellt HTTPS Backend-Service (Port 443)" - echo -e " → Konfiguriert Autologin und HTTPS Kiosk-Browser" - echo -e " → Browser öffnet: ${BLUE}https://localhost:443${NC}" - echo -e " → ${YELLOW}NEUSTART ERFORDERLICH!${NC}" - echo "" - echo -e "${RED}0)${NC} Beenden" - echo "" - echo -e "${RED}⚠️ WARNUNG: Option 2 macht Raspberry Pi zu reinem HTTPS-Kiosk-System!${NC}" - echo -e "${GREEN}🔐 HTTPS: Automatische SSL-Zertifikat-Generierung für localhost${NC}" - echo -e "${BLUE}=================================================================${NC}" - echo -n "Ihre Wahl [0-2]: " -} - -# ========================== MAIN LOGIC ========================== -main() { - # System-Checks - check_root - check_debian_system - - # Erstelle Log-Datei - mkdir -p "$(dirname "$INSTALL_LOG")" - touch "$INSTALL_LOG" - - log "=== MYP HTTPS KIOSK-INSTALLER GESTARTET ===" - log "Arbeitsverzeichnis: $CURRENT_DIR" - log "Zielverzeichnis: $APP_DIR" - log "HTTPS-Service: $SERVICE_NAME" - log "Kiosk-Benutzer: $KIOSK_USER" - log "SSL-Zertifikate: $APP_DIR/certs/localhost/" - log "System: $(uname -a)" - log "Debian-Version: $(cat /etc/debian_version 2>/dev/null || echo 'Unbekannt')" - - while true; do - show_menu - read -r choice - - case $choice in - 1) - clear - log "=== OPTION 1: SYSTEM VORBEREITEN ===" - install_system_dependencies - echo "" - echo -e "${GREEN}✅ System-Vorbereitung abgeschlossen!${NC}" - echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" - read -r - ;; - 2) - clear - echo -e "${RED}⚠️ WARNUNG: Sie sind dabei, alle Desktop-Environments zu entfernen!${NC}" - echo -e "${YELLOW}Der Raspberry Pi wird zu einem reinen HTTPS-Kiosk-System umgebaut.${NC}" - echo -e "${BLUE}Nach der Installation startet automatisch der HTTPS-Kiosk-Browser.${NC}" - echo -e "${GREEN}SSL-Zertifikate für localhost werden automatisch generiert.${NC}" - echo "" - echo -n "Sind Sie sicher? [ja/NEIN]: " - read -r confirm - - if [ "$confirm" = "ja" ] || [ "$confirm" = "JA" ]; then - clear - log "=== OPTION 2: VOLLSTÄNDIGER HTTPS KIOSK-MODUS ===" - setup_production_kiosk - echo "" - echo -e "${GREEN}✅ HTTPS KIOSK-MODUS ERFOLGREICH EINGERICHTET!${NC}" - echo -e "${RED}🔄 NEUSTART JETZT ERFORDERLICH: sudo reboot${NC}" - echo -e "${BLUE}🔐 HTTPS-URL: https://localhost:443${NC}" - echo -e "${YELLOW}Drücken Sie Enter, um fortzufahren...${NC}" - read -r - else - echo -e "${BLUE}Installation abgebrochen.${NC}" - sleep 2 - fi - ;; - 0) - log "=== HTTPS KIOSK-INSTALLER BEENDET ===" - echo -e "${GREEN}Auf Wiedersehen!${NC}" - echo -e "${BLUE}Log-Datei: $INSTALL_LOG${NC}" - exit 0 - ;; - *) - echo -e "${RED}Ungültige Eingabe. Bitte wählen Sie 0-2.${NC}" - sleep 2 - ;; - esac - done -} - -# Script starten -main "$@" \ No newline at end of file diff --git a/backend/logs/analytics/analytics.log b/backend/logs/analytics/analytics.log index 8ba78291..a4e76c7e 100644 --- a/backend/logs/analytics/analytics.log +++ b/backend/logs/analytics/analytics.log @@ -35,3 +35,10 @@ 2025-06-01 04:48:29 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 04:48:43 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 04:54:12 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:15:28 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:18:20 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:19:07 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:19:13 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:19:37 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:19:50 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 13:21:18 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log index e8206563..8f9690a2 100644 --- a/backend/logs/app/app.log +++ b/backend/logs/app/app.log @@ -900,3 +900,97 @@ WHERE users.id = ? 2025-06-01 04:54:25 - [app] app - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich abgemeldet 2025-06-01 04:54:31 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True 2025-06-01 04:54:31 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 13:15:27 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:15:29 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:15:30 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:15:30 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 13:15:30 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 13:15:30 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 13:15:30 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 13:15:30 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 13:15:30 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 13:15:30 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 13:15:30 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 13:15:30 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 13:15:30 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 13:15:30 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 13:15:30 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 13:15:38 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 13:15:38 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: name 'calculate_success_rate' is not defined +2025-06-01 13:18:20 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:18:21 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:18:21 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:18:21 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 13:18:21 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 13:18:21 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 13:18:21 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 13:18:22 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 13:18:22 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 13:18:22 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 13:18:22 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 13:18:22 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 13:18:22 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 13:18:22 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 13:18:22 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 13:18:23 - [app] app - [INFO] INFO - Admin-Check für Funktion admin: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 13:18:24 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Daten: Could not build url for endpoint 'admin_page'. Did you mean 'admin_add_user_page' instead? +2025-06-01 13:19:07 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:19:08 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:19:08 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:19:12 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:19:13 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:19:13 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:19:37 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:19:37 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:19:38 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:19:38 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 13:19:38 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 13:19:38 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 13:19:38 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 13:19:38 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 13:19:38 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 13:19:38 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 13:19:38 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 13:19:38 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 13:19:38 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 13:19:38 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 13:19:38 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 13:19:50 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:19:51 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:19:51 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:19:51 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 13:19:51 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 13:19:51 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 13:19:51 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 13:19:52 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 13:19:52 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 13:19:52 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 13:19:52 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 13:19:52 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 13:19:52 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 13:19:52 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 13:19:52 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 13:19:55 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 13:19:56 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 13:20:04 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 13:20:04 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 13:20:31 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 13:20:31 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 13:21:14 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 13:21:14 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 13:21:18 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 13:21:19 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 13:21:19 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 13:21:19 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 13:21:19 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 13:21:19 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 13:21:19 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 13:21:20 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 13:21:20 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 13:21:20 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 13:21:20 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 13:21:20 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 13:21:20 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 13:21:20 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 13:21:20 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 13:21:20 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True diff --git a/backend/logs/auth/auth.log b/backend/logs/auth/auth.log index b19b84b9..3caa1a91 100644 --- a/backend/logs/auth/auth.log +++ b/backend/logs/auth/auth.log @@ -44,3 +44,6 @@ 2025-06-01 04:46:53 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet 2025-06-01 04:54:27 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0) 2025-06-01 04:54:27 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet +2025-06-01 13:15:34 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0) +2025-06-01 13:15:34 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet +2025-06-01 13:15:36 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1 diff --git a/backend/logs/backup/backup.log b/backend/logs/backup/backup.log index 142711ef..a0fe0de0 100644 --- a/backend/logs/backup/backup.log +++ b/backend/logs/backup/backup.log @@ -35,3 +35,10 @@ 2025-06-01 04:48:29 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 04:48:43 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 04:54:11 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:15:28 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:18:20 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:19:07 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:19:13 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:19:37 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:19:50 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 13:21:18 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) diff --git a/backend/logs/dashboard/dashboard.log b/backend/logs/dashboard/dashboard.log index 772cd894..7e5b8ba4 100644 --- a/backend/logs/dashboard/dashboard.log +++ b/backend/logs/dashboard/dashboard.log @@ -133,3 +133,31 @@ 2025-06-01 04:54:12 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet 2025-06-01 04:54:12 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) 2025-06-01 04:54:13 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:15:29 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:15:30 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:15:30 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:15:30 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:18:21 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:18:21 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:18:21 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:18:21 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:19:08 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:08 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:08 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:19:08 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:19:13 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:13 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:13 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:19:13 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:19:37 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:38 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:38 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:19:38 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:19:51 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:51 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:19:51 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:19:51 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 13:21:19 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:21:19 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 13:21:19 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 13:21:19 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) diff --git a/backend/logs/database/database.log b/backend/logs/database/database.log index d2c9c2a2..0ad29c2d 100644 --- a/backend/logs/database/database.log +++ b/backend/logs/database/database.log @@ -35,3 +35,10 @@ 2025-06-01 04:48:29 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 04:48:43 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 04:54:11 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:15:28 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:18:20 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:19:07 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:19:13 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:19:37 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:19:50 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 13:21:18 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet diff --git a/backend/logs/email_notification/email_notification.log b/backend/logs/email_notification/email_notification.log index ab78400d..6b2d1ba8 100644 --- a/backend/logs/email_notification/email_notification.log +++ b/backend/logs/email_notification/email_notification.log @@ -33,3 +33,10 @@ 2025-06-01 04:48:30 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 04:48:44 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 04:54:12 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:15:29 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:18:21 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:19:08 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:19:13 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:19:37 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:19:51 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 13:21:19 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) diff --git a/backend/logs/maintenance/maintenance.log b/backend/logs/maintenance/maintenance.log index d703b562..4feada4e 100644 --- a/backend/logs/maintenance/maintenance.log +++ b/backend/logs/maintenance/maintenance.log @@ -66,3 +66,17 @@ 2025-06-01 04:48:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 04:54:12 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 04:54:12 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:15:29 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:15:30 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:18:21 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:18:21 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:08 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:08 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:13 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:13 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:37 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:38 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:19:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:21:19 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 13:21:19 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet diff --git a/backend/logs/multi_location/multi_location.log b/backend/logs/multi_location/multi_location.log index 83dcf6f6..ffedad33 100644 --- a/backend/logs/multi_location/multi_location.log +++ b/backend/logs/multi_location/multi_location.log @@ -66,3 +66,17 @@ 2025-06-01 04:48:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 04:54:12 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 04:54:12 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:15:30 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:15:30 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:18:21 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:18:21 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:08 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:08 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:13 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:13 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:37 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:38 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:19:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:21:19 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 13:21:19 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt diff --git a/backend/logs/permissions/permissions.log b/backend/logs/permissions/permissions.log index f7926aaf..421c4f10 100644 --- a/backend/logs/permissions/permissions.log +++ b/backend/logs/permissions/permissions.log @@ -31,3 +31,10 @@ 2025-06-01 04:48:30 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 04:48:44 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 04:54:13 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:15:30 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:18:21 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:19:08 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:19:13 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:19:38 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:19:51 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 13:21:19 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert diff --git a/backend/logs/printer_monitor/printer_monitor.log b/backend/logs/printer_monitor/printer_monitor.log index 680c15bf..42a2c4bb 100644 --- a/backend/logs/printer_monitor/printer_monitor.log +++ b/backend/logs/printer_monitor/printer_monitor.log @@ -923,3 +923,67 @@ 2025-06-01 04:54:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... 2025-06-01 04:54:49 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden 2025-06-01 04:54:49 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s +2025-06-01 13:15:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:15:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:15:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 13:15:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 13:15:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 13:15:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 13:15:30 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 13:15:36 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 13:15:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 13:15:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 13:15:54 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 13:16:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 13:16:06 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.1s +2025-06-01 13:18:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:18:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:18:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 13:18:22 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 13:18:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 13:18:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 13:18:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 13:18:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 13:18:34 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 13:18:40 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 13:18:46 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 13:18:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 13:18:58 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.1s +2025-06-01 13:19:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:19:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:19:12 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:19:12 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:19:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:19:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:19:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 13:19:38 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 13:19:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 13:19:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 13:19:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 13:19:45 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 13:19:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:19:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:19:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 13:19:52 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 13:19:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 13:19:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 13:19:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 13:19:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 13:20:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 13:20:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 13:20:16 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 13:20:23 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 13:20:29 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.1s +2025-06-01 13:21:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 13:21:18 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 13:21:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 13:21:20 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 13:21:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 13:21:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 13:21:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 13:21:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 13:21:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 13:21:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 13:21:44 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 13:21:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 13:21:56 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.1s diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index bd585598..e3132240 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -2911,3 +2911,20 @@ 2025-06-01 04:54:11 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True 2025-06-01 04:54:13 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet 2025-06-01 04:54:13 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 13:15:28 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:15:30 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 13:15:30 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 13:18:20 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:18:22 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 13:18:22 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 13:19:07 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:19:12 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:19:37 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:19:38 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 13:19:38 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 13:19:50 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:19:52 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 13:19:52 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 13:21:18 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 13:21:20 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 13:21:20 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet diff --git a/backend/logs/security/security.log b/backend/logs/security/security.log index 94a4e2c7..f3d0cfd9 100644 --- a/backend/logs/security/security.log +++ b/backend/logs/security/security.log @@ -31,3 +31,10 @@ 2025-06-01 04:48:30 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 04:48:44 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 04:54:13 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:15:30 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:18:21 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:19:08 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:19:13 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:19:38 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:19:51 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 13:21:19 - [security] security - [INFO] INFO - 🔒 Security System initialisiert diff --git a/backend/logs/shutdown_manager/shutdown_manager.log b/backend/logs/shutdown_manager/shutdown_manager.log index ccf5321d..7c29cfff 100644 --- a/backend/logs/shutdown_manager/shutdown_manager.log +++ b/backend/logs/shutdown_manager/shutdown_manager.log @@ -88,3 +88,18 @@ 2025-06-01 04:48:30 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-01 04:48:44 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-01 04:54:12 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:15:30 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:18:21 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:19:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:19:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-01 13:19:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus... +2025-06-01 13:19:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s +2025-06-01 13:19:08 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... +2025-06-01 13:19:13 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:19:14 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-01 13:19:14 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus... +2025-06-01 13:19:14 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s +2025-06-01 13:19:14 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... +2025-06-01 13:19:38 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:19:51 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 13:21:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log index 5e4312a1..e563e640 100644 --- a/backend/logs/startup/startup.log +++ b/backend/logs/startup/startup.log @@ -291,3 +291,66 @@ 2025-06-01 04:54:12 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert 2025-06-01 04:54:12 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert 2025-06-01 04:54:12 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:15:30.022931 +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:15:30 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:18:21.616582 +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:18:21 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:19:08.567147 +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:19:08 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:19:13.918980 +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:19:13 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:19:37.994201 +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:19:37 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:19:51.748912 +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:19:51 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T13:21:19.672971 +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 13:21:19 - [startup] startup - [INFO] INFO - ================================================== diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log index 1eba9f87..0b31612e 100644 --- a/backend/logs/windows_fixes/windows_fixes.log +++ b/backend/logs/windows_fixes/windows_fixes.log @@ -138,3 +138,31 @@ 2025-06-01 04:54:11 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) 2025-06-01 04:54:11 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet 2025-06-01 04:54:11 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:15:27 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:15:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:15:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:15:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:18:20 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:18:20 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:18:20 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:18:20 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:19:07 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:19:07 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:19:07 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:19:07 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:19:12 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:19:12 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:19:12 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:19:12 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:19:36 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:19:36 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:19:36 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:19:36 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:19:50 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:19:50 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:19:50 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:19:50 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 13:21:18 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 13:21:18 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 13:21:18 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 13:21:18 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet diff --git a/backend/setup.sh b/backend/setup.sh new file mode 100644 index 00000000..b179135a --- /dev/null +++ b/backend/setup.sh @@ -0,0 +1,843 @@ +#!/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 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" +} + +# =========================== 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" +} + +# =========================== 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" + ) + + 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" + + 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 | 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} Nur Abhängigkeiten installieren und System vorbereiten" + echo -e " ${BLUE}→ Python, Node.js, SSL-Zertifikate, minimaler Test${NC}" + echo "" + echo -e "${GREEN}2)${NC} Finale Installation mit kompletter Kiosk-Modus-Konfiguration" + echo -e " ${BLUE}→ Desktop entfernen, Autologin, Services aktivieren${NC}" + echo "" + echo -e "${GREEN}3)${NC} Nur Services installieren/aktualisieren" + echo -e " ${BLUE}→ Systemd-Services aus systemd/ Verzeichnis kopieren${NC}" + echo "" + echo -e "${GREEN}4)${NC} System-Test durchführen" + echo -e " ${BLUE}→ HTTPS-Verbindung und SSL-Zertifikat testen${NC}" + echo "" + echo -e "${GREEN}5)${NC} Beenden" + echo "" + echo -e "${CYAN}=================================================================${NC}" + echo -n "Ihre Wahl [1-5]: " +} + +# =========================== INSTALLATIONS-MODI =========================== +install_dependencies_only() { + log "=== MODUS: NUR ABHÄNGIGKEITEN INSTALLIEREN ===" + + check_root + check_debian_system + check_internet_connection + + update_system + 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 die finale Kiosk-Installation (Option 2)" +} + +install_full_kiosk() { + log "=== MODUS: FINALE KIOSK-INSTALLATION ===" + + check_root + check_debian_system + + # 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..." + install_dependencies_only + fi + + remove_desktop_environments + install_minimal_x11 + create_kiosk_user + configure_autologin + install_systemd_services + enable_and_start_services + test_application + cleanup_old_files + + success "✅ Finale Kiosk-Installation abgeschlossen!" + info "Das System wird beim nächsten Neustart automatisch im Kiosk-Modus starten" + warning "⚠️ Neustart empfohlen: sudo reboot" +} + +install_services_only() { + log "=== MODUS: NUR SERVICES INSTALLIEREN ===" + + check_root + install_systemd_services + + # Frage ob Services aktiviert werden sollen + echo "" + echo -n "Services aktivieren und starten? [j/N]: " + read -r activate_services + + if [[ "$activate_services" =~ ^[Jj]$ ]]; then + enable_and_start_services + else + info "Services installiert aber nicht aktiviert" + info "Manuell aktivieren mit: sudo systemctl enable $HTTPS_SERVICE_NAME" + fi + + success "✅ Service-Installation abgeschlossen!" +} + +run_system_test() { + log "=== MODUS: SYSTEM-TEST ===" + + test_application + + # Zusätzliche Tests + progress "Prüfe Service-Status..." + + local services=("$HTTPS_SERVICE_NAME" "$KIOSK_SERVICE_NAME" "$WATCHDOG_SERVICE_NAME") + + for service in "${services[@]}"; do + if systemctl is-enabled --quiet "$service" 2>/dev/null; then + if systemctl is-active --quiet "$service"; then + success "✅ $service: aktiv und läuft" + else + warning "⚠️ $service: aktiviert aber läuft nicht" + fi + else + info "ℹ️ $service: nicht aktiviert" + fi + done + + success "✅ System-Test abgeschlossen!" +} + +# =========================== 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_kiosk + echo "" + echo -n "Drücken Sie Enter um fortzufahren..." + read -r + ;; + 3) + install_services_only + echo "" + echo -n "Drücken Sie Enter um fortzufahren..." + read -r + ;; + 4) + run_system_test + echo "" + echo -n "Drücken Sie Enter um fortzufahren..." + read -r + ;; + 5) + log "Setup-Skript beendet" + exit 0 + ;; + *) + error "Ungültige Auswahl. Bitte wählen Sie 1-5." + ;; + esac + done +} + +# Skript starten +main "$@" \ No newline at end of file diff --git a/backend/kiosk-watchdog-python.service b/backend/systemd/kiosk-watchdog-python.service similarity index 100% rename from backend/kiosk-watchdog-python.service rename to backend/systemd/kiosk-watchdog-python.service diff --git a/backend/kiosk-watchdog.service b/backend/systemd/kiosk-watchdog.service similarity index 100% rename from backend/kiosk-watchdog.service rename to backend/systemd/kiosk-watchdog.service diff --git a/backend/myp-https.service b/backend/systemd/myp-https.service similarity index 100% rename from backend/myp-https.service rename to backend/systemd/myp-https.service diff --git a/backend/myp-kiosk.service b/backend/systemd/myp-kiosk.service similarity index 100% rename from backend/myp-kiosk.service rename to backend/systemd/myp-kiosk.service diff --git a/backend/templates/admin.html b/backend/templates/admin.html index adade0a8..54243a08 100644 --- a/backend/templates/admin.html +++ b/backend/templates/admin.html @@ -650,7 +650,7 @@ document.addEventListener('DOMContentLoaded', function() { document.getElementById('modal-optimize-db').addEventListener('click', optimizeDatabase); document.getElementById('modal-create-backup').addEventListener('click', createBackup); document.getElementById('modal-advanced-settings').addEventListener('click', function() { - window.location.href = '{{ url_for("admin_settings") }}'; + window.location.href = '{{ url_for("optimization_settings") }}'; }); }); diff --git a/backend/utils/__pycache__/ssl_config.cpython-313.pyc b/backend/utils/__pycache__/ssl_config.cpython-313.pyc index 8f754f6e..e52626f7 100644 Binary files a/backend/utils/__pycache__/ssl_config.cpython-313.pyc and b/backend/utils/__pycache__/ssl_config.cpython-313.pyc differ