#!/bin/sh
# ikuai-compat-fw3：用 fw3 生成规则、经 uclibc iptables 兼容层落地到 iKuai 内核 netfilter。
# 宿主内核只有 legacy netfilter，fw3 进程内 libiptc(musl) 无法驱动它；故不调用 fw3 的
# 应用路径，而是取其 print 输出（一串 iptables 命令）交给兼容层 iptables 执行。
#
# 清理仅针对 fw3 自己：删除带 "!fw3" 注释的规则，以及 fw3 用 -N 声明的链——不碰
# 插件（OpenClash 等）加的链与跳转，因此 /etc/init.d/firewall restart 不会打断插件。
FW3=/sbin/fw3
SEL="iptables"
TABLES="filter nat mangle raw"

rules() { "$FW3" print 2>/dev/null | grep -E "^${SEL} "; }

flush_fw3() {
  local t r
  for t in $TABLES; do
    # 删除 fw3 标记的规则（跨所有链）
    iptables -t "$t" -S 2>/dev/null | grep '^-A ' | grep -F '!fw3' | sed 's/^-A /-D /' > /tmp/.fw3del
    while IFS= read -r r; do
      [ -n "$r" ] && iptables -t "$t" $r 2>/dev/null
    done < /tmp/.fw3del
  done
  # 删除 fw3 自己声明的链（逆序，先删被引用的）
  rules | sed -nE "s/^${SEL} -t ([a-z]+) -N (.+)$/\1 \2/p" \
    | awk '{a[NR]=$0} END{for(i=NR;i>=1;i--) print a[i]}' > /tmp/.fw3ch
  while IFS=' ' read -r t c; do
    [ -n "$c" ] || continue
    iptables -t "$t" -F "$c" 2>/dev/null
    iptables -t "$t" -X "$c" 2>/dev/null
  done < /tmp/.fw3ch
  rm -f /tmp/.fw3del /tmp/.fw3ch 2>/dev/null
  return 0
}

apply_rules() { rules | sh 2>/dev/null; return 0; }

case "$1" in
  stop|flush) flush_fw3 ;;
  apply|reload|restart|start|"") flush_fw3; apply_rules ;;
  print) rules ;;
  *) echo "usage: ikuai-compat-fw3 apply|stop|print" >&2; exit 2 ;;
esac
