From 7a021765774256df7e7ecd065097447fcb0a35d6 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sun, 19 Apr 2026 11:59:28 +0800 Subject: [PATCH] Reuse saved managerd agent token on deploy --- scripts/deploy.sh | 33 +++++++++++++++++++++++---------- tests/test_deploy_script.py | 8 ++++++-- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index d316cfc..08f2ae8 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -3,7 +3,7 @@ # 部署到 /opt,包含完整的运行时目录、权限、日志轮转等 # # 用法: sudo ./deploy.sh [install|upgrade|status|logs|clean-hls|uninstall] -# 安装/升级 Agent 时必须显式传入后台管理统一主钥匙: +# 首次安装 Agent 时传入后台管理统一主钥匙;后续部署默认沿用设备保存的主钥匙: # sudo 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= ./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= ./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= ./deploy.sh install" + echo " sudo ./deploy.sh upgrade # 沿用设备保存的后台管理统一主钥匙" echo " sudo ./deploy.sh status" echo " sudo ./deploy.sh clean-hls 7 # 保留最近7天" exit 1 diff --git a/tests/test_deploy_script.py b/tests/test_deploy_script.py index 1d399c0..38ebe8b 100644 --- a/tests/test_deploy_script.py +++ b/tests/test_deploy_script.py @@ -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__":