#!/bin/bash ####################################################################### # MYP AIO-Installer - Testing & Validation Module # # Dieses Modul behandelt: # - Python-Tests und Dependency-Validierung # - Build-Prozess-Tests # - Service-Start-Tests # - Funktionalitäts-Tests # - Performance-Tests # - Integration-Tests # - Upgrade-Funktionalität ####################################################################### # Funktionsdeklarationen für Testing & Validation test_installation() { log "INFO" "=== INSTALLATIONS-TESTS DURCHFÜHREN ===" # System-Tests test_system_health # Python-Environment-Tests test_python_environment # Node.js-Environment-Tests test_node_environment # Build-Prozess-Tests test_build_process # Service-Tests test_services # Netzwerk-Tests test_networking # Security-Tests test_security # Mercedes-Zertifikat-Tests test_mercedes_certificates # Performance-Tests test_performance # Integration-Tests test_integration # Test-Report erstellen create_test_report log "INFO" "Installations-Tests abgeschlossen" } test_system_health() { log "INFO" "=== SYSTEM-HEALTH-TESTS ===" local test_errors=0 # Betriebssystem-Check log "INFO" "Teste Betriebssystem..." if command -v lsb_release >/dev/null 2>&1; then local os_info=$(lsb_release -d | cut -f2) log "INFO" "Betriebssystem: $os_info" else log "WARN" "OS-Information nicht verfügbar" test_errors=$((test_errors + 1)) fi # Kernel-Check log "INFO" "Teste Kernel..." local kernel_version=$(uname -r) log "INFO" "Kernel-Version: $kernel_version" # Speicher-Check log "INFO" "Teste Speicher..." local total_mem=$(free -m | awk 'NR==2{print $2}') local free_mem=$(free -m | awk 'NR==2{print $7}') log "INFO" "Gesamtspeicher: ${total_mem}MB, Verfügbar: ${free_mem}MB" if [[ $total_mem -lt 512 ]]; then log "WARN" "Wenig Gesamtspeicher verfügbar ($total_mem MB)" test_errors=$((test_errors + 1)) fi if [[ $free_mem -lt 128 ]]; then log "WARN" "Wenig freier Speicher verfügbar ($free_mem MB)" test_errors=$((test_errors + 1)) fi # Festplatten-Check log "INFO" "Teste Festplattenspeicher..." local disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//') local disk_free=$(df -h / | awk 'NR==2 {print $4}') log "INFO" "Festplattenauslastung: $disk_usage%, Frei: $disk_free" if [[ $disk_usage -gt 90 ]]; then log "ERROR" "Festplatte zu voll ($disk_usage%)" test_errors=$((test_errors + 1)) fi # CPU-Check log "INFO" "Teste CPU..." local cpu_count=$(nproc) local load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//') log "INFO" "CPU-Kerne: $cpu_count, Load Average: $load_avg" # Netzwerk-Interface-Check log "INFO" "Teste Netzwerk-Interfaces..." local interfaces=$(ip link show | grep "state UP" | wc -l) log "INFO" "Aktive Netzwerk-Interfaces: $interfaces" if [[ $interfaces -eq 0 ]]; then log "ERROR" "Keine aktiven Netzwerk-Interfaces" test_errors=$((test_errors + 1)) fi # Zeitzone-Check log "INFO" "Teste Systemzeit..." local current_time=$(date) local timezone=$(timedatectl show --property=Timezone --value 2>/dev/null || echo "Unknown") log "INFO" "Aktuelle Zeit: $current_time" log "INFO" "Zeitzone: $timezone" if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ System-Health-Tests bestanden" return 0 else log "ERROR" "✗ System-Health-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_python_environment() { log "INFO" "=== PYTHON-ENVIRONMENT-TESTS ===" local test_errors=0 # Python-Version-Check log "INFO" "Teste Python-Installation..." if command -v python3 >/dev/null 2>&1; then local python_version=$(python3 --version | cut -d' ' -f2) log "INFO" "Python-Version: $python_version" # Version-Check (mindestens 3.8) if ! python3 -c "import sys; sys.exit(0 if sys.version_info >= (3, 8) else 1)"; then log "ERROR" "Python-Version zu alt (mindestens 3.8 erforderlich)" test_errors=$((test_errors + 1)) fi else log "ERROR" "Python3 nicht gefunden" test_errors=$((test_errors + 1)) fi # pip-Check log "INFO" "Teste pip-Installation..." if command -v pip3 >/dev/null 2>&1; then local pip_version=$(pip3 --version | cut -d' ' -f2) log "INFO" "pip-Version: $pip_version" else log "ERROR" "pip3 nicht gefunden" test_errors=$((test_errors + 1)) fi # Kritische Python-Packages testen log "INFO" "Teste kritische Python-Packages..." local critical_packages=( "flask" "flask_sqlalchemy" "flask_login" "flask_wtf" "werkzeug" "sqlalchemy" "requests" "cryptography" "bcrypt" ) for package in "${critical_packages[@]}"; do if python3 -c "import $package" 2>/dev/null; then local version=$(python3 -c "import $package; print(getattr($package, '__version__', 'unknown'))" 2>/dev/null) log "INFO" "✓ $package ($version)" else log "ERROR" "✗ $package nicht verfügbar" test_errors=$((test_errors + 1)) fi done # Python-Import-Test für MYP-Module log "INFO" "Teste MYP-Python-Module..." if [[ -f "$INSTALL_PATH/app.py" ]]; then cd "$INSTALL_PATH" if python3 -c "import models" 2>/dev/null; then log "INFO" "✓ models.py importiert" else log "ERROR" "✗ models.py Import fehlgeschlagen" test_errors=$((test_errors + 1)) fi # Flask-App-Import-Test if python3 -c "from app import app" 2>/dev/null; then log "INFO" "✓ Flask-App importiert" else log "ERROR" "✗ Flask-App Import fehlgeschlagen" test_errors=$((test_errors + 1)) fi else log "ERROR" "app.py nicht gefunden in $INSTALL_PATH" test_errors=$((test_errors + 1)) fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Python-Environment-Tests bestanden" return 0 else log "ERROR" "✗ Python-Environment-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_node_environment() { log "INFO" "=== NODE.JS-ENVIRONMENT-TESTS ===" local test_errors=0 # Node.js-Check log "INFO" "Teste Node.js-Installation..." if command -v node >/dev/null 2>&1; then local node_version=$(node --version) log "INFO" "Node.js-Version: $node_version" # Version-Check (mindestens v16) if ! node -e "process.exit(parseInt(process.version.slice(1)) >= 16 ? 0 : 1)"; then log "WARN" "Node.js-Version könnte zu alt sein (empfohlen: v16+)" fi else log "ERROR" "Node.js nicht gefunden" test_errors=$((test_errors + 1)) fi # npm-Check log "INFO" "Teste npm-Installation..." if command -v npm >/dev/null 2>&1; then local npm_version=$(npm --version) log "INFO" "npm-Version: $npm_version" else log "ERROR" "npm nicht gefunden" test_errors=$((test_errors + 1)) fi # Package.json-Check if [[ -f "$INSTALL_PATH/package.json" ]]; then log "INFO" "✓ package.json gefunden" cd "$INSTALL_PATH" # npm list Test if npm list --depth=0 >/dev/null 2>&1; then log "INFO" "✓ npm-Packages installiert" else log "WARN" "npm-Packages möglicherweise nicht vollständig installiert" fi # TailwindCSS-Check if npx tailwindcss --help >/dev/null 2>&1; then log "INFO" "✓ TailwindCSS verfügbar" else log "WARN" "TailwindCSS nicht verfügbar" fi else log "WARN" "package.json nicht gefunden" fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Node.js-Environment-Tests bestanden" return 0 else log "ERROR" "✗ Node.js-Environment-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_build_process() { log "INFO" "=== BUILD-PROZESS-TESTS ===" local test_errors=0 if [[ -f "$INSTALL_PATH/package.json" ]]; then cd "$INSTALL_PATH" log "INFO" "Teste CSS-Build..." if npm run build:css 2>/dev/null; then log "INFO" "✓ CSS-Build erfolgreich" # Prüfe ob Output-Datei erstellt wurde if [[ -f "static/css/output.css" ]]; then log "INFO" "✓ CSS-Output-Datei erstellt" else log "ERROR" "✗ CSS-Output-Datei nicht erstellt" test_errors=$((test_errors + 1)) fi else log "ERROR" "✗ CSS-Build fehlgeschlagen" test_errors=$((test_errors + 1)) fi else log "WARN" "Kein package.json gefunden, überspringe Build-Tests" fi # Asset-Komprimierung testen log "INFO" "Teste Asset-Komprimierung..." if [[ -f "$INSTALL_PATH/static/css/output.css.gz" ]]; then log "INFO" "✓ CSS-Komprimierung funktioniert" else log "WARN" "CSS-Komprimierung nicht verfügbar" fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Build-Prozess-Tests bestanden" return 0 else log "ERROR" "✗ Build-Prozess-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_services() { log "INFO" "=== SERVICE-TESTS ===" local test_errors=0 # SystemD-Check log "INFO" "Teste SystemD..." if command -v systemctl >/dev/null 2>&1; then log "INFO" "✓ SystemD verfügbar" else log "ERROR" "✗ SystemD nicht verfügbar" test_errors=$((test_errors + 1)) fi # Service-Dateien prüfen local service_files=( "/etc/systemd/system/${SERVICE_NAME}.service" "/etc/systemd/system/${KIOSK_SERVICE}.service" ) for service_file in "${service_files[@]}"; do if [[ -f "$service_file" ]]; then log "INFO" "✓ Service-Datei gefunden: $(basename "$service_file")" else log "ERROR" "✗ Service-Datei fehlt: $(basename "$service_file")" test_errors=$((test_errors + 1)) fi done # Service-Status prüfen log "INFO" "Teste Service-Status..." # Haupt-Service if systemctl is-enabled --quiet "$SERVICE_NAME"; then log "INFO" "✓ $SERVICE_NAME ist aktiviert" else log "ERROR" "✗ $SERVICE_NAME ist nicht aktiviert" test_errors=$((test_errors + 1)) fi # Service-Start-Test log "INFO" "Teste Service-Start..." if systemctl start "$SERVICE_NAME"; then log "INFO" "✓ $SERVICE_NAME gestartet" # Warte auf Service-Start sleep 5 if systemctl is-active --quiet "$SERVICE_NAME"; then log "INFO" "✓ $SERVICE_NAME ist aktiv" else log "ERROR" "✗ $SERVICE_NAME ist nicht aktiv" test_errors=$((test_errors + 1)) fi else log "ERROR" "✗ $SERVICE_NAME konnte nicht gestartet werden" test_errors=$((test_errors + 1)) fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Service-Tests bestanden" return 0 else log "ERROR" "✗ Service-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_networking() { log "INFO" "=== NETZWERK-TESTS ===" local test_errors=0 # HTTP-Service-Test log "INFO" "Teste HTTP-Service..." # Warte auf Service for i in {1..30}; do if systemctl is-active --quiet "$SERVICE_NAME"; then break fi sleep 2 done # HTTP-Erreichbarkeit testen local test_url="https://localhost" log "INFO" "Teste URL: $test_url" if curl -f -s -k --connect-timeout 10 "$test_url" >/dev/null; then log "INFO" "✓ HTTPS-Service erreichbar" else log "ERROR" "✗ HTTPS-Service nicht erreichbar" test_errors=$((test_errors + 1)) fi # Port-Check log "INFO" "Teste offene Ports..." local required_ports=("443" "80") for port in "${required_ports[@]}"; do if ss -tlnp | grep ":$port " >/dev/null; then log "INFO" "✓ Port $port ist offen" else log "ERROR" "✗ Port $port ist nicht offen" test_errors=$((test_errors + 1)) fi done # DNS-Test log "INFO" "Teste DNS-Auflösung..." if nslookup google.com >/dev/null 2>&1; then log "INFO" "✓ DNS-Auflösung funktioniert" else log "ERROR" "✗ DNS-Auflösung fehlgeschlagen" test_errors=$((test_errors + 1)) fi # Externe Konnektivität log "INFO" "Teste externe Konnektivität..." if ping -c 3 8.8.8.8 >/dev/null 2>&1; then log "INFO" "✓ Externe Konnektivität funktioniert" else log "ERROR" "✗ Externe Konnektivität fehlgeschlagen" test_errors=$((test_errors + 1)) fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Netzwerk-Tests bestanden" return 0 else log "ERROR" "✗ Netzwerk-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_security() { log "INFO" "=== SICHERHEITS-TESTS ===" local test_errors=0 # Firewall-Test log "INFO" "Teste Firewall..." if command -v ufw >/dev/null 2>&1; then if ufw status | grep -q "Status: active"; then log "INFO" "✓ UFW ist aktiv" else log "ERROR" "✗ UFW ist nicht aktiv" test_errors=$((test_errors + 1)) fi else log "ERROR" "✗ UFW nicht verfügbar" test_errors=$((test_errors + 1)) fi # SSH-Konfiguration testen log "INFO" "Teste SSH-Konfiguration..." if systemctl is-active --quiet ssh; then log "INFO" "✓ SSH-Service aktiv" # SSH-Konfiguration prüfen if grep -q "PermitRootLogin no" /etc/ssh/sshd_config*; then log "INFO" "✓ Root-Login deaktiviert" else log "WARN" "Root-Login möglicherweise aktiviert" fi else log "ERROR" "✗ SSH-Service nicht aktiv" test_errors=$((test_errors + 1)) fi # Fail2Ban-Test log "INFO" "Teste Fail2Ban..." if command -v fail2ban-server >/dev/null 2>&1; then if systemctl is-active --quiet fail2ban; then log "INFO" "✓ Fail2Ban aktiv" else log "WARN" "Fail2Ban nicht aktiv" fi else log "WARN" "Fail2Ban nicht installiert" fi # Benutzer-Berechtigungen testen log "INFO" "Teste Benutzer-Berechtigungen..." if id "$PROJECT_USER" &>/dev/null; then log "INFO" "✓ MYP-Benutzer existiert" # Sudo-Rechte prüfen if sudo -l -U "$PROJECT_USER" | grep -q "myp-"; then log "INFO" "✓ MYP-Benutzer hat limitierte sudo-Rechte" else log "WARN" "MYP-Benutzer sudo-Rechte nicht konfiguriert" fi else log "ERROR" "✗ MYP-Benutzer existiert nicht" test_errors=$((test_errors + 1)) fi # SSL-Zertifikat testen log "INFO" "Teste SSL-Zertifikate..." if [[ -f "$INSTALL_PATH/certs/myp.crt" ]] && [[ -f "$INSTALL_PATH/certs/myp.key" ]]; then log "INFO" "✓ SSL-Zertifikate gefunden" # Zertifikat-Gültigkeit prüfen if openssl x509 -in "$INSTALL_PATH/certs/myp.crt" -checkend 86400 >/dev/null; then log "INFO" "✓ SSL-Zertifikat gültig" else log "WARN" "SSL-Zertifikat läuft bald ab" fi else log "ERROR" "✗ SSL-Zertifikate nicht gefunden" test_errors=$((test_errors + 1)) fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Sicherheits-Tests bestanden" return 0 else log "ERROR" "✗ Sicherheits-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_performance() { log "INFO" "=== PERFORMANCE-TESTS ===" local test_errors=0 # Service-Startup-Zeit messen log "INFO" "Teste Service-Startup-Zeit..." local start_time=$(date +%s) systemctl restart "$SERVICE_NAME" # Warte auf Service-Start for i in {1..60}; do if systemctl is-active --quiet "$SERVICE_NAME"; then local end_time=$(date +%s) local startup_time=$((end_time - start_time)) log "INFO" "✓ Service-Startup-Zeit: ${startup_time}s" if [[ $startup_time -gt 30 ]]; then log "WARN" "Service-Startup-Zeit sehr lang (${startup_time}s)" fi break fi sleep 1 done if ! systemctl is-active --quiet "$SERVICE_NAME"; then log "ERROR" "✗ Service konnte nicht gestartet werden" test_errors=$((test_errors + 1)) fi # HTTP-Response-Zeit testen log "INFO" "Teste HTTP-Response-Zeit..." if systemctl is-active --quiet "$SERVICE_NAME"; then # Warte zusätzlich für vollständigen Start sleep 5 local response_time=$(curl -o /dev/null -s -w '%{time_total}' -k https://localhost 2>/dev/null || echo "999") if [[ "$response_time" != "999" ]]; then log "INFO" "✓ HTTP-Response-Zeit: ${response_time}s" if (( $(echo "$response_time > 5" | bc -l) )); then log "WARN" "HTTP-Response-Zeit sehr lang (${response_time}s)" fi else log "ERROR" "✗ HTTP-Response-Zeit nicht messbar" test_errors=$((test_errors + 1)) fi fi # Speicherverbrauch testen log "INFO" "Teste Speicherverbrauch..." local mem_usage=$(ps aux | grep "[p]ython.*app.py" | awk '{sum+=$6} END {print sum/1024}' | cut -d. -f1) if [[ -n "$mem_usage" && "$mem_usage" != "0" ]]; then log "INFO" "✓ MYP-Service Speicherverbrauch: ${mem_usage}MB" if [[ $mem_usage -gt 256 ]]; then log "WARN" "Hoher Speicherverbrauch (${mem_usage}MB)" fi else log "WARN" "Speicherverbrauch nicht messbar" fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Performance-Tests bestanden" return 0 else log "ERROR" "✗ Performance-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_mercedes_certificates() { log "INFO" "=== MERCEDES-ZERTIFIKAT-TESTS ===" local test_errors=0 # Prüfe ob Mercedes-Zertifikat-Verzeichnis existiert log "INFO" "Teste Mercedes-Zertifikat-Installation..." if [[ -d "/usr/local/share/ca-certificates/mercedes" ]]; then local cert_count=$(find /usr/local/share/ca-certificates/mercedes -name "*.crt" | wc -l) if [[ $cert_count -gt 0 ]]; then log "INFO" "✓ $cert_count Mercedes-Zertifikate installiert" else log "ERROR" "✗ Keine Mercedes-Zertifikate gefunden" test_errors=$((test_errors + 1)) fi else log "WARN" "Mercedes-Zertifikat-Verzeichnis nicht gefunden (möglicherweise keine Zertifikate im Projekt)" fi # Prüfe System-CA-Store log "INFO" "Teste System-CA-Store..." if [[ -f "/etc/ssl/certs/ca-certificates.crt" ]]; then log "INFO" "✓ System-CA-Store gefunden" # Prüfe ob Mercedes-Zertifikate integriert sind if grep -q "Daimler AG" /etc/ssl/certs/ca-certificates.crt 2>/dev/null; then log "INFO" "✓ Mercedes-Zertifikate im CA-Store integriert" else log "WARN" "Mercedes-Zertifikate nicht im CA-Store gefunden" fi else log "ERROR" "✗ System-CA-Store nicht gefunden" test_errors=$((test_errors + 1)) fi # Prüfe Python-Zertifikat-Konfiguration log "INFO" "Teste Python-Zertifikat-Konfiguration..." if [[ -f "/etc/myp/python-certs.conf" ]]; then log "INFO" "✓ Python-Zertifikat-Konfiguration vorhanden" # Teste Python SSL-Kontext if python3 -c "import ssl; print('SSL-Kontext:', ssl.create_default_context())" >/dev/null 2>&1; then log "INFO" "✓ Python SSL-Kontext funktioniert" else log "ERROR" "✗ Python SSL-Kontext fehlerhaft" test_errors=$((test_errors + 1)) fi else log "WARN" "Python-Zertifikat-Konfiguration nicht gefunden" fi # Prüfe Node.js-Zertifikat-Konfiguration log "INFO" "Teste Node.js-Zertifikat-Konfiguration..." if [[ -f "/etc/myp/nodejs-certs.conf" ]]; then log "INFO" "✓ Node.js-Zertifikat-Konfiguration vorhanden" else log "WARN" "Node.js-Zertifikat-Konfiguration nicht gefunden" fi # Prüfe Chromium-Zertifikat-Konfiguration log "INFO" "Teste Chromium-Zertifikat-Konfiguration..." if [[ -f "/etc/chromium/policies/managed/mercedes-certificates.json" ]]; then log "INFO" "✓ Chromium-Zertifikat-Policy vorhanden" else log "WARN" "Chromium-Zertifikat-Policy nicht gefunden" fi # Teste NSS-Datenbank für Chromium if [[ -d "/home/$PROJECT_USER/.pki/nssdb" ]]; then log "INFO" "✓ Chromium NSS-Datenbank vorhanden" # Prüfe Mercedes-Zertifikate in NSS if command -v certutil >/dev/null 2>&1; then local nss_cert_count=$(sudo -u "$PROJECT_USER" certutil -L -d sql:"/home/$PROJECT_USER/.pki/nssdb" 2>/dev/null | grep -c "Mercedes-" || echo "0") if [[ $nss_cert_count -gt 0 ]]; then log "INFO" "✓ $nss_cert_count Mercedes-Zertifikate in NSS-Datenbank" else log "WARN" "Keine Mercedes-Zertifikate in NSS-Datenbank gefunden" fi fi else log "WARN" "Chromium NSS-Datenbank nicht gefunden" fi # Teste HTTPS-Verbindungen (falls Netzwerk verfügbar) log "INFO" "Teste HTTPS-Verbindungen..." if command -v curl >/dev/null 2>&1; then # Test zu bekannter Mercedes-Domain if curl -s --connect-timeout 5 --max-time 10 https://www.mercedes-benz.com >/dev/null 2>&1; then log "INFO" "✓ HTTPS-Verbindung zu Mercedes-Domain erfolgreich" else log "WARN" "HTTPS-Verbindung zu Mercedes-Domain fehlgeschlagen (Netzwerk/Firewall)" fi # Test zu Standard-HTTPS-Site if curl -s --connect-timeout 5 --max-time 10 https://www.google.com >/dev/null 2>&1; then log "INFO" "✓ HTTPS-Verbindung zu Standard-Site erfolgreich" else log "WARN" "HTTPS-Verbindungen generell problematisch" test_errors=$((test_errors + 1)) fi fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Mercedes-Zertifikat-Tests bestanden" return 0 else log "ERROR" "✗ Mercedes-Zertifikat-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } test_integration() { log "INFO" "=== INTEGRATION-TESTS ===" local test_errors=0 # Datei-Upload-Test log "INFO" "Teste Datei-Upload-Verzeichnis..." if [[ -d "$INSTALL_PATH/uploads" ]]; then log "INFO" "✓ Upload-Verzeichnis existiert" # Schreibrechte testen local test_file="$INSTALL_PATH/uploads/test-$(date +%s).txt" if echo "test" > "$test_file" 2>/dev/null; then log "INFO" "✓ Upload-Verzeichnis beschreibbar" rm -f "$test_file" else log "ERROR" "✗ Upload-Verzeichnis nicht beschreibbar" test_errors=$((test_errors + 1)) fi else log "ERROR" "✗ Upload-Verzeichnis existiert nicht" test_errors=$((test_errors + 1)) fi # Datenbank-Test log "INFO" "Teste Datenbank..." if [[ -f "$INSTALL_PATH/database/myp.db" ]]; then log "INFO" "✓ Datenbank-Datei existiert" else log "WARN" "Datenbank-Datei existiert noch nicht (wird beim ersten Start erstellt)" fi # Logging-Test log "INFO" "Teste Logging..." if [[ -d "/var/log/myp" ]]; then log "INFO" "✓ Log-Verzeichnis existiert" # Log-Schreibrechte testen local test_log="/var/log/myp/test-$(date +%s).log" if echo "test" > "$test_log" 2>/dev/null; then log "INFO" "✓ Log-Verzeichnis beschreibbar" rm -f "$test_log" else log "ERROR" "✗ Log-Verzeichnis nicht beschreibbar" test_errors=$((test_errors + 1)) fi else log "ERROR" "✗ Log-Verzeichnis existiert nicht" test_errors=$((test_errors + 1)) fi # Desktop-Integration testen log "INFO" "Teste Desktop-Integration..." if systemctl is-enabled --quiet lightdm 2>/dev/null; then log "INFO" "✓ Display Manager konfiguriert" else log "WARN" "Display Manager nicht konfiguriert" fi if systemctl is-enabled --quiet "$KIOSK_SERVICE" 2>/dev/null; then log "INFO" "✓ Kiosk-Service aktiviert" else log "WARN" "Kiosk-Service nicht aktiviert" fi if [[ $test_errors -eq 0 ]]; then log "INFO" "✓ Integration-Tests bestanden" return 0 else log "ERROR" "✗ Integration-Tests fehlgeschlagen ($test_errors Fehler)" return 1 fi } create_test_report() { log "INFO" "Erstelle Test-Report..." local report_file="/var/log/myp/installation-test-report-$(date +%Y%m%d-%H%M%S).txt" local summary_file="/var/log/myp/test-summary.txt" cat > "$report_file" << EOF ================================================================================ MYP INSTALLATIONS-TEST-REPORT ================================================================================ Erstellt: $(date) System: $(uname -a) Hostname: $(hostname) Installer-Version: 1.0.0 === SYSTEM-INFORMATIONEN === Betriebssystem: $(lsb_release -d 2>/dev/null | cut -f2 || echo "Unbekannt") Kernel: $(uname -r) Architektur: $(uname -m) Gesamtspeicher: $(free -h | awk 'NR==2{print $2}') Verfügbarer Speicher: $(free -h | awk 'NR==2{print $7}') Festplattenspeicher: $(df -h / | awk 'NR==2{print $4}') verfügbar CPU-Kerne: $(nproc) Load Average: $(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//') === PYTHON-UMGEBUNG === Python-Version: $(python3 --version 2>/dev/null | cut -d' ' -f2 || echo "Nicht installiert") pip-Version: $(pip3 --version 2>/dev/null | cut -d' ' -f2 || echo "Nicht installiert") Installierte Packages: $(pip3 list 2>/dev/null | wc -l || echo "0") === NODE.JS-UMGEBUNG === Node.js-Version: $(node --version 2>/dev/null || echo "Nicht installiert") npm-Version: $(npm --version 2>/dev/null || echo "Nicht installiert") === SERVICES === MYP-HTTPS-Service: $(systemctl is-active $SERVICE_NAME 2>/dev/null || echo "Nicht aktiv") MYP-Kiosk-Service: $(systemctl is-active $KIOSK_SERVICE 2>/dev/null || echo "Nicht aktiv") SSH-Service: $(systemctl is-active ssh 2>/dev/null || echo "Nicht aktiv") Firewall: $(ufw status 2>/dev/null | head -1 | awk '{print $2}' || echo "Nicht verfügbar") === NETZWERK === Aktive Interfaces: $(ip link show | grep "state UP" | wc -l) IP-Adressen: $(hostname -I) DNS-Server: $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}' | tr '\n' ' ') === SICHERHEIT === UFW-Status: $(ufw status 2>/dev/null | head -1 || echo "Nicht verfügbar") Fail2Ban-Status: $(systemctl is-active fail2ban 2>/dev/null || echo "Nicht installiert") SSH-Root-Login: $(grep -E "^PermitRootLogin" /etc/ssh/sshd_config* 2>/dev/null | head -1 | awk '{print $2}' || echo "Unbekannt") === TEST-ERGEBNISSE === EOF # Test-Ergebnisse anhängen if test_system_health; then echo "System Health: ✓ BESTANDEN" >> "$report_file" else echo "System Health: ✗ FEHLGESCHLAGEN" >> "$report_file" fi if test_python_environment; then echo "Python Environment: ✓ BESTANDEN" >> "$report_file" else echo "Python Environment: ✗ FEHLGESCHLAGEN" >> "$report_file" fi if test_node_environment; then echo "Node.js Environment: ✓ BESTANDEN" >> "$report_file" else echo "Node.js Environment: ✗ FEHLGESCHLAGEN" >> "$report_file" fi if test_services; then echo "Services: ✓ BESTANDEN" >> "$report_file" else echo "Services: ✗ FEHLGESCHLAGEN" >> "$report_file" fi if test_networking; then echo "Networking: ✓ BESTANDEN" >> "$report_file" else echo "Networking: ✗ FEHLGESCHLAGEN" >> "$report_file" fi if test_security; then echo "Security: ✓ BESTANDEN" >> "$report_file" else echo "Security: ✗ FEHLGESCHLAGEN" >> "$report_file" fi cat >> "$report_file" << EOF === EMPFEHLUNGEN === 1. Regelmäßige System-Updates durchführen 2. Firewall-Regeln regelmäßig überprüfen 3. SSL-Zertifikate vor Ablauf erneuern 4. Log-Dateien regelmäßig rotieren 5. Backup-Strategie implementieren === NÄCHSTE SCHRITTE === 1. System neu starten: sudo reboot 2. MYP-System im Browser testen: https://$(hostname -I | awk '{print $1}') 3. Admin-Panel konfigurieren: https://$(hostname -I | awk '{print $1}')/admin 4. Benutzer und Drucker einrichten ================================================================================ ENDE REPORT ================================================================================ EOF # Kurze Zusammenfassung erstellen cat > "$summary_file" << EOF MYP Installation Test Summary - $(date) System Health: $(test_system_health && echo "✓" || echo "✗") Python Environment: $(test_python_environment && echo "✓" || echo "✗") Node.js Environment: $(test_node_environment && echo "✓" || echo "✗") Services: $(test_services && echo "✓" || echo "✗") Networking: $(test_networking && echo "✓" || echo "✗") Security: $(test_security && echo "✓" || echo "✗") Report: $report_file EOF log "INFO" "Test-Report erstellt: $report_file" log "INFO" "Test-Zusammenfassung: $summary_file" # Report-Inhalte auch ins Log schreiben cat "$summary_file" >> "$LOG_FILE" }