chore: Änderungen commited
This commit is contained in:
386
backend/scripts/diagnose_network.sh
Normal file
386
backend/scripts/diagnose_network.sh
Normal file
@ -0,0 +1,386 @@
|
||||
#!/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
|
Reference in New Issue
Block a user