* remove the global log error/warn etc functions and use request context logger whenever possible
84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
package manager
|
|
|
|
import (
|
|
"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() {
|
|
if !m.cfg.CheckForUpdates {
|
|
return
|
|
}
|
|
|
|
m.log.Debug("Checking for updates")
|
|
|
|
pluginSlugs := m.externalPluginIDsAsCSV()
|
|
resp, err := httpClient.Get("https://grafana.com/api/plugins/versioncheck?slugIn=" + pluginSlugs + "&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() {
|
|
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) externalPluginIDsAsCSV() string {
|
|
var result []string
|
|
for _, p := range m.plugins {
|
|
if p.IsCorePlugin() {
|
|
continue
|
|
}
|
|
|
|
result = append(result, p.ID)
|
|
}
|
|
|
|
return strings.Join(result, ",")
|
|
}
|