RKNnoVPN/module/scripts/rescue_reset.sh
2026-05-07 19:44:47 +03:00

133 lines
3.7 KiB
Shell

#!/system/bin/sh
# ============================================================================
# RKNnoVPN rescue_reset.sh
#
# Root-level cleanup that does not trust runtime state, PID files, or stale
# iptables backup. It removes only RKNnoVPN-owned network artifacts.
#
# Modes:
# runtime-reset - runtime cleanup while preserving reset window
# hard-reset - external rescue; kill stale runtime processes
# update-clean - called by updater; keep staged update state
# uninstall-clean - called by module removal; kill runtime without changing
# user config/manual state
# ============================================================================
set +e
MODE="${1:-hard-reset}"
case "$MODE" in
reset)
MODE="hard-reset"
;;
runtime-reset|hard-reset|update-clean|uninstall-clean)
;;
*)
echo "Usage: $0 {runtime-reset|hard-reset|update-clean|uninstall-clean}" >&2
exit 2
;;
esac
IPT_WAIT_WAS_SET="${IPT_WAIT+x}"
SCRIPT_DIR="${0%/*}"
if [ -f "${SCRIPT_DIR}/lib/rknnovpn_env.sh" ]; then
. "${SCRIPT_DIR}/lib/rknnovpn_env.sh"
fi
if [ -f "${SCRIPT_DIR}/lib/rknnovpn_netstack.sh" ]; then
. "${SCRIPT_DIR}/lib/rknnovpn_netstack.sh"
fi
if [ -z "$IPT_WAIT_WAS_SET" ]; then
IPT_WAIT="-w 10"
fi
LOG_FILE="${LOG_FILE:-${LOG_DIR:-$RKNNOVPN_DIR/logs}/rescue_reset.log}"
TAG="rknnovpn:reset"
mkdir -p "$RUN_DIR" "$CONFIG_DIR" "${LOG_FILE%/*}" 2>/dev/null
log() {
_ts="$(date '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo '----')"
_msg="$_ts [$MODE] $*"
echo "$_msg" >> "$LOG_FILE" 2>/dev/null
/system/bin/log -t "$TAG" -p i "$*" 2>/dev/null
echo "$*"
}
rknnovpn_enter_reset_mode
if [ "$MODE" = "runtime-reset" ] || [ "$MODE" = "hard-reset" ]; then
rknnovpn_set_manual_mode
fi
log "[1/8] asking runtime CLI for graceful stop"
if [ -x "$RKNNOVPN_DIR/bin/rknnovpn-runtime" ] && [ "$MODE" = "hard-reset" ]; then
"$RKNNOVPN_DIR/bin/rknnovpn-runtime" stop >/dev/null 2>&1 || true
fi
kill_matching_processes() {
signal="$1"
for p in /proc/[0-9]*; do
pid="${p##*/}"
[ "$pid" = "$$" ] && continue
[ -r "$p/cmdline" ] || continue
cmd="$(cat "$p/cmdline" 2>/dev/null | tr '\000' ' ')"
[ -z "$cmd" ] && continue
case "$cmd" in
*"$RKNNOVPN_DIR/bin/sing-box"*|\
*"$RKNNOVPN_DIR/bin/xray"*|\
*"$RKNNOVPN_DIR/scripts/net_handler.sh"*|*"inotifyd"*"${RKNNOVPN_DIR}/scripts/net_handler.sh"*)
log "$signal $pid :: $cmd"
kill "-$signal" "$pid" 2>/dev/null
;;
esac
done
}
log "[2/8] killing orphan sing-box/xray/net_handler processes"
kill_matching_processes TERM
sleep 1
kill_matching_processes KILL
log "[3/8] stopping bundled runtime pieces"
if [ -x "$RKNNOVPN_DIR/scripts/dns.sh" ]; then
IPT_WAIT="$IPT_WAIT" "$RKNNOVPN_DIR/scripts/dns.sh" stop >/dev/null 2>&1 || true
fi
if [ -x "$RKNNOVPN_DIR/scripts/iptables.sh" ]; then
IPT_WAIT="$IPT_WAIT" "$RKNNOVPN_DIR/scripts/iptables.sh" stop >/dev/null 2>&1 || true
fi
log "[4/8] deleting RKNnoVPN iptables/ip6tables artifacts"
rknnovpn_cleanup_iptables_all
log "[5/8] deleting RKNnoVPN policy routing"
rknnovpn_delete_policy_routes
log "[6/8] removing stale runtime files"
rknnovpn_remove_runtime_snapshots
leftovers=""
add_leftover() {
if [ -z "$leftovers" ]; then
leftovers="$1"
else
leftovers="${leftovers}; $1"
fi
}
log "[7/8] verifying cleanup"
out="$(rknnovpn_collect_netstack_leftovers)"
[ -n "$out" ] && add_leftover "$out"
log "[8/8] finishing"
if [ "$MODE" != "runtime-reset" ]; then
rknnovpn_leave_reset_mode
fi
if [ -n "$leftovers" ]; then
log "leftovers remain: $leftovers"
exit 1
fi
log "cleanup complete"
exit 0