From 088c256f58e4f538608d4b22438097a47ef3973c Mon Sep 17 00:00:00 2001 From: kitadmin Date: Thu, 23 Jul 2026 03:38:03 +0000 Subject: [PATCH] fix: ping local gateway instead of curl when ICMP gives 100% loss curl --interface fails for root on Synology due to policy routing. Pinging the local gateway (e.g. Eyeride at 192.168.10.1) works reliably and confirms the WAN path is up even when internet ICMP is NAT-blocked. Co-Authored-By: Claude Sonnet 4.6 --- .../usr/lib/busrouter/telemetry-synology.sh | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/package/kit-busrouter/files/usr/lib/busrouter/telemetry-synology.sh b/package/kit-busrouter/files/usr/lib/busrouter/telemetry-synology.sh index 5aec31b..f87848e 100755 --- a/package/kit-busrouter/files/usr/lib/busrouter/telemetry-synology.sh +++ b/package/kit-busrouter/files/usr/lib/busrouter/telemetry-synology.sh @@ -239,16 +239,19 @@ _ping_iface() { # Extract loss _loss=$(echo "$_out" | sed -n 's/.* \([0-9]*\)% packet loss.*/\1/p') [ -z "$_loss" ] && _loss="null" - # If ICMP reports 100% loss, try HTTP probe — Eyeride NAT blocks ICMP but passes HTTP. + # If ICMP to internet gives 100% loss, ping the local gateway — + # Eyeride NAT drops internet ICMP but the gateway (192.168.10.1) is reachable locally. if [ "$_loss" = "100" ]; then - _t0=$(date +%s%3N 2>/dev/null || date +%s) - _hcode=$(curl -s --interface "$_iface" --connect-timeout 5 --max-time 8 \ - -o /dev/null -w "%{http_code}" http://1.1.1.1 2>/dev/null) - _t1=$(date +%s%3N 2>/dev/null || date +%s) - if [ -n "$_hcode" ] && [ "$_hcode" != "000" ]; then - _loss="0" - [ -z "$_avg" ] || [ "$_avg" = "null" ] && \ - _avg=$(awk "BEGIN { printf \"%.0f\", ${_t1} - ${_t0} }" 2>/dev/null) + _gw=$(ip route show 2>/dev/null | grep "dev $_iface" | grep -v "^default" | awk '/via/{print $3; exit} /kernel/{print ""}' | head -1) + [ -z "$_gw" ] && _gw=$(ip route show default 2>/dev/null | grep "dev $_iface" | awk '{print $3}' | head -1) + if [ -n "$_gw" ]; then + _gw_out=$(ping -c 3 -W 2 "$_gw" 2>/dev/null) + _gw_loss=$(echo "$_gw_out" | sed -n 's/.* \([0-9]*\)% packet loss.*/\1/p') + if [ -n "$_gw_loss" ] && [ "$_gw_loss" != "100" ]; then + _loss="$_gw_loss" + _avg=$(echo "$_gw_out" | tail -1 | sed -n 's/.*=\ [0-9.]*\/\([0-9.]*\)\/.*/\1/p') + [ -z "$_avg" ] && _avg="null" + fi fi fi printf '%s %s %s\n' "${_avg}" "${_jitter}" "${_loss}" | tr -d '\n\r'