Files
Projektarbeit-MYP/backend/scripts/diagnose_network.sh

386 lines
12 KiB
Bash

#!/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