#!/bin/bash

# 一键管理和配置 dnsmasq 脚本
# 请确保使用 sudo 或 root 权限运行此脚本

# 脚本版本和更新时间
VERSION="V_1.3.5"
LAST_UPDATED=$(date +"%Y-%m-%d")

# 检查是否以 root 身份运行6
if [ "$EUID" -ne 0 ]; then
  echo -e "\033[31m[错误] 请以 root 权限运行此脚本！\033[0m"
  exit 1
fi

# 检查系统是否为 Debian/Ubuntu
if ! grep -Ei 'debian|ubuntu' /etc/os-release > /dev/null; then
  echo -e "\033[31m[错误] 此脚本仅适用于 Debian 和 Ubuntu 系统！\033[0m"
  exit 1
fi

# 检查 curl 和 jq 是否安装，未安装则自动安装
if ! command -v curl &> /dev/null; then
    echo -e "\033[31mcurl 未安装，正在安装...\033[0m"
    sudo apt-get update && sudo apt-get install -y curl
fi

if ! command -v jq &> /dev/null; then
    echo -e "\033[31mjq 未安装，正在安装...\033[0m"
    sudo apt-get update && sudo apt-get install -y jq
fi

# 指定配置文件的下载地址
CONFIG_URL="https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dnsmasq.conf"
CONFIG_FILE="/etc/dnsmasq.conf"
SCRIPT_NAME="dns-unlock.sh"
SCRIPT_PATH="/root/$SCRIPT_NAME"
SYMLINK_PATH="/usr/local/bin/ddns"
AUTHOR="Jimmydada"

# 检查并创建 ddns 快捷命令（符号链接）
create_symlink() {
  if [ ! -f "$SYMLINK_PATH" ]; then
    echo -e "\033[1;32m首次运行，创建快捷命令 ddns...\033[0m"
    sudo ln -sf "$SCRIPT_PATH" "$SYMLINK_PATH"
    sudo chmod +x "$SYMLINK_PATH"
    echo -e "\033[1;32m快捷命令 ddns 创建成功！\033[0m"
  else
    echo -e "\033[1;33m快捷指令 ddns 快速进入设置\033[0m"
  fi
}

