From 16b02fd3f184777ff7d1947d515b2ce7b87218a1 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 22 Jun 2026 11:26:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Agent=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=AF=94=E5=AF=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog/index.md | 2 + internal/apps/openflare/node/helpers.go | 79 +-------------------- internal/apps/openflare/node/logics_test.go | 25 +++++++ 3 files changed, 29 insertions(+), 77 deletions(-) diff --git a/docs/changelog/index.md b/docs/changelog/index.md index 61f09fe6..4563dae9 100644 --- a/docs/changelog/index.md +++ b/docs/changelog/index.md @@ -28,6 +28,8 @@ sidebar: false ### 修复 +- 修复 Agent 升级版本比对逻辑:使用统一的 `pkg/utils.CompareVersions` 对比版本,正确处理预览/预发布版本(如 `v3.0.0-beta` 升级到 `v3.0.0-beta.1`),避免升级按钮非预期禁用的问题。 + - 修复 Agent 以 `openflare` 非 root 运行时 OpenResty `-t`/reload 失败:nginx `pid` 与 `client_body_temp`/`proxy_temp` 等临时目录改写入 `data_dir/var/run` 与 `data_dir/var/cache/nginx`(`__OPENFLARE_PID_PATH__` / `__OPENFLARE_NGINX_CACHE_DIR__` 占位符),不再使用 OpenResty 安装目录下不可写路径。 - 修复 OpenResty 响应泄露版本号:默认主配置模板与 safe fallback 模板补充 `server_tokens off;`,隐藏 `Server` 头与错误页中的 nginx/OpenResty 版本信息。 diff --git a/internal/apps/openflare/node/helpers.go b/internal/apps/openflare/node/helpers.go index a58520ba..72b04035 100644 --- a/internal/apps/openflare/node/helpers.go +++ b/internal/apps/openflare/node/helpers.go @@ -12,12 +12,12 @@ import ( "io" "net" "net/http" - "strconv" "strings" "time" ofws "github.com/Rain-kl/Wavelet/internal/apps/openflare/websocket" "github.com/Rain-kl/Wavelet/internal/model" + "github.com/Rain-kl/Wavelet/pkg/utils" ) const ( @@ -298,82 +298,7 @@ func isVersionNewer(current string, latest string) bool { } func compareVersions(local, remote string) int { - left := parseVersionInfo(local) - right := parseVersionInfo(remote) - if left.isDev { - if right.valid { - return -1 - } - return 0 - } - if !left.valid || !right.valid { - return 0 - } - - maxLen := len(left.numbers) - if len(right.numbers) > maxLen { - maxLen = len(right.numbers) - } - for index := 0; index < maxLen; index++ { - leftValue := 0 - rightValue := 0 - if index < len(left.numbers) { - leftValue = left.numbers[index] - } - if index < len(right.numbers) { - rightValue = right.numbers[index] - } - if leftValue < rightValue { - return -1 - } - if leftValue > rightValue { - return 1 - } - } - return 0 -} - -type versionInfo struct { - valid bool - isDev bool - numbers []int -} - -func parseVersionInfo(version string) versionInfo { - normalized := strings.TrimSpace(strings.TrimPrefix(version, "v")) - if normalized == "" || normalized == "dev" { - return versionInfo{isDev: strings.EqualFold(normalized, "dev")} - } - base := normalized - if separator := strings.IndexRune(normalized, '-'); separator >= 0 { - base = normalized[:separator] - } - segments := strings.Split(base, ".") - parts := make([]int, 0, len(segments)) - for _, segment := range segments { - segment = strings.TrimSpace(segment) - if segment == "" { - parts = append(parts, 0) - continue - } - numeric := strings.Builder{} - for _, r := range segment { - if r < '0' || r > '9' { - break - } - numeric.WriteRune(r) - } - if numeric.Len() == 0 { - parts = append(parts, 0) - continue - } - value, err := strconv.Atoi(numeric.String()) - if err != nil { - return versionInfo{} - } - parts = append(parts, value) - } - return versionInfo{valid: len(parts) > 0, numbers: parts} + return utils.CompareVersions(local, remote) } func fetchLatestGitHubRelease(ctx context.Context, repo string, channel releaseChannel) (*githubReleaseResponse, error) { diff --git a/internal/apps/openflare/node/logics_test.go b/internal/apps/openflare/node/logics_test.go index 7f1731f9..281dc8ef 100644 --- a/internal/apps/openflare/node/logics_test.go +++ b/internal/apps/openflare/node/logics_test.go @@ -331,3 +331,28 @@ type roundTripFunc func(req *http.Request) (*http.Response, error) func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) { return f(req) } + +func TestCompareVersions(t *testing.T) { + tests := []struct { + local string + remote string + expected int + }{ + {"v3.0.0-beta", "v3.0.0-beta.1", -1}, + {"v3.0.0-beta", "v3.0.0", -1}, + {"v3.0.0-beta.1", "v3.0.0", -1}, + {"dev", "v3.0.0", -1}, + {"v3.0.0", "v3.0.0", 0}, + {"v3.0.0", "v2.9.9", 1}, + {"v3.0.0", "v3.0.1", -1}, + {"v3.0.0-beta.1", "v3.0.0-beta.2", -1}, + {"v3.0.0-beta.11", "v3.0.0-beta.2", 1}, + } + + for _, tt := range tests { + t.Run(tt.local+"_vs_"+tt.remote, func(t *testing.T) { + res := compareVersions(tt.local, tt.remote) + assert.Equal(t, tt.expected, res) + }) + } +}