| package cmd |
|
|
| import ( |
| "time" |
|
|
| "github.com/spf13/cobra" |
| "go.uber.org/zap" |
|
|
| "github.com/apernet/hysteria/app/v2/internal/utils" |
| "github.com/apernet/hysteria/core/v2/client" |
| ) |
|
|
| const ( |
| updateCheckInterval = 24 * time.Hour |
| ) |
|
|
| |
| var checkUpdateCmd = &cobra.Command{ |
| Use: "check-update", |
| Short: "Check for updates", |
| Long: "Check for updates.", |
| Run: runCheckUpdate, |
| } |
|
|
| func init() { |
| rootCmd.AddCommand(checkUpdateCmd) |
| } |
|
|
| func runCheckUpdate(cmd *cobra.Command, args []string) { |
| logger.Info("checking for updates", |
| zap.String("version", appVersion), |
| zap.String("platform", appPlatform), |
| zap.String("arch", appArch), |
| zap.String("channel", appType), |
| ) |
|
|
| checker := utils.NewServerUpdateChecker(appVersion, appPlatform, appArch, appType) |
| resp, err := checker.Check() |
| if err != nil { |
| logger.Fatal("failed to check for updates", zap.Error(err)) |
| } |
| if resp.HasUpdate { |
| logger.Info("update available", |
| zap.String("version", resp.LatestVersion), |
| zap.String("url", resp.URL), |
| zap.Bool("urgent", resp.Urgent), |
| ) |
| } else { |
| logger.Info("no update available") |
| } |
| } |
|
|
| |
| func runCheckUpdateServer() { |
| checker := utils.NewServerUpdateChecker(appVersion, appPlatform, appArch, appType) |
| checkUpdateRoutine(checker) |
| } |
|
|
| |
| func runCheckUpdateClient(hyClient client.Client) { |
| checker := utils.NewClientUpdateChecker(appVersion, appPlatform, appArch, appType, hyClient) |
| checkUpdateRoutine(checker) |
| } |
|
|
| func checkUpdateRoutine(checker *utils.UpdateChecker) { |
| ticker := time.NewTicker(updateCheckInterval) |
| for { |
| logger.Debug("checking for updates", |
| zap.String("version", appVersion), |
| zap.String("platform", appPlatform), |
| zap.String("arch", appArch), |
| zap.String("channel", appType), |
| ) |
| resp, err := checker.Check() |
| if err != nil { |
| logger.Debug("failed to check for updates", zap.Error(err)) |
| } else if resp.HasUpdate { |
| logger.Info("update available", |
| zap.String("version", resp.LatestVersion), |
| zap.String("url", resp.URL), |
| zap.Bool("urgent", resp.Urgent), |
| ) |
| } else { |
| logger.Debug("no update available") |
| } |
| <-ticker.C |
| } |
| } |
|
|