From 741ece5b80c81ea4b159b9c707d3ab9977209462 Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 10:55:59 +0200 Subject: [PATCH 1/7] remove 'disown' command (unneeded) --- etc/rc.d/rc.docker | 2 -- sbin/monitor_interface | 1 - sbin/monitor_nchan | 1 - 3 files changed, 4 deletions(-) diff --git a/etc/rc.d/rc.docker b/etc/rc.d/rc.docker index 8d9b5221f..13632d0af 100755 --- a/etc/rc.d/rc.docker +++ b/etc/rc.d/rc.docker @@ -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 diff --git a/sbin/monitor_interface b/sbin/monitor_interface index 041f02856..e6977454f 100755 --- a/sbin/monitor_interface +++ b/sbin/monitor_interface @@ -67,4 +67,3 @@ while :; do # check every 3 seconds sleep 3 done & -disown %% diff --git a/sbin/monitor_nchan b/sbin/monitor_nchan index 76d50e769..67ce818ca 100755 --- a/sbin/monitor_nchan +++ b/sbin/monitor_nchan @@ -71,4 +71,3 @@ while :; do # check every 30 seconds sleep 30 done & -disown %% From 571e8dd75b253fb1c7f96e8b7e32f631996650ab Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 11:09:49 +0200 Subject: [PATCH 2/7] Revert "remove 'disown' command (unneeded)" This reverts commit 741ece5b80c81ea4b159b9c707d3ab9977209462. --- etc/rc.d/rc.docker | 2 ++ sbin/monitor_interface | 1 + sbin/monitor_nchan | 1 + 3 files changed, 4 insertions(+) diff --git a/etc/rc.d/rc.docker b/etc/rc.d/rc.docker index 13632d0af..8d9b5221f 100755 --- a/etc/rc.d/rc.docker +++ b/etc/rc.d/rc.docker @@ -613,6 +613,7 @@ case "$1" in docker_service_start docker_network_start docker_container_start &>/dev/null & + disown ;; 'stop') docker_container_stop @@ -632,6 +633,7 @@ case "$1" in docker_service_start docker_network_start docker_container_start &>/dev/null & + disown ;; 'status') docker_status diff --git a/sbin/monitor_interface b/sbin/monitor_interface index e6977454f..041f02856 100755 --- a/sbin/monitor_interface +++ b/sbin/monitor_interface @@ -67,3 +67,4 @@ while :; do # check every 3 seconds sleep 3 done & +disown %% diff --git a/sbin/monitor_nchan b/sbin/monitor_nchan index 67ce818ca..76d50e769 100755 --- a/sbin/monitor_nchan +++ b/sbin/monitor_nchan @@ -71,3 +71,4 @@ while :; do # check every 30 seconds sleep 30 done & +disown %% From 58c3c296003835c5eba32e6f7cb68fd482a2e786 Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 12:22:00 +0200 Subject: [PATCH 3/7] nchan_monitor: improved idle detection --- sbin/monitor_nchan | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/sbin/monitor_nchan b/sbin/monitor_nchan index 76d50e769..dedfa82e2 100755 --- a/sbin/monitor_nchan +++ b/sbin/monitor_nchan @@ -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 %% From 34d2c075aedea017cd0853d515a4150eb5384dcc Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 12:22:50 +0200 Subject: [PATCH 4/7] monitor_interface: remove unused 'disown' statement --- sbin/monitor_interface | 1 - 1 file changed, 1 deletion(-) diff --git a/sbin/monitor_interface b/sbin/monitor_interface index 041f02856..e6977454f 100755 --- a/sbin/monitor_interface +++ b/sbin/monitor_interface @@ -67,4 +67,3 @@ while :; do # check every 3 seconds sleep 3 done & -disown %% From 693cd33181b6bbb68e543a9480d102e2991f3e34 Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 12:23:08 +0200 Subject: [PATCH 5/7] rc.docker: remove unused 'disown' statement --- etc/rc.d/rc.docker | 2 -- 1 file changed, 2 deletions(-) diff --git a/etc/rc.d/rc.docker b/etc/rc.d/rc.docker index 8d9b5221f..13632d0af 100755 --- a/etc/rc.d/rc.docker +++ b/etc/rc.d/rc.docker @@ -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 From 60358274a66e0fc3a1b18bf427248d5a947bb6ae Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 16:58:07 +0200 Subject: [PATCH 6/7] network: improved monitoring of static addresses --- sbin/create_network_ini | 15 ++++++--------- sbin/monitor_interface | 40 ++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/sbin/create_network_ini b/sbin/create_network_ini index c2f9e55e5..198c86e95 100755 --- a/sbin/create_network_ini +++ b/sbin/create_network_ini @@ -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,7 +233,7 @@ 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 diff --git a/sbin/monitor_interface b/sbin/monitor_interface index e6977454f..331a021fb 100755 --- a/sbin/monitor_interface +++ b/sbin/monitor_interface @@ -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,17 +49,20 @@ 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 From 0a5e4b54157b85cf0504569c19398e1158a64d16 Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 10 May 2025 17:08:40 +0200 Subject: [PATCH 7/7] Update create_network_ini --- sbin/create_network_ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/sbin/create_network_ini b/sbin/create_network_ini index 198c86e95..18f5faec9 100755 --- a/sbin/create_network_ini +++ b/sbin/create_network_ini @@ -235,8 +235,6 @@ for ((i=0; i<${SYSNICS:-1}; i++)); do # store static ipv6 assignment 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