From 235076b6b9647149f41e8f5aa8e9f2b213e4b85f Mon Sep 17 00:00:00 2001 From: "Arnaud G. GIBERT" Date: Tue, 26 Aug 2025 19:14:05 +0200 Subject: [PATCH] - Complete the first gateway support implementation, - More tests needed! --- ReleaseNotes.txt | 2 +- usr/local/lib/network.bash | 123 +++++++++++++++++++++++++++++-------- usr/local/lib/vpn.bash | 13 ++-- 3 files changed, 107 insertions(+), 31 deletions(-) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 3486311..209fdfb 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,5 +1,5 @@ ------------------------------------------------------------------------------------------------------------------------------------ -Network Tools V 1.1.0 - A. GIBERT - 2025/09/?? +Network Tools V 1.1.0 - A. GIBERT - 2025/08/26 ------------------------------------------------------------------------------------------------------------------------------------ - Add VPN Gateway support. diff --git a/usr/local/lib/network.bash b/usr/local/lib/network.bash index 49dfa81..637ee2f 100644 --- a/usr/local/lib/network.bash +++ b/usr/local/lib/network.bash @@ -297,7 +297,7 @@ network_dst_tab_load() tab_assign NETWORK_DST_TAB "${ndtl_id},Status" "${ndtl_status}" - if [[ "${ndtl_type}" == "1" ]] + if [[ "${ndtl_type}" == "5" ]] then ndtl_host_name="" dns_value="" @@ -453,6 +453,55 @@ network_dst_tab_dev_lookup() +#-------------------------------------------------------------------------------------------------------------------------- +# network_dst_ip_update +#-------------------------------------------------------------------------------------------------------------------------- + +network_dst_ip_update() +{ + local dst_ip_new="$1" + + + if [[ "${dst_ip}" != "${dst_ip_new}" ]] + then + log_info "Network" "Update ${dst_host_name}: Old: [${dst_ip}] New: [${dst_ip_new}]" + + ${DEBUG} /usr/local/sbin/ip_host_update "${dst_host_name/.*}" "${dst_host_name#*.}" "${dst_ip_new}" 60 + tab_assign NETWORK_DST_TAB "${dst_id},IP" "${dst_ip_new}" + else + log_trace "Network" "Skiping ${dst_host_name}: IP: [${dst_ip}]" + fi +} + + + + + +#-------------------------------------------------------------------------------------------------------------------------- +# network_dst_name_ip_update +#-------------------------------------------------------------------------------------------------------------------------- + +network_dst_name_ip_update() +{ + local dst_name="$1" + local dst_ip_new="$2" + + + network_dst_tab_name_lookup "${job_name}" + + if [[ "${dst_id}" != "" ]] + then + network_dst_tab_get "${dst_id}" + network_dst_ip_update "${dst_ip_new}" + else + log_error "Network: dst name not found: [${dst_name}]" + fi +} + + + + + #-------------------------------------------------------------------------------------------------------------------------- # network_src_tab_load #-------------------------------------------------------------------------------------------------------------------------- @@ -519,12 +568,15 @@ network_src_tab_load() ;; "2") # OpenVPN - nstl_device="tun0" - nstl_status_line="$( echo "${NETWORK_OPENVPN_STATUS}" | grep "${nstl_device}.log: CLIENT_LIST.*${nstl_ip},")" +# nstl_device="tun0" +# 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 [[ "${nstl_status_line}" == "" ]] then - nstl_status="0" + nstl_device="" + nstl_status="0" nstl_bytes_received="" nstl_bytes_sent="" nstl_start_date="" @@ -537,7 +589,8 @@ network_src_tab_load() IFS=, set ${nstl_status_line} &>/dev/null 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} @@ -879,36 +932,55 @@ network_table_set() +#-------------------------------------------------------------------------------------------------------------------------- +# network_dst_address_init_all +#-------------------------------------------------------------------------------------------------------------------------- + +network_dst_address_init_all() +{ + for dst_id in ${NETWORK_DST_ID_LIST} + do + network_dst_tab_get "${dst_id}" + network_dst_ip_update "0.0.0.0" + done +} + + + + + #-------------------------------------------------------------------------------------------------------------------------- # network_dst_address_refresh #-------------------------------------------------------------------------------------------------------------------------- network_dst_address_refresh() { - local dst_id="$1" - local dst_host_name="$2" - local dst_ip_old="$3" + local dst_id="$1" - local dst_ip_new - local proxy_host="proxy${dst_id}.${NETWORK_DST_PROXY_NAME}" - local proxy_port=8080 + local dst_ip_new + local proxy_host + local proxy_port=8080 - dst_ip_new=$( nc -w ${NETWORK_NC_TIMEOUT} ${proxy_host} ${proxy_port}) + network_dst_tab_get "${dst_id}" - if is_valid_ip ${dst_ip_new} + if [[ ( "${dst_host_name}" != "" ) ]] then - if [[ "${dst_ip_old}" != "${dst_ip_new}" ]] - then - log_info "Network" "Update ${dst_host_name}: Old: [${dst_ip_old}] New: [${dst_ip_new}]" - ${DEBUG} /usr/local/sbin/ip_host_update "${dst_host_name/.*}" "${dst_host_name#*.}" "${dst_ip_new}" 60 + if [[ ${dst_host_name} =~ ([0-9]+) ]] + then + proxy_host="proxy${BASH_REMATCH[1]}.${NETWORK_DST_PROXY_NAME}" - tab_assign NETWORK_DST_TAB "${dst_id},IP" "${dst_ip_new}" - else - log_trace "Network" "Skiping ${dst_host_name}: IP: [${dst_ip_old}]" - fi - else - log_info "Network" "Skiping ${dst_host_name}: Invalid IP: [${dst_ip_new}] Old IP: [${dst_ip_old}]" + dst_ip_new="$( nc -w ${NETWORK_NC_TIMEOUT} ${proxy_host} ${proxy_port} 2>/dev/null)" + + if is_valid_ip "${dst_ip_new}" + then + network_dst_ip_update "${dst_ip_new}" + else + log_info "Network" "Skiping: [${dst_host_name}]: Invalid IP: [${dst_ip_new}]" + fi + else + log_info "Network" "Skiping: dst_id: [${dst_id}]: Invalid host_name: [${dst_host_name}]" + fi fi } @@ -924,8 +996,7 @@ network_dst_address_refresh_all() { for dst_id in ${NETWORK_DST_ID_LIST} do - network_dst_tab_get ${dst_id} - network_dst_address_refresh ${dst_id} ${dst_host_name} ${dst_ip} + network_dst_address_refresh "${dst_id}" done } @@ -1267,6 +1338,8 @@ network_start() network_forward_start + network_dst_address_init_all + log_info "Network" "Network started!" } diff --git a/usr/local/lib/vpn.bash b/usr/local/lib/vpn.bash index 1d4135e..7869cf2 100644 --- a/usr/local/lib/vpn.bash +++ b/usr/local/lib/vpn.bash @@ -208,7 +208,7 @@ vpn_job_tab_init() tab_assign VPN_JOB_TAB "${job_id},Name" "${dst_name}" tab_assign VPN_JOB_TAB "${job_id},PId" "0" - tab_assign VPN_JOB_TAB "${job_id},Cmd" "/usr/sbin/openvpn --config ${config_file} --dev ${dst_device} --daemon" + tab_assign VPN_JOB_TAB "${job_id},Cmd" "/usr/sbin/openvpn --config ${config_file} --daemon" tab_assign VPN_JOB_TAB "${job_id},Date" "" tab_assign VPN_JOB_NAME_IDX "${dst_name}" "${job_id}" @@ -314,7 +314,8 @@ vpn_supervisor() for job_id in ${VPN_JOB_ID_LIST} do vpn_job_tab_get "${job_id}" - + + ${DEBUG} kill -0 "${job_pid}" 2>/dev/null rc=$? @@ -323,18 +324,20 @@ vpn_supervisor() log_info "VPN" "Restarting Cmd: [${job_cmd}]..." eval ${DEBUG} ${job_cmd} - + job_pid="$( ps aux | grep "${job_cmd}" | grep -v grep | head -1 | awk '{print $2}')" if [[ "${job_pid}" == "" ]] then job_pid=0 fi - + tab_assign VPN_JOB_TAB "${job_id},PId" "${job_pid}" tab_assign VPN_JOB_TAB "${job_id},Date" "$(date --rfc-3339=seconds -u)" - + log_info "VPN" "PId: [${VPN_JOB_TAB["${job_id},PId"]}]!" + + network_dst_name_ip_update "${job_name}" "0.0.0.0" fi done