#!/bin/bash

# =================================================================
#  URL Checker Remote Node 本地一键安装脚本 (在线安装版)
#  节点无需开放任何端口，只需能访问主控端出站网络
# =================================================================

# 1. Caddy 静态服务基础 URL
DOWNLOAD_BASE_URL="https://files.sanyi.best/shell"
BINARY_URL="${DOWNLOAD_BASE_URL}/remote_checker"
INSTALL_DIR="/usr/local/bin"
BINARY_PATH="${INSTALL_DIR}/remote_checker"

# 2. 检查是否使用 root 权限运行
if [ "$EUID" -ne 0 ]; then
    echo "错误：请使用 root 权限运行此脚本 (例如使用 sudo bash)。"
    exit 1
fi

if [ -f /etc/os-release ]; then
    . /etc/os-release
    OS=$ID
else
    echo "无法确定操作系统类型。"
    exit 1
fi

if [[ "$OS" != "centos" && "$OS" != "ubuntu" && "$OS" != "debian" && "$OS" != "almalinux" && "$OS" != "rocky" && "$OS" != "alpine" ]]; then
    echo "警告：未测试的操作系统类型 $OS，将尝试继续..."
fi

# ── 下载二进制文件 ──────────────────────────────────────────────

echo "正在从 ${BINARY_URL} 下载 remote_checker ..."
if command -v curl >/dev/null 2>&1; then
    curl -f -L "$BINARY_URL" -o "$BINARY_PATH"
elif command -v wget >/dev/null 2>&1; then
    wget -qO "$BINARY_PATH" "$BINARY_URL"
else
    echo "错误：系统未安装 curl 或 wget，无法下载文件。"
    exit 1
fi

if [ $? -ne 0 ]; then
    echo "错误：下载 remote_checker 失败！请检查 DOWNLOAD_BASE_URL 配置是否正确，或网络是否连通。"
    exit 1
fi

chmod +x "$BINARY_PATH"
echo "下载完成并已授予执行权限。"

# ── 交互式配置 ──────────────────────────────────────────────────

read -p "请输入节点 UUID（需与主控端管理页面中注册的 UUID 一致）: " NODE_UUID
if [ -z "$NODE_UUID" ]; then
    echo "错误：UUID 不能为空，请先在主控端管理页面创建节点并复制其 UUID。"
    exit 1
fi

read -p "请输入主控端地址（格式 host:port，端口与主控 Web 端口相同）: " MASTER_ADDR
if [ -z "$MASTER_ADDR" ]; then
    echo "错误：主控端地址不能为空。"
    exit 1
fi

echo ""
echo "配置确认："
echo "  节点 UUID   : $NODE_UUID"
echo "  主控端地址  : $MASTER_ADDR"
echo "  安装路径    : $BINARY_PATH"
echo "  （节点无需开放任何入站端口）"
echo ""

# ── 服务安装与启动 ─────────────────────────────────────────────

if command -v systemctl >/dev/null 2>&1; then
    # ── 创建 systemd 服务文件 ──────────────────────────────────────
    SERVICE_FILE="/etc/systemd/system/remote-checker.service"

    cat <<EOL > $SERVICE_FILE
[Unit]
Description=URL Checker Remote Node Service
After=network.target

[Service]
Type=simple
ExecStart=${BINARY_PATH} --uuid $NODE_UUID --master $MASTER_ADDR
WorkingDirectory=/tmp
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOL

    systemctl daemon-reload
    systemctl stop remote-checker 2>/dev/null
    systemctl start remote-checker
    systemctl enable remote-checker

    echo "----------------------------------------------------"
    echo "URL Checker 远程节点已在 systemd 中安装并启动。"
    echo "状态检查: systemctl status remote-checker"
    echo "日志查看: journalctl -u remote-checker -f"
    echo "----------------------------------------------------"

elif command -v rc-service >/dev/null 2>&1; then
    # ── 创建 OpenRC 服务文件 (Alpine Linux) ──────────────────────
    SERVICE_FILE="/etc/init.d/remote-checker"

    cat <<EOL > $SERVICE_FILE
#!/sbin/openrc-run

name="remote-checker"
description="URL Checker Remote Node Service"

command="${BINARY_PATH}"
command_args="--uuid $NODE_UUID --master $MASTER_ADDR"
command_background="yes"
pidfile="/run/remote-checker.pid"
directory="/tmp"

depend() {
    need net
}
EOL

    chmod +x $SERVICE_FILE

    rc-service remote-checker stop 2>/dev/null
    rc-service remote-checker start
    rc-update add remote-checker default

    echo "----------------------------------------------------"
    echo "URL Checker 远程节点已在 OpenRC 中安装并启动。"
    echo "状态检查: rc-service remote-checker status"
    echo "由于 OpenRC 默认后台进程不记录标准输出，如需排查问题"
    echo "建议查看服务端日志或将程序日志重定向至文件。"
    echo "----------------------------------------------------"

else
    echo "----------------------------------------------------"
    echo "警告：未检测到支持的系统服务管理器 (systemd 或 OpenRC)。"
    echo "您需要手动运行此节点，例如使用 nohup 或 screen/tmux："
    echo "命令: ${BINARY_PATH} --uuid $NODE_UUID --master $MASTER_ADDR"
    echo "----------------------------------------------------"
fi