mirror of
https://github.com/unraid/webgui.git
synced 2026-01-07 18:19:54 -06:00
Merge pull request #2194 from bergware/master
More network fixes and improvements
This commit is contained in:
@@ -613,7 +613,6 @@ case "$1" in
|
||||
docker_service_start
|
||||
docker_network_start
|
||||
docker_container_start &>/dev/null &
|
||||
disown
|
||||
;;
|
||||
'stop')
|
||||
docker_container_stop
|
||||
@@ -633,7 +632,6 @@ case "$1" in
|
||||
docker_service_start
|
||||
docker_network_start
|
||||
docker_container_start &>/dev/null &
|
||||
disown
|
||||
;;
|
||||
'status')
|
||||
docker_status
|
||||
|
||||
@@ -146,7 +146,6 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
echo "PROTOCOL:0=\"${PROTOCOL[$i]}\"" >>$INI
|
||||
echo "USE_DHCP:0=\"${USE_DHCP[$i]}\"" >>$INI
|
||||
echo "USE_GW4:0=\"${USE_GW4[$i]}\"" >>$INI
|
||||
DATA=
|
||||
if [[ ${USE_DHCP[$i]} == yes ]]; then
|
||||
# get dhcp assigned ipv4 address & mask
|
||||
NET=($(ip -4 -br addr show scope global primary dev $IFACE | awk '{sub("/"," ",$3);print $3;exit}'))
|
||||
@@ -162,7 +161,7 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
echo "GATEWAY:0=\"${GATEWAY[$i]}\"" >>$INI
|
||||
echo "METRIC:0=\"${METRIC[$i]}\"" >>$INI
|
||||
# store static ipv4 assignment
|
||||
[[ -n ${IPADDR[$i]} ]] && DATA="$IFACE ${IPADDR[$i]}/$(mask2cidr ${NETMASK[$i]}) ${METRIC[$i]:-0}"
|
||||
echo "$(ip -4 -br addr show scope global primary dev $IFACE | awk '{$2="";print;exit}')" >>$STA
|
||||
fi
|
||||
echo "USE_DHCP6:0=\"${USE_DHCP6[$i]}\"" >>$INI
|
||||
echo "USE_GW6:0=\"${USE_GW6[$i]}\"" >>$INI
|
||||
@@ -182,10 +181,9 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
echo "GATEWAY6:0=\"${GATEWAY6[$i]}\"" >>$INI
|
||||
echo "METRIC6:0=\"${METRIC6[$i]}\"" >>$INI
|
||||
echo "PRIVACY6:0=\"\"" >>$INI
|
||||
# store static ipv4 assignment
|
||||
[[ -n ${IPADDR6[$i]} ]] && DATA="${DATA:-$IFACE} ${IPADDR6[$i]}/${NETMASK6[$i]} ${METRIC6[$i]:-0}"
|
||||
# store static ipv6 assignment
|
||||
echo "$(ip -6 -br addr show scope global primary -deprecated dev $IFACE | awk '{$2="";print;exit}')" >>$STA
|
||||
fi
|
||||
[[ -n $DATA ]] && echo "$DATA" >>$STA
|
||||
echo "USE_MTU=\"${USE_MTU[$i]}\"" >>$INI
|
||||
echo "MTU=\"${MTU[$i]}\"" >>$INI
|
||||
if [[ -n ${VLANS[$i]} ]]; then
|
||||
@@ -197,7 +195,6 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
echo "PROTOCOL:$j=\"${PROTOCOL[$i,$j]}\"" >>$INI
|
||||
echo "USE_DHCP:$j=\"${USE_DHCP[$i,$j]}\"" >>$INI
|
||||
echo "USE_GW4:$j=\"${USE_GW4[$i,$j]}\"" >>$INI
|
||||
DATA=
|
||||
if [[ ${USE_DHCP[$i,$j]} == yes ]]; then
|
||||
DEV=$IFACE.${VLANID[$i,$j]}
|
||||
# get dhcp assigned ipv4 address & cidr2mask
|
||||
@@ -213,8 +210,8 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
echo "NETMASK:$j=\"${NETMASK[$i,$j]}\"" >>$INI
|
||||
echo "GATEWAY:$j=\"${GATEWAY[$i,$j]}\"" >>$INI
|
||||
echo "METRIC:$j=\"${METRIC[$i,$j]}\"" >>$INI
|
||||
# store static ipv6 assignment
|
||||
[[ -n ${IPADDR[$i,$j]} ]] && DATA="$DEV ${IPADDR[$i,$j]}/$(mask2cidr ${NETMASK[$i,$j]}) ${METRIC[$i,$j]:-0}"
|
||||
# store static ipv4 assignment
|
||||
echo "$(ip -4 -br addr show scope global primary dev $DEV | awk '{$2="";print;exit}')" >>$STA
|
||||
fi
|
||||
echo "USE_DHCP6:$j=\"${USE_DHCP6[$i,$j]}\"" >>$INI
|
||||
echo "USE_GW6:$j=\"${USE_GW6[$i,$j]}\"" >>$INI
|
||||
@@ -236,10 +233,8 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do
|
||||
echo "METRIC6:$j=\"${METRIC6[$i,$j]}\"" >>$INI
|
||||
echo "PRIVACY6:$j=\"\"" >>$INI
|
||||
# store static ipv6 assignment
|
||||
[[ -n ${IPADDR6[$i,$j]} ]] && DATA="${DATA:-$DEV} ${IPADDR6[$i,$j]}/${NETMASK6[$i,$j]} ${METRIC6[$i,$j]:-0}"
|
||||
echo "$(ip -6 -br addr show scope global primary -deprecated dev $DEV | awk '{$2="";print;exit}')" >>$STA
|
||||
fi
|
||||
# static IP assignments handled by rc.monitor
|
||||
[[ -n $DATA ]] && echo "$DATA" >>$STA
|
||||
done
|
||||
else
|
||||
# interface without VLANs
|
||||
|
||||
@@ -23,27 +23,24 @@ md5(){
|
||||
}
|
||||
|
||||
switch(){
|
||||
local n
|
||||
local n status
|
||||
[[ -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
|
||||
status=3
|
||||
# state should stay different for at least 3 seconds
|
||||
for n in {1..3}; do
|
||||
[[ $(state $1) != $2 ]] && ((status--))
|
||||
sleep 1
|
||||
done
|
||||
return 0
|
||||
[[ $status -eq 0 ]]
|
||||
}
|
||||
|
||||
init(){
|
||||
PORT=(); IPV4=(); METRIC4=(); IPV6=(); METRIC6=(); STATE=();
|
||||
PORT=(); 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]}))
|
||||
PORT+=("$ROW")
|
||||
STATE+=($(state ${ROW%% *}))
|
||||
done <$FILE
|
||||
fi
|
||||
MD5=$(md5)
|
||||
@@ -52,19 +49,21 @@ init(){
|
||||
while :; do
|
||||
# monitor file content changes
|
||||
[[ $MD5 != $(md5) ]] && init
|
||||
LAST=
|
||||
for i in ${!PORT[@]}; do
|
||||
INT=${PORT[$i]%% *}
|
||||
# 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]}
|
||||
if switch $INT ${STATE[$i]}; then
|
||||
NEW=$(state $INT)
|
||||
STATE[$i]=$NEW
|
||||
if [[ $NEW == up ]]; then
|
||||
ip addr add dev ${PORT[$i]}
|
||||
elif [[ $NEW == down && $INT != $LAST ]]; then
|
||||
ip addr flush scope global dev $INT
|
||||
fi
|
||||
fi
|
||||
LAST=$INT
|
||||
done
|
||||
# check every 3 seconds
|
||||
sleep 3
|
||||
done &
|
||||
disown %%
|
||||
|
||||
@@ -7,6 +7,21 @@ status=http://localhost/pub/session?buffer_length=1 # nchan information about G
|
||||
nchan_list=/tmp/nchan_list.tmp
|
||||
nchan_id=$(basename "$0")
|
||||
|
||||
nchan_subs(){
|
||||
curl -m2 --unix-socket $nginx $status 2>/dev/null | grep -Pom1 'subscribers: \K\d+'
|
||||
}
|
||||
|
||||
nchan_idle(){
|
||||
local n idle subs
|
||||
idle=3
|
||||
for n in {1..3}; do
|
||||
subs=$(nchan_subs)
|
||||
[[ -z $subs || $subs -eq 0 ]] && ((idle--))
|
||||
sleep 3
|
||||
done
|
||||
[[ $idle -eq 0 ]]
|
||||
}
|
||||
|
||||
nchan_stop() {
|
||||
echo -n >$nchan_list
|
||||
while IFS=$'\n' read -r nchan; do
|
||||
@@ -49,26 +64,18 @@ start=$(date +%s)
|
||||
while :; do
|
||||
# only act when GUI registered nchan processes are running
|
||||
if [[ -s $nchan_pid ]]; then
|
||||
# get number of GUI nchan subscribers
|
||||
subs=$(curl --unix-socket $nginx $status 2>/dev/null | grep -Pom1 'subscribers: \K\d+')
|
||||
if [[ -z $subs || $subs -eq 0 ]]; then
|
||||
sleep 5
|
||||
# steady state?
|
||||
subs=$(curl --unix-socket $nginx $status 2>/dev/null | grep -Pom1 'subscribers: \K\d+')
|
||||
if [[ -z $subs || $subs -eq 0 ]]; then
|
||||
now=$(date +%s)
|
||||
# log at 1 hour interval
|
||||
if [[ $((now-start)) -ge 3600 ]]; then
|
||||
logger -t $nchan_id -- "Stop running nchan processes"
|
||||
start=$now
|
||||
fi
|
||||
nchan_stop
|
||||
# empty GUI registered list & statistics
|
||||
rm -f $nchan_pid $disk_load
|
||||
if nchan_idle; then
|
||||
now=$(date +%s)
|
||||
# log at 1 hour interval
|
||||
if [[ $((now-start)) -ge 3600 ]]; then
|
||||
logger -t $nchan_id -- "Stop running nchan processes"
|
||||
start=$now
|
||||
fi
|
||||
nchan_stop
|
||||
# empty GUI registered list & statistics
|
||||
rm -f $nchan_pid $disk_load
|
||||
fi
|
||||
fi
|
||||
# check every 30 seconds
|
||||
sleep 30
|
||||
done &
|
||||
disown %%
|
||||
|
||||
Reference in New Issue
Block a user