#!/bin/bash
# 我是代码注释：=============================================================
# 我是代码注释：华为云 Debian 12 双网卡 + VLAN 多出口 SOCKS5 终版（一次跑通 + 一键修改账号端口命令 wawa）
# 我是代码注释：功能清单：
# 我是代码注释：1) eth0 / eth1 各自部署 1 个 SOCKS5（listen=各自私网IP）
# 我是代码注释：2) eth0 下按 /root/ip.txt 创建 VLAN 子接口（每行：VLAN_ID MAC IP），每条 IP 单独 1 个 SOCKS5
# 我是代码注释：3) 每个入口独立出口（Xray outbound sendThrough=对应私网IP + PBR 源地址路由）
# 我是代码注释：4) systemd 托管，关机/重启自恢复
# 我是代码注释：5) 末尾输出每条入口对应“公网IP/端口/用户名/密码”，并落盘到 /root/socks5_endpoints.txt
# 我是代码注释：6) 生成命令：wawa  —— 一键修改用户名/密码/端口，并自动重启全部 Xray 服务
# 我是代码注释：说明：DNS 由你自行解决，本脚本不做 DNS 修复
# 我是代码注释：=============================================================

set -e
# 我是代码注释：遇到错误直接退出，避免半配置状态
trap 'echo "[ERROR] 行号 ${LINENO} 发生错误，脚本中止。"; exit 1' ERR
# 我是代码注释：错误时打印行号，方便排查

# 我是代码注释：------------------------- 基础参数（需要就改这里）-------------------------
ETH0_NAME="eth0"
# 我是代码注释：主网卡名
ETH1_NAME="eth1"
# 我是代码注释：副网卡名（不存在则自动跳过 eth1）
PARENT_IFACE="${ETH0_NAME}"
# 我是代码注释：VLAN 父接口（默认挂在 eth0）
GATEWAY="192.168.0.1"
# 我是代码注释：默认网关（不一样就改）
IP_PREFIX_LEN="24"
# 我是代码注释：掩码长度（常见 /24）
IP_CONFIG_FILE="/root/ip.txt"
# 我是代码注释：VLAN 配置文件（每行：VLAN_ID MAC IP；可空行、可 # 注释、兼容 Windows 换行）
XRAY_BIN_PATH="/usr/local/bin/xray"
# 我是代码注释：xray 二进制路径
XRAY_ETC_DIR="/usr/local/etc/xray"
# 我是代码注释：xray 配置目录
STATE_FILE="/etc/wawa-socks5.env"
# 我是代码注释：保存账号端口等状态（供 wawa 命令与 systemd 使用）
SETUP_SCRIPT="/usr/local/bin/wawa-huawei-netif-setup.sh"
# 我是代码注释：重建 VLAN/PBR 的幂等脚本（开机自动执行）
SUMMARY_FILE="/root/socks5_summary.txt"
# 我是代码注释：部署汇总信息文件
ENDPOINTS_FILE="/root/socks5_endpoints.txt"
# 我是代码注释：输出端点列表文件（全部）
ENDPOINTS_10_FILE="/root/socks5_10_endpoints.txt"
# 我是代码注释：输出端点列表文件（前10条）
WAWA_CMD="/usr/local/bin/wawa"
# 我是代码注释：一键修改命令路径

# 我是代码注释：------------------------- eth1 的 PBR 参数（双网卡常见）-------------------------
PBR_TABLE_ID_ETH1="101"
# 我是代码注释：eth1 路由表 ID
PBR_TABLE_NAME_ETH1="T_eth1"
# 我是代码注释：eth1 路由表名
PBR_PRIORITY_ETH1="10000"
# 我是代码注释：eth1 策略路由优先级
ETH1_SUBNET_CIDR="192.168.0.0/24"
# 我是代码注释：eth1 直连网段（不一样就改）

# 我是代码注释：------------------------- 权限检查 -------------------------
if [ "$(id -u)" -ne 0 ]; then
  # 我是代码注释：必须 root 执行（要写 systemd、写网卡、写路由）
  echo "错误：请使用 root 权限运行此脚本。"
  exit 1
fi

