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:
@@ -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'
|
||||||
|
|||||||
Reference in New Issue
Block a user