chore: Änderungen commited
This commit is contained in:
480
backend/setup/modules/enhanced_network_check.sh
Normal file
480
backend/setup/modules/enhanced_network_check.sh
Normal file
@ -0,0 +1,480 @@
|
||||
#!/bin/bash
|
||||
|
||||
#######################################################################
|
||||
# MYP AIO-Installer - Enhanced Network Check Module
|
||||
#
|
||||
# Verbesserte Internet-Verbindungsprüfung für VM-Kompatibilität
|
||||
#
|
||||
# Funktionen:
|
||||
# - Mehrstufige Netzwerk-Checks
|
||||
# - VM-spezifische Timeouts
|
||||
# - DNS-Resolution-Validation
|
||||
# - Corporate-Proxy-Unterstützung
|
||||
# - Detaillierte Fehlerdiagnose
|
||||
#######################################################################
|
||||
|
||||
# Erweiterte Internet-Verbindungsprüfung (VM-kompatibel)
|
||||
check_internet_connection_enhanced() {
|
||||
log "INFO" "=== ERWEITERTE INTERNET-VERBINDUNGSPRÜFUNG ==="
|
||||
|
||||
local connection_available=false
|
||||
local check_errors=()
|
||||
|
||||
# Schritt 1: Netzwerk-Interface-Check
|
||||
log "INFO" "Schritt 1: Prüfe Netzwerk-Interfaces..."
|
||||
if check_network_interfaces; then
|
||||
log "INFO" "✓ Netzwerk-Interfaces aktiv"
|
||||
else
|
||||
check_errors+=("Keine aktiven Netzwerk-Interfaces")
|
||||
fi
|
||||
|
||||
# Schritt 2: DNS-Resolution-Check
|
||||
log "INFO" "Schritt 2: Prüfe DNS-Auflösung..."
|
||||
if check_dns_resolution; then
|
||||
log "INFO" "✓ DNS-Auflösung funktioniert"
|
||||
else
|
||||
check_errors+=("DNS-Auflösung fehlgeschlagen")
|
||||
fi
|
||||
|
||||
# Schritt 3: Gateway-Erreichbarkeit
|
||||
log "INFO" "Schritt 3: Prüfe Gateway-Erreichbarkeit..."
|
||||
if check_gateway_reachability; then
|
||||
log "INFO" "✓ Gateway erreichbar"
|
||||
else
|
||||
check_errors+=("Gateway nicht erreichbar")
|
||||
fi
|
||||
|
||||
# Schritt 4: Externe Konnektivität (mehrere Methoden)
|
||||
log "INFO" "Schritt 4: Prüfe externe Konnektivität..."
|
||||
if check_external_connectivity; then
|
||||
log "INFO" "✓ Externe Konnektivität verfügbar"
|
||||
connection_available=true
|
||||
else
|
||||
check_errors+=("Externe Konnektivität fehlgeschlagen")
|
||||
fi
|
||||
|
||||
# Schritt 5: Corporate-Proxy-Check (falls Standard-Check fehlschlägt)
|
||||
if [[ "$connection_available" == "false" ]]; then
|
||||
log "INFO" "Schritt 5: Prüfe Corporate-Proxy-Konnektivität..."
|
||||
if check_corporate_proxy; then
|
||||
log "INFO" "✓ Corporate-Proxy-Konnektivität verfügbar"
|
||||
connection_available=true
|
||||
else
|
||||
check_errors+=("Corporate-Proxy-Konnektivität fehlgeschlagen")
|
||||
fi
|
||||
fi
|
||||
|
||||
# Ergebnis-Auswertung
|
||||
if [[ "$connection_available" == "true" ]]; then
|
||||
log "INFO" "✅ Internet-Verbindung erfolgreich validiert"
|
||||
return 0
|
||||
else
|
||||
log "ERROR" "❌ Internet-Verbindung nicht verfügbar"
|
||||
log "ERROR" "Gefundene Probleme:"
|
||||
for error in "${check_errors[@]}"; do
|
||||
log "ERROR" " - $error"
|
||||
done
|
||||
|
||||
# Detaillierte Diagnose-Informationen
|
||||
show_network_diagnostics
|
||||
|
||||
# Benutzer-Option: Trotzdem fortfahren?
|
||||
if [[ "${FORCE_YES:-}" != "true" ]]; then
|
||||
if confirm_action "Internet-Verbindung problematisch. Trotzdem fortfahren? (Nicht empfohlen)"; then
|
||||
log "WARN" "⚠️ Installation trotz Netzwerk-Problemen fortgesetzt"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Netzwerk-Interface-Check
|
||||
check_network_interfaces() {
|
||||
local active_interfaces=$(ip link show | grep -E "state UP|LOWER_UP" | wc -l)
|
||||
|
||||
if [[ $active_interfaces -gt 0 ]]; then
|
||||
log "INFO" "Aktive Netzwerk-Interfaces: $active_interfaces"
|
||||
|
||||
# Interface-Details loggen
|
||||
ip link show | grep -E "state UP|LOWER_UP" | while read line; do
|
||||
log "DEBUG" "Interface: $line"
|
||||
done
|
||||
|
||||
return 0
|
||||
else
|
||||
log "ERROR" "Keine aktiven Netzwerk-Interfaces gefunden"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# DNS-Resolution-Check mit mehreren Servern
|
||||
check_dns_resolution() {
|
||||
local dns_servers=(
|
||||
"8.8.8.8" # Google DNS
|
||||
"1.1.1.1" # Cloudflare DNS
|
||||
"9.9.9.9" # Quad9 DNS
|
||||
"208.67.222.222" # OpenDNS
|
||||
)
|
||||
|
||||
local test_domains=(
|
||||
"google.com"
|
||||
"cloudflare.com"
|
||||
"github.com"
|
||||
)
|
||||
|
||||
# Teste DNS-Server-Erreichbarkeit
|
||||
for dns_server in "${dns_servers[@]}"; do
|
||||
log "INFO" "Teste DNS-Server: $dns_server"
|
||||
|
||||
# Ping mit VM-freundlichem Timeout
|
||||
if timeout 10 ping -c 2 -W 3 "$dns_server" &>/dev/null; then
|
||||
log "INFO" "✓ DNS-Server $dns_server erreichbar"
|
||||
|
||||
# Teste Domain-Auflösung
|
||||
for domain in "${test_domains[@]}"; do
|
||||
if timeout 10 nslookup "$domain" "$dns_server" &>/dev/null; then
|
||||
log "INFO" "✓ DNS-Auflösung für $domain erfolgreich"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
else
|
||||
log "WARN" "DNS-Server $dns_server nicht erreichbar"
|
||||
fi
|
||||
done
|
||||
|
||||
log "ERROR" "Alle DNS-Server-Tests fehlgeschlagen"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Gateway-Erreichbarkeit prüfen
|
||||
check_gateway_reachability() {
|
||||
local gateway=$(ip route show default | awk '/default/ {print $3}' | head -1)
|
||||
|
||||
if [[ -n "$gateway" ]]; then
|
||||
log "INFO" "Default Gateway: $gateway"
|
||||
|
||||
# Gateway-Ping mit VM-Timeout
|
||||
if timeout 15 ping -c 3 -W 5 "$gateway" &>/dev/null; then
|
||||
log "INFO" "✓ Gateway $gateway erreichbar"
|
||||
return 0
|
||||
else
|
||||
log "ERROR" "Gateway $gateway nicht erreichbar"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log "ERROR" "Kein Default Gateway gefunden"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Externe Konnektivität mit mehreren Methoden
|
||||
check_external_connectivity() {
|
||||
local test_methods=(
|
||||
"ping_test"
|
||||
"curl_test"
|
||||
"wget_test"
|
||||
"nc_test"
|
||||
)
|
||||
|
||||
for method in "${test_methods[@]}"; do
|
||||
log "INFO" "Teste externe Konnektivität mit: $method"
|
||||
|
||||
if $method; then
|
||||
log "INFO" "✓ Externe Konnektivität via $method erfolgreich"
|
||||
return 0
|
||||
else
|
||||
log "WARN" "Externe Konnektivität via $method fehlgeschlagen"
|
||||
fi
|
||||
done
|
||||
|
||||
log "ERROR" "Alle Konnektivitäts-Tests fehlgeschlagen"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Ping-Test mit VM-optimierten Parametern
|
||||
ping_test() {
|
||||
local test_hosts=(
|
||||
"8.8.8.8" # Google DNS
|
||||
"1.1.1.1" # Cloudflare DNS
|
||||
"9.9.9.9" # Quad9 DNS
|
||||
)
|
||||
|
||||
for host in "${test_hosts[@]}"; do
|
||||
# VM-freundliche Ping-Parameter:
|
||||
# -c 3: 3 Pakete (mehr Zuverlässigkeit)
|
||||
# -W 5: 5 Sekunden Timeout pro Paket
|
||||
# -i 2: 2 Sekunden Intervall zwischen Paketen
|
||||
if timeout 20 ping -c 3 -W 5 -i 2 "$host" &>/dev/null; then
|
||||
log "INFO" "✓ Ping zu $host erfolgreich"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# curl-Test mit erweiterten Timeouts
|
||||
curl_test() {
|
||||
if ! command -v curl &>/dev/null; then
|
||||
log "WARN" "curl nicht verfügbar"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local test_urls=(
|
||||
"http://connectivitycheck.gstatic.com/generate_204" # Google Connectivity Check
|
||||
"http://www.gstatic.com/generate_204" # Google Alternative
|
||||
"http://captive.apple.com/hotspot-detect.html" # Apple Connectivity Check
|
||||
"http://clients3.google.com/generate_204" # Google Client Check
|
||||
)
|
||||
|
||||
for url in "${test_urls[@]}"; do
|
||||
# VM-freundliche curl-Parameter:
|
||||
# --connect-timeout 15: 15 Sekunden Verbindungs-Timeout
|
||||
# --max-time 30: 30 Sekunden Gesamt-Timeout
|
||||
# --retry 2: 2 Wiederholungen
|
||||
# --retry-delay 3: 3 Sekunden Pause zwischen Wiederholungen
|
||||
if curl -s -f --connect-timeout 15 --max-time 30 --retry 2 --retry-delay 3 "$url" &>/dev/null; then
|
||||
log "INFO" "✓ curl zu $url erfolgreich"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# wget-Test als Alternative
|
||||
wget_test() {
|
||||
if ! command -v wget &>/dev/null; then
|
||||
log "WARN" "wget nicht verfügbar"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# wget mit VM-Timeouts
|
||||
if timeout 30 wget --quiet --spider --timeout=15 --tries=2 "http://www.google.com" &>/dev/null; then
|
||||
log "INFO" "✓ wget-Test erfolgreich"
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# nc (netcat) Test für Port-Konnektivität
|
||||
nc_test() {
|
||||
if ! command -v nc &>/dev/null; then
|
||||
log "WARN" "netcat nicht verfügbar"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local test_endpoints=(
|
||||
"8.8.8.8 53" # Google DNS
|
||||
"1.1.1.1 53" # Cloudflare DNS
|
||||
"google.com 80" # HTTP
|
||||
"google.com 443" # HTTPS
|
||||
)
|
||||
|
||||
for endpoint in "${test_endpoints[@]}"; do
|
||||
local host=$(echo $endpoint | awk '{print $1}')
|
||||
local port=$(echo $endpoint | awk '{print $2}')
|
||||
|
||||
if timeout 10 nc -z -w 5 "$host" "$port" &>/dev/null; then
|
||||
log "INFO" "✓ netcat zu $host:$port erfolgreich"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Corporate-Proxy-Check für Mercedes-Umgebung
|
||||
check_corporate_proxy() {
|
||||
log "INFO" "Prüfe Corporate-Proxy-Konnektivität..."
|
||||
|
||||
# Prüfe auf Proxy-Umgebungsvariablen
|
||||
local proxy_vars=(
|
||||
"$http_proxy"
|
||||
"$https_proxy"
|
||||
"$HTTP_PROXY"
|
||||
"$HTTPS_PROXY"
|
||||
)
|
||||
|
||||
for proxy in "${proxy_vars[@]}"; do
|
||||
if [[ -n "$proxy" ]]; then
|
||||
log "INFO" "Proxy gefunden: $proxy"
|
||||
|
||||
# Teste Proxy-Konnektivität
|
||||
if test_proxy_connectivity "$proxy"; then
|
||||
log "INFO" "✓ Proxy-Konnektivität erfolgreich"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Teste bekannte Corporate-Domains
|
||||
local corporate_domains=(
|
||||
"mercedes-benz.com"
|
||||
"daimler.com"
|
||||
"corpintra.net"
|
||||
)
|
||||
|
||||
for domain in "${corporate_domains[@]}"; do
|
||||
if timeout 15 curl -s --connect-timeout 10 --max-time 20 "https://$domain" &>/dev/null; then
|
||||
log "INFO" "✓ Corporate-Domain $domain erreichbar"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
log "WARN" "Corporate-Proxy-Konnektivität nicht verfügbar"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Proxy-Konnektivität testen
|
||||
test_proxy_connectivity() {
|
||||
local proxy="$1"
|
||||
|
||||
if [[ -z "$proxy" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Teste Proxy mit curl
|
||||
if curl -s --proxy "$proxy" --connect-timeout 10 --max-time 15 "http://www.google.com" &>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Detaillierte Netzwerk-Diagnose anzeigen
|
||||
show_network_diagnostics() {
|
||||
log "INFO" "=== NETZWERK-DIAGNOSE ==="
|
||||
|
||||
# IP-Konfiguration
|
||||
log "INFO" "IP-Konfiguration:"
|
||||
ip addr show | grep -E "(inet |state UP)" | head -10 | while read line; do
|
||||
log "INFO" " $line"
|
||||
done
|
||||
|
||||
# Routing-Tabelle
|
||||
log "INFO" "Routing-Tabelle:"
|
||||
ip route show | head -5 | while read line; do
|
||||
log "INFO" " $line"
|
||||
done
|
||||
|
||||
# DNS-Konfiguration
|
||||
log "INFO" "DNS-Konfiguration:"
|
||||
if [[ -f /etc/resolv.conf ]]; then
|
||||
grep nameserver /etc/resolv.conf | head -3 | while read line; do
|
||||
log "INFO" " $line"
|
||||
done
|
||||
fi
|
||||
|
||||
# Proxy-Einstellungen
|
||||
log "INFO" "Proxy-Einstellungen:"
|
||||
for var in http_proxy https_proxy HTTP_PROXY HTTPS_PROXY; do
|
||||
if [[ -n "${!var}" ]]; then
|
||||
log "INFO" " $var=${!var}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Aktive Verbindungen
|
||||
log "INFO" "Aktive Netzwerk-Verbindungen:"
|
||||
ss -tuln | head -10 | while read line; do
|
||||
log "INFO" " $line"
|
||||
done
|
||||
|
||||
# VM-Detection
|
||||
detect_vm_environment
|
||||
}
|
||||
|
||||
# VM-Umgebung erkennen
|
||||
detect_vm_environment() {
|
||||
log "INFO" "=== VM-UMGEBUNG-ERKENNUNG ==="
|
||||
|
||||
# Hypervisor-Detection
|
||||
if command -v systemd-detect-virt &>/dev/null; then
|
||||
local virt_type=$(systemd-detect-virt)
|
||||
if [[ "$virt_type" != "none" ]]; then
|
||||
log "INFO" "VM-Umgebung erkannt: $virt_type"
|
||||
|
||||
# VM-spezifische Empfehlungen
|
||||
case "$virt_type" in
|
||||
"vmware")
|
||||
log "INFO" "VMware-Empfehlung: Prüfe NAT/Bridge-Modus"
|
||||
;;
|
||||
"virtualbox")
|
||||
log "INFO" "VirtualBox-Empfehlung: Aktiviere Host-Only-Adapter"
|
||||
;;
|
||||
"kvm"|"qemu")
|
||||
log "INFO" "KVM/QEMU-Empfehlung: Prüfe virtio-Netzwerk-Driver"
|
||||
;;
|
||||
"hyper-v")
|
||||
log "INFO" "Hyper-V-Empfehlung: Prüfe Integration Services"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
log "INFO" "Physisches System erkannt"
|
||||
fi
|
||||
fi
|
||||
|
||||
# DMI-basierte Detection
|
||||
if [[ -f /sys/class/dmi/id/product_name ]]; then
|
||||
local product_name=$(cat /sys/class/dmi/id/product_name 2>/dev/null)
|
||||
if [[ "$product_name" =~ (VMware|VirtualBox|KVM|QEMU) ]]; then
|
||||
log "INFO" "VM via DMI erkannt: $product_name"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Internet-Check-Bypass für Offline-Installation
|
||||
enable_offline_mode() {
|
||||
log "WARN" "=== OFFLINE-MODUS AKTIVIERT ==="
|
||||
log "WARN" "Internet-Checks werden übersprungen"
|
||||
log "WARN" "Manche Features können eingeschränkt sein"
|
||||
|
||||
export MYP_OFFLINE_MODE="true"
|
||||
|
||||
# Erstelle Marker-Datei
|
||||
echo "OFFLINE_MODE_ENABLED=$(date)" > "/tmp/myp-offline-mode"
|
||||
}
|
||||
|
||||
# Check-Funktion für Offline-Modus
|
||||
is_offline_mode() {
|
||||
[[ "$MYP_OFFLINE_MODE" == "true" ]] || [[ -f "/tmp/myp-offline-mode" ]]
|
||||
}
|
||||
|
||||
# Hauptfunktion: Ersetzt den ursprünglichen Internet-Check
|
||||
check_system_enhanced() {
|
||||
log "INFO" "Überprüfe Systemvoraussetzungen (erweitert)..."
|
||||
|
||||
# Debian/Ubuntu Check
|
||||
if ! command -v apt &> /dev/null; then
|
||||
log "ERROR" "Dieses System wird nicht unterstützt (kein APT Package Manager)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Internet-Verbindung (erweitert)
|
||||
if ! check_internet_connection_enhanced; then
|
||||
if [[ "${FORCE_OFFLINE:-}" == "true" ]]; then
|
||||
enable_offline_mode
|
||||
log "WARN" "Offline-Modus erzwungen"
|
||||
else
|
||||
log "ERROR" "Internet-Verbindung erforderlich für Installation"
|
||||
log "INFO" "Hinweise zur Fehlerbehebung:"
|
||||
log "INFO" " 1. Prüfe VM-Netzwerk-Einstellungen (NAT/Bridge)"
|
||||
log "INFO" " 2. Warte 1-2 Minuten nach VM-Start"
|
||||
log "INFO" " 3. Prüfe Host-Firewall/Proxy-Einstellungen"
|
||||
log "INFO" " 4. Verwende --force-offline für Offline-Installation"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Speicherplatz (mindestens 2GB frei)
|
||||
local free_space=$(df / | awk 'NR==2 {print $4}')
|
||||
if [[ $free_space -lt 2097152 ]]; then
|
||||
log "ERROR" "Nicht genügend Speicherplatz (mindestens 2GB erforderlich)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "INFO" "Systemvoraussetzungen erfüllt"
|
||||
}
|
Reference in New Issue
Block a user