# 我是代码注释：------------------------- 网卡存在性检查 -------------------------
ip link show "${ETH0_NAME}" >/dev/null 2>&1 || { echo "错误：未找到 ${ETH0_NAME}"; exit 1; }
# 我是代码注释：eth0 必须存在
if ! ip link show "${ETH1_NAME}" >/dev/null 2>&1; then
  # 我是代码注释：eth1 不存在则只部署 eth0 + VLAN
  echo "警告：未找到 ${ETH1_NAME}（将跳过 eth1 部署）。"
fi

# 我是代码注释：------------------------- 安装依赖（DNS 你已解决）-------------------------
export DEBIAN_FRONTEND=noninteractive
# 我是代码注释：避免 apt 交互阻塞
apt-get update -y
# 我是代码注释：更新软件索引
apt-get install -y iproute2 vlan wget curl ca-certificates unzip
# 我是代码注释：安装必须包（iproute2/vlan/下载工具/证书/解压）

# 我是代码注释：------------------------- VLAN 模块（开机加载）-------------------------
modprobe 8021q || echo "警告：加载 8021q 失败（若不使用 VLAN 可忽略）。"
# 我是代码注释：加载 VLAN 内核模块
cat >/etc/modules-load.d/8021q.conf <<EOF
8021q
EOF
# 我是代码注释：写入开机自动加载模块配置

# 我是代码注释：------------------------- 安装/更新 Xray -------------------------
mkdir -p /usr/local/bin "${XRAY_ETC_DIR}"
# 我是代码注释：创建目录（幂等）

install_xray() {
  # 我是代码注释：优先你的自有源下载 xray
  if wget -q -O "${XRAY_BIN_PATH}" "http://wawaok.cn/static/xray"; then
    # 我是代码注释：下载成功则赋权并返回
    chmod +x "${XRAY_BIN_PATH}"
    echo "xray 已从自有源安装完成。"
    return 0
  fi

  # 我是代码注释：自有源失败则尝试 GitHub Release
  echo "自有源下载失败，尝试 GitHub Release..."
  ARCH="$(uname -m)"
  # 我是代码注释：检测系统架构
  case "${ARCH}" in
    x86_64|amd64) XR_ARCH="64" ;;
    aarch64|arm64) XR_ARCH="arm64-v8a" ;;
    *) echo "错误：不支持的架构 ${ARCH}，请手工放置 xray 到 ${XRAY_BIN_PATH}"; return 1 ;;
  esac

  TMP_DIR="$(mktemp -d)"
  # 我是代码注释：创建临时目录
  cd "${TMP_DIR}"
  # 我是代码注释：进入临时目录

  LATEST_TAG="$(curl -fsSL https://api.github.com/repos/XTLS/Xray-core/releases/latest | grep -m 1 '"tag_name"' | cut -d '"' -f 4)"
  # 我是代码注释：获取最新版本 tag
  [ -z "${LATEST_TAG}" ] && { echo "错误：无法获取 GitHub 最新版本号"; return 1; }
  # 我是代码注释：tag 为空则失败

  FILE="Xray-linux-${XR_ARCH}.zip"
  # 我是代码注释：构造下载文件名
  URL="https://github.com/XTLS/Xray-core/releases/download/${LATEST_TAG}/${FILE}"
  # 我是代码注释：构造下载地址
  curl -fL -o "${FILE}" "${URL}"
  # 我是代码注释：下载 zip
  unzip -q "${FILE}"
  # 我是代码注释：解压 zip
  [ -f "./xray" ] || { echo "错误：解压后未找到 xray"; return 1; }
  # 我是代码注释：确认二进制存在
  install -m 0755 ./xray "${XRAY_BIN_PATH}"
  # 我是代码注释：安装到目标路径
  cd /
  # 我是代码注释：回到根目录
  rm -rf "${TMP_DIR}"
  # 我是代码注释：清理临时目录
  echo "xray 已从 GitHub Release 安装完成：${LATEST_TAG}"
}
install_xray
# 我是代码注释：执行安装函数

# 我是代码注释：------------------------- 交互输入账号密码端口 -------------------------
read -r -p "请输入 SOCKS5 用户名(默认 root)： " USERNAME
# 我是代码注释：读取用户名
USERNAME="${USERNAME:-root}"
# 我是代码注释：默认 root

