- Improve device up api events,

- Improve openvpn stats reporting,
- Add a new conection state for gateways device up with no gateway client conected.
This commit is contained in:
2025-09-01 01:09:29 +02:00
parent 235076b6b9
commit b1c51d6cfd
4 changed files with 305 additions and 86 deletions

View File

@@ -168,6 +168,72 @@ network_common_dump()
#--------------------------------------------------------------------------------------------------------------------------
# network_common_openvpn_stats_get
#--------------------------------------------------------------------------------------------------------------------------
network_common_openvpn_stats_get()
{
local device="$1"
local client="$2"
if [[ "${client}" == "" ]]
then
client=".*"
else
if [[ "${device}" == "" ]]
then
tmp="$( echo "${NETWORK_OPENVPN_STATUS}" | grep "CLIENT_LIST,${client},")"
tmp="${tmp/*\//}"
device="${tmp/.status*/}"
fi
fi
if [[ "${device}" != "" ]]
then
if [[ "${NETWORK_OPENVPN_STATUS}" =~ ("${device}.status: TITLE") ]]
then
# OpenVPN Server Mode
OIFS="${IFS}"
IFS=","
set XXX/$( echo "${NETWORK_OPENVPN_STATUS}" | grep "${device}\.status: CLIENT_LIST,${client},") &>/dev/null
IFS="${OIFS}"
tmp="${1/XXX*\//}"
ovpn_stat_device="${tmp/.status*/}"
ovpn_stat_client_name="$2"
ovpn_stat_address_ext="$3"
ovpn_stat_address_int="$4"
ovpn_stat_address_int6="$5"
ovpn_stat_bytes_received="$6"
ovpn_stat_bytes_sent="$7"
ovpn_stat_connected_date="$8"
ovpn_stat_connected_time_t="$9"
ovpn_stat_user_name="$10"
ovpn_stat_client_id="$11"
ovpn_stat_peer_id="$12"
ovpn_stat_cipher="$13"
else
# OpenVPN Client Mode
set XXX/$( echo "${NETWORK_OPENVPN_STATUS}" | grep "${device}\.status:") &>/dev/null
tmp="${1/XXX*\//}"
ovpn_stat_device="${tmp/.status*/}"
ovpn_stat_bytes_received="${18/bytes,}"
ovpn_stat_bytes_sent="${22/bytes,}"
fi
else
ovpn_stat_device=""
fi
}
#-------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------
# network_ip_route_tab_load # network_ip_route_tab_load
#-------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------
@@ -233,6 +299,7 @@ network_ip_route_tab_dump()
echo "NETWORK_IP_ROUTE_ID_LIST: [${NETWORK_IP_ROUTE_ID_LIST}]" echo "NETWORK_IP_ROUTE_ID_LIST: [${NETWORK_IP_ROUTE_ID_LIST}]"
echo echo
echo "NETWORK_IP_ROUTE_IP_IDX:" echo "NETWORK_IP_ROUTE_IP_IDX:"
for key in "${!NETWORK_IP_ROUTE_IP_IDX[@]}" for key in "${!NETWORK_IP_ROUTE_IP_IDX[@]}"
@@ -242,6 +309,7 @@ network_ip_route_tab_dump()
echo echo
echo "NETWORK_IP_ROUTE_TAB:" echo "NETWORK_IP_ROUTE_TAB:"
for key in "${!NETWORK_IP_ROUTE_TAB[@]}" for key in "${!NETWORK_IP_ROUTE_TAB[@]}"
@@ -294,8 +362,6 @@ network_dst_tab_load()
ndtl_status="$( ip link show dev ${ndtl_device} 2>/dev/null | grep -q ",UP," && echo "1" || echo "0")" ndtl_status="$( ip link show dev ${ndtl_device} 2>/dev/null | grep -q ",UP," && echo "1" || echo "0")"
tab_assign NETWORK_DST_TAB "${ndtl_id},Status" "${ndtl_status}"
if [[ "${ndtl_type}" == "5" ]] if [[ "${ndtl_type}" == "5" ]]
then then
@@ -312,21 +378,32 @@ network_dst_tab_load()
case "${ndtl_type}" case "${ndtl_type}"
in in
"0"|"1") "0")
ndtl_bytes_received="$( cat /sys/class/net/${ndtl_device}/statistics/rx_bytes 2>/dev/null | numfmt --to=iec-i --suffix=B)" ndtl_bytes_received="$( cat /sys/class/net/${ndtl_device}/statistics/rx_bytes 2>/dev/null | numfmt --to=iec-i --suffix=B)"
ndtl_bytes_sent="$( cat /sys/class/net/${ndtl_device}/statistics/tx_bytes 2>/dev/null | numfmt --to=iec-i --suffix=B)" ndtl_bytes_sent="$( cat /sys/class/net/${ndtl_device}/statistics/tx_bytes 2>/dev/null | numfmt --to=iec-i --suffix=B)"
;; ;;
"2") "1"|"2")
set $( echo "${NETWORK_OPENVPN_STATUS}" | grep ${ndtl_device}'\.') &>/dev/null network_common_openvpn_stats_get "${ndtl_device}" ""
# i=1; while [[ $i -lt 50 ]]; do eval "val=\${$i}"; echo "($i):[${val}]" 1>&2; i=$(( $i + 1)); done if [[ ( "${ndtl_type}" == "1") && ( "${ndtl_status}" == "1") && ( "${ovpn_stat_client_name}" == "") ]]
then
ndtl_status="2"
ndtl_bytes_received="$( echo ${18/bytes,} | numfmt --to=iec-i --suffix=B)" ndtl_bytes_received=""
ndtl_bytes_sent="$( echo ${22/bytes,} | numfmt --to=iec-i --suffix=B)" ndtl_bytes_sent=""
else
ndtl_bytes_received="$( echo ${ovpn_stat_bytes_received} | numfmt --to=iec-i --suffix=B)"
ndtl_bytes_sent="$( echo ${ovpn_stat_bytes_sent} | numfmt --to=iec-i --suffix=B)"
fi
;; ;;
esac esac
tab_assign NETWORK_DST_TAB "${ndtl_id},Status" "${ndtl_status}"
if [[ "${ndtl_status}" == "1" ]] if [[ "${ndtl_status}" == "1" ]]
then then
@@ -388,9 +465,20 @@ network_dst_tab_get()
network_dst_tab_dump() network_dst_tab_dump()
{ {
echo "NETWORK_DST_TYPE:"
for key in "${!NETWORK_DST_TYPE[@]}"
do
echo "[${key}]: [${NETWORK_DST_TYPE[${key}]}]"
done | sort -n
echo
echo "NETWORK_DST_ID_LIST: [${NETWORK_DST_ID_LIST}]" echo "NETWORK_DST_ID_LIST: [${NETWORK_DST_ID_LIST}]"
echo echo
echo "NETWORK_DST_NAME_IDX:" echo "NETWORK_DST_NAME_IDX:"
for key in "${!NETWORK_DST_NAME_IDX[@]}" for key in "${!NETWORK_DST_NAME_IDX[@]}"
@@ -400,6 +488,7 @@ network_dst_tab_dump()
echo echo
echo "NETWORK_DST_DEV_IDX:" echo "NETWORK_DST_DEV_IDX:"
for key in "${!NETWORK_DST_DEV_IDX[@]}" for key in "${!NETWORK_DST_DEV_IDX[@]}"
@@ -409,6 +498,7 @@ network_dst_tab_dump()
echo echo
echo "NETWORK_DST_TAB:" echo "NETWORK_DST_TAB:"
for key in "${!NETWORK_DST_TAB[@]}" for key in "${!NETWORK_DST_TAB[@]}"
@@ -552,13 +642,24 @@ network_src_tab_load()
device_num="$(( ( ${ip_num} - ${ip_base}) / 4))" device_num="$(( ( ${ip_num} - ${ip_base}) / 4))"
nstl_device="${NETWORK_SRC_LOCAL_DEVICE}-${device_num}" nstl_device="${NETWORK_SRC_LOCAL_DEVICE}-${device_num}"
;;& nstl_status="$( ip link show dev ${nstl_device} 2>/dev/null | grep -q ",UP," && echo "1" || echo "0")"
if [[ "${nstl_status}" == 1 ]]
then
nstl_bytes_received="$( cat /sys/class/net/${nstl_device}/statistics/rx_bytes 2>/dev/null | numfmt --to=iec-i --suffix=B)"
nstl_bytes_sent="$( cat /sys/class/net/${nstl_device}/statistics/tx_bytes 2>/dev/null | numfmt --to=iec-i --suffix=B)"
nstl_start_date="$( stat -c %Z /sys/class/net/${nstl_device})"
nstl_uptime="$( echo $(( $(date +%s) - ${nstl_start_date})) | awk '{days = int($1/86400); print days " day" (( days > 1 ) ? "s" : "") strftime(" %H:%M:%S", $1,1)}')"
else
nstl_bytes_received=""
nstl_bytes_sent=""
nstl_uptime=""
nstl_last_seen=""
fi
;;
"1") # Routed "1") # Routed
nstl_device="" nstl_device=""
;;&
"0"|"1") # Local + Routed
nstl_status="2" nstl_status="2"
nstl_bytes_received="" nstl_bytes_received=""
@@ -568,12 +669,9 @@ network_src_tab_load()
;; ;;
"2") # OpenVPN "2") # OpenVPN
# nstl_device="tun0" network_common_openvpn_stats_get "" "${nstl_host_name}"
# nstl_status_line="$( echo "${NETWORK_OPENVPN_STATUS}" | grep "${nstl_device}.status: CLIENT_LIST.*${nstl_ip},")"
nstl_status_line="$( echo "${NETWORK_OPENVPN_STATUS}" | grep "CLIENT_LIST,.*${nstl_ip},")" if [[ "${ovpn_stat_device}" == "" ]]
if [[ "${nstl_status_line}" == "" ]]
then then
nstl_device="" nstl_device=""
nstl_status="0" nstl_status="0"
@@ -582,18 +680,12 @@ network_src_tab_load()
nstl_start_date="" nstl_start_date=""
nstl_uptime="" nstl_uptime=""
nstl_last_seen="$( stat -c "%x" /etc/openvpn/status/${nstl_host_name}.status 2>/dev/null | sed -e 's/\..*//')" nstl_last_seen="$( stat -c "%x" /etc/openvpn/status/${nstl_host_name}.status 2>/dev/null | sed -e 's/\..*//')"
else else
nstl_device="${ovpn_stat_device}"
nstl_status="1" nstl_status="1"
nstl_bytes_received=$( echo ${ovpn_stat_bytes_sent} | numfmt --to=iec-i --suffix=B)
IFS=, nstl_bytes_sent=$( echo ${ovpn_stat_bytes_sent} | numfmt --to=iec-i --suffix=B)
set ${nstl_status_line} &>/dev/null nstl_start_date=${ovpn_stat_connected_date}
unset IFS
nstl_device="$( echo $1 | sed -e "s%.*/%%" -e 's/.status.*//')"
nstl_bytes_received=$( echo ${6} | numfmt --to=iec-i --suffix=B)
nstl_bytes_sent=$( echo ${7} | numfmt --to=iec-i --suffix=B)
nstl_start_date=${8}
nstl_uptime=$( echo "$(($(date +%s) - $(date -d "${nstl_start_date}" +%s)))" | awk '{days = int($1/86400); print days " day" (( days > 1 ) ? "s" : "") strftime(" %H:%M:%S", $1,1)}') nstl_uptime=$( echo "$(($(date +%s) - $(date -d "${nstl_start_date}" +%s)))" | awk '{days = int($1/86400); print days " day" (( days > 1 ) ? "s" : "") strftime(" %H:%M:%S", $1,1)}')
nstl_last_seen="$(stat -c "%x" /etc/openvpn/status/${nstl_host_name}.status 2>/dev/null | sed -e 's/\..*//')" nstl_last_seen="$(stat -c "%x" /etc/openvpn/status/${nstl_host_name}.status 2>/dev/null | sed -e 's/\..*//')"
fi fi
@@ -680,6 +772,16 @@ network_src_tab_get()
network_src_tab_dump() network_src_tab_dump()
{ {
echo "NETWORK_SRC_TYPE:"
for key in "${!NETWORK_SRC_TYPE[@]}"
do
echo "[${key}]: [${NETWORK_SRC_TYPE[${key}]}]"
done | sort -n
echo
echo "NETWORK_SRC_ID_LIST: [${NETWORK_SRC_ID_LIST}]" echo "NETWORK_SRC_ID_LIST: [${NETWORK_SRC_ID_LIST}]"
echo echo
@@ -772,7 +874,7 @@ network_route_dst_init()
local dst_id="$1" local dst_id="$1"
network_dst_tab_get ${dst_id} network_dst_tab_get "${dst_id}"
if [[ ${dst_type} == "0" ]] if [[ ${dst_type} == "0" ]]
then then
@@ -792,7 +894,21 @@ network_route_dst_init()
fi fi
target_device=${dst_device} # network_route_rx3_init ${dst_device}
}
#--------------------------------------------------------------------------------------------------------------------------
# network_route_rx3_init
#--------------------------------------------------------------------------------------------------------------------------
network_route_rx3_init()
{
local target_device="$1"
log_trace "Network" "Add [${target_device}] Rx3 routes in VPN tables" log_trace "Network" "Add [${target_device}] Rx3 routes in VPN tables"
@@ -806,7 +922,7 @@ network_route_dst_init()
if [[ "${ip_route_device}" == "${target_device}" ]] if [[ "${ip_route_device}" == "${target_device}" ]]
then then
${DEBUG} ip route add ${ip_route_ip}/${ip_route_mask} table ${dst_table} dev ${ip_route_device} ${DEBUG} ip route add ${ip_route_ip}/${ip_route_mask} dev ${ip_route_device} table ${dst_table}
fi fi
done done
done done
@@ -845,6 +961,111 @@ network_route_other_init()
#--------------------------------------------------------------------------------------------------------------------------
# network_device_init
#--------------------------------------------------------------------------------------------------------------------------
network_device_init()
{
local dst_id="$1"
local device_name="$2"
log_trace "Network" "Init dst_id: [${dst_id}] device_name: [${device_name}]"
if [[ "${dst_id}" == "" ]]
then
network_dst_tab_dev_lookup "${device_name}"
fi
if [[ "${dst_id}" != "" ]]
then
network_route_dst_init "${dst_id}"
device_name="${dst_device}"
fi
network_route_rx3_init "${device_name}"
}
#--------------------------------------------------------------------------------------------------------------------------
# network_device_deinit
#--------------------------------------------------------------------------------------------------------------------------
network_device_deinit()
{
local dst_id="$1"
local device_name="$2"
log_trace "Network" "DeInit dst_id: [${dst_id}] device_name: [${device_name}]"
if [[ "${dst_id}" == "" ]]
then
network_dst_tab_dev_lookup "${device_name}"
fi
if [[ "${dst_id}" != "" ]]
then
network_dst_tab_get "${dst_id}"
network_dst_ip_update "0.0.0.0"
fi
}
#--------------------------------------------------------------------------------------------------------------------------
# network_dst_init
#--------------------------------------------------------------------------------------------------------------------------
#
#network_device_name_init()
#{
# local dst_id="$1"
#
#
# if [[ "${dst_id}" != "" ]]
# then
# network_dst_tab_get "${dst_id}"
#
# network_route_dst_init "${dst_id}"
#
# network_route_rx3_init "${dst_device}"
#
# fi
#
# network_route_rx3_init "${target_device}"
#}
#--------------------------------------------------------------------------------------------------------------------------
# network_device_name_init
#--------------------------------------------------------------------------------------------------------------------------
#
#network_device_name_init()
#{
# local target_device="$1"
#
#
# network_dst_tab_dev_lookup ${target_device}
#
# if [[ "${dst_id}" != "" ]]
# then
# network_route_dst_init "${dst_id}"
# fi
#
# network_route_rx3_init "${target_device}"
#}
#-------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------
# network_route_init # network_route_init
#-------------------------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------------------------
@@ -853,9 +1074,15 @@ network_route_init()
{ {
for dst_id in ${NETWORK_DST_ID_LIST} for dst_id in ${NETWORK_DST_ID_LIST}
do do
network_route_dst_init ${dst_id} network_device_init "${dst_id}" ""
network_route_other_init ${dst_id} network_route_other_init "${dst_id}"
done done
# for dst_id in ${NETWORK_DST_ID_LIST}
# do
# network_route_dst_init ${dst_id}
# network_route_other_init ${dst_id}
# done
} }
@@ -964,13 +1191,18 @@ network_dst_address_refresh()
network_dst_tab_get "${dst_id}" network_dst_tab_get "${dst_id}"
if [[ ( "${dst_host_name}" != "" ) ]] if [[ ( "${dst_host_name}" != "" )]]
then then
if [[ ${dst_host_name} =~ ([0-9]+) ]] if [[ ${dst_host_name} =~ ([0-9]+) ]]
then then
proxy_host="proxy${BASH_REMATCH[1]}.${NETWORK_DST_PROXY_NAME}" proxy_host="proxy${BASH_REMATCH[1]}.${NETWORK_DST_PROXY_NAME}"
if [[ ( "${dst_ip}" != "0.0.0.0") && ( "${dst_status}" != 1)]]
then
dst_ip_new="0.0.0.0"
else
dst_ip_new="$( nc -w ${NETWORK_NC_TIMEOUT} ${proxy_host} ${proxy_port} 2>/dev/null)" dst_ip_new="$( nc -w ${NETWORK_NC_TIMEOUT} ${proxy_host} ${proxy_port} 2>/dev/null)"
fi
if is_valid_ip "${dst_ip_new}" if is_valid_ip "${dst_ip_new}"
then then

View File

@@ -39,23 +39,8 @@ Local_Netmask="$5"
network_init network_init
network_dst_tab_dev_lookup "${Dev}" log_info "VPN-Down" "[${Dev}]: Local_MTU: [${Local_MTU}] Remote_MTU: [${Remote_MTU}] Local_Address: [${Local_Address}] Local_Netmask: [${Local_Netmask}] Dst_Table: [${dst_table}] Phase: [${Phase}] Status: [OK]"
network_dst_tab_get "${dst_id}"
network_device_deinit "" "${Dev}"
line="[${Dev}]: Local_MTU: [${Local_MTU}] Remote_MTU: [${Remote_MTU}] Local_Address: [${Local_Address}] Local_Netmask: [${Local_Netmask}] Dst_Table: [${dst_table}] Phase: [${Phase}]"
if [[ "${dst_table}" != "" ]]
then
log_info "VPN-Down" "$line" " Status: [OK]"
remote_address=0.0.0.0
log_trace "VPN-Down" "[${Dev}]: set ${remote_address} to vpn${id}.vpn.rx3"
${DEBUG} ip_host_update vpn${id} vpn.rx3 ${remote_address} 60
else
log_error "VPN-Down" "$line" " Status: [ERROR]!"
fi
log_trace "VPN-Down" "[${Dev}]: Done!" log_trace "VPN-Down" "[${Dev}]: Done!"

View File

@@ -40,20 +40,9 @@ Local_Netmask="$5"
network_init network_init
network_dst_tab_dev_lookup "${Dev}"
network_dst_tab_get "${dst_id}"
log_info "VPN-Up" "[${Dev}]: Local_MTU: [${Local_MTU}] Remote_MTU: [${Remote_MTU}] Local_Address: [${Local_Address}] Local_Netmask: [${Local_Netmask}] Phase: [${Phase}] Status: [OK]"
line="[${Dev}]: Local_MTU: [${Local_MTU}] Remote_MTU: [${Remote_MTU}] Local_Address: [${Local_Address}] Local_Netmask: [${Local_Netmask}] Dst_Table: [${dst_table}] Dst_Id: [${dst_id}] Phase: [${Phase}]" network_device_init "" "${Dev}"
if [[ "${dst_table}" != "" ]]
then
log_info "VPN-Up" "$line" " Status: [OK]"
log_trace "VPN-Up" "[${Dev}]: ip route add table: [${dst_table}] default dev: [${Dev}]"
network_route_dst_init ${dst_id}
else
log_error "VPN-Up" "$line" " Status: [ERROR]!"
fi
log_trace "VPN-Up" "[${Dev}]: Done!" log_trace "VPN-Up" "[${Dev}]: Done!"

View File

@@ -129,12 +129,25 @@ Destination_Status_Board()
then then
echo -n "<TR><TD class="header">${dst_id}</TD><TD>${dst_name}</TD><TD>${NETWORK_DST_TYPE[${dst_type}]}</TD><TD>${dst_device}</TD>" echo -n "<TR><TD class="header">${dst_id}</TD><TD>${dst_name}</TD><TD>${NETWORK_DST_TYPE[${dst_type}]}</TD><TD>${dst_device}</TD>"
if [[ "${dst_status}" == 1 ]] case "${dst_status}"
then in
echo -n "<TD><IMG SRC=\"/icons/user-online.png\" TITLE=\"Up\" ALT=\"Up\"></TD>" "0")
else
echo -n "<TD><IMG SRC=\"/icons/user-busy.png\" TITLE=\"Down\" ALT=\"Down\"></TD>" echo -n "<TD><IMG SRC=\"/icons/user-busy.png\" TITLE=\"Down\" ALT=\"Down\"></TD>"
fi ;;
"1")
echo -n "<TD><IMG SRC=\"/icons/user-online.png\" TITLE=\"Up\" ALT=\"Up\"></TD>"
;;
"2")
echo -n "<TD><IMG SRC=\"/icons/user-unready.png\" TITLE=\"Unready\" ALT=\"Unready\"></TD>"
;;
*)
echo -n "<TD><IMG SRC=\"\" TITLE=\"Unknown\" ALT=\"Unknown\"></TD>"
;;
esac
echo "<TD>${dst_ip:--}</TD><TD>${dst_host_name:--}</TD><TD>${dst_config:--}</TD><TD>${dst_table}</TD><TD>${dst_bytes_received:--}</TD><TD>${dst_bytes_sent:--}</TD><TD>${dst_uptime:--}</TD>" echo "<TD>${dst_ip:--}</TD><TD>${dst_host_name:--}</TD><TD>${dst_config:--}</TD><TD>${dst_table}</TD><TD>${dst_bytes_received:--}</TD><TD>${dst_bytes_sent:--}</TD><TD>${dst_uptime:--}</TD>"
else else