From 71c026ccf3b601573cd48ed5329c6062d5a07f6e Mon Sep 17 00:00:00 2001 From: Mock Date: Tue, 14 Apr 2026 00:15:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ip=20route=E5=9C=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8F=98=E5=8C=96=E5=90=8E=E4=B9=9F=E8=A6=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=8C=E6=89=A7=E8=A1=8Croute=20repair?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/boot/blitz-watchdog.sh | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/scripts/boot/blitz-watchdog.sh b/scripts/boot/blitz-watchdog.sh index e41b4ac..bf8b5ca 100644 --- a/scripts/boot/blitz-watchdog.sh +++ b/scripts/boot/blitz-watchdog.sh @@ -243,6 +243,90 @@ resolve_network_interface() { [[ -n "${NETWORK_LAST_INTERFACE}" ]] } +network_route_targets() { + local target + + if [[ -n "${BLITZ_TIME_SERVER_IP:-}" ]]; then + printf '%s\n' "${BLITZ_TIME_SERVER_IP}" + fi + for target in ${BLITZ_5G_ROUTE_TARGETS//,/ }; do + if [[ -n "${target}" && "${target}" != "${BLITZ_TIME_SERVER_IP:-}" ]]; then + printf '%s\n' "${target}" + fi + done +} + +resolve_network_gateway() { + local interface_name="$1" + local default_route + local gateway="" + local tokens=() + local index + + default_route="$(ip -o route show default dev "${interface_name}" 2>/dev/null | head -n 1 || true)" + if [[ -n "${default_route}" ]]; then + read -r -a tokens <<< "${default_route}" + for (( index=0; index<${#tokens[@]}-1; index++ )); do + if [[ "${tokens[index]}" == "via" ]]; then + gateway="${tokens[index + 1]}" + break + fi + done + fi + + if [[ -n "${gateway}" ]]; then + printf '%s\n' "${gateway}" + return 0 + fi + if [[ -n "${BLITZ_5G_GATEWAY:-}" ]]; then + printf '%s\n' "${BLITZ_5G_GATEWAY}" + return 0 + fi + return 1 +} + +repair_network_routes() { + local interface_name="$1" + local gateway="" + local target + local route_output + local rc + + if [[ -z "${interface_name}" ]]; then + return 1 + fi + if ! ping -I "${interface_name}" -c 1 -W 2 "${BLITZ_TIME_SERVER_IP}" >/dev/null 2>&1; then + blitz_log "${STEP}" "route-repair-probe" "failure" "interface=${interface_name} target=${BLITZ_TIME_SERVER_IP}" 1 + return 1 + fi + + gateway="$(resolve_network_gateway "${interface_name}" || true)" + if [[ -z "${gateway}" ]]; then + blitz_log "${STEP}" "route-repair-gateway" "failure" "interface=${interface_name}" 1 + return 1 + fi + + while IFS= read -r target; do + [[ -n "${target}" ]] || continue + if ip route replace "${target}/32" via "${gateway}" dev "${interface_name}"; then + blitz_log "${STEP}" "route-repair-target" "success" "target=${target} interface=${interface_name} gateway=${gateway}" 0 + else + rc=$? + blitz_log "${STEP}" "route-repair-target" "failure" "target=${target} interface=${interface_name} gateway=${gateway}" "${rc}" + return "${rc}" + fi + done < <(network_route_targets) + + route_output="$(blitz_route_ready "${BLITZ_TIME_SERVER_IP}" "${interface_name}" || true)" + if [[ -z "${route_output}" ]]; then + blitz_log "${STEP}" "route-repair-postcheck" "failure" "interface=${interface_name} gateway=${gateway}" 1 + return 1 + fi + + blitz_log "${STEP}" "route-repair-postcheck" "success" "interface=${interface_name} gateway=${gateway} route=${route_output}" 0 + return 0 +} + network_is_healthy() { local route_output @@ -283,6 +367,15 @@ wait_for_network_recovery() { perform_network_recovery() { local rc=0 + if resolve_network_interface && repair_network_routes "${NETWORK_LAST_INTERFACE}"; then + set_last_action "route-repair" + RECOVERY_ACTION_TAKEN=1 + NETWORK_COOLDOWN_UNTIL=$(( $(now_epoch_sec) + BLITZ_NETWORK_RECOVERY_COOLDOWN_SEC )) + NETWORK_FAIL_COUNT=0 + blitz_log "${STEP}" "network-recovery" "success" "mode=route-repair interface=${NETWORK_LAST_INTERFACE}" 0 + return 0 + fi + set_last_action "network-recovery" RECOVERY_ACTION_TAKEN=1 blitz_log "${STEP}" "network-recovery" "start" "fail_count=${NETWORK_FAIL_COUNT}" 0