forked from DevOps/deploy.stack
126 lines
3.9 KiB
Bash
126 lines
3.9 KiB
Bash
#!/usr/bin/env bash
|
||
#
|
||
# create-multi-keys.sh — 在 vm61 honcho 上批量创建 3 个客户端的 API key
|
||
#
|
||
# 用法:
|
||
# 1. 在 vm61 上: ./create-multi-keys.sh
|
||
# 2. 输出 3 个 key 文件到 ~/.honcho-keys/,chmod 600
|
||
# 3. scp 到对应客户端
|
||
#
|
||
# 前置:
|
||
# - honcho-api 容器跑着
|
||
# - AUTH_USE_AUTH=true + 管理员 token(honcho init 时生成)
|
||
# - workspace "home" 已存在
|
||
#
|
||
# ⚠️ 不要 echo key 到聊天。文件 chmod 600,scp 时 -p 保留权限。
|
||
|
||
set -euo pipefail
|
||
|
||
WORKSPACE="${HONCHO_WORKSPACE:-home}"
|
||
HONCHO_API="${HONCHO_API_URL:-http://10.0.0.1:8000}"
|
||
ADMIN_TOKEN_FILE="${HONCHO_ADMIN_TOKEN_FILE:-/root/.honcho-keys/admin.key}"
|
||
|
||
# 客户端清单: name:peer:device_hint
|
||
CLIENTS=(
|
||
"alpha:laodeng-mypc03:mypc03"
|
||
"beta:laodeng-govpc:gov-pc"
|
||
"gamma:laodeng-mac:macbook"
|
||
)
|
||
|
||
OUT_DIR="${OUT_DIR:-/root/.honcho-keys}"
|
||
mkdir -p "$OUT_DIR"
|
||
chmod 700 "$OUT_DIR"
|
||
|
||
if [[ ! -f "$ADMIN_TOKEN_FILE" ]]; then
|
||
echo "❌ 找不到 admin token: $ADMIN_TOKEN_FILE" >&2
|
||
echo " 把 honcho init 时生成的 admin token 写到该文件,chmod 600" >&2
|
||
exit 1
|
||
fi
|
||
|
||
ADMIN_TOKEN="$(cat "$ADMIN_TOKEN_FILE")"
|
||
|
||
echo "==> honcho: $HONCHO_API"
|
||
echo "==> workspace: $WORKSPACE"
|
||
echo "==> 输出目录: $OUT_DIR"
|
||
echo ""
|
||
|
||
for entry in "${CLIENTS[@]}"; do
|
||
IFS=':' read -r slug peer device <<< "$entry"
|
||
key_file="$OUT_DIR/${device}.key"
|
||
info_file="$OUT_DIR/${device}.json"
|
||
|
||
echo "--- [$device] peer=$peer ---"
|
||
|
||
# 检查 peer 是否已存在(幂等)
|
||
existing="$(curl -fsS -H "Authorization: Bearer *** "$HONCHO_API/v2/workspaces/$WORKSPACE/peers/$peer" 2>/dev/null || true)"
|
||
|
||
if [[ -n "$existing" && "$existing" != *"404"* ]]; then
|
||
echo " peer 已存在,跳过创建"
|
||
else
|
||
# 创建 peer
|
||
curl -fsS -X POST \
|
||
-H "Authorization: Bearer *** \
|
||
-H "Content-Type: application/json" \
|
||
-d "{\"name\":\"$peer\"}" \
|
||
"$HONCHO_API/v2/workspaces/$WORKSPACE/peers" \
|
||
| tee "$info_file.tmp" > /dev/null
|
||
mv "$info_file.tmp" "$info_file"
|
||
chmod 600 "$info_file"
|
||
echo " ✅ peer 已创建"
|
||
fi
|
||
|
||
# 创建 API key(每次新建,旧的不 revoke)
|
||
# honcho 的 key 创建 API 名称可能因版本不同,下面给常见两种尝试
|
||
key_resp="$(curl -fsS -X POST \
|
||
-H "Authorization: Bearer *** \
|
||
-H "Content-Type: application/json" \
|
||
-d "{\"name\":\"$peer\",\"scope\":\"peer:$peer\"}" \
|
||
"$HONCHO_API/v2/workspaces/$WORKSPACE/api-keys" 2>/dev/null || true)"
|
||
|
||
if [[ -z "$key_resp" ]]; then
|
||
# 备选 endpoint
|
||
key_resp="$(curl -fsS -X POST \
|
||
-H "Authorization: Bearer *** \
|
||
-H "Content-Type: application/json" \
|
||
-d "{\"name\":\"$peer\"}" \
|
||
"$HONCHO_API/v2/auth/keys 2>/dev/null || true)"
|
||
fi
|
||
|
||
if [[ -z "$key_resp" ]]; then
|
||
echo " ❌ 创建 key 失败,请检查 honcho API 版本" >&2
|
||
echo " 临时手动: honcho create user --workspace $WORKSPACE --name $peer" >&2
|
||
continue
|
||
fi
|
||
|
||
# 提取 token(兼容多种字段名)
|
||
token="$(echo "$key_resp" | python3 -c '
|
||
import json, sys
|
||
try:
|
||
d = json.load(sys.stdin)
|
||
print(d.get("token") or d.get("api_key") or d.get("key") or d.get("value") or "")
|
||
except Exception:
|
||
print("")
|
||
')"
|
||
|
||
if [[ -z "$token" ]]; then
|
||
echo " ❌ 无法从响应提取 token:"
|
||
echo "$key_resp" | head -c 500
|
||
echo ""
|
||
continue
|
||
fi
|
||
|
||
echo -n "$token" > "$key_file"
|
||
chmod 600 "$key_file"
|
||
echo " ✅ key 已写入: $key_file ($(wc -c < "$key_file") bytes)"
|
||
done
|
||
|
||
echo ""
|
||
echo "==> 完成。当前 keys:"
|
||
ls -la "$OUT_DIR"
|
||
echo ""
|
||
echo "下一步:"
|
||
echo " scp $OUT_DIR/mypc03.key mypc03:~/.honcho-keys/"
|
||
echo " scp $OUT_DIR/govpc.key govpc:~/.honcho-keys/"
|
||
echo " scp $OUT_DIR/mac.key macbook:~/.honcho-keys/"
|
||
echo ""
|
||
echo "⚠️ 不要 echo 这些 key 到聊天/日志/screenshot" |