mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-12-24 11:51:13 +08:00
refactor: upgrade (#266)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user