From 69331963daf74c8dbd3b4ba59b9bbc636f3103b3 Mon Sep 17 00:00:00 2001 From: Fletcher Haynes Date: Tue, 31 Jan 2023 09:43:10 -0800 Subject: [PATCH] Updated version check to use POST only. Updated version check schema. Now generating a local UUID to submit to version check as a unique ID that persists in a file. --- server.go | 4 +-- verchk.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 67 insertions(+), 11 deletions(-) diff --git a/server.go b/server.go index 34c759b04..007cd6add 100644 --- a/server.go +++ b/server.go @@ -607,13 +607,13 @@ func (s *Server) Open() error { // Do version check in. This is in a goroutine so that we don't block server startup if the server endpoint is down/having issues. go func() { s.logger.Printf("Beginning featurebase version check-in") - vc := VersionChecker{URL: "https://analytics.featurebase.com/v2/featurebase/version"} + vc := VersionChecker{URL: "https://analytics.featurebase.com/v2/featurebase/metrics"} resp, err := vc.CheckIn() if err != nil { s.logger.Errorf("doing version checkin. Error was %s", err) return } - s.logger.Printf("Version check-in complete. Latest version is %s", resp.Information.Version) + s.logger.Printf("Version check-in complete. Latest version is %s", resp.Version) }() // Start DisCo. diff --git a/verchk.go b/verchk.go index f9af36e6a..0041a9ca1 100644 --- a/verchk.go +++ b/verchk.go @@ -5,6 +5,10 @@ import ( "encoding/json" "io" "net/http" + "os" + "strings" + + "github.com/google/uuid" ) type VersionChecker struct { @@ -18,26 +22,36 @@ func NewVersionChecker(endpoint string) *VersionChecker { return &v } -func (v *VersionChecker) CheckIn() (*Response, error) { +func (v *VersionChecker) CheckIn() (*VerCheckResponse, error) { + + id, err := v.WriteClientUUID() + if err != nil { + return nil, err + } body := make(map[string]string, 2) body["entry_type"] = "user" - body["version"] = VersionInfo(true) + body["version"] = Version + body["client_id"] = id + req, err := json.Marshal(body) if err != nil { return nil, err } - _, err = http.Post(v.URL, "application/json", bytes.NewBuffer(req)) + + wReq := bytes.NewReader(req) + if err != nil { return nil, err } - var json_resp Response - r, err := http.Get(v.URL) + var json_resp VerCheckResponse + r, err := http.Post(v.URL, "application/json", wReq) if err != nil { return nil, err } data, err := io.ReadAll(r.Body) + if err != nil { return nil, err } @@ -51,10 +65,52 @@ func (v *VersionChecker) CheckIn() (*Response, error) { } -type Response struct { - Information InfoSubResponse `json:"info"` +func (v *VersionChecker) GenerateClientUUID() (string, error) { + clientUUID := uuid.New() + cleanedUUID := strings.Replace(clientUUID.String(), "-", "", -1) + return cleanedUUID, nil +} + +func (v *VersionChecker) WriteClientUUID() (string, error) { + filename := ".client_id.txt" + _, err := os.Stat(filename) + if err != nil { + if os.IsNotExist(err) { + fh, err := os.Create(filename) + if err != nil { + return "", err + } + defer fh.Close() + id, err := v.GenerateClientUUID() + if err != nil { + return "", err + } + + _, err = fh.WriteString(id) + if err != nil { + return "", err + } + + return "", err + } else { + return "", err + } + } + + fh, err := os.Open(filename) + if err != nil { + return "", err + } + defer fh.Close() + buf, err := os.ReadFile(filename) + + if err != nil { + return "", err + } + return string(buf), nil + } -type InfoSubResponse struct { - Version string `json:"version"` +type VerCheckResponse struct { + Version string `json:"latest_version"` }