Files
auto-macvlan/guest-dhcp.sh
T

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