#!/usr/bin/env bash # # guest-dhcp.sh — aktifkan DHCP untuk NIC tambahan (mis. macvlan) DI DALAM guest incus. # Jalankan di dalam guest (SSH atau `incus exec`), karena sisi host (add NIC) sudah diatur. # # Pakai: # ./guest-dhcp.sh # auto: semua NIC non-lo yang belum punya IPv4 # ./guest-dhcp.sh eth1 # NIC tertentu # ./guest-dhcp.sh eth1 eth2 # # Opsi: # --metric N RouteMetric DHCPv4 (default 50; 0 = tidak di-set) # lebih kecil dari NIC incusbr0 (100) agar NIC ini jadi default route # -h, --help # # Idempotent. Mendukung NetworkManager, systemd-networkd, dhcpcd, dhclient, udhcpc. set -euo pipefail METRIC=50 TARGETS=() while [ $# -gt 0 ]; do case "$1" in --metric) METRIC="${2:?--metric butuh angka}"; shift 2 ;; -h|--help) sed -n '2,17p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; -*) echo "opsi tak dikenal: $1" >&2; exit 2 ;; *) TARGETS+=("$1"); shift ;; esac done have_ip(){ ip -4 addr show "$1" 2>/dev/null | grep -q 'inet '; } # auto-deteksi NIC tanpa IPv4 if [ ${#TARGETS[@]} -eq 0 ]; then for d in /sys/class/net/*; do n="$(basename "$d")"; [ "$n" = lo ] && continue have_ip "$n" || TARGETS+=("$n") done fi if [ ${#TARGETS[@]} -eq 0 ]; then echo "Semua NIC sudah punya IPv4. Tidak ada yang perlu dikonfigurasi." exit 0 fi # deteksi pengelola jaringan NM=0; NETD=0 if command -v systemctl >/dev/null 2>&1; then systemctl is-active --quiet NetworkManager 2>/dev/null && NM=1 systemctl is-active --quiet systemd-networkd 2>/dev/null && NETD=1 fi for iface in "${TARGETS[@]}"; do echo "== konfigurasi $iface" if [ "$NM" = 1 ]; then nmcli device connect "$iface" >/dev/null 2>&1 || { nmcli connection add type ethernet ifname "$iface" con-name "$iface" ipv4.method auto >/dev/null 2>&1 || true nmcli connection up "$iface" >/dev/null 2>&1 || true } elif [ "$NETD" = 1 ] || [ -d /etc/systemd/network ]; then { printf '[Match]\nName=%s\n[Network]\nDHCP=yes\n' "$iface" [ "$METRIC" -gt 0 ] && printf '[DHCPv4]\nRouteMetric=%s\n' "$METRIC" } > "/etc/systemd/network/20-$iface.network" systemctl restart systemd-networkd >/dev/null 2>&1 || true elif command -v dhcpcd >/dev/null 2>&1; then dhcpcd "$iface" >/dev/null 2>&1 || true elif command -v dhclient >/dev/null 2>&1; then dhclient "$iface" >/dev/null 2>&1 || true elif command -v udhcpc >/dev/null 2>&1; then udhcpc -i "$iface" >/dev/null 2>&1 || true else echo " ! tidak ada DHCP client (NetworkManager/systemd-networkd/dhcpcd/dhclient/udhcpc)" >&2 exit 1 fi done # tunggu IP for _ in $(seq 1 20); do ready=0 for iface in "${TARGETS[@]}"; do have_ip "$iface" && ready=$((ready+1)); done [ "$ready" -eq ${#TARGETS[@]} ] && break sleep 1 done echo for iface in "${TARGETS[@]}"; do ip4="$(ip -4 -o addr show "$iface" 2>/dev/null | awk '{print $4}' | cut -d/ -f1 | head -1)" printf '%-8s %s\n' "$iface" "${ip4:-belum dapat IP}" done