90 lines
2.9 KiB
Bash
Executable File
90 lines
2.9 KiB
Bash
Executable File
#!/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
|