#!/usr/bin/env bash echo "[INFO] Powered By Randallanjie.com" set -e ############################################################################### # 函数:检查并安装依赖 ############################################################################### function install_deps_if_needed() { local packages=("curl" "jq" "base64") # 判断命令是否存在,若不存在,则需要安装 for pkg in "${packages[@]}"; do if ! command -v "$pkg" &> /dev/null; then echo "[INFO] 检测到命令 '$pkg' 不存在,需要安装..." # 尝试判断系统使用 apt-get 或 yum 安装 if command -v apt-get &> /dev/null; then echo "[INFO] 检测到系统支持 apt-get,开始安装: $pkg" sudo apt-get update -y # base64 通常在 coreutils 中,jq 单独包 sudo apt-get install -y curl jq coreutils elif command -v yum &> /dev/null; then echo "[INFO] 检测到系统支持 yum,开始安装: $pkg" sudo yum install -y curl jq coreutils elif command -v dnf &> /dev/null; then echo "[INFO] 检测到系统支持 dnf,开始安装: $pkg" sudo dnf install -y curl jq coreutils elif command -v zypper &> /dev/null; then echo "[INFO] 检测到系统支持 zypper,开始安装: $pkg" sudo zypper install -y curl jq coreutils else echo "[ERROR] 不支持的包管理器,无法自动安装 $pkg,请手动安装。" exit 1 fi # 再次检测命令是否成功安装 if ! command -v "$pkg" &> /dev/null; then echo "[ERROR] 安装 $pkg 失败,请手动安装后再试。" exit 1 fi fi done } ############################################################################### # 开始脚本逻辑 ############################################################################### # 1. 检查依赖 install_deps_if_needed ############################################################################### # 解析命令行参数 ############################################################################### ACID="" ACKEY="" NAME="" CLUSTER_ID="" GROUP_ID=0 REGION_ID=0 DNS_ROUTES="" API_HOST="" GRANT_ID=1 # 默认值 while [[ $# -gt 0 ]]; do case $1 in --acid) ACID="$2" shift 2 ;; --ackey) ACKEY="$2" shift 2 ;; --name) NAME="$2" shift 2 ;; --clusterid) CLUSTER_ID="$2" shift 2 ;; --grantid) GRANT_ID="$2" shift 2 ;; --groupid) GROUP_ID="$2" shift 2 ;; --regionid) REGION_ID="$2" shift 2 ;; --dnsroutes) DNS_ROUTES="$2" shift 2 ;; --api-host) API_HOST="$2" shift 2 ;; *) echo "[ERROR] 未知参数: $1" exit 1 ;; esac done # 基础校验 if [[ -z "$ACID" || -z "$ACKEY" || -z "$CLUSTER_ID" ]]; then echo "[ERROR] 用法: $0 --acid --ackey --clusterid [--grantid ] [--name ] [--groupid ] [--regionid ] [--dnsroutes ] [--api-host ]" exit 1 fi ############################################################################### # 先获取本机 IPv4,用于创建节点时的 nodeLogin 和 “自动名称”逻辑 ############################################################################### echo "[INFO] 获取本机 IPv4 地址..." LOCAL_IPV4=$(curl -s 4.ipw.cn || true) if [[ -z "$LOCAL_IPV4" ]]; then echo "[WARN] 获取IPv4失败,使用0.0.0.0" LOCAL_IPV4="0.0.0.0" fi echo "[INFO] 本机 IPv4: $LOCAL_IPV4" # 如果没指定 --name,就自动生成一个 "<本机IPv4>(YYYY-MM-DD-HH-mm)" 格式名称 if [[ -z "$NAME" ]]; then DATE_STR=$(date +%Y-%m-%d-%H-%M) NAME="${LOCAL_IPV4}(${DATE_STR})" echo "[INFO] 未指定 --name,自动设置 NAME=$NAME" fi ############################################################################### # 2. 获取 Token ############################################################################### echo "[INFO] 正在获取 Token..." get_token_resp=$(curl -s -X POST \ -H "Content-Type: application/json" \ "$API_HOST/APIAccessTokenService/getAPIAccessToken" \ -d '{ "type": "admin", "accessKeyId": "'"$ACID"'", "accessKey": "'"$ACKEY"'" }') get_token_code=$(echo "$get_token_resp" | jq -r '.code') if [ "$get_token_code" != "200" ]; then echo "[ERROR] 获取Token失败,响应: $get_token_resp" exit 1 fi TOKEN=$(echo "$get_token_resp" | jq -r '.data.token') echo "[INFO] 成功获取 Token" ############################################################################### # 3. 创建节点 (NodeService/createNode) # nodeLogin.params 是 bytes 类型,所以先把 JSON Base64 编码 ############################################################################### echo "[INFO] 正在创建节点..." # 处理 DNS_ROUTES => JSON 数组 if [[ -n "$DNS_ROUTES" ]]; then dns_routes_json_array=$(echo "$DNS_ROUTES" | sed 's/ /","/g') dns_routes_json_array="[\"$dns_routes_json_array\"]" else dns_routes_json_array="[]" fi # nodeLogin.params 的原始 JSON # 加入 grantId=$GRANT_ID node_login_json=$(cat <