# 获取当前外部IP地址和所属地区
IP_INFO=$(curl -s http://ipinfo.io/json)
IP_ADDRESS=$(echo $IP_INFO | jq -r '.ip')
REGION=$(echo $IP_INFO | jq -r '.region')


# 执行检查和创建符号链接的操作
create_symlink

# 公共函数：检查端口占用并释放
check_and_release_port() {
  local port=$1
  echo -e "\033[1;34m检查端口 $port 的占用情况...\033[0m"

  # 检查端口是否被占用
  if lsof -i :$port | grep -q LISTEN; then
    echo -e "\033[31m端口 $port 被以下进程占用：\033[0m"
    lsof -i :$port

    # 检查是否是由 smartdns 占用
    if lsof -i :$port | grep -q 'smartdns'; then
      echo -e "\033[33msmartdns 服务正在占用端口 $port，尝试停止服务...\033[0m"
      systemctl stop smartdns && systemctl disable smartdns
      if [ $? -eq 0 ]; then
        echo -e "\033[1;32msmartdns 服务已成功停止。\033[0m"
      else
        echo -e "\033[31m[错误] 无法停止 smartdns 服务，请手动检查。\033[0m"
      fi
    fi

    # 检查是否是由 dnsmasq 占用
    if lsof -i :$port | grep -q 'dnsmasq'; then
      echo -e "\033[33mdnsmasq 服务正在占用端口 $port，尝试停止服务...\033[0m"
      systemctl stop dnsmasq && systemctl disable dnsmasq
      if [ $? -eq 0 ]; then
        echo -e "\033[1;32mdnsmasq 服务已成功停止。\033[0m"
      else
        echo -e "\033[31m[错误] 无法停止 dnsmasq 服务，请手动检查。\033[0m"
      fi
    fi

    # 检测并处理 systemd-resolved 服务
    if systemctl is-active --quiet systemd-resolved; then
        echo -e "\033[33m检测到 systemd-resolved 正在运行，占用端口 $port。\033[0m"
        echo -e "\033[33m尝试停止 systemd-resolved 服务...\033[0m"
        systemctl stop systemd-resolved
        systemctl disable systemd-resolved
        echo -e "\033[1;32m[成功] systemd-resolved 服务已停止并禁用。\033[0m"
    else
        echo -e "\033[1;32msystemd-resolved 服务未运行。\033[0m"
    fi

    # 检测其他未知进程并尝试终止
    echo -e "\033[33m尝试关闭端口 $port 的其他占用进程...\033[0m"
    lsof -i :$port | awk 'NR>1 {print $2}' | xargs -r kill -9
    echo -e "\033[1;32m端口 $port 已释放。\033[0m"
  else
    echo -e "\033[1;32m端口 $port 未被占用。\033[0m"
  fi
}

# 检查并停止占用端口 53 的服务
stop_services_using_port_53() {
    PORT_IN_USE=$(sudo netstat -tuln | grep ':53')
    if [ -n "$PORT_IN_USE" ]; then
        echo -e "\033[1;34m端口 53 已被占用，检查是否为 systemd-resolved...\033[0m"
        
        # 检查是否是 systemd-resolved 占用了端口
        SYSTEMD_RESOLVED=$(ps aux | grep 'systemd-resolved' | grep -v 'grep')
        if [ -n "$SYSTEMD_RESOLVED" ]; then
            echo -e "\033[1;33msystemd-resolved 正在占用端口 53，停止 systemd-resolved 服务...\033[0m"
            sudo systemctl stop systemd-resolved
            sudo systemctl disable systemd-resolved
        fi

        # 检查并停止 dnsmasq 服务
        DNSMASQ=$(ps aux | grep 'dnsmasq' | grep -v 'grep')
        if [ -n "$DNSMASQ" ]; then
            echo -e "\033[1;33mdnsmasq 正在占用端口 53，停止 dnsmasq 服务...\033[0m"
            sudo systemctl stop dnsmasq
            sudo systemctl disable dnsmasq
        fi

  # 强制停止占用端口 53 的所有进程
  echo -e "\033[1;33m发现其他进程占用端口 53，强制停止这些进程...\033[0m"
  PIDS=$(sudo lsof -t -i :53)
  if [ -n "$PIDS" ]; then
    for PID in $PIDS; do
      if [[ "$PID" =~ ^[0-9]+$ ]]; then
        sudo kill -9 "$PID"
        echo -e "\033[1;32m已强制停止进程 PID: $PID\033[0m"
      else
        echo -e "\033[1;31m无效的 PID: $PID，跳过...\033[0m"
      fi
    done
  else
    echo -e "\033[1;32m没有发现占用端口 53 的进程。\033[0m"
  fi
else
  echo -e "\033[1;32m端口 53 未被占用，可以继续配置！\033[0m"
fi
}


# 公共函数：设置 resolv.conf 并锁定
set_and_lock_resolv_conf() {
  local nameserver=$1
  echo -e "\033[1;34m备份 /etc/resolv.conf 文件...\033[0m"
  cp /etc/resolv.conf /etc/resolv.conf.bak 2>/dev/null
  echo -e "\033[1;34m删除旧的 /etc/resolv.conf 并创建新文件...\033[0m"
  rm -f /etc/resolv.conf
  echo "nameserver $nameserver" > /etc/resolv.conf
  echo -e "\033[1;34m锁定 /etc/resolv.conf 文件...\033[0m"
  chattr +i /etc/resolv.conf
  echo -e "\033[1;32m操作成功！当前 nameserver 已设置为 $nameserver 并已锁定。\033[0m"
}

# 公共函数 - 更新系统和包管理器
update_system() {
    echo -e "\033[1;33m正在更新系统和包管理器...\033[0m"
    sudo apt-get update -y && sudo apt-get upgrade -y
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32m系统和包管理器已更新至最新版本！\033[0m"
    else
        echo -e "\033[31m更新系统和包管理器失败，请检查网络或权限。\033[0m"
        exit 1
    fi
}

# 公共函数 - 检测并安装必要软件
check_and_install_software() {
    REQUIRED_SOFTWARE=("curl" "lsof")
    for software in "${REQUIRED_SOFTWARE[@]}"; do
        if ! command -v $software &> /dev/null; then
            echo -e "\033[1;33m检测到 $software 未安装，正在安装...\033[0m"
            sudo apt-get install -y $software
            if [ $? -eq 0 ]; then
                echo -e "\033[1;32m$software 安装成功！\033[0m"
            else
                echo -e "\033[31m安装 $software 失败，请检查网络或权限。\033[0m"
                exit 1
            fi
        else
            echo -e "\033[1;32m$software 已安装。\033[0m"
        fi
    done
}

install_smartdns() {
    # 检测系统类型
    SYSTEM_NAME=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"')
    echo -e "\033[1;34m检测到当前系统为：$SYSTEM_NAME\033[0m"

    # 检查 SmartDNS 是否已经安装
    if command -v smartdns >/dev/null 2>&1; then
        echo -e "\033[1;32mSmartDNS 已安装，无需重复安装。\033[0m"
        return
    fi

    if [[ "$SYSTEM_NAME" == "ubuntu" ]]; then
        echo -e "\033[1;34mUbuntu 系统，使用 DEB 包安装 SmartDNS...\033[0m"
        DEB_URL="https://github.com/pymumu/smartdns/releases/download/Release46/smartdns.1.2024.06.12-2222.x86_64-debian-all.deb"
        TEMP_DEB="/tmp/smartdns.deb"

        wget "$DEB_URL" -O "$TEMP_DEB"
        if [ $? -ne 0 ]; then
            echo -e "\033[31m[错误] SmartDNS 安装包下载失败，请检查网络连接！\033[0m"
            exit 1
        fi

        dpkg -i "$TEMP_DEB"
        if [ $? -ne 0 ]; then
            echo -e "\033[31m[警告] 安装依赖失败，尝试修复...\033[0m"
            apt-get -f install -y
        fi

        rm -f "$TEMP_DEB"
    else
        echo -e "\033[1;34m非 Ubuntu 系统，使用 apt 安装 SmartDNS...\033[0m"
        apt update && apt install -y smartdns
        if [ $? -ne 0 ]; then
            echo -e "\033[31m[错误] SmartDNS 安装失败，请检查系统环境！\033[0m"
            exit 1
        fi
    fi

    if command -v smartdns >/dev/null 2>&1; then
        echo -e "\033[1;32mSmartDNS 安装成功！\033[0m"
    else
        echo -e "\033[31m[错误] SmartDNS 安装失败，请检查手动安装！\033[0m"
        exit 1
    fi
}

# 显示标题和备注
echo -e "\033[1;34m======================================\033[0m"
echo -e "\033[1;32m       一键配置 dnsmasq 分流脚本       \033[0m"
echo -e "\033[1;36m       版本：  $VERSION       \033[0m"
echo -e "\033[1;36m       更新时间：$LAST_UPDATED        \033[0m"
echo -e "\033[1;36m       本脚本由 $AUTHOR 维护          \033[0m"
echo -e "\033[1;36m    VPS IP： $IP_ADDRESS  $REGION     \033[0m"
echo -e "\033[1;34m======================================\033[0m"
echo -e "\n"

# 显示主菜单
echo -e "\033[1;33m请选择要执行的操作：\033[0m"
echo -e "\033[1;36m1.\033[0m \033[1;32mdnsmasq 分流配置\033[0m"
echo -e "\033[1;36m2.\033[0m \033[1;32msmartdns 分流配置\033[0m"
echo -e "\033[1;36m3.\033[0m \033[1;32mresolv 分流配置（全局代理）\033[0m"
echo -e "\033[1;36m4.\033[0m \033[1;32m检测流媒体解锁支持情况\033[0m"
echo -e "\033[1;36m5.\033[0m \033[1;32m检查系统端口 53 占用情况\033[0m"
echo -e "\033[1;36m6.\033[0m \033[1;32m删除脚本\033[0m"
echo -e "\033[1;36m7.\033[0m \033[1;32m更新脚本\033[0m"
echo -e "\033[1;36m0.\033[0m \033[1;31m退出\033[0m"
echo -e "\n\033[1;33m请输入数字 (0-7):\033[0m"
read main_choice

case $main_choice in
1)
  # dnsmasq 分流配置子菜单
  while true; do
  echo -e "\033[1;33m请选择要执行的操作：\033[0m"
  echo -e "\033[1;36m1.\033[0m \033[1;32m安装并配置 dnsmasq 分流\033[0m"
  echo -e "\033[1;36m2.\033[0m \033[1;32m卸载 dnsmasq 并恢复默认配置\033[0m"
  echo -e "\033[1;36m3.\033[0m \033[1;32m更新 dnsmasq 配置文件\033[0m"
  echo -e "\033[1;36m4.\033[0m \033[1;32m重启 dnsmasq 服务\033[0m"
  echo -e "\033[1;36m0.\033[0m \033[1;31m退出脚本\033[0m"
  echo -e "\n\033[1;33m请输入数字 (0-4):\033[0m"
  read dnsmasq_choice
  
  case $dnsmasq_choice in
    1)
    # 检测并安装必要软件
    check_and_install_software
    
    # 安装并配置 dnsmasq
    echo "执行安装 dnsmasq 的相关操作..."
    
    # 安装 dnsmasq
    apt update && apt install -y dnsmasq
    if [ $? -ne 0 ]; then
      echo -e "\033[31m[错误] dnsmasq 安装失败，请检查系统环境！\033[0m"
      exit 1
    fi

    # 检查是否成功安装
    if ! command -v dnsmasq >/dev/null 2>&1; then
        echo -e "\033[31m[错误] dnsmasq 安装失败，请检查！\033[0m"
        exit 1
    fi
    echo -e "\033[1;32m[dnsmasq] 安装完成。\033[0m"

    # 检查是否安装 lsof
    if ! command -v lsof >/dev/null 2>&1; then
        echo -e "\033[33m检测到系统未安装 lsof 工具，正在安装...\033[0m"
        apt update && apt install -y lsof
        if ! command -v lsof >/dev/null 2>&1; then
            echo -e "\033[31m[错误] lsof 安装失败，请手动安装后重试！\033[0m"
            exit 1
        fi
        echo -e "\033[1;32m[lsof] 工具安装完成。\033[0m"
    fi

     # 下载并更新配置文件
    echo -e "\033[1;34m下载并覆盖 dnsmasq 配置文件...\033[0m"
    curl -o $CONFIG_FILE $CONFIG_URL
    if [ $? -ne 0 ]; then
        echo -e "\033[31m[错误] 配置文件下载失败，请检查网络连接！\033[0m"
        exit 1
    fi
    echo -e "\033[1;32m配置文件已更新：$CONFIG_FILE\033[0m"

