#!/bin/sh # 50-network.sh — Configure networking # Priority: persistent config > cloud-init > DHCP fallback # Check for saved network config (from previous boot or cloud-init) if [ -f "$DATA_MOUNT/network/interfaces.sh" ]; then log "Applying saved network configuration" . "$DATA_MOUNT/network/interfaces.sh" return 0 fi # Check for cloud-init network config CLOUDINIT_FILE="${KUBESOLO_CLOUDINIT:-$DATA_MOUNT/etc-kubesolo/cloud-init.yaml}" if [ -f "$CLOUDINIT_FILE" ]; then log "Cloud-init found: $CLOUDINIT_FILE" # Phase 1: simple parsing — extract network stanza # TODO: Replace with proper cloud-init parser (Go binary) in Phase 2 log_warn "Cloud-init network parsing not yet implemented — falling back to DHCP" fi # Fallback: DHCP on first non-loopback interface log "Configuring network via DHCP" # Bring up loopback ip link set lo up ip addr add 127.0.0.1/8 dev lo # Find first ethernet interface ETH_DEV="" for iface in /sys/class/net/*; do iface="$(basename "$iface")" case "$iface" in lo|docker*|veth*|br*|cni*) continue ;; esac ETH_DEV="$iface" break done if [ -z "$ETH_DEV" ]; then log_err "No network interface found" return 1 fi log "Using interface: $ETH_DEV" ip link set "$ETH_DEV" up # Run DHCP client (BusyBox udhcpc) if command -v udhcpc >/dev/null 2>&1; then udhcpc -i "$ETH_DEV" -s /usr/share/udhcpc/default.script \ -t 10 -T 3 -A 5 -b -q 2>/dev/null || { log_err "DHCP failed on $ETH_DEV" return 1 } elif command -v dhcpcd >/dev/null 2>&1; then dhcpcd "$ETH_DEV" || { log_err "DHCP failed on $ETH_DEV" return 1 } else log_err "No DHCP client available (need udhcpc or dhcpcd)" return 1 fi log_ok "Network configured on $ETH_DEV"