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 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 03:38:03 +00:00
parent bbbc873bdb
commit 088c256f58
@@ -239,16 +239,19 @@ _ping_iface() {
# Extract loss # Extract loss
_loss=$(echo "$_out" | sed -n 's/.* \([0-9]*\)% packet loss.*/\1/p') _loss=$(echo "$_out" | sed -n 's/.* \([0-9]*\)% packet loss.*/\1/p')
[ -z "$_loss" ] && _loss="null" [ -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 if [ "$_loss" = "100" ]; then
_t0=$(date +%s%3N 2>/dev/null || date +%s) _gw=$(ip route show 2>/dev/null | grep "dev $_iface" | grep -v "^default" | awk '/via/{print $3; exit} /kernel/{print ""}' | head -1)
_hcode=$(curl -s --interface "$_iface" --connect-timeout 5 --max-time 8 \ [ -z "$_gw" ] && _gw=$(ip route show default 2>/dev/null | grep "dev $_iface" | awk '{print $3}' | head -1)
-o /dev/null -w "%{http_code}" http://1.1.1.1 2>/dev/null) if [ -n "$_gw" ]; then
_t1=$(date +%s%3N 2>/dev/null || date +%s) _gw_out=$(ping -c 3 -W 2 "$_gw" 2>/dev/null)
if [ -n "$_hcode" ] && [ "$_hcode" != "000" ]; then _gw_loss=$(echo "$_gw_out" | sed -n 's/.* \([0-9]*\)% packet loss.*/\1/p')
_loss="0" if [ -n "$_gw_loss" ] && [ "$_gw_loss" != "100" ]; then
[ -z "$_avg" ] || [ "$_avg" = "null" ] && \ _loss="$_gw_loss"
_avg=$(awk "BEGIN { printf \"%.0f\", ${_t1} - ${_t0} }" 2>/dev/null) _avg=$(echo "$_gw_out" | tail -1 | sed -n 's/.*=\ [0-9.]*\/\([0-9.]*\)\/.*/\1/p')
[ -z "$_avg" ] && _avg="null"
fi
fi fi
fi fi
printf '%s %s %s\n' "${_avg}" "${_jitter}" "${_loss}" | tr -d '\n\r' printf '%s %s %s\n' "${_avg}" "${_jitter}" "${_loss}" | tr -d '\n\r'