# 提示用户是否调整配置文件中的 IP
    read -p "配置文件中 IP 为 154.12.177.22 和 157.20.104.47，是否调整？(回车默认Alice DNS，输入y调整自己的解锁IP): " adjust
    if [[ "$adjust" == "y" || "$adjust" == "Y" ]]; then
        read -p "请输入您的解锁IP: " unlock_ip
        # 修改配置文件中的 IP 地址
        echo -e "\033[1;34m正在修改配置文件中的 IP 地址...\033[0m"
        sed -i "s/154.12.177.22/$unlock_ip/g" $CONFIG_FILE
        sed -i "s/157.20.104.47/$unlock_ip/g" $CONFIG_FILE
        echo -e "\033[1;32m配置文件中的 IP 已更新为新的解锁IP：$unlock_ip\033[0m"
    else
        echo -e "\033[1;32m未调整配置文件中的 IP。\033[0m"
    fi

    # 检查端口 53 占用情况
    check_and_release_port 53

    # 备份并更新 /etc/resolv.conf
    set_and_lock_resolv_conf "127.0.0.1"

    # 重启 dnsmasq 服务
    echo -e "\033[1;34m重启 dnsmasq 服务...\033[0m"
    systemctl restart dnsmasq && systemctl enable dnsmasq
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32mdnsmasq 服务已成功启动并启用开机自启！\033[0m"
    else
        echo -e "\033[31m[错误] dnsmasq 服务启动失败，请检查配置！\033[0m"
    fi
    ;;
    
  2)
    # 卸载 dnsmasq 并恢复默认配置
    echo -e "\033[1;33m正在卸载 dnsmasq 并恢复系统默认配置...\033[0m"

    # 卸载 dnsmasq
    sudo apt-get purge -y dnsmasq
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32mdnsmasq 已成功卸载！\033[0m"
    else
        echo -e "\033[31m卸载 dnsmasq 失败，请检查权限或网络。\033[0m"
        exit 1
    fi

    # 禁用 dnsmasq 服务
    sudo systemctl disable --now dnsmasq &> /dev/null
    echo -e "\033[1;32mdnsmasq 服务已停止并禁用。\033[0m"

    # 删除残留配置文件
    CONFIG_FILE="/etc/dnsmasq.conf"
    if [ -f "$CONFIG_FILE" ]; then
        sudo rm -f "$CONFIG_FILE"
        echo -e "\033[1;32m残留配置文件已清理：$CONFIG_FILE\033[0m"
    fi

    # 恢复系统 DNS 配置
    echo -e "\033[1;33m正在恢复系统 DNS 配置到 8.8.8.8...\033[0m"
    RESOLV_FILE="/etc/resolv.conf"
    if [ -f "$RESOLV_FILE" ]; then
        sudo chattr -i "$RESOLV_FILE" &> /dev/null  # 解除锁定
        echo -e "nameserver 8.8.8.8" | sudo tee "$RESOLV_FILE" > /dev/null
        sudo chattr +i "$RESOLV_FILE" &> /dev/null  # 锁定配置
        echo -e "\033[1;32m系统 DNS 已恢复为 8.8.8.8。\033[0m"
    else
        echo -e "\033[31m未找到 $RESOLV_FILE 文件，请手动检查。\033[0m"
    fi

    # 重启网络服务
    echo -e "\033[1;33m正在重启网络服务...\033[0m"
    sudo systemctl restart systemd-resolved
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32m网络服务已成功重启。\033[0m"
    else
        echo -e "\033[31m重启网络服务失败，请检查日志。\033[0m"
    fi

    echo -e "\033[1;32mdnsmasq 已成功卸载，系统 DNS 恢复完成！\033[0m"
    ;;

3)
    # 更新 dnsmasq 配置文件
    echo -e "\033[1;34m进入 dnsmasq 配置文件更新菜单...\033[0m"
    echo -e "\033[1;33m请选择要更新的配置：\033[0m"
    echo -e "\033[1;36m1.\033[0m \033[1;32m更新为 HK 配置\033[0m"
    echo -e "\033[1;36m2.\033[0m \033[1;32m更新为 SG 配置\033[0m"
    echo -e "\033[1;36m3.\033[0m \033[1;32m更新为全量配置\033[0m"
    echo -e "\033[1;36m0.\033[0m \033[1;31m退出脚本\033[0m"
    read update_choice

    # 根据选择进入下一步操作
    case $update_choice in
  1)
    # 更新为 HK 配置
    CONFIG_URL="https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dnsmasq.conf.hk"
    TARGET_FILE="dnsmasq.conf.hk"
    REGION="HK"
    ;;
  2)
    # 更新为 SG 配置
    CONFIG_URL="https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dnsmasq.conf.sg"
    TARGET_FILE="dnsmasq.conf.sg"
    REGION="SG"
    ;;
  3)
    # 更新为全量配置
    CONFIG_URL="https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dnsmasq.conf.allsg"
    TARGET_FILE="dnsmasq.conf.allsg"
    REGION="AllSG"
    ;;
  *)
    echo -e "\033[31m无效选择，请输入0-3！\033[0m"
    exit 1
    ;;
  esac

  echo -e "\033[1;34m开始更新为 $REGION 配置...\033[0m"

  # 备份旧的配置文件
  if [ -f /etc/dnsmasq.conf ]; then
    echo -e "\033[1;33m备份原有配置文件为 /etc/dnsmasq.conf.bak...\033[0m"
    mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
  fi

  # 下载新的配置文件
  echo -e "\033[1;33m下载新的 $REGION 配置文件...\033[0m"
  curl -o "/etc/$TARGET_FILE" "$CONFIG_URL"
  if [ $? -eq 0 ]; then
    echo -e "\033[1;32m$REGION 配置文件下载成功！\033[0m"
    
    # 提示用户是否更换 IP
    if [ "$REGION" == "AllSG" ]; then
      echo -e "\033[1;33m配置文件中包含 IP 地址 157.20.104.47，是否需要替换为自己的 IP 地址？(回车默认不修改，输入 y 修改)\033[0m"
      read use_own_ip

      if [ "$use_own_ip" == "y" ]; then
        echo -e "\033[1;33m请输入您的 IP 地址：\033[0m"
        read user_ip
        # 替换文件中的 IP 地址
        sed -i "s/157.20.104.47/$user_ip/g" /etc/$TARGET_FILE
        echo -e "\033[1;32mIP 地址已替换为 $user_ip\033[0m"
      else
        echo -e "\033[1;32m保留原有 IP 地址！\033[0m"
      fi
    fi

    # 将新的配置文件替换为 dnsmasq 的默认配置文件
    mv "/etc/$TARGET_FILE" /etc/dnsmasq.conf
    echo -e "\033[1;32m$REGION 配置文件更新成功！\033[0m"

    # 重启 dnsmasq 服务
    echo -e "\033[1;33m重启 dnsmasq 服务...\033[0m"
    systemctl restart dnsmasq
    if [ $? -eq 0 ]; then
      echo -e "\033[1;32mdnsmasq 服务重启成功！\033[0m"
    else
      echo -e "\033[31m重启 dnsmasq 服务失败，请检查日志！\033[0m"
    fi
  else
    echo -e "\033[31m$REGION 配置文件下载失败，请检查网络连接！\033[0m"
    # 恢复原始配置（如果有备份）
    if [ -f /etc/dnsmasq.conf.bak ]; then
      echo -e "\033[1;33m恢复原始配置文件...\033[0m"
      mv /etc/dnsmasq.conf.bak /etc/dnsmasq.conf
    fi
  fi
  ;;
  
  4)
    # 重启 dnsmasq 服务
    echo -e "\033[1;34m重启 dnsmasq 服务...\033[0m"
    systemctl restart dnsmasq
    if [ $? -eq 0 ]; then
      echo -e "\033[1;32mdnsmasq 服务已成功重启！\033[0m"
    else
      echo -e "\033[31m[错误] dnsmasq 服务重启失败！\033[0m"
    fi
    ;;

    0)
      break
      ;;
    
    *)
      echo -e "\033[31m无效选择，请重新输入！\033[0m"
      ;;
    esac
  done
  ;;

