refactor: upgrade (#266)

This commit is contained in:
naison
2024-05-24 10:54:12 +08:00
committed by GitHub
parent a26abab8ce
commit 2ec20f7d1d
3 changed files with 80 additions and 63 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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")
}),