diff --git a/internal/selfupdate/selfupdate.go b/internal/selfupdate/selfupdate.go index c7d10f5..ad43434 100644 --- a/internal/selfupdate/selfupdate.go +++ b/internal/selfupdate/selfupdate.go @@ -53,12 +53,24 @@ func AssetName(goarch string) (string, error) { } } +// LatestReleaseURLEnv overrides the release-lookup endpoint as a whole +// (mirrors, tests), analogous to BaseURLEnv. +const LatestReleaseURLEnv = "XUI_RELEASE_LATEST_URL" + +// LatestReleaseURL returns the effective release-lookup endpoint. +func LatestReleaseURL() string { + if v := strings.TrimSpace(os.Getenv(LatestReleaseURLEnv)); v != "" { + return v + } + return LatestReleaseAPI +} + // FetchLatestReleaseTag returns the tag_name of the newest release. func FetchLatestReleaseTag(ctx context.Context, client *http.Client) (string, error) { if client == nil { client = http.DefaultClient } - req, err := http.NewRequestWithContext(ctx, http.MethodGet, LatestReleaseAPI, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, LatestReleaseURL(), nil) if err != nil { return "", err } diff --git a/internal/web/service/panel/panel.go b/internal/web/service/panel/panel.go index 55adc64..9a081f1 100644 --- a/internal/web/service/panel/panel.go +++ b/internal/web/service/panel/panel.go @@ -601,7 +601,10 @@ func (s *PanelService) runNativeUpdate(runID int64) { releaseUpdateSlot() } - tag, err := fetchLatestPanelVersion() + client := (&service.SettingService{}).NewProxiedHTTPClient(10 * time.Minute) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + tag, err := selfupdate.FetchLatestReleaseTag(ctx, client) if err != nil { fail("fetch latest release: %v", err) return @@ -622,9 +625,6 @@ func (s *PanelService) runNativeUpdate(runID int64) { } tmp := filepath.Join(filepath.Dir(exePath), fmt.Sprintf(".x-ui-update-%d", runID)) base := selfupdate.BaseURL() + tag + "/" - client := (&service.SettingService{}).NewProxiedHTTPClient(10 * time.Minute) - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) - defer cancel() logger.Infof("panel self-update: downloading %s (%s)", tag, asset) if err := selfupdate.DownloadVerified(ctx, client, base+asset, base+asset+".sha256", tmp); err != nil { _ = os.Remove(tmp)