2)
  # smartdns 分流配置子菜单
  while true; do
  echo -e "\033[1;33m请选择要执行的操作：\033[0m"
  echo -e "\033[1;36m1.\033[0m \033[1;32m安装并配置 smartdns 分流\033[0m"
  echo -e "\033[1;36m2.\033[0m \033[1;32m重启 smartdns 服务\033[0m"
  echo -e "\033[1;36m3.\033[0m \033[1;32m卸载 smartdns 并恢复默认 resolv.conf 配置\033[0m"
  echo -e "\033[1;36m4.\033[0m \033[1;32m一键更新全量配置\033[0m"
  echo -e "\033[1;36m0.\033[0m \033[1;31m退出脚本\033[0m"
  echo -e "\n\033[1;33m请输入数字 (0-4):\033[0m"
  read smartdns_choice

  case $smartdns_choice in
  1)
# 检测并安装必要软件
check_and_install_software

# 安装 smartdns
install_smartdns

# 下载 smartdns 配置文件
echo -e "\033[1;34m正在下载 smartdns 配置文件...\033[0m"
curl -o /etc/smartdns/smartdns.conf https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/smartdns.conf
if [ $? -ne 0 ]; then
  echo -e "\033[31m[错误] 配置文件下载失败！\033[0m"
  exit 1
