mirror of
https://github.com/unraid/webgui.git
synced 2026-01-01 15:10:19 -06:00
70 lines
1.9 KiB
Bash
Executable File
70 lines
1.9 KiB
Bash
Executable File
#!/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
|
|
|
|
state(){
|
|
cat $SYSTEM/$1/operstate 2>/dev/null
|
|
}
|
|
|
|
md5(){
|
|
[[ -r $FILE ]] && md5sum $FILE | awk '{print $1;exit}'
|
|
}
|
|
|
|
switch(){
|
|
local n
|
|
[[ -z $1 ]] && return 1
|
|
# state change should stay stable for at least 5 seconds
|
|
for n in {1..5}; do
|
|
[[ $(state $1) == $2 ]] && return 1 || sleep 1
|
|
done
|
|
return 0
|
|
}
|
|
|
|
init(){
|
|
PORT=(); IPV4=(); METRIC4=(); IPV6=(); METRIC6=(); STATE=();
|
|
if [[ -r $FILE ]]; then
|
|
# initialize values from file, maintained by 'create_network_ini'
|
|
while IFS=$'\n' read -r ROW; do
|
|
ROW=($ROW)
|
|
PORT+=(${ROW[0]})
|
|
IPV4+=(${ROW[1]:--})
|
|
METRIC4+=(${ROW[2]:--})
|
|
IPV6+=(${ROW[3]:--})
|
|
METRIC6+=(${ROW[4]:--})
|
|
STATE+=($(state ${ROW[0]}))
|
|
done <$FILE
|
|
fi
|
|
MD5=$(md5)
|
|
}
|
|
|
|
while :; do
|
|
# monitor file content changes
|
|
[[ $MD5 != $(md5) ]] && init
|
|
for i in ${!PORT[@]}; do
|
|
# did interface state change?
|
|
if switch ${PORT[$i]} ${STATE[$i]}; then
|
|
STATE[$i]=$(state ${PORT[$i]})
|
|
if [[ ${STATE[$i]} == up ]]; then
|
|
[[ ${IPV4[$i]} != '-' ]] && ip addr add ${IPV4[$i]} metric ${METRIC4[$i]} dev ${PORT[$i]}
|
|
[[ ${IPV6[$i]} != '-' ]] && ip addr add ${IPV6[$i]} metric ${METRIC6[$i]} dev ${PORT[$i]}
|
|
elif [[ ${STATE[$i]} == down ]]; then
|
|
ip addr flush scope global dev ${PORT[$i]}
|
|
fi
|
|
fi
|
|
done
|
|
# check every 3 seconds
|
|
sleep 3
|
|
done &
|