#!/bin/bash ####################################################################### # MYP Network Diagnostics Tool # # Umfassende Netzwerk-Diagnose für VM-Umgebungen # Identifiziert Internet-Verbindungsprobleme vor Installation ####################################################################### set -euo pipefail # Farben für Output readonly RED='\033[0;31m' readonly GREEN='\033[0;32m' readonly YELLOW='\033[1;33m' readonly BLUE='\033[0;34m' readonly NC='\033[0m' # Logging-Funktion log() { local level="$1" shift local message="$*" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') case "$level" in "INFO") echo -e "${GREEN}[INFO]${NC} $message" ;; "WARN") echo -e "${YELLOW}[WARN]${NC} $message" ;; "ERROR") echo -e "${RED}[ERROR]${NC} $message" ;; "DEBUG") echo -e "${BLUE}[DEBUG]${NC} $message" ;; esac } main() { clear echo "==================================================================================================" echo " MYP NETWORK DIAGNOSTICS TOOL" echo "==================================================================================================" echo # System-Information show_system_info # Netzwerk-Tests run_network_tests # Internet-Konnektivitäts-Tests run_internet_tests # VM-spezifische Tests run_vm_tests # Empfehlungen show_recommendations } show_system_info() { log "INFO" "=== SYSTEM-INFORMATION ===" # Betriebssystem if command -v lsb_release &>/dev/null; then local os_info=$(lsb_release -d | cut -f2) log "INFO" "Betriebssystem: $os_info" fi # Kernel log "INFO" "Kernel: $(uname -r)" # Architektur log "INFO" "Architektur: $(uname -m)" # Virtualisierung if command -v systemd-detect-virt &>/dev/null; then local virt_type=$(systemd-detect-virt) if [[ "$virt_type" != "none" ]]; then log "INFO" "Virtualisierung: $virt_type" else log "INFO" "Virtualisierung: Physisches System" fi fi echo } run_network_tests() { log "INFO" "=== NETZWERK-INTERFACE-TESTS ===" # Aktive Interfaces local interfaces=$(ip link show | grep -c "state UP") log "INFO" "Aktive Netzwerk-Interfaces: $interfaces" if [[ $interfaces -eq 0 ]]; then log "ERROR" "❌ Keine aktiven Netzwerk-Interfaces gefunden!" return 1 fi # Interface-Details log "INFO" "Interface-Details:" ip addr show | grep -E "(inet |UP)" | while read line; do log "DEBUG" " $line" done # Routing-Tabelle log "INFO" "Routing-Tabelle:" ip route show | head -5 | while read line; do log "DEBUG" " $line" done # Gateway-Test local gateway=$(ip route show default | awk '/default/ {print $3}' | head -1) if [[ -n "$gateway" ]]; then log "INFO" "Default Gateway: $gateway" log "INFO" "Teste Gateway-Erreichbarkeit..." if timeout 10 ping -c 3 -W 5 "$gateway" &>/dev/null; then log "INFO" "✅ Gateway $gateway erreichbar" else log "ERROR" "❌ Gateway $gateway nicht erreichbar" fi else log "ERROR" "❌ Kein Default Gateway konfiguriert" fi echo } run_internet_tests() { log "INFO" "=== INTERNET-KONNEKTIVITÄTS-TESTS ===" # DNS-Konfiguration prüfen log "INFO" "DNS-Konfiguration:" if [[ -f /etc/resolv.conf ]]; then grep nameserver /etc/resolv.conf | head -3 | while read line; do log "DEBUG" " $line" done fi # DNS-Server-Tests log "INFO" "Teste DNS-Server-Erreichbarkeit..." local dns_servers=("8.8.8.8" "1.1.1.1" "9.9.9.9" "208.67.222.222") local dns_success=0 for dns in "${dns_servers[@]}"; do log "INFO" "Teste DNS-Server: $dns" if timeout 15 ping -c 2 -W 5 "$dns" &>/dev/null; then log "INFO" "✅ DNS-Server $dns erreichbar" dns_success=$((dns_success + 1)) else log "WARN" "❌ DNS-Server $dns nicht erreichbar" fi done if [[ $dns_success -eq 0 ]]; then log "ERROR" "❌ Keine DNS-Server erreichbar!" else log "INFO" "✅ $dns_success von ${#dns_servers[@]} DNS-Servern erreichbar" fi # Domain-Auflösung testen log "INFO" "Teste Domain-Auflösung..." local domains=("google.com" "github.com" "cloudflare.com") local resolution_success=0 for domain in "${domains[@]}"; do log "INFO" "Teste Domain: $domain" if timeout 15 nslookup "$domain" &>/dev/null; then log "INFO" "✅ $domain aufgelöst" resolution_success=$((resolution_success + 1)) else log "WARN" "❌ $domain nicht auflösbar" fi done if [[ $resolution_success -eq 0 ]]; then log "ERROR" "❌ Domain-Auflösung fehlgeschlagen!" else log "INFO" "✅ $resolution_success von ${#domains[@]} Domains aufgelöst" fi # HTTP-Konnektivität testen log "INFO" "Teste HTTP-Konnektivität..." local http_success=0 # curl-Tests if command -v curl &>/dev/null; then local urls=( "http://connectivitycheck.gstatic.com/generate_204" "http://www.google.com" "http://github.com" ) for url in "${urls[@]}"; do log "INFO" "Teste URL: $url" if timeout 20 curl -s -f --connect-timeout 15 --max-time 25 "$url" &>/dev/null; then log "INFO" "✅ $url erreichbar" http_success=$((http_success + 1)) else log "WARN" "❌ $url nicht erreichbar" fi done fi # wget-Tests als Fallback if command -v wget &>/dev/null && [[ $http_success -eq 0 ]]; then log "INFO" "Teste mit wget..." if timeout 20 wget --timeout=15 --tries=2 -q -O /dev/null "http://www.google.com"; then log "INFO" "✅ wget-Test erfolgreich" http_success=$((http_success + 1)) else log "WARN" "❌ wget-Test fehlgeschlagen" fi fi if [[ $http_success -eq 0 ]]; then log "ERROR" "❌ HTTP-Konnektivität fehlgeschlagen!" else log "INFO" "✅ HTTP-Konnektivität verfügbar" fi echo } run_vm_tests() { log "INFO" "=== VM-SPEZIFISCHE TESTS ===" # VM-Detection local is_vm=false local virt_type="unknown" if command -v systemd-detect-virt &>/dev/null; then virt_type=$(systemd-detect-virt) if [[ "$virt_type" != "none" ]]; then is_vm=true log "INFO" "VM-Umgebung erkannt: $virt_type" 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|Hyper-V) ]]; then is_vm=true log "INFO" "VM via DMI erkannt: $product_name" fi fi if [[ "$is_vm" == "true" ]]; then log "INFO" "🖥️ Virtuelle Maschine erkannt" # VM-spezifische Empfehlungen case "$virt_type" in "vmware") log "INFO" "VMware-Umgebung: Prüfe NAT/Bridge-Modus" ;; "virtualbox") log "INFO" "VirtualBox-Umgebung: Prüfe Netzwerk-Adapter-Typ" ;; "kvm"|"qemu") log "INFO" "KVM/QEMU-Umgebung: Prüfe virtio-Netzwerk-Driver" ;; "hyper-v") log "INFO" "Hyper-V-Umgebung: Prüfe Integration Services" ;; esac # VM-Performance-Tests log "INFO" "Teste VM-Netzwerk-Performance..." local start_time=$(date +%s%N) timeout 10 ping -c 1 8.8.8.8 &>/dev/null local end_time=$(date +%s%N) local ping_time=$(( (end_time - start_time) / 1000000 )) # ms log "INFO" "Ping-Latenz: ${ping_time}ms" if [[ $ping_time -gt 1000 ]]; then log "WARN" "⚠️ Hohe Ping-Latenz ($ping_time ms) - VM-Netzwerk könnte langsam sein" fi else log "INFO" "🖥️ Physisches System erkannt" fi echo } show_recommendations() { log "INFO" "=== EMPFEHLUNGEN ===" # Sammle Test-Ergebnisse local has_internet=false local is_vm=false local needs_vm_mode=false # Internet-Check if timeout 10 ping -c 1 8.8.8.8 &>/dev/null; then has_internet=true fi # VM-Check if command -v systemd-detect-virt &>/dev/null; then local virt_type=$(systemd-detect-virt) if [[ "$virt_type" != "none" ]]; then is_vm=true fi fi # Performance-Check local start_time=$(date +%s%N) timeout 5 ping -c 1 8.8.8.8 &>/dev/null 2>&1 || true local end_time=$(date +%s%N) local ping_time=$(( (end_time - start_time) / 1000000 )) if [[ $ping_time -gt 500 ]] || [[ "$is_vm" == "true" ]]; then needs_vm_mode=true fi # Empfehlungen basierend auf Ergebnissen if [[ "$has_internet" == "true" ]]; then log "INFO" "✅ Internet-Verbindung verfügbar" if [[ "$needs_vm_mode" == "true" ]]; then log "INFO" "🚀 Empfohlene Installation (VM-Modus):" echo " sudo ./setup/aio_installer.sh --vm-mode --full" else log "INFO" "🚀 Empfohlene Installation:" echo " sudo ./setup/aio_installer.sh --full" fi else log "WARN" "⚠️ Internet-Verbindung problematisch" log "INFO" "🔧 Mögliche Lösungen:" echo " 1. Warten (1-2 Minuten nach VM-Start):" echo " sleep 120" echo " sudo ./setup/aio_installer.sh --vm-mode --full" echo echo " 2. VM-Netzwerk-Einstellungen prüfen:" echo " - NAT-Modus aktivieren" echo " - Bridge-Modus versuchen" echo " - VM neu starten" echo echo " 3. Offline-Installation:" echo " sudo ./setup/aio_installer.sh --force-offline --full" echo echo " 4. Internet-Check überspringen:" echo " sudo ./setup/aio_installer.sh --skip-internet-check --full" fi # Zusätzliche VM-Empfehlungen if [[ "$is_vm" == "true" ]]; then log "INFO" "🖥️ VM-spezifische Tipps:" echo " - Mindestens 2GB RAM zuweisen" echo " - NAT-Netzwerk-Modus verwenden" echo " - Nach VM-Start 2 Minuten warten" echo " - Bei Problemen: VM neu starten" fi # Proxy-Erkennung if [[ -n "${http_proxy:-}" ]] || [[ -n "${HTTP_PROXY:-}" ]]; then log "INFO" "🌐 Proxy-Umgebung erkannt:" echo " - Corporate-Proxy: ${http_proxy:-$HTTP_PROXY}" echo " - Möglicherweise erweiterte Timeouts erforderlich" fi echo log "INFO" "📋 Zusammenfassung:" echo " Internet verfügbar: $(if [[ "$has_internet" == "true" ]]; then echo "✅ JA"; else echo "❌ NEIN"; fi)" echo " VM-Umgebung: $(if [[ "$is_vm" == "true" ]]; then echo "✅ JA"; else echo "❌ NEIN"; fi)" echo " VM-Modus empfohlen: $(if [[ "$needs_vm_mode" == "true" ]]; then echo "✅ JA"; else echo "❌ NEIN"; fi)" } # Kommandozeilen-Argumente case "${1:-}" in --help|-h) echo "MYP Network Diagnostics Tool" echo "Verwendung: $0 [OPTION]" echo echo "Optionen:" echo " --help, -h Diese Hilfe anzeigen" echo " (keine) Vollständige Netzwerk-Diagnose" exit 0 ;; *) main ;; esac