fi

# 检测 smartdns 配置文件中的默认 IP
DEFAULT_IP1="154.12.177.22"
DEFAULT_IP2="157.20.104.47"

echo -e "\033[1;34m检测到配置文件中的默认 IP 为：\033[0m"
echo -e "\033[1;33m1. $DEFAULT_IP1\033[0m"
echo -e "\033[1;33m2. $DEFAULT_IP2\033[0m"
echo -e "\033[1;34m是否需要修改这些 IP？(y/N):\033[0m"
read change_ip

if [[ "$change_ip" == "y" || "$change_ip" == "Y" ]]; then
  echo -e "\033[1;34m请输入第一个 IP 的新值（留空则保留 $DEFAULT_IP1）：\033[0m"
  read new_ip1
  if [ -n "$new_ip1" ]; then
    sed -i "s/$DEFAULT_IP1/$new_ip1/" /etc/smartdns/smartdns.conf
    echo -e "\033[1;32m已将 $DEFAULT_IP1 替换为 $new_ip1！\033[0m"
  else
    echo -e "\033[1;33m保留 $DEFAULT_IP1！\033[0m"
  fi

  echo -e "\033[1;34m请输入第二个 IP 的新值（留空则保留 $DEFAULT_IP2）：\033[0m"
  read new_ip2
  if [ -n "$new_ip2" ]; then
    sed -i "s/$DEFAULT_IP2/$new_ip2/" /etc/smartdns/smartdns.conf
    echo -e "\033[1;32m已将 $DEFAULT_IP2 替换为 $new_ip2！\033[0m"
  else
    echo -e "\033[1;33m保留 $DEFAULT_IP2！\033[0m"
  fi
else
  echo -e "\033[1;33m保持默认 IP 配置！\033[0m"
fi

# 调用函数来检查和停止端口占用的服务
stop_services_using_port_53

# 检查 /etc/resolv.conf 文件是否被锁定，如果已锁定则解锁
if lsattr /etc/resolv.conf | grep -q 'i'; then
  echo -e "\033[1;33m文件 /etc/resolv.conf 已被锁定，正在解锁...\033[0m"
  chattr -i /etc/resolv.conf
  if [ $? -ne 0 ]; then
    echo -e "\033[31m[错误] 解锁 /etc/resolv.conf 文件失败！\033[0m"
    exit 1
  fi
fi

# 备份 /etc/resolv.conf 文件
echo -e "\033[1;34m备份 /etc/resolv.conf 文件...\033[0m"
cp /etc/resolv.conf /etc/resolv.conf.bak
if [ $? -ne 0 ]; then
  echo -e "\033[31m[错误] /etc/resolv.conf 备份失败！\033[0m"
  exit 1
