#!/bin/bash
#  启动/停止/重启脚本

# ===================== 配置区 =====================
# 程序路径
AGENT_PATH="./dns-server"
# 日志文件路径
LOG_FILE="./server.log"
# PID文件路径（记录进程ID）
PID_FILE="./server.pid"
# 启动参数（根据实际需求调整）
START_ARGS=""
# 工作目录
WORK_DIR="."
# ==================== 配置区结束 ====================

# 检查程序文件是否存在
check_agent_exists() {
    if [ ! -f "${AGENT_PATH}" ]; then
        echo "错误：程序文件 ${AGENT_PATH} 不存在！"
        exit 1
    fi
    if [ ! -x "${AGENT_PATH}" ]; then
        echo "错误：程序文件 ${AGENT_PATH} 没有执行权限，正在尝试添加..."
        chmod +x "${AGENT_PATH}"
        if [ $? -ne 0 ]; then
            echo "错误：添加执行权限失败，请手动执行 chmod +x ${AGENT_PATH}"
            exit 1
        fi
    fi
}

# 检查进程是否运行
check_running() {
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p "${PID}" > /dev/null 2>&1; then
            return 0  # 运行中
        else
            rm -f "${PID_FILE}"  # PID文件存在但进程已死，清理PID文件
        fi
    fi
    return 1  # 未运行
}

# 启动程序
start_agent() {
    if check_running; then
        echo "✅ dns-server 已在运行（PID: $(cat ${PID_FILE})）"
        return 0
    fi

    echo "🚀 正在启动 dns-server（工作目录：${WORK_DIR}）..."
    
    # 新增：检查并切换工作目录
    if [ ! -d "${WORK_DIR}" ]; then
        echo "⚠️ 工作目录 ${WORK_DIR} 不存在，正在创建..."
        mkdir -p "${WORK_DIR}"
        if [ $? -ne 0 ]; then
            echo "❌ 创建工作目录 ${WORK_DIR} 失败！"
            exit 1
        fi
    fi
    
    # 切换到工作目录（关键：程序将在此目录下运行）
    cd "${WORK_DIR}" || {
        echo "❌ 切换到工作目录 ${WORK_DIR} 失败！"
        exit 1
    }

    # 创建日志目录
    mkdir -p "$(dirname ${LOG_FILE})"
    # 后台启动程序（注意：cd仅影响当前子进程，需在同一行执行）
    nohup "${AGENT_PATH}" ${START_ARGS} > "${LOG_FILE}" 2>&1 &
    AGENT_PID=$!
    echo "${AGENT_PID}" > "${PID_FILE}"

    # 等待检查启动状态
    sleep 2
    if check_running; then
        echo "✅ dns-server 启动成功（PID: ${AGENT_PID}，工作目录：${WORK_DIR}）"
        echo "日志文件：${LOG_FILE}"
    else
        echo "❌ dns-server 启动失败！请查看日志：${LOG_FILE}"
        rm -f "${PID_FILE}"
        exit 1
    fi
}
# 停止程序
stop_agent() {
    if ! check_running; then
        echo "ℹ️ dns-server 未运行"
        return 0
    fi

    PID=$(cat "${PID_FILE}")
    echo "🛑 正在停止 dns-server（PID: ${PID}）..."
    # 优雅停止（先尝试TERM信号，失败则强制KILL）
    kill "${PID}" > /dev/null 2>&1
    sleep 3

    if ps -p "${PID}" > /dev/null 2>&1; then
        echo "⚠️ 优雅停止失败，强制杀死进程..."
        kill -9 "${PID}" > /dev/null 2>&1
        sleep 1
    fi

    # 清理PID文件
    rm -f "${PID_FILE}"
    echo "✅ dns-server 已停止"
}

# 查看状态
status_agent() {
    if check_running; then
        echo "✅ dns-server 运行中（PID: $(cat ${PID_FILE})）"
    else
        echo "ℹ️ dns-server 未运行"
    fi
}

# 重启程序
restart_agent() {
    echo "🔄 正在重启 dns-server..."
    stop_agent
    sleep 2
    start_agent
}

# 帮助信息
show_help() {
    echo "使用方法：$0 [start|stop|restart|status|help]"
    echo "  start   - 启动 dns-server"
    echo "  stop    - 停止 dns-server"
    echo "  restart - 重启 dns-server"
    echo "  status  - 查看 dns-server 运行状态"
    echo "  help    - 显示帮助信息"
}

# 主逻辑
main() {
    # 检查是否为root用户（可选，根据需求调整）
    if [ "$(id -u)" -ne 0 ]; then
        echo "警告：建议使用root用户运行此脚本（当前用户：$(whoami)）"
        # exit 1  # 如果强制要求root，取消注释
    fi

    check_agent_exists

    case "$1" in
        start)
            start_agent
            ;;
        stop)
            stop_agent
            ;;
        restart)
            restart_agent
            ;;
        status)
            status_agent
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            echo "错误：无效参数 '$1'"
            show_help
            exit 1
            ;;
    esac
}

# 执行主逻辑
main "$@"

