182 lines
7.0 KiB
Bash
Executable File
182 lines
7.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Verify Network Configuration
|
|
# Checks network connectivity and bandwidth to Proxmox host
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
|
source "$PROJECT_ROOT/lib/common.sh" 2>/dev/null || {
|
|
log_info() { echo "[INFO] $1"; }
|
|
log_success() { echo "[✓] $1"; }
|
|
log_error() { echo "[ERROR] $1"; }
|
|
log_warn() { echo "[WARN] $1"; }
|
|
}
|
|
|
|
# Load configuration
|
|
load_config "$PROJECT_ROOT/config/proxmox.conf" 2>/dev/null || true
|
|
|
|
log_info "========================================="
|
|
log_info "Network Configuration Verification"
|
|
log_info "========================================="
|
|
log_info ""
|
|
|
|
# Check network connectivity
|
|
log_info "=== Network Connectivity ==="
|
|
|
|
# Get Proxmox host IP/name (if configured)
|
|
PROXMOX_HOST="${PROXMOX_HOST:-localhost}"
|
|
log_info "Proxmox host: $PROXMOX_HOST"
|
|
|
|
# Check if we can resolve the host
|
|
if command_exists ping; then
|
|
if ping -c 1 -W 2 "$PROXMOX_HOST" &>/dev/null; then
|
|
log_success "Proxmox host is reachable"
|
|
|
|
# Get average latency
|
|
LATENCY=$(ping -c 3 -W 2 "$PROXMOX_HOST" 2>/dev/null | grep "avg" | awk -F'/' '{print $5}' || echo "N/A")
|
|
if [[ "$LATENCY" != "N/A" ]]; then
|
|
log_info " Average latency: ${LATENCY}ms"
|
|
if (( $(echo "$LATENCY > 100" | bc -l 2>/dev/null || echo 0) )); then
|
|
log_warn " High latency detected (>100ms). May impact deployment performance."
|
|
fi
|
|
fi
|
|
else
|
|
log_warn "Cannot ping Proxmox host (may be normal if running locally)"
|
|
fi
|
|
fi
|
|
|
|
# Check network interfaces
|
|
log_info ""
|
|
log_info "=== Network Interfaces ==="
|
|
|
|
if [[ -f /proc/net/dev ]]; then
|
|
# List active network interfaces
|
|
INTERFACES=$(ip -o link show 2>/dev/null | awk -F': ' '{print $2}' | grep -v "lo" || true)
|
|
if [[ -n "$INTERFACES" ]]; then
|
|
for iface in $INTERFACES; do
|
|
if ip link show "$iface" 2>/dev/null | grep -q "state UP"; then
|
|
log_info " $iface: UP"
|
|
|
|
# Get link speed if available
|
|
if [[ -f "/sys/class/net/$iface/speed" ]]; then
|
|
SPEED=$(cat "/sys/class/net/$iface/speed" 2>/dev/null || echo "unknown")
|
|
if [[ "$SPEED" != "-1" ]] && [[ "$SPEED" != "unknown" ]]; then
|
|
if [[ $SPEED -ge 1000 ]]; then
|
|
log_success " Speed: ${SPEED}Mbps (Gigabit or better - recommended)"
|
|
elif [[ $SPEED -ge 100 ]]; then
|
|
log_warn " Speed: ${SPEED}Mbps (Fast Ethernet - may limit performance)"
|
|
else
|
|
log_warn " Speed: ${SPEED}Mbps (Slow - may significantly impact deployment)"
|
|
fi
|
|
fi
|
|
fi
|
|
else
|
|
log_info " $iface: DOWN"
|
|
fi
|
|
done
|
|
fi
|
|
else
|
|
log_warn "Cannot check network interfaces (/proc/net/dev not available)"
|
|
fi
|
|
|
|
# Check Proxmox bridge configuration (if on Proxmox host)
|
|
log_info ""
|
|
log_info "=== Proxmox Bridge Configuration ==="
|
|
|
|
CONFIGURED_BRIDGE="${PROXMOX_BRIDGE:-vmbr0}"
|
|
log_info "Configured bridge: $CONFIGURED_BRIDGE"
|
|
|
|
if command_exists ip; then
|
|
if ip link show "$CONFIGURED_BRIDGE" &>/dev/null; then
|
|
log_success "Bridge '$CONFIGURED_BRIDGE' exists"
|
|
|
|
BRIDGE_STATUS=$(ip link show "$CONFIGURED_BRIDGE" 2>/dev/null | grep -o "state [A-Z]*" | awk '{print $2}')
|
|
log_info " Status: $BRIDGE_STATUS"
|
|
|
|
if [[ "$BRIDGE_STATUS" == "UP" ]]; then
|
|
log_success " Bridge is UP"
|
|
else
|
|
log_warn " Bridge is DOWN - containers may not have network access"
|
|
fi
|
|
else
|
|
log_error "Bridge '$CONFIGURED_BRIDGE' not found"
|
|
log_info " Available bridges:"
|
|
ip link show type bridge 2>/dev/null | grep "^[0-9]" | awk -F': ' '{print " - " $2}' || log_info " (none found)"
|
|
fi
|
|
fi
|
|
|
|
# Check DNS resolution (important for package downloads)
|
|
log_info ""
|
|
log_info "=== DNS Configuration ==="
|
|
|
|
if command_exists nslookup || command_exists host; then
|
|
TEST_DOMAIN="github.com"
|
|
if nslookup "$TEST_DOMAIN" &>/dev/null || host "$TEST_DOMAIN" &>/dev/null; then
|
|
log_success "DNS resolution working ($TEST_DOMAIN)"
|
|
else
|
|
log_error "DNS resolution failed - package downloads may fail"
|
|
fi
|
|
else
|
|
log_warn "Cannot test DNS (nslookup/host not available)"
|
|
fi
|
|
|
|
# Check internet connectivity (for package downloads)
|
|
log_info ""
|
|
log_info "=== Internet Connectivity ==="
|
|
|
|
if command_exists curl; then
|
|
if curl -s --max-time 5 https://github.com &>/dev/null; then
|
|
log_success "Internet connectivity working (GitHub reachable)"
|
|
|
|
# Test download speed (rough estimate)
|
|
log_info " Testing download speed..."
|
|
SPEED_TEST=$(curl -s -o /dev/null -w "%{speed_download}" --max-time 10 https://github.com 2>/dev/null || echo "0")
|
|
if [[ -n "$SPEED_TEST" ]] && [[ "$SPEED_TEST" != "0" ]]; then
|
|
# Convert bytes/s to Mbps
|
|
SPEED_MBPS=$(echo "scale=2; $SPEED_TEST * 8 / 1024 / 1024" | bc 2>/dev/null || echo "N/A")
|
|
if [[ "$SPEED_MBPS" != "N/A" ]]; then
|
|
log_info " Approximate download speed: ${SPEED_MBPS} Mbps"
|
|
if (( $(echo "$SPEED_MBPS > 100" | bc -l 2>/dev/null || echo 0) )); then
|
|
log_success " Speed is good for deployment (recommended: >100 Mbps)"
|
|
elif (( $(echo "$SPEED_MBPS > 10" | bc -l 2>/dev/null || echo 0) )); then
|
|
log_warn " Speed is acceptable but may slow deployment (recommended: >100 Mbps)"
|
|
else
|
|
log_warn " Speed is slow - deployment may be significantly slower"
|
|
log_info " Consider:"
|
|
log_info " • Using local package mirrors"
|
|
log_info " • Pre-caching packages"
|
|
log_info " • Upgrading network connection"
|
|
fi
|
|
fi
|
|
fi
|
|
else
|
|
log_warn "Internet connectivity test failed (may be normal in isolated networks)"
|
|
fi
|
|
else
|
|
log_warn "Cannot test internet connectivity (curl not available)"
|
|
fi
|
|
|
|
# Network optimization recommendations
|
|
log_info ""
|
|
log_info "=== Network Optimization Recommendations ==="
|
|
log_info ""
|
|
log_info "For optimal deployment performance:"
|
|
log_info " ✓ Use Gigabit Ethernet (1 Gbps) or faster"
|
|
log_info " ✓ Ensure low latency (<50ms) to Proxmox host"
|
|
log_info " ✓ Use wired connection instead of wireless"
|
|
log_info " ✓ Consider local package mirrors for apt"
|
|
log_info " ✓ Pre-cache OS templates (saves 5-10 minutes)"
|
|
log_info " ✓ Monitor network usage during deployment"
|
|
log_info ""
|
|
log_info "Expected network usage:"
|
|
log_info " • OS template download: ~200-500 MB (one-time)"
|
|
log_info " • Package downloads: ~500 MB - 2 GB per container"
|
|
log_info " • Configuration file transfers: Minimal"
|
|
log_info " • Total for 67 containers: ~35-135 GB"
|
|
log_info ""
|
|
|
|
log_success "Network configuration verification complete"
|
|
|