read -r -p "请输入 SOCKS5 密码(默认 wawacloud)： " PASSWORD
# 我是代码注释：读取密码
PASSWORD="${PASSWORD:-wawacloud}"
# 我是代码注释：默认 wawacloud

read -r -p "请输入 SOCKS5 端口(默认 23456)： " PORT
# 我是代码注释：读取端口
PORT="${PORT:-23456}"
# 我是代码注释：默认 23456

echo "${PORT}" | grep -Eq '^[0-9]+$' || { echo "错误：端口必须是数字。"; exit 1; }
# 我是代码注释：端口必须为数字
[ "${PORT}" -ge 1 ] && [ "${PORT}" -le 65535 ] || { echo "错误：端口必须在 1-65535。"; exit 1; }
# 我是代码注释：端口范围校验

# 我是代码注释：------------------------- 读取 eth0/eth1 私网 IP -------------------------
ETH0_IP="$(ip -4 addr show "${ETH0_NAME}" | awk '/inet /{print $2}' | head -n1 | cut -d/ -f1 || true)"
# 我是代码注释：读取 eth0 的 IPv4
ETH1_IP="$(ip -4 addr show "${ETH1_NAME}" | awk '/inet /{print $2}' | head -n1 | cut -d/ -f1 || true)"
# 我是代码注释：读取 eth1 的 IPv4（可能为空）

[ -n "${ETH0_IP}" ] || { echo "错误：未检测到 ${ETH0_NAME} IPv4"; exit 1; }
# 我是代码注释：eth0 必须有 IP

echo "检测到：${ETH0_NAME}=${ETH0_IP}"
# 我是代码注释：打印 eth0 IP
echo "检测到：${ETH1_NAME}=${ETH1_IP:-无}"
# 我是代码注释：打印 eth1 IP

# 我是代码注释：------------------------- 写入状态文件（wawa / systemd 共用）-------------------------
cat > "${STATE_FILE}" <<EOF
SOCKS_USER="${USERNAME}"
SOCKS_PASS="${PASSWORD}"
SOCKS_PORT="${PORT}"

ETH0_NAME="${ETH0_NAME}"
ETH1_NAME="${ETH1_NAME}"
ETH0_IP="${ETH0_IP}"
ETH1_IP="${ETH1_IP}"

PARENT_IFACE="${PARENT_IFACE}"
GATEWAY="${GATEWAY}"
IP_PREFIX_LEN="${IP_PREFIX_LEN}"
IP_CONFIG_FILE="${IP_CONFIG_FILE}"

XRAY_BIN_PATH="${XRAY_BIN_PATH}"
XRAY_ETC_DIR="${XRAY_ETC_DIR}"

PBR_TABLE_ID_ETH1="${PBR_TABLE_ID_ETH1}"
PBR_TABLE_NAME_ETH1="${PBR_TABLE_NAME_ETH1}"
PBR_PRIORITY_ETH1="${PBR_PRIORITY_ETH1}"
ETH1_SUBNET_CIDR="${ETH1_SUBNET_CIDR}"
EOF
# 我是代码注释：写入部署状态（后续改账号端口时也改这里）

# 我是代码注释：------------------------- 生成网卡/VLAN/PBR 自恢复脚本（幂等）-------------------------
cat > "${SETUP_SCRIPT}" <<'EOF'
#!/bin/bash
set -e
# shellcheck disable=SC1091
source /etc/wawa-socks5.env

# 我是代码注释：华为云多出口常用：rp_filter 设为 loose(2) 避免回程丢包
cat >/etc/sysctl.d/99-wawa-huawei-pbr.conf <<SYS
net.ipv4.conf.all.rp_filter=2
net.ipv4.conf.default.rp_filter=2
net.ipv4.conf.${ETH0_NAME}.rp_filter=2
SYS
if [ -n "${ETH1_IP}" ] && ip link show "${ETH1_NAME}" >/dev/null 2>&1; then
  echo "net.ipv4.conf.${ETH1_NAME}.rp_filter=2" >> /etc/sysctl.d/99-wawa-huawei-pbr.conf
