#!/bin/sh

STATE=/run/mgmt-net.state
LINK_LOCK=/run/link-mode.lock
FORCE="${1:-}"

[ -e "$LINK_LOCK" ] && [ "$FORCE" != "--force" ] && exit 0

eth_standby() {
    ifdown eth0 2>/dev/null || true
    ifup eth0
    ip addr flush dev eth0
}

carrier=0
if [ -r /sys/class/net/eth0/carrier ]; then
    carrier=$(cat /sys/class/net/eth0/carrier 2>/dev/null || echo 0)
fi

if pidof wfb_tx wfb_rx wfb_tun wifilink >/dev/null; then
    wfb_active=1
else
    wfb_active=0
fi

if [ "$carrier" = "1" ]; then
    wanted=ethernet
elif [ "$wfb_active" = "1" ]; then
    wanted=wfb
else
    wanted=wifi
fi

current=$(cat "$STATE" 2>/dev/null || true)
[ "$wanted" = "$current" ] && [ "$FORCE" != "--force" ] && exit 0

case "$wanted" in
    ethernet)
        [ "$wfb_active" = "0" ] && ifdown wlan0 2>/dev/null || true
        ifdown eth0 2>/dev/null || true
        ifup eth0
        ;;

    wifi)
        eth_standby
        ifdown wlan0 2>/dev/null || true
        ip link set wlan0 down
        iw dev wlan0 set type managed
        ip link set wlan0 up
        ifup wlan0
        ;;

    wfb)
        eth_standby
        ;;
esac

echo "$wanted" >"$STATE"
logger -t mgmt-net "active path: $wanted"
