loader logic revised
This commit is contained in:
@@ -1,19 +1,84 @@
|
||||
package loader
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"galaxy/connector"
|
||||
"galaxy/util"
|
||||
)
|
||||
|
||||
func (l *loader) newerVersion(version string) bool {
|
||||
return util.CompareSemver(util.MustParseSemver(l.client.Version()), util.MustParseSemver(version)) > 0
|
||||
func (l *loader) checkAndDownloadPluginVersion() error {
|
||||
versions, err := l.connector.CheckVersion()
|
||||
if err != nil {
|
||||
return err
|
||||
} else if latest, ok, err := latestVersion(versions); err != nil {
|
||||
return err
|
||||
} else if ok {
|
||||
return l.preparePluginVersion(latest)
|
||||
} else {
|
||||
return errors.New("Server did not respond with a suitable client version")
|
||||
}
|
||||
}
|
||||
|
||||
// downloadVersion fetches given version artifact, when newer to the current version,
|
||||
// and stores at the App's local storage with a pre-defined name with semver suffix
|
||||
func (l *loader) downloadVersion(v connector.VersionInfo) {
|
||||
if !l.newerVersion(v.Version) {
|
||||
return
|
||||
// preparePluginVersion fetches and stores given version of plugin artifact, if newer to the current known version.
|
||||
func (l *loader) preparePluginVersion(v connector.VersionInfo) error {
|
||||
s, exists, err := l.loadCurrentState()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
l.connector.DownloadVersion(v.URL)
|
||||
version, err := util.ParseSemver(v.Version)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if exists {
|
||||
currentVersion, err := util.ParseSemver(s.ClientCurrentVersion)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if util.CompareSemver(currentVersion, version) > 0 {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
err = l.downloadPlugin(v.URL, v.Version, v.Checksum)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// downloadPlugin downloads and stores at the App's local storage with a pre-defined name with semver suffix.
|
||||
func (l *loader) downloadPlugin(url, version string, checksum [32]byte) error {
|
||||
data, err := l.connector.DownloadVersion(url)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Plugin v%s download error: %w", version, err)
|
||||
}
|
||||
dataChecksum := SumSHA256(data)
|
||||
if !EqualSHA256(checksum, dataChecksum) {
|
||||
return errors.New("Downloaded pligin checksum incorrect")
|
||||
}
|
||||
versionFileName := resolvePluginFile(version)
|
||||
versionFileExists, _, err := l.storage.FileExists(versionFileName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Check plugin v%s exists error: %w", version, err)
|
||||
}
|
||||
if versionFileExists {
|
||||
storedData, err := l.storage.ReadFile(versionFileName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if EqualSHA256(dataChecksum, SumSHA256(storedData)) {
|
||||
return nil
|
||||
}
|
||||
if err := l.storage.DeleteFile(versionFileName); err != nil {
|
||||
return fmt.Errorf("Plugin v%s delete error: %w", version, err)
|
||||
}
|
||||
}
|
||||
err = l.storage.WriteFile(versionFileName, data)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Plugin file write error: %w", err)
|
||||
}
|
||||
if err := l.setNextVersion(&version); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user