fi

# 修改 /etc/resolv.conf 中的 nameserver 为 127.0.0.1
echo -e "\033[1;34m修改 /etc/resolv.conf 文件中的 nameserver 为 127.0.0.1...\033[0m"
echo "nameserver 127.0.0.1" > /etc/resolv.conf
if [ $? -ne 0 ]; then
  echo -e "\033[31m[错误] 修改 /etc/resolv.conf 文件失败！\033[0m"
  exit 1
fi

# 锁定 /etc/resolv.conf 文件
echo -e "\033[1;34m锁定 /etc/resolv.conf 文件...\033[0m"
chattr +i /etc/resolv.conf
if [ $? -ne 0 ]; then
  echo -e "\033[31m[错误] 锁定 /etc/resolv.conf 文件失败！\033[0m"
  exit 1
fi

# 启动 smartdns 服务并设置为开机启动
echo -e "\033[1;34m启动 smartdns 并设置为开机启动...\033[0m"
systemctl restart smartdns && systemctl enable smartdns
if [ $? -ne 0 ]; then
  echo -e "\033[31m[错误] smartdns 启动失败！\033[0m"
  exit 1
fi

echo -e "\033[1;32msmartdns 配置已完成，服务已启动并设置为开机启动！\033[0m"
;;

  2)
    # 重启 smartdns 服务
    echo -e "\033[1;34m重启 smartdns 服务...\033[0m"
    systemctl restart smartdns
    if [ $? -eq 0 ]; then
      echo -e "\033[1;32msmartdns 服务已成功重启！\033[0m"
    else
      echo -e "\033[31m[错误] smartdns 服务重启失败！\033[0m"
    fi
    ;;

 3)
    # 卸载 smartdns 并恢复默认 resolv.conf 配置
    echo -e "\033[1;34m正在卸载 smartdns 并恢复默认 resolv.conf 配置...\033[0m"

    # 卸载 smartdns
    apt-get purge -y smartdns
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32msmartdns 已成功卸载！\033[0m"
    else
        echo -e "\033[31m[错误] 卸载 smartdns 失败，请检查权限或网络连接！\033[0m"
        exit 1
    fi

    # 恢复默认 resolv.conf 配置
    RESOLV_FILE="/etc/resolv.conf"
    RESOLV_BAK="/etc/resolv.conf.bak"
    if [ -f "$RESOLV_BAK" ]; then
        echo -e "\033[1;34m正在恢复原始 resolv.conf 配置...\033[0m"
        sudo chattr -i "$RESOLV_FILE" &> /dev/null  # 解锁 resolv.conf 文件
        sudo cp "$RESOLV_BAK" "$RESOLV_FILE"
        sudo chattr +i "$RESOLV_FILE" &> /dev/null  # 锁定配置，防止被覆盖
        echo -e "\033[1;32m原始 resolv.conf 配置已成功恢复！\033[0m"
    else
        echo -e "\033[31m[错误] 找不到备份文件 $RESOLV_BAK，无法恢复默认配置！\033[0m"
        echo -e "\033[1;33m将 resolv.conf 设置为 Google 公共 DNS（8.8.8.8）...\033[0m"
        sudo chattr -i "$RESOLV_FILE" &> /dev/null
        echo -e "nameserver 8.8.8.8" | sudo tee "$RESOLV_FILE" > /dev/null
        sudo chattr +i "$RESOLV_FILE" &> /dev/null
        echo -e "\033[1;32m系统 DNS 已设置为 8.8.8.8。\033[0m"
    fi

    # 重启系统 DNS 服务
    echo -e "\033[1;34m正在重启系统 DNS 服务...\033[0m"
    sudo systemctl restart systemd-resolved
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32m系统 DNS 服务已成功重启！\033[0m"
    else
        echo -e "\033[31m[错误] 系统 DNS 服务重启失败，请检查日志！\033[0m"
    fi

    echo -e "\033[1;32msmartdns 卸载完成，系统 DNS 恢复完成！\033[0m"
    ;;

    4)
      # 一键更新全量配置
      CONFIG_URL="https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/smartdns.conf.sg"
      CONFIG_FILE="/etc/smartdns/smartdns.conf"
      BACKUP_FILE="/etc/smartdns/smartdns.conf.bak"

      echo "正在下载最新的 SmartDNS 配置文件..."
      curl -o /tmp/smartdns.conf.sg $CONFIG_URL
      if [ $? -ne 0 ]; then
        echo -e "\033[31m[错误] 配置文件下载失败！请检查网络连接。\033[0m"
        continue
      fi

      echo "检测到配置文件中可能需要更换的 IP：157.20.104.47"
      echo -e "\033[1;34m是否需要替换为其他 IP 地址？[y/N]\033[0m"
      read replace_choice
      if [[ "$replace_choice" =~ ^[Yy]$ ]]; then
        echo -e "\033[1;34m请输入新的 IP 地址：\033[0m"
        read new_ip
        sed -i "s/157\.20\.104\.47/$new_ip/g" /tmp/smartdns.conf.sg
        echo -e "\033[1;32m已将 157.20.104.47 替换为 $new_ip\033[0m"
      fi

      # 检测是否存在默认配置文件
      if [ -f $CONFIG_FILE ]; then
        echo "备份当前的 SmartDNS 配置文件..."
        cp $CONFIG_FILE $BACKUP_FILE
        if [ $? -ne 0 ]; then
          echo -e "\033[31m[错误] 配置文件备份失败！\033[0m"
          continue
        fi
      else
        echo -e "\033[1;33m未检测到默认配置文件，跳过备份。\033[0m"
      fi

      # 替换 SmartDNS 配置文件
      echo "替换 SmartDNS 配置文件..."
      if [ ! -d "/etc/smartdns" ]; then
      echo "目标目录 /etc/smartdns 不存在，正在创建..."
      mkdir -p /etc/smartdns
      if [ $? -ne 0 ]; then
        echo -e "\033[31m[错误] 目标目录创建失败！\033[0m"
        continue
       fi
       fi

      mv /tmp/smartdns.conf.sg $CONFIG_FILE
      if [ $? -ne 0 ]; then
      echo -e "\033[31m[错误] 配置文件替换失败！\033[0m"
      continue
      fi

      echo "重启 SmartDNS 服务..."
      systemctl restart smartdns
      if [ $? -ne 0 ]; then
        echo -e "\033[31m[错误] SmartDNS 服务重启失败！\033[0m"
      else
        echo -e "\033[1;32mSmartDNS 配置已更新并成功重启服务！\033[0m"
      fi
      ;;

    0)
      break
      ;;
    *)
      echo -e "\033[31m无效选择，请重新输入！\033[0m"
      ;;
    esac
  done
  ;;

