mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 18:35:51 +02:00
refactor: replace upgrader with version package for runtime and release information
This commit is contained in:
parent
8e212ae79b
commit
d0cf93d5e3
11 changed files with 182 additions and 121 deletions
42
internal/version/info.go
Normal file
42
internal/version/info.go
Normal file
|
@ -0,0 +1,42 @@
|
|||
package version
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type RuntimeInfo struct {
|
||||
OS string `json:"os"`
|
||||
Arch string `json:"arch"`
|
||||
ExPath string `json:"ex_path"`
|
||||
}
|
||||
|
||||
type CurVersion struct {
|
||||
Version string `json:"version"`
|
||||
BuildID int `json:"build_id"`
|
||||
TotalBuild int `json:"total_build"`
|
||||
}
|
||||
|
||||
func GetRuntimeInfo() (r RuntimeInfo, err error) {
|
||||
ex, err := os.Executable()
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.GetRuntimeInfo os.Executable() err")
|
||||
return
|
||||
}
|
||||
realPath, err := filepath.EvalSymlinks(ex)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.GetRuntimeInfo filepath.EvalSymlinks() err")
|
||||
return
|
||||
}
|
||||
|
||||
r = RuntimeInfo{
|
||||
OS: runtime.GOOS,
|
||||
Arch: runtime.GOARCH,
|
||||
ExPath: realPath,
|
||||
}
|
||||
|
||||
return
|
||||
}
|
124
internal/version/release.go
Normal file
124
internal/version/release.go
Normal file
|
@ -0,0 +1,124 @@
|
|||
package version
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
const (
|
||||
GithubLatestReleaseAPI = "https://api.github.com/repos/0xJacky/nginx-ui/releases/latest"
|
||||
GithubReleasesListAPI = "https://api.github.com/repos/0xJacky/nginx-ui/releases"
|
||||
)
|
||||
|
||||
type TReleaseAsset struct {
|
||||
Name string `json:"name"`
|
||||
BrowserDownloadUrl string `json:"browser_download_url"`
|
||||
Size uint `json:"size"`
|
||||
}
|
||||
|
||||
type TRelease struct {
|
||||
TagName string `json:"tag_name"`
|
||||
Name string `json:"name"`
|
||||
PublishedAt time.Time `json:"published_at"`
|
||||
Body string `json:"body"`
|
||||
Prerelease bool `json:"prerelease"`
|
||||
Assets []TReleaseAsset `json:"assets"`
|
||||
}
|
||||
|
||||
func (t *TRelease) GetAssetsMap() (m map[string]TReleaseAsset) {
|
||||
m = make(map[string]TReleaseAsset)
|
||||
for _, v := range t.Assets {
|
||||
m[v.Name] = v
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func getLatestRelease() (data TRelease, err error) {
|
||||
resp, err := http.Get(GithubLatestReleaseAPI)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.getLatestRelease http.Get err")
|
||||
return
|
||||
}
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.getLatestRelease io.ReadAll err")
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != 200 {
|
||||
err = errors.New(string(body))
|
||||
return
|
||||
}
|
||||
err = json.Unmarshal(body, &data)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.getLatestRelease json.Unmarshal err")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func getLatestPrerelease() (data TRelease, err error) {
|
||||
resp, err := http.Get(GithubReleasesListAPI)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.getLatestPrerelease http.Get err")
|
||||
return
|
||||
}
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.getLatestPrerelease io.ReadAll err")
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != 200 {
|
||||
err = errors.New(string(body))
|
||||
return
|
||||
}
|
||||
|
||||
var releaseList []TRelease
|
||||
|
||||
err = json.Unmarshal(body, &releaseList)
|
||||
if err != nil {
|
||||
err = errors.Wrap(err, "service.getLatestPrerelease json.Unmarshal err")
|
||||
return
|
||||
}
|
||||
|
||||
latestDate := time.Time{}
|
||||
|
||||
for _, release := range releaseList {
|
||||
if release.Prerelease && release.PublishedAt.After(latestDate) {
|
||||
data = release
|
||||
latestDate = release.PublishedAt
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func GetRelease(channel string) (data TRelease, err error) {
|
||||
stableRelease, err := getLatestRelease()
|
||||
if err != nil {
|
||||
return TRelease{}, err
|
||||
}
|
||||
|
||||
switch channel {
|
||||
default:
|
||||
fallthrough
|
||||
case "stable":
|
||||
return stableRelease, nil
|
||||
case "prerelease":
|
||||
preRelease, err := getLatestPrerelease()
|
||||
if err != nil {
|
||||
return TRelease{}, err
|
||||
}
|
||||
// if preRelease is newer than stableRelease, return preRelease
|
||||
// otherwise return stableRelease
|
||||
if preRelease.PublishedAt.After(stableRelease.PublishedAt) {
|
||||
return preRelease, nil
|
||||
}
|
||||
return stableRelease, nil
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue