mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 01:53:33 -06:00
85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
package manager
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/hashicorp/go-version"
|
|
)
|
|
|
|
var (
|
|
httpClient = http.Client{Timeout: 10 * time.Second}
|
|
)
|
|
|
|
type gcomPlugin struct {
|
|
Slug string `json:"slug"`
|
|
Version string `json:"version"`
|
|
}
|
|
|
|
func (m *PluginManager) checkForUpdates(ctx context.Context) {
|
|
if !m.cfg.CheckForUpdates {
|
|
return
|
|
}
|
|
|
|
m.log.Debug("Checking for updates")
|
|
|
|
pluginIDs := m.pluginsEligibleForVersionCheck()
|
|
resp, err := httpClient.Get("https://grafana.com/api/plugins/versioncheck?slugIn=" + strings.Join(pluginIDs, ",") + "&grafanaVersion=" + m.cfg.BuildVersion)
|
|
if err != nil {
|
|
m.log.Debug("Failed to get plugins repo from grafana.com", "error", err.Error())
|
|
return
|
|
}
|
|
defer func() {
|
|
if err := resp.Body.Close(); err != nil {
|
|
m.log.Warn("Failed to close response body", "err", err)
|
|
}
|
|
}()
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
m.log.Debug("Update check failed, reading response from grafana.com", "error", err.Error())
|
|
return
|
|
}
|
|
|
|
var gcomPlugins []gcomPlugin
|
|
err = json.Unmarshal(body, &gcomPlugins)
|
|
if err != nil {
|
|
m.log.Debug("Failed to unmarshal plugin repo, reading response from grafana.com", "error", err.Error())
|
|
return
|
|
}
|
|
|
|
for _, localP := range m.Plugins(ctx) {
|
|
for _, gcomP := range gcomPlugins {
|
|
if gcomP.Slug == localP.ID {
|
|
localP.GrafanaComVersion = gcomP.Version
|
|
|
|
plugVersion, err1 := version.NewVersion(localP.Info.Version)
|
|
gplugVersion, err2 := version.NewVersion(gcomP.Version)
|
|
|
|
if err1 != nil || err2 != nil {
|
|
localP.GrafanaComHasUpdate = localP.Info.Version != localP.GrafanaComVersion
|
|
} else {
|
|
localP.GrafanaComHasUpdate = plugVersion.LessThan(gplugVersion)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *PluginManager) pluginsEligibleForVersionCheck() []string {
|
|
var result []string
|
|
for _, p := range m.plugins() {
|
|
if p.IsCorePlugin() {
|
|
continue
|
|
}
|
|
|
|
result = append(result, p.ID)
|
|
}
|
|
|
|
return result
|
|
}
|