3)
  # resolv 文件分流配置子菜单
  while true; do
  echo -e "\033[1;33m请选择要执行的操作：\033[0m"
  echo -e "\033[1;36m1.\033[0m \033[1;32m解锁 /etc/resolv.conf 文件\033[0m"
  echo -e "\033[1;36m2.\033[0m \033[1;32m锁定 /etc/resolv.conf 文件\033[0m"
  echo -e "\033[1;36m3.\033[0m \033[1;32m一键全局代理（修改系统 DNS 配置）\033[0m"
  echo -e "\033[1;36m4.\033[0m \033[1;32m恢复原始 /etc/resolv.conf 配置\033[0m"
  echo -e "\033[1;36m5.\033[0m \033[1;32m一键恢复 8.8.8.8 并重启系统 DNS\033[0m"
  echo -e "\033[1;36m0.\033[0m \033[1;31m退出脚本\033[0m"
  echo -e "\n\033[1;33m请输入数字 (0-5):\033[0m"
  read resolv_choice
  
  case $resolv_choice in
  1)
    # 解锁 resolv.conf 文件
    echo -e "\033[1;34m解锁 /etc/resolv.conf 文件...\033[0m"
    chattr -i /etc/resolv.conf
    echo -e "\033[1;32m文件解锁成功！\033[0m"
    ;;

  2)
    # 锁定 resolv.conf 文件
    echo -e "\033[1;34m锁定 /etc/resolv.conf 文件...\033[0m"
    chattr +i /etc/resolv.conf
    echo -e "\033[1;32m文件已成功锁定！\033[0m"
    ;;

  3)
    # 一键更换 nameserver
  echo -e "\033[1;34m检测 /etc/resolv.conf 是否为符号链接...\033[0m"

  # 检测是否为符号链接
  if [ -L /etc/resolv.conf ]; then
    TARGET_FILE=$(readlink -f /etc/resolv.conf)
    echo -e "\033[1;33m检测到 /etc/resolv.conf 是符号链接，指向 $TARGET_FILE。\033[0m"
  else
    TARGET_FILE="/etc/resolv.conf"
    echo -e "\033[1;32m /etc/resolv.conf 是普通文件。\033[0m"
  fi

  echo -e "\033[1;34m检测 $TARGET_FILE 是否被锁定...\033[0m"

  # 检测是否被锁定
  if lsattr $TARGET_FILE | grep -q 'i'; then
    echo -e "\033[1;33m检测到 $TARGET_FILE 被锁定，正在解锁...\033[0m"
    chattr -i $TARGET_FILE
    if [ $? -eq 0 ]; then
      echo -e "\033[1;32m文件已解锁！\033[0m"
    else
      echo -e "\033[31m解锁失败，请检查权限！\033[0m"
      exit 1
    fi
  else
    echo -e "\033[1;32m文件未锁定，无需解锁。\033[0m"
  fi

  # 提示用户输入新的 nameserver 地址
  echo -e "\033[1;34m请输入要更换的 nameserver 地址（例如 8.8.8.8）：\033[0m"
  read nameserver

  # 验证输入是否为有效的 IP 地址
  if [[ ! $nameserver =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo -e "\033[31m输入的 DNS 地址无效，请输入正确的 IPv4 地址！\033[0m"
    exit 1
  fi

  # 更新目标文件
  echo -e "\033[1;34m正在更新 $TARGET_FILE 配置...\033[0m"
  echo "nameserver $nameserver" > $TARGET_FILE
  if [ $? -eq 0 ]; then
    echo -e "\033[1;32m更新成功：nameserver $nameserver\033[0m"
  else
    echo -e "\033[31m更新失败，请检查权限！\033[0m"
    exit 1
  fi

  # 锁定目标文件
  echo -e "\033[1;34m正在锁定 $TARGET_FILE...\033[0m"
  chattr +i $TARGET_FILE
  if [ $? -eq 0 ]; then
    echo -e "\033[1;32m文件已成功锁定！\033[0m"
  else
    echo -e "\033[31m锁定失败，请检查权限！\033[0m"
    exit 1
  fi

  # 重启 DNS 服务
  echo -e "\033[1;34m正在重启系统 DNS 服务...\033[0m"
  systemctl restart systemd-resolved
  if [ $? -eq 0 ]; then
    echo -e "\033[1;32m系统 DNS 服务已重启！\033[0m"
  else
    echo -e "\033[31m系统 DNS 服务重启失败，请检查配置或日志！\033[0m"
    exit 1
  fi
  ;;

  4)
    # 恢复原始配置
    echo -e "\033[1;34m恢复原始 /etc/resolv.conf 配置...\033[0m"
    cp /etc/resolv.conf.bak /etc/resolv.conf
    chattr -i /etc/resolv.conf
    echo -e "\033[1;32m已恢复原始配置！\033[0m"
    ;;
    
  5)
    # 一键恢复 8.8.8.8 并重启系统 DNS
    echo -e "\033[1;34m检测 /etc/resolv.conf 是否为符号链接...\033[0m"
    if [ -L /etc/resolv.conf ]; then
        TARGET_FILE=$(readlink -f /etc/resolv.conf)
        echo -e "\033[1;33m检测到 /etc/resolv.conf 是符号链接，指向 $TARGET_FILE。\033[0m"
    else
        TARGET_FILE="/etc/resolv.conf"
        echo -e "\033[1;32m /etc/resolv.conf 是普通文件。\033[0m"
    fi

    echo -e "\033[1;34m检测 $TARGET_FILE 是否被锁定...\033[0m"
    if lsattr $TARGET_FILE | grep -q "\-i\-"; then
        echo -e "\033[1;33m文件已锁定，正在解锁...\033[0m"
        chattr -i $TARGET_FILE
        echo -e "\033[1;32m文件已解锁，继续操作...\033[0m"
    else
        echo -e "\033[1;32m文件未锁定，无需解锁。\033[0m"
    fi

    echo -e "\033[1;34m备份原有的 $TARGET_FILE 文件...\033[0m"
    cp $TARGET_FILE $TARGET_FILE.bak

    echo -e "\033[1;34m修改 $TARGET_FILE 配置为 8.8.8.8...\033[0m"
    echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > $TARGET_FILE

    echo -e "\033[1;34m重启系统 DNS 服务...\033[0m"
    systemctl restart systemd-resolved
    if [ $? -eq 0 ]; then
        echo -e "\033[1;32m系统 DNS 已成功设置为 8.8.8.8 并重启！\033[0m"
    else
        echo -e "\033[31m[错误] DNS 服务重启失败，请检查配置！\033[0m"
    fi
    ;;
      
    0)
      break
      ;;
    *)
      echo -e "\033[31m无效选择，请重新输入！\033[0m"
      ;;
    esac
  done
  ;;

