diff --git a/cmd/kubevpn/cmds/upgrade.go b/cmd/kubevpn/cmds/upgrade.go index fe9f047a..6cd3ef6c 100644 --- a/cmd/kubevpn/cmds/upgrade.go +++ b/cmd/kubevpn/cmds/upgrade.go @@ -1,22 +1,12 @@ package cmds import ( - "fmt" - "net/http" - "os" - "runtime" - - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "golang.org/x/oauth2" cmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/util/i18n" "k8s.io/kubectl/pkg/util/templates" - "github.com/wencaiwulue/kubevpn/v2/pkg/config" - "github.com/wencaiwulue/kubevpn/v2/pkg/daemon" "github.com/wencaiwulue/kubevpn/v2/pkg/upgrade" - "github.com/wencaiwulue/kubevpn/v2/pkg/util" ) func CmdUpgrade(_ cmdutil.Factory) *cobra.Command { @@ -28,22 +18,8 @@ func CmdUpgrade(_ cmdutil.Factory) *cobra.Command { disconnect all from k8s cluster, leave all resources, remove all clone resource, and then, upgrade local daemon grpc server to latest version. `)), - Run: func(cmd *cobra.Command, args []string) { - var client = http.DefaultClient - if config.GitHubOAuthToken != "" { - client = oauth2.NewClient(cmd.Context(), oauth2.StaticTokenSource(&oauth2.Token{AccessToken: config.GitHubOAuthToken, TokenType: "Bearer"})) - } - latestVersion, latestCommit, url, err := util.GetManifest(client, runtime.GOOS, runtime.GOARCH) - if err != nil { - log.Fatal(err) - } - err = upgrade.Main(cmd.Context(), client, latestVersion, latestCommit, url) - if err != nil { - log.Fatal(err) - } - fmt.Fprint(os.Stdout, "Upgrade daemon...") - err = daemon.StartupDaemon(cmd.Context()) - fmt.Fprint(os.Stdout, "done") + RunE: func(cmd *cobra.Command, args []string) error { + return upgrade.Main(cmd.Context()) }, } return cmd diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index 140fcffc..5b28d6da 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -6,10 +6,14 @@ import ( "net/http" "os" "path/filepath" + "runtime" + "strings" goversion "github.com/hashicorp/go-version" + "golang.org/x/oauth2" "github.com/wencaiwulue/kubevpn/v2/pkg/config" + "github.com/wencaiwulue/kubevpn/v2/pkg/daemon" "github.com/wencaiwulue/kubevpn/v2/pkg/util" ) @@ -21,51 +25,33 @@ import ( // 5) unzip to temp file // 6) check permission of putting new kubevpn back // 7) chmod +x, move old to /temp, move new to CURRENT_FOLDER -func Main(ctx context.Context, client *http.Client, latestVersion string, latestCommit string, url string) error { - fmt.Printf("The latest version is: %s, commit: %s\n", latestVersion, latestCommit) - - commit := config.GitCommit - version := config.Version - var err error - var cVersion, dVersion *goversion.Version - cVersion, err = goversion.NewVersion(version) +func Main(ctx context.Context) error { + client, url, up, err := needsUpgrade(ctx, config.Version, config.GitCommit) if err != nil { return err } - dVersion, err = goversion.NewVersion(latestVersion) - if err != nil { - return err - } - if cVersion.GreaterThan(dVersion) || (cVersion.Equal(dVersion) && commit == latestCommit) { - fmt.Println("Already up to date, don't needs to upgrade") + if !up { return nil } - var executable string - executable, err = os.Executable() + err = elevate() if err != nil { return err } - var tem *os.File - tem, err = os.Create(filepath.Join(filepath.Dir(executable), ".test")) - if tem != nil { - _ = tem.Close() - _ = os.Remove(tem.Name()) - } - if os.IsPermission(err) { - util.RunWithElevated() - os.Exit(0) - } else if err != nil { + + err = downloadAndInstall(client, url) + if err != nil { return err - } else if !util.IsAdmin() { - util.RunWithElevated() - os.Exit(0) } - fmt.Printf("Current version is: %s less than latest version: %s, needs to upgrade\n", cVersion, dVersion) + fmt.Fprint(os.Stdout, "Upgrade daemon...\n") + err = daemon.StartupDaemon(ctx) + fmt.Fprint(os.Stdout, "Done\n") + return err +} - var temp *os.File - temp, err = os.CreateTemp("", "") +func downloadAndInstall(client *http.Client, url string) error { + temp, err := os.CreateTemp("", "") if err != nil { return err } @@ -115,3 +101,61 @@ func Main(ctx context.Context, client *http.Client, latestVersion string, latest err = os.Rename(file.Name(), curFolder) return err } + +func elevate() error { + executable, err := os.Executable() + if err != nil { + return err + } + var tem *os.File + tem, err = os.Create(filepath.Join(filepath.Dir(executable), ".test")) + if tem != nil { + _ = tem.Close() + _ = os.Remove(tem.Name()) + } + if os.IsPermission(err) { + util.RunWithElevated() + os.Exit(0) + } else if err != nil { + return err + } else if !util.IsAdmin() { + util.RunWithElevated() + os.Exit(0) + } + return nil +} + +func needsUpgrade(ctx context.Context, version string, commit string) (client *http.Client, url string, upgrade bool, err error) { + var latestVersion, latestCommit string + if config.GitHubOAuthToken != "" { + client = oauth2.NewClient(ctx, oauth2.StaticTokenSource(&oauth2.Token{AccessToken: config.GitHubOAuthToken, TokenType: "Bearer"})) + latestVersion, latestCommit, url, err = util.GetManifest(client, runtime.GOOS, runtime.GOARCH) + } else { + client = http.DefaultClient + v := "https://github.com/kubenetworks/kubevpn/raw/master/plugins/stable.txt" + var stream []byte + stream, err = util.DownloadFileStream(v) + latestVersion = strings.TrimSpace(string(stream)) + url = fmt.Sprintf("https://github.com/kubenetworks/kubevpn/releases/download/%s/kubevpn_%s_%s_%s.zip", latestVersion, latestVersion, runtime.GOOS, runtime.GOARCH) + } + if err != nil { + return + } + + var currV, latestV *goversion.Version + currV, err = goversion.NewVersion(version) + if err != nil { + return + } + latestV, err = goversion.NewVersion(latestVersion) + if err != nil { + return + } + if currV.GreaterThan(latestV) || (currV.Equal(latestV) && commit == latestCommit) { + fmt.Fprintf(os.Stdout, "Already up to date, don't needs to upgrade, version: %s\n", latestV) + return + } + fmt.Fprintf(os.Stdout, "Current version is: %s less than latest version: %s, needs to upgrade\n", currV, latestV) + upgrade = true + return +} diff --git a/pkg/util/upgarde.go b/pkg/util/upgarde.go index ca8bf89c..51f4927b 100644 --- a/pkg/util/upgarde.go +++ b/pkg/util/upgarde.go @@ -11,7 +11,6 @@ import ( "strings" "github.com/schollz/progressbar/v3" - log "github.com/sirupsen/logrus" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" ) @@ -92,9 +91,7 @@ func Download(client *http.Client, url string, filename string, stdout, stderr i } defer get.Body.Close() total := float64(get.ContentLength) / 1024 / 1024 - s := fmt.Sprintf("Length: %d (%0.2fM)\n", get.ContentLength, total) - log.Info(s) - io.WriteString(stdout, s) + fmt.Fprintf(stdout, "Length: %d (%0.2fM)\n", get.ContentLength, total) var f *os.File f, err = os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) @@ -106,7 +103,7 @@ func Download(client *http.Client, url string, filename string, stdout, stderr i progressbar.OptionSetWriter(stdout), progressbar.OptionEnableColorCodes(true), progressbar.OptionShowBytes(true), - progressbar.OptionSetWidth(50), + progressbar.OptionSetWidth(25), progressbar.OptionOnCompletion(func() { _, _ = fmt.Fprint(stderr, "\n") }),