938 lines
30 KiB
Bash
938 lines
30 KiB
Bash
#!/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"
|
|
} |