From 8fbc60473ce6c48762a890a64309de3979beb572 Mon Sep 17 00:00:00 2001 From: engigu Date: Thu, 1 Jan 2026 15:14:56 +0800 Subject: [PATCH] feat: agent selfupdate check --- internal/controllers/agent_controller.go | 4 +-- internal/services/agent_service.go | 35 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/internal/controllers/agent_controller.go b/internal/controllers/agent_controller.go index 505257b..de1bff4 100644 --- a/internal/controllers/agent_controller.go +++ b/internal/controllers/agent_controller.go @@ -182,7 +182,7 @@ func (c *AgentController) Heartbeat(ctx *gin.Context) { // 检查是否需要更新 latestVersion := c.agentService.GetLatestVersion() - needUpdate := latestVersion != "" && req.Version != "" && req.Version != latestVersion + needUpdate := c.agentService.CheckNeedUpdate(req.Version, req.BuildTime) forceUpdate := agent.ForceUpdate // 如果强制更新已触发,重置标志 @@ -524,7 +524,7 @@ func (c *AgentController) handleHeartbeat(ac *services.AgentConnection, agent *m // 检查是否需要更新 latestVersion := c.agentService.GetLatestVersion() - needUpdate := latestVersion != "" && req.Version != "" && req.Version != latestVersion + needUpdate := c.agentService.CheckNeedUpdate(req.Version, req.BuildTime) forceUpdate := agent.ForceUpdate if forceUpdate && needUpdate { diff --git a/internal/services/agent_service.go b/internal/services/agent_service.go index 0b4d573..695faf9 100644 --- a/internal/services/agent_service.go +++ b/internal/services/agent_service.go @@ -1,6 +1,7 @@ package services import ( + "baihu/internal/constant" "baihu/internal/database" "baihu/internal/logger" "baihu/internal/models" @@ -387,6 +388,40 @@ func (s *AgentService) GetLatestVersion() string { return strings.TrimSpace(string(data)) } +// GetLatestBuildTime 获取最新 Agent 构建时间 +func (s *AgentService) GetLatestBuildTime() string { + return constant.BuildTime +} + +// CheckNeedUpdate 检查 Agent 是否需要更新 +// 比较 version 和 build_time,任一不同则需要更新 +func (s *AgentService) CheckNeedUpdate(agentVersion, agentBuildTime string) bool { + latestVersion := s.GetLatestVersion() + latestBuildTime := s.GetLatestBuildTime() + + // 如果没有最新版本信息,不需要更新 + if latestVersion == "" { + return false + } + + // 如果 Agent 没有版本信息,需要更新 + if agentVersion == "" { + return true + } + + // 版本不同,需要更新 + if agentVersion != latestVersion { + return true + } + + // 版本相同但构建时间不同,也需要更新 + if latestBuildTime != "" && latestBuildTime != "unknown" && agentBuildTime != "" && agentBuildTime != latestBuildTime { + return true + } + + return false +} + // GetAvailablePlatforms 获取可用的平台列表 func (s *AgentService) GetAvailablePlatforms() []map[string]string { platforms := []map[string]string{}