85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
package loader
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"galaxy/connector"
|
|
"galaxy/util"
|
|
)
|
|
|
|
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")
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|
|
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
|
|
}
|