Reuse saved managerd agent token on deploy

This commit is contained in:
tian 2026-04-19 11:59:28 +08:00
parent d1d2da08d1
commit 7a02176577
2 changed files with 29 additions and 12 deletions

View File

@ -3,7 +3,7 @@
# 部署到 /opt包含完整的运行时目录、权限、日志轮转等
#
# 用法: sudo ./deploy.sh [install|upgrade|status|logs|clean-hls|uninstall]
# 安装/升级 Agent 时必须显式传入后台管理统一主钥匙:
# 首次安装 Agent 时传入后台管理统一主钥匙;后续部署默认沿用设备保存的主钥匙:
# sudo AGENT_TOKEN=<managerd.json 中的 agent_token> ./deploy.sh install
set -e
@ -46,18 +46,28 @@ DEPLOY_CONFIG_OVERLAYS="${DEPLOY_CONFIG_OVERLAYS:-configs/overlays/face_debug.js
DEPLOY_CONFIG_ID="${DEPLOY_CONFIG_ID:-local_3588_face_debug}"
DEPLOY_CONFIG_VERSION="${DEPLOY_CONFIG_VERSION:-$(date +%Y%m%d.%H%M%S)}"
# 后台管理系统访问所有设备 agent 的统一主钥匙。
# 必须由部署调用方显式传入,禁止设备本地随机生成,避免后台和设备 token 漂移。
# 示例:
# 后台管理系统访问所有设备 agent 的统一主钥匙。传入 AGENT_TOKEN 表示写入/轮换主钥匙;
# 不传时沿用设备上保存的主钥匙。禁止设备本地随机生成,避免后台和设备 token 漂移。
# 首次安装示例:
# sudo AGENT_TOKEN=4fe2d69fda23d0d5d04a1486d4920e68 ./scripts/deploy.sh install
# 后续升级示例:
# sudo ./scripts/deploy.sh upgrade
AGENT_TOKEN="${AGENT_TOKEN:-}"
AGENT_TOKEN_FILE="$AGENT_INSTALL_DIR/agent.token"
require_agent_token() {
resolve_agent_token() {
if [ -z "$AGENT_TOKEN" ]; then
echo -e "${RED}错误: AGENT_TOKEN 未设置${NC}"
echo "Agent token 是后台管理系统访问所有设备的统一管理主钥匙,部署脚本不会本地生成 token。"
echo "请使用sudo AGENT_TOKEN=<managerd.json 中的 agent_token> ./scripts/deploy.sh install"
exit 1
if [ -f "$AGENT_TOKEN_FILE" ]; then
AGENT_TOKEN="$(tr -d '\r\n[:space:]' < "$AGENT_TOKEN_FILE")"
echo -e "${GREEN}${NC} 使用设备已保存的后台管理统一主钥匙"
else
echo -e "${RED}错误: 未提供 AGENT_TOKEN且未找到已保存的主钥匙 $AGENT_TOKEN_FILE${NC}"
echo "首次安装必须使用sudo AGENT_TOKEN=<managerd.json 中的 agent_token> ./scripts/deploy.sh install"
echo "部署脚本不会本地生成 token。"
exit 1
fi
else
echo -e "${GREEN}${NC} 使用 AGENT_TOKEN 写入/轮换后台管理统一主钥匙"
fi
if ! printf '%s' "$AGENT_TOKEN" | grep -Eq '^[A-Za-z0-9._:-]+$'; then
echo -e "${RED}错误: AGENT_TOKEN 包含不支持的字符${NC}"
@ -491,7 +501,7 @@ EOF
# 安装 Agent
cmd_install_agent() {
echo -e "${BLUE}[2/5] 安装 Agent...${NC}"
require_agent_token
resolve_agent_token
# 查找 Agent 编译产物(优先使用预编译的 arm64 二进制)
AGENT_SOURCE=""
@ -513,6 +523,8 @@ cmd_install_agent() {
cp "$AGENT_SOURCE" "$AGENT_INSTALL_DIR/rk3588-agent"
chmod +x "$AGENT_INSTALL_DIR/rk3588-agent"
printf '%s\n' "$AGENT_TOKEN" > "$AGENT_TOKEN_FILE"
chmod 600 "$AGENT_TOKEN_FILE"
# Agent 配置
cat > "$AGENT_INSTALL_DIR/agent.config.json" << EOF
@ -870,6 +882,7 @@ case "${1:-install}" in
echo ""
echo "示例:"
echo " sudo AGENT_TOKEN=<managerd.json 中的 agent_token> ./deploy.sh install"
echo " sudo ./deploy.sh upgrade # 沿用设备保存的后台管理统一主钥匙"
echo " sudo ./deploy.sh status"
echo " sudo ./deploy.sh clean-hls 7 # 保留最近7天"
exit 1

View File

@ -6,14 +6,18 @@ ROOT = Path(__file__).resolve().parents[1]
class DeployScriptTest(unittest.TestCase):
def test_deploy_requires_managerd_agent_token_without_fallback(self):
def test_deploy_uses_saved_managerd_agent_token_without_random_fallback(self):
text = (ROOT / "scripts" / "deploy.sh").read_text(encoding="utf-8")
self.assertIn('AGENT_TOKEN="${AGENT_TOKEN:-}"', text)
self.assertIn("require_agent_token", text)
self.assertIn('AGENT_TOKEN_FILE="$AGENT_INSTALL_DIR/agent.token"', text)
self.assertIn("resolve_agent_token", text)
self.assertIn('AGENT_TOKEN="$(tr -d', text)
self.assertIn('"token": "$AGENT_TOKEN"', text)
self.assertIn('printf \'%s\\n\' "$AGENT_TOKEN" > "$AGENT_TOKEN_FILE"', text)
self.assertNotIn("openssl rand", text)
self.assertIn("不会本地生成 token", text)
self.assertIn("首次安装必须使用", text)
if __name__ == "__main__":