#!/bin/bash # # script: monitor_interface # # Monitors a given list of interfaces and add or remove static IP addresses to these interfaces. # The list of interfaces is provided in the file '/var/local/emhttp/statics.ini' # This file is maintained by the script 'create_network_ini' which keep track of all IP assignments. # # By removing static IP addresses from inactive interfaces, these interfaces do not longer interfere with wireless. # In other words the wired connection can be pulled without consequences. # # Bergware - modified for Unraid OS, May 2025 FILE=/var/local/emhttp/statics.ini SYSTEM=/sys/class/net md5(){ [[ -r $FILE ]] && md5sum $FILE | awk '{print $1;exit}' } wlan(){ [[ -e $SYSTEM/wlan0 ]] } carrier(){ cat $SYSTEM/$1/carrier 2>/dev/null } state(){ local n NEW OLD HOLD OLD=$(carrier $1) HOLD=4 # new state should hold for at least 4 seconds for n in {1..4}; do sleep 1 NEW=$(carrier $1) [[ $NEW != $OLD ]] && ((HOLD--)) done [[ $HOLD -eq 0 ]] && echo $NEW || echo $OLD } init(){ TASK=() if [[ -r $FILE ]]; then # initialize values from file, maintained by 'create_network_ini' while IFS=$'\n' read -r ROW; do TASK+=("$ROW") done <$FILE fi MD5=$(md5) } while :; do if wlan; then # monitor file content changes [[ $MD5 != $(md5) ]] && init LAST= for i in ${!TASK[@]}; do ADDR=(${TASK[$i]}) PORT=${ADDR[0]} [[ $LAST != ${PORT%.*} ]] && STATE=$(state ${PORT%.*}) case $STATE in 1) # up case ${ADDR[1]} in GW4) # no existing default and new default is defined? IPV4=$(ip -4 -br addr show scope global primary dev $PORT | awk '{print $3;exit}') if [[ -n $IPV4 ]]; then ROUTE=$(ip -4 route show to default dev $PORT) [[ -z $ROUTE ]] && ip -4 route add dev ${TASK[$i]/GW4/} fi ;; GW6) # no existing default and new default is defined? IPV6=$(ip -6 -br addr show scope global primary -deprecated dev $PORT | awk '{print $3;exit}') if [[ -n $IPV6 ]]; then ROUTE=$(ip -6 route show to default dev $PORT) [[ -z $ROUTE ]] && ip -6 route add dev ${TASK[$i]/GW6/} fi ;; *) IPA=$(ip -br addr show to ${ADDR[1]} dev $PORT) if [[ -f /var/tmp/$PORT.down ]]; then # Special treatment for shim and vhost interfaces [[ -n $IPA ]] && ip addr del dev ${TASK[$i]} else # IP address not present? create it [[ -z $IPA ]] && ip addr add dev ${TASK[$i]} fi ;; esac ;; 0) # down # IP address present, remove it [[ -n $(ip -br addr show to ${ADDR[1]} dev $PORT) ]] && ip addr del dev ${TASK[$i]} ;; esac LAST=${PORT%.*} done fi # check every 3 seconds sleep 3 done &