#!/bin/bash
#
# Teleport Node Agent 安装脚本
# 适用于 OpenAnolis / RHEL / CentOS / AlmaLinux
#
# 使用方法:
#   ./install-teleport-agent.sh -n <节点名称> -p <代理地址> -t <Token> -l <标签>
#
# 参数说明:
#   -n, --node-name     节点名称 (必填)
#   -p, --proxy-addr    Teleport 代理地址 (必填), 格式: teleport.example.com:443
#   -t, --auth-token    Join Token (可选)
#   -l, --labels        节点标签 (可选), 格式: env=prod,server=node01
#   -v, --version       Teleport 版本 (可选), 默认: 17.0.0
#   -h, --help          显示帮助信息
#
# 示例:
#   ./install-teleport-agent.sh -n server-01 -p teleport.example.com:443 -t abc123 -l "env=prod,server=server-01"
#   ./install-teleport-agent.sh --node-name server-02 --proxy-addr teleport.example.com:443 --labels "env=prod,server=server-02"
#

set -e

# ========== 默认配置 ==========
TELEPORT_VERSION="17.0.0"           # Teleport 版本
PROXY_ADDR=""                        # Teleport 代理地址
AUTH_TOKEN=""                        # Join Token（如果需要）
LABELS=""                           # 节点标签
NODE_NAME=""                         # 节点名称

# ========== 颜色输出 ==========
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# ========== 显示帮助信息 ==========
show_help() {
    head -20 "$0" | tail -19
    exit 0
}

# ========== 解析命令行参数 ==========
parse_args() {
    if [[ $# -eq 0 ]]; then
        log_error "请提供必要的参数"
        echo ""
        head -20 "$0" | tail -19
        exit 1
    fi

    while [[ $# -gt 0 ]]; do
        case $1 in
            -n|--node-name)
                NODE_NAME="$2"
                shift 2
                ;;
            -p|--proxy-addr)
                PROXY_ADDR="$2"
                shift 2
                ;;
            -t|--auth-token)
                AUTH_TOKEN="$2"
                shift 2
                ;;
            -l|--labels)
                LABELS="$2"
                shift 2
                ;;
            -v|--version)
                TELEPORT_VERSION="$2"
                shift 2
                ;;
            -h|--help)
                show_help
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                ;;
        esac
    done

    # 验证必填参数
    if [[ -z "$NODE_NAME" ]]; then
        log_error "节点名称 (-n/--node-name) 为必填参数"
        exit 1
    fi

    if [[ -z "$PROXY_ADDR" ]]; then
        log_error "代理地址 (-p/--proxy-addr) 为必填参数"
        exit 1
    fi

    # 如果没有提供标签，默认使用节点名称
    if [[ -z "$LABELS" ]]; then
        LABELS="server=${NODE_NAME}"
    fi
}

# ========== 检查root权限 ==========
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "请使用 root 用户运行此脚本"
        exit 1
    fi
}

# ========== 检测系统版本 ==========
detect_os() {
    if [[ -f /etc/os-release ]]; then
        source /etc/os-release
        OS_NAME="$NAME"
        OS_ID="$ID"
        OS_VERSION="$VERSION_ID"
    else
        log_error "无法检测操作系统版本"
        exit 1
    fi

    log_info "检测到操作系统: $OS_NAME $OS_VERSION"

    # OpenAnolis 属于 el 系
    if [[ "$OS_ID" == "openanolis" || "$OS_ID" == "anolis" ]]; then
        PACKAGE_MANAGER="yum"
        log_info "使用 yum 包管理器"
    elif [[ "$OS_ID" == "centos" || "$OS_ID" == "rhel" || "$OS_ID" == "rocky" || "$OS_ID" == "almalinux" ]]; then
        PACKAGE_MANAGER="yum"
    else
        log_warn "未知操作系统，将尝试使用 yum"
        PACKAGE_MANAGER="yum"
    fi
}

