package app import ( "net/http" "syscall" ) func handleTrafficAdvancedReset(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } lock, lockMsg := acquireTrafficApplyLock() if lockMsg != nil { writeJSON(w, http.StatusOK, *lockMsg) return } defer func() { _ = syscall.Flock(int(lock.Fd()), syscall.LOCK_UN) _ = lock.Close() }() prev := normalizeTrafficModeState(loadTrafficModeState()) next := prev next.AutoLocalBypass = false next.IngressReplyBypass = false nextIface, _ := resolveTrafficIface(next.PreferredIface) if err := applyTrafficMode(next, nextIface); err != nil { prevIface, _ := resolveTrafficIface(prev.PreferredIface) _ = applyTrafficMode(prev, prevIface) msg := evaluateTrafficMode(prev) msg.Message = "advanced reset failed, rolled back: " + err.Error() writeJSON(w, http.StatusOK, msg) return } if err := saveTrafficModeState(next); err != nil { prevIface, _ := resolveTrafficIface(prev.PreferredIface) _ = applyTrafficMode(prev, prevIface) _ = saveTrafficModeState(prev) msg := evaluateTrafficMode(prev) msg.Message = "advanced reset save failed, rolled back: " + err.Error() writeJSON(w, http.StatusOK, msg) return } res := evaluateTrafficMode(next) if !res.Healthy { prevIface, _ := resolveTrafficIface(prev.PreferredIface) _ = applyTrafficMode(prev, prevIface) _ = saveTrafficModeState(prev) rolled := evaluateTrafficMode(prev) rolled.Message = "advanced reset verification failed, rolled back: " + res.Message writeJSON(w, http.StatusOK, rolled) return } events.push("traffic_advanced_reset", map[string]any{ "mode": res.Mode, "applied": res.AppliedMode, "active_iface": res.ActiveIface, "healthy": res.Healthy, "auto_local": res.AutoLocalBypass, "ingress_reply": res.IngressReplyBypass, "advanced_active": res.AdvancedActive, }) res.Message = "advanced bypass reset" writeJSON(w, http.StatusOK, res) }