Merge pull request #2194 from bergware/master

More network fixes and improvements
This commit is contained in:
tom mortensen
2025-05-10 12:32:23 -07:00
committed by GitHub
4 changed files with 50 additions and 51 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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 %%

View File

@@ -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 %%