4)
  # 检测流媒体解锁支持情况
  echo "检测流媒体解锁支持情况..."
  bash <(curl -L -s https://raw.githubusercontent.com/1-stream/RegionRestrictionCheck/main/check.sh)
  if [ $? -eq 0 ]; then
    echo "流媒体解锁检测完成！"
  else
    echo "流媒体解锁检测失败，请检查网络连接或脚本 URL！"
  fi
  ;;

5)
  # 检查系统端口 53 占用情况
  check_and_release_port 53
  ;;

6)
  # 删除脚本本地文件
  echo -e "\033[1;34m删除脚本本地文件...\033[0m"
  rm -f $0
  echo -e "\033[1;32m脚本已成功删除！\033[0m"
  ;;

7)
  # 更新脚本
  echo -e "\033[1;34m检查远程脚本版本...\033[0m"
  
  # 获取远程脚本的版本号
  REMOTE_VERSION=$(curl -s https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dns-unlock.sh | grep "VERSION=" | cut -d '"' -f 2)
  
  # 当前脚本的版本号
 CURRENT_VERSION=$(grep 'VERSION=' /root/dns-unlock.sh | cut -d '"' -f 2)
  
  echo -e "\033[1;33m当前版本：$CURRENT_VERSION\033[0m"
  echo -e "\033[1;33m远程版本：$REMOTE_VERSION\033[0m"
  
  # 比较版本号
  if [ "$REMOTE_VERSION" \> "$CURRENT_VERSION" ]; then
    echo -e "\033[1;32m检测到新版本：$REMOTE_VERSION\033[0m"
    echo -e "\033[1;33m正在下载并更新脚本...\033[0m"
    
    # 下载并替换当前脚本
    curl -o /root/dns-unlock.sh https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dns-unlock.sh
    if [ $? -eq 0 ]; then
      echo -e "\033[1;32m脚本已成功更新为版本 $REMOTE_VERSION\033[0m"
      
      # 设置脚本可执行权限
      chmod +x /root/dns-unlock.sh

      # 重新执行更新后的脚本
      echo -e "\033[1;34m重新启动脚本...\033[0m"
      /root/dns-unlock.sh
      exit 0
    else
      echo -e "\033[31m[错误] 下载新脚本失败，请检查网络连接！\033[0m"
    fi
  else
    echo -e "\033[1;32m当前已经是最新版本，无需更新！\033[0m"
  fi
  ;;
  
  0)
  echo -e "\033[1;31m退出脚本...\033[0m"
  exit 0
  ;;

*)
  echo -e "\033[31m无效选择，请重新输入！\033[0m"
  ;;
esac
