mirror of https://github.com/portainer/portainer
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package status
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/coreos/go-semver/semver"
|
|
|
|
portainer "github.com/portainer/portainer/api"
|
|
"github.com/portainer/portainer/api/http/client"
|
|
|
|
"github.com/portainer/libhttp/response"
|
|
)
|
|
|
|
type inspectVersionResponse struct {
|
|
// Whether portainer has an update available
|
|
UpdateAvailable bool `json:"UpdateAvailable" example:"false"`
|
|
// The latest version available
|
|
LatestVersion string `json:"LatestVersion" example:"2.0.0"`
|
|
}
|
|
|
|
type githubData struct {
|
|
TagName string `json:"tag_name"`
|
|
}
|
|
|
|
// @id StatusInspectVersion
|
|
// @summary Check for portainer updates
|
|
// @description Check if portainer has an update available
|
|
// @description **Access policy**: authenticated
|
|
// @security ApiKeyAuth
|
|
// @security jwt
|
|
// @tags status
|
|
// @produce json
|
|
// @success 200 {object} inspectVersionResponse "Success"
|
|
// @router /status/version [get]
|
|
func (handler *Handler) statusInspectVersion(w http.ResponseWriter, r *http.Request) {
|
|
motd, err := client.Get(portainer.VersionCheckURL, 5)
|
|
if err != nil {
|
|
response.JSON(w, &inspectVersionResponse{UpdateAvailable: false})
|
|
return
|
|
}
|
|
|
|
var data githubData
|
|
err = json.Unmarshal(motd, &data)
|
|
if err != nil {
|
|
response.JSON(w, &inspectVersionResponse{UpdateAvailable: false})
|
|
return
|
|
}
|
|
|
|
resp := inspectVersionResponse{
|
|
UpdateAvailable: false,
|
|
}
|
|
|
|
currentVersion := semver.New(portainer.APIVersion)
|
|
latestVersion := semver.New(data.TagName)
|
|
if currentVersion.LessThan(*latestVersion) {
|
|
resp.UpdateAvailable = true
|
|
resp.LatestVersion = data.TagName
|
|
}
|
|
|
|
response.JSON(w, &resp)
|
|
}
|