From 8a9c0f5c8207c29123f41351301205832784cc7c Mon Sep 17 00:00:00 2001 From: Randall Date: Sat, 28 Dec 2024 16:26:27 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20goedge=5Fadd=5Fnode.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goedge_add_node.sh | 325 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 goedge_add_node.sh diff --git a/goedge_add_node.sh b/goedge_add_node.sh new file mode 100644 index 0000000..394f2d8 --- /dev/null +++ b/goedge_add_node.sh @@ -0,0 +1,325 @@ +#!/usr/bin/env bash +# +# 逻辑: +# 1. 检查依赖 +# 2. 若未指定 --name,则用 "本机IPv4(YYYY-MM-DD-HH-mm)" +# 3. 获取 Token +# 4. 创建节点 (nodeLogin.params 做 Base64,并包含grantId) +# 5. 批量添加 IP +# 6. 获取节点信息 +# 7. 安装节点 +# +# 依赖:curl, jq, base64 +# +# 若不加 --grantid,则默认值为 1; +# 若不加 --name,则自动设置成 "<本机IPv4>(YYYY-MM-DD-HH-mm)"。 + +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 <