driftctl/pkg/version/version.go

86 lines
1.8 KiB
Go

package version
import (
"encoding/json"
"io/ioutil"
"net/http"
"runtime"
"github.com/snyk/driftctl/build"
goversion "github.com/hashicorp/go-version"
"github.com/sirupsen/logrus"
)
// Current software version
// Could be injected on build with -ldflags
var version string = "dev"
// Return the current version as string
func Current() string {
currentVersion := version
build := build.Build{}
if !build.IsRelease() {
currentVersion += "-dev"
}
return currentVersion
}
/**
* Return "" if current version is the last version,
* else return the latest version string
**/
func CheckLatest() string {
client := &http.Client{}
req, _ := http.NewRequest("GET", "https://telemetry.driftctl.com/version", nil)
req.Header.Set("driftctl-version", Current())
req.Header.Set("driftctl-os", runtime.GOOS)
req.Header.Set("driftctl-arch", runtime.GOARCH)
res, err := client.Do(req)
if err != nil {
logrus.Debugf("Unable to check for a newer version: %+v", err)
return ""
}
if res.StatusCode != 200 {
logrus.Debugf("Unable to check for a newer version: %s", res.Status)
return ""
}
bodyBytes, err := ioutil.ReadAll(res.Body)
if err != nil {
logrus.Debug("Unable to read response")
logrus.Debug(err)
return ""
}
responseBody := map[string]string{}
err = json.Unmarshal(bodyBytes, &responseBody)
if err != nil {
logrus.Debug("Unable to decode version check response")
logrus.Debug(err)
return ""
}
currentVersion, err := goversion.NewVersion(version)
if err != nil {
logrus.Debugf("Unable to parse current version: %s", version)
return ""
}
lastVersion, err := goversion.NewVersion(responseBody["latest"])
if err != nil {
logrus.Debugf("Unable to parse latest version: %s", responseBody["latest"])
return ""
}
if currentVersion.LessThan(lastVersion) {
return lastVersion.String()
}
return ""
}