# ========== 添加 Teleport 仓库 ==========
add_teleport_repo() {
    log_info "添加 Teleport 官方仓库..."

    # 安装依赖
    $PACKAGE_MANAGER install -y yum-utils curl

    # 添加 Teleport 仓库
    yum-config-manager --add-repo https://deb.releases.teleport.dev/teleport-repo.repo

    # 清理缓存
    yum clean metadata
}

# ========== 安装 Teleport ==========
install_teleport() {
    log_info "安装 Teleport $TELEPORT_VERSION ..."

    # 安装 teleport（包含 tsh 和 tctl）
    $PACKAGE_MANAGER install -y teleport-${TELEPORT_VERSION}

    # 验证安装
    if command -v tsh &> /dev/null; then
        log_info "Teleport 安装成功！"
        tsh version
    else
        log_error "Teleport 安装失败"
        exit 1
    fi
}

# ========== 配置 Teleport Agent ==========
configure_agent() {
    log_info "配置 Teleport Agent..."

    # 创建配置目录
    mkdir -p /etc/teleport

    # 生成 teleport.yaml 配置
    cat > /etc/teleport/teleport.yaml << EOF
version: v2
teleport:
  nodename: ${NODE_NAME}
  auth_token: ${AUTH_TOKEN}
  proxy_server: ${PROXY_ADDR}
  labels:
    $(echo $LABELS | tr ',' '\n' | sed 's/=/: /')

ssh_service:
  enabled: true
  labels:
    $(echo $LABELS | tr ',' '\n' | sed 's/=/: /')

auth_service:
  enabled: false

proxy_service:
  enabled: false
EOF

    log_info "配置文件已创建: /etc/teleport/teleport.yaml"
}

# ========== 配置 systemd 服务 ==========
setup_systemd_service() {
    log_info "配置 systemd 服务..."

    # 创建 teleport 用户（如果不存在）
    id teleport &>/dev/null || useradd -r -d /var/lib/teleport -s /sbin/nologin teleport

    # 设置目录权限
    chown -R teleport:teleport /var/lib/teleport
    chown -R teleport:teleport /etc/teleport

    # 复制 systemd 服务文件
    cp /lib/systemd/system/teleport.service /etc/systemd/system/teleport.service

    # 重新加载 systemd
    systemctl daemon-reload

    # 设置开机自启
    systemctl enable teleport

    log_info "systemd 服务配置完成"
}

# ========== 启动服务 ==========
start_service() {
    log_info "启动 Teleport 服务..."

    systemctl start teleport
    sleep 2

    if systemctl is-active --quiet teleport; then
        log_info "Teleport 服务已启动"
        systemctl status teleport --no-pager
    else
        log_error "Teleport 服务启动失败"
        journalctl -u teleport -n 50 --no-pager
        exit 1
    fi
}

# ========== 验证连接 ==========
verify_connection() {
    log_info "验证节点注册状态..."

    # 提示用户需要在控制端运行以下命令查看节点
    echo ""
    log_info "请在安装了 tsh 客户端的机器上运行以下命令查看节点列表:"
    echo "  tsh nodes"
    echo ""
    log_info "或者查看详细节点信息:"
    echo "  tsh ls -v"
    echo ""
}

# ========== 主函数 ==========
main() {
    # 解析命令行参数
    parse_args "$@"

    log_info "开始安装 Teleport Node Agent..."
    log_info "节点名称: $NODE_NAME"
    log_info "代理地址: $PROXY_ADDR"
    log_info "节点标签: $LABELS"
    log_info "Teleport 版本: $TELEPORT_VERSION"
    echo ""

    check_root
    detect_os

    # 如果没有 Auth Token，提示用户
    if [[ -z "$AUTH_TOKEN" ]]; then
        log_warn "未设置 AUTH_TOKEN，请在部署前先在 Auth Server 上生成 token:"
        echo "  tctl nodes add --roles=node --ttl=1h"
        echo ""
        log_warn "或者在配置中移除 auth_token，运行服务后再通过邀请方式注册"
        echo ""
    fi

    add_teleport_repo
    install_teleport
    configure_agent
    setup_systemd_service
    start_service
    verify_connection

    log_info "Teleport Node Agent 安装完成！"
}

main "$@"