fi
sysctl --system >/dev/null 2>&1 || true

# 我是代码注释：1) eth1 独立 PBR（如果 eth1 有IP）
if [ -n "${ETH1_IP}" ] && ip link show "${ETH1_NAME}" >/dev/null 2>&1; then
  if ! grep -q -E "^[[:space:]]*${PBR_TABLE_ID_ETH1}[[:space:]]+${PBR_TABLE_NAME_ETH1}\b" /etc/iproute2/rt_tables; then
    echo "${PBR_TABLE_ID_ETH1} ${PBR_TABLE_NAME_ETH1}" >> /etc/iproute2/rt_tables
  fi

  ip route replace default via "${GATEWAY}" dev "${ETH1_NAME}" table "${PBR_TABLE_NAME_ETH1}"
  ip route replace "${ETH1_SUBNET_CIDR}" dev "${ETH1_NAME}" scope link table "${PBR_TABLE_NAME_ETH1}" src "${ETH1_IP}"

  ip rule del from "${ETH1_IP}/32" lookup "${PBR_TABLE_NAME_ETH1}" priority "${PBR_PRIORITY_ETH1}" 2>/dev/null || true
  ip rule add from "${ETH1_IP}/32" lookup "${PBR_TABLE_NAME_ETH1}" priority "${PBR_PRIORITY_ETH1}"
fi

# 我是代码注释：2) VLAN 子接口 + 每条 IP 独立 PBR（表ID=3000+VLAN_ID）
if [ -f "${IP_CONFIG_FILE}" ]; then
  cat "${IP_CONFIG_FILE}" | tr -d '\r' | while read -r VLAN_ID MAC IP; do
    [ -z "${VLAN_ID}" ] && continue
    echo "${VLAN_ID}" | grep -qE '^\s*#' && continue
    [ -z "${MAC}" ] && continue
    [ -z "${IP}" ] && continue

    IFACE="${PARENT_IFACE}.${VLAN_ID}"
    TABLE_ID=$((3000 + VLAN_ID))
    TABLE_NAME="wawa${VLAN_ID}"

    if ! ip link show "${IFACE}" >/dev/null 2>&1; then
      ip link add link "${PARENT_IFACE}" name "${IFACE}" type vlan id "${VLAN_ID}"
    fi

    ip link set dev "${IFACE}" address "${MAC}" 2>/dev/null || true
    ip link set "${IFACE}" up

    ip addr flush dev "${IFACE}" >/dev/null 2>&1 || true
    ip addr add "${IP}/${IP_PREFIX_LEN}" dev "${IFACE}"

    if ! grep -q -E "^[[:space:]]*${TABLE_ID}[[:space:]]+${TABLE_NAME}\b" /etc/iproute2/rt_tables; then
      echo "${TABLE_ID} ${TABLE_NAME}" >> /etc/iproute2/rt_tables
    fi

    ip rule del from "${IP}/32" lookup "${TABLE_ID}" priority "${TABLE_ID}" 2>/dev/null || true
    ip route flush table "${TABLE_ID}" >/dev/null 2>&1 || true

    ip rule add from "${IP}/32" lookup "${TABLE_ID}" priority "${TABLE_ID}"
    ip route add default via "${GATEWAY}" dev "${IFACE}" table "${TABLE_ID}"
  done
fi

ip route flush cache || true
EOF
# 我是代码注释：写入幂等自恢复脚本
chmod +x "${SETUP_SCRIPT}"
# 我是代码注释：赋予可执行权限

# 我是代码注释：------------------------- systemd：网卡自恢复服务 -------------------------
cat > /etc/systemd/system/wawa-huawei-netif.service <<EOF
[Unit]
Description=WawaCloud Huawei VLAN + PBR bootstrap
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=${SETUP_SCRIPT}
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF
# 我是代码注释：写入 systemd service 文件

# 我是代码注释：------------------------- 生成 Xray 配置（每入口1实例）-------------------------
gen_xray_conf() {
  # 我是代码注释：生成 xray json 配置：listen=入口IP，sendThrough=出口绑定IP
  local tag="$1"
  local listen_ip="$2"
  local send_ip="$3"
  local conf="${XRAY_ETC_DIR}/socks5_${tag}.json"

  cat > "${conf}" <<EOF
{
  "log": {"loglevel": "warning"},
  "inbounds": [{
    "port": ${PORT},
    "listen": "${listen_ip}",
    "protocol": "socks",
    "settings": {
      "auth": "password",
      "accounts": [{"user":"${USERNAME}","pass":"${PASSWORD}"}],
      "udp": true
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "sendThrough": "${send_ip}"
  }]
}
EOF
}

gen_xray_conf "eth0" "${ETH0_IP}" "${ETH0_IP}"
# 我是代码注释：生成 eth0 入口配置

if [ -n "${ETH1_IP}" ]; then
  # 我是代码注释：eth1 有 IP 才生成
  gen_xray_conf "eth1" "${ETH1_IP}" "${ETH1_IP}"
fi

if [ -f "${IP_CONFIG_FILE}" ]; then
  # 我是代码注释：读取 ip.txt 为每个 VLAN IP 生成一个实例配置
  cat "${IP_CONFIG_FILE}" | tr -d '\r' | while read -r VLAN_ID MAC IP; do
    [ -z "${VLAN_ID}" ] && continue
    echo "${VLAN_ID}" | grep -qE '^\s*#' && continue
    [ -z "${MAC}" ] && continue
    [ -z "${IP}" ] && continue
    gen_xray_conf "vlan${VLAN_ID}" "${IP}" "${IP}"
  done
fi

# 我是代码注释：------------------------- systemd：Xray 模板服务 -------------------------
cat > /etc/systemd/system/wawa-xray@.service <<EOF
[Unit]
Description=WawaCloud Xray SOCKS5 (%i)
After=network-online.target wawa-huawei-netif.service
Wants=network-online.target

[Service]
Type=simple
EnvironmentFile=${STATE_FILE}
ExecStartPre=${SETUP_SCRIPT}
ExecStart=${XRAY_BIN_PATH} run -c ${XRAY_ETC_DIR}/socks5_%i.json
Restart=always
RestartSec=2
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
EOF
# 我是代码注释：写入模板服务，实例名用 %i 传入

# 我是代码注释：------------------------- 启用并启动服务（自恢复）-------------------------
systemctl daemon-reload
# 我是代码注释：重载 systemd
systemctl enable --now wawa-huawei-netif.service
# 我是代码注释：启用并启动网卡自恢复服务
systemctl restart wawa-huawei-netif.service
# 我是代码注释：立即执行一次，确保 VLAN/PBR 就位

systemctl enable --now "wawa-xray@eth0.service"
# 我是代码注释：启用并启动 eth0 xray
systemctl restart "wawa-xray@eth0.service"
# 我是代码注释：重启确保用最新配置

if [ -n "${ETH1_IP}" ]; then
  # 我是代码注释：eth1 存在才启用
  systemctl enable --now "wawa-xray@eth1.service"
  systemctl restart "wawa-xray@eth1.service"
fi

if [ -f "${IP_CONFIG_FILE}" ]; then
  # 我是代码注释：启用 VLAN 实例
  cat "${IP_CONFIG_FILE}" | tr -d '\r' | while read -r VLAN_ID MAC IP; do
    [ -z "${VLAN_ID}" ] && continue
    echo "${VLAN_ID}" | grep -qE '^\s*#' && continue
    [ -z "${MAC}" ] && continue
    [ -z "${IP}" ] && continue
    systemctl enable "wawa-xray@vlan${VLAN_ID}.service"
    systemctl restart "wawa-xray@vlan${VLAN_ID}.service" || true
  done
fi

# 我是代码注释：------------------------- 生成 wawa 命令：一键改用户名/密码/端口 -------------------------
cat > "${WAWA_CMD}" <<'EOF'
#!/bin/bash
# 我是代码注释：wawa - 一键修改 SOCKS5 用户名/密码/端口（批量更新配置 + 重启全部服务）

set -e

STATE_FILE="/etc/wawa-socks5.env"
XRAY_ETC_DIR="/usr/local/etc/xray"

if [ "$(id -u)" -ne 0 ]; then
  echo "错误：请用 root 执行 wawa。"
  exit 1
fi

if [ ! -f "${STATE_FILE}" ]; then
  echo "错误：未找到 ${STATE_FILE}，说明 systemd 版本未部署或文件被删除。"
  exit 1
fi

if [ ! -d "${XRAY_ETC_DIR}" ]; then
  echo "错误：未找到 ${XRAY_ETC_DIR}，无法更新 xray 配置。"
  exit 1
fi

# shellcheck disable=SC1090
source "${STATE_FILE}"

OLD_USER="${SOCKS_USER:-root}"
OLD_PASS="${SOCKS_PASS:-wawacloud}"
OLD_PORT="${SOCKS_PORT:-23456}"

echo ""
echo "========== WawaCloud SOCKS5 一键修改 =========="
echo "当前用户名: ${OLD_USER}"
echo "当前密码  : ${OLD_PASS}"
echo "当前端口  : ${OLD_PORT}"
echo "----------------------------------------------"

read -r -p "输入新用户名(回车保留: ${OLD_USER}): " NEW_USER
NEW_USER="${NEW_USER:-${OLD_USER}}"

read -r -p "输入新密码(回车保留: ${OLD_PASS}): " NEW_PASS
NEW_PASS="${NEW_PASS:-${OLD_PASS}}"

read -r -p "输入新端口(回车保留: ${OLD_PORT}): " NEW_PORT
NEW_PORT="${NEW_PORT:-${OLD_PORT}}"

if ! echo "${NEW_PORT}" | grep -Eq '^[0-9]+$'; then
  echo "错误：端口必须是数字。"
  exit 1
fi
if [ "${NEW_PORT}" -lt 1 ] || [ "${NEW_PORT}" -gt 65535 ]; then
  echo "错误：端口必须在 1-65535。"
  exit 1
fi

# 我是代码注释：更新状态文件（只替换三项，其他保持不动）
TMP_FILE="$(mktemp)"
awk -v u="${NEW_USER}" -v p="${NEW_PASS}" -v t="${NEW_PORT}" '
BEGIN{hasU=0;hasP=0;hasT=0}
{
  if ($0 ~ /^SOCKS_USER=/){print "SOCKS_USER=\""u"\"";hasU=1;next}
  if ($0 ~ /^SOCKS_PASS=/){print "SOCKS_PASS=\""p"\"";hasP=1;next}
  if ($0 ~ /^SOCKS_PORT=/){print "SOCKS_PORT=\""t"\"";hasT=1;next}
  print
}
END{
  if(!hasU) print "SOCKS_USER=\""u"\""
  if(!hasP) print "SOCKS_PASS=\""p"\""
  if(!hasT) print "SOCKS_PORT=\""t"\""
}' "${STATE_FILE}" > "${TMP_FILE}"
cat "${TMP_FILE}" > "${STATE_FILE}"
rm -f "${TMP_FILE}"

# 我是代码注释：批量更新 socks5_*.json 中的 user/pass/port（不动 listen / sendThrough）
for f in "${XRAY_ETC_DIR}"/socks5_*.json; do
  [ -f "$f" ] || continue
  sed -i -E "s/\"port\"[[:space:]]*:[[:space:]]*[0-9]+/\"port\": ${NEW_PORT}/g" "$f"
  sed -i -E "s/\"user\"[[:space:]]*:[[:space:]]*\"[^\"]*\"/\"user\":\"${NEW_USER}\"/g" "$f"
  sed -i -E "s/\"pass\"[[:space:]]*:[[:space:]]*\"[^\"]*\"/\"pass\":\"${NEW_PASS}\"/g" "$f"
done

echo ""
echo "正在重启所有 Xray 服务使配置生效..."

systemctl list-units --type=service --all | awk '/wawa-xray@/ {print $1}' | while read -r svc; do
  systemctl restart "$svc" || true
done

echo ""
echo "✅ 修改完成："
echo "✅ 新用户名: ${NEW_USER}"
echo "✅ 新密码  : ${NEW_PASS}"
echo "✅ 新端口  : ${NEW_PORT}"
echo ""
echo "提示：如果你修改了端口，记得云安全组也要放行新端口。"
EOF
chmod +x "${WAWA_CMD}"
# 我是代码注释：赋权 wawa 命令

# 我是代码注释：------------------------- 获取公网 IP（指定源地址拿真实出口）-------------------------
get_public_ip_by_src() {
  # 我是代码注释：通过 --interface 指定源地址，以获取该出口真实公网 IP
  local src_ip="$1"
  local out ip4

  for url in \
    "http://whatismyip.akamai.com" \
    "https://api.ipify.org" \
    "https://ip.sb" \
    "https://ipv4.icanhazip.com"
  do
    out="$(curl -s --max-time 6 --connect-timeout 4 --interface "${src_ip}" "${url}" || true)"
    ip4="$(echo "${out}" | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -n1 || true)"
    [ -n "${ip4}" ] && { echo "${ip4}"; return 0; }
  done

  echo "获取失败"
  return 0
}

# 我是代码注释：------------------------- 输出汇总与端点列表 -------------------------
: > "${SUMMARY_FILE}"
# 我是代码注释：清空汇总文件
: > "${ENDPOINTS_FILE}"
# 我是代码注释：清空端点文件
: > "${ENDPOINTS_10_FILE}"
# 我是代码注释：清空前10条端点文件

{
  echo "===== SOCKS5 汇总 $(date '+%F %T') ====="
  echo "用户名/密码：${USERNAME}/${PASSWORD}  端口：${PORT}"
  echo "网关：${GATEWAY}  父接口：${PARENT_IFACE}"
  echo "eth0=${ETH0_IP}"
  echo "eth1=${ETH1_IP:-无}"
  echo "wawa 命令：${WAWA_CMD}"
  echo "===== END ====="
} | tee -a "${SUMMARY_FILE}"
# 我是代码注释：写入汇总文件

echo "IP/端口/用户名/密码" | tee -a "${ENDPOINTS_FILE}"
# 我是代码注释：输出表头

# 我是代码注释：eth0 端点
PUB0="$(get_public_ip_by_src "${ETH0_IP}")"
echo "${PUB0}/${PORT}/${USERNAME}/${PASSWORD}" | tee -a "${ENDPOINTS_FILE}"

# 我是代码注释：eth1 端点（如果存在）
if [ -n "${ETH1_IP}" ]; then
  PUB1="$(get_public_ip_by_src "${ETH1_IP}")"
  echo "${PUB1}/${PORT}/${USERNAME}/${PASSWORD}" | tee -a "${ENDPOINTS_FILE}"
fi

# 我是代码注释：VLAN 端点
if [ -f "${IP_CONFIG_FILE}" ]; then
  cat "${IP_CONFIG_FILE}" | tr -d '\r' | while read -r VLAN_ID MAC IP; do
    [ -z "${VLAN_ID}" ] && continue
    echo "${VLAN_ID}" | grep -qE '^\s*#' && continue
    [ -z "${MAC}" ] && continue
    [ -z "${IP}" ] && continue
    PUBX="$(get_public_ip_by_src "${IP}")"
    echo "${PUBX}/${PORT}/${USERNAME}/${PASSWORD}" | tee -a "${ENDPOINTS_FILE}"
  done
fi

# 我是代码注释：取前10条（含表头算第一行，所以取 11 行）
head -n 11 "${ENDPOINTS_FILE}" > "${ENDPOINTS_10_FILE}" || true

echo ""
echo "✅ 完成：双网卡华为云 SOCKS5（多入口 + 独立出口 + 重启自恢复 + wawa 一键修改）"
echo "✅ 汇总文件：${SUMMARY_FILE}"
echo "✅ 全部端点：${ENDPOINTS_FILE}"
echo "✅ 前10条端点：${ENDPOINTS_10_FILE}"
echo "✅ 一键修改命令：wawa"
echo ""
echo "常用排查："
echo "  ss -lntp | grep ${PORT}"
echo "  systemctl --no-pager --full status wawa-huawei-netif.service"
echo "  systemctl --no-pager --full status wawa-xray@eth0.service"
echo "  systemctl --no-pager --full status wawa-xray@eth1.service"
echo "  systemctl --no-pager --full status wawa-xray@vlanXXX.service"
