pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/usage/update/update.go (about)

     1  package update
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                         Copyright (c) 2022 ESSENTIAL KAOS                          //
     6  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  import (
    11  	"os"
    12  	"time"
    13  
    14  	"pkg.re/essentialkaos/ek.v12/req"
    15  )
    16  
    17  // ////////////////////////////////////////////////////////////////////////////////// //
    18  
    19  // ReleaseInfo contains info about the latest version of application
    20  type ReleaseInfo struct {
    21  	Version string    `json:"version"`
    22  	Date    time.Time `json:"date"`
    23  }
    24  
    25  // ////////////////////////////////////////////////////////////////////////////////// //
    26  
    27  // UpdateChecker checks new releases on custom storage
    28  func UpdateChecker(app, version, data string) (string, time.Time, bool) {
    29  	if version == "" || data == "" || !isUpdateCheckRequired() {
    30  		return "", time.Time{}, false
    31  	}
    32  
    33  	release := getLastReleaseInfo(app, version, data)
    34  
    35  	if release == nil {
    36  		return "", time.Time{}, false
    37  	}
    38  
    39  	return release.Version, release.Date, release.Version != version
    40  }
    41  
    42  // ////////////////////////////////////////////////////////////////////////////////// //
    43  
    44  // getLastReleaseInfo fetches info about the latest version
    45  func getLastReleaseInfo(app, version, storage string) *ReleaseInfo {
    46  	engine := req.Engine{}
    47  
    48  	engine.SetDialTimeout(3)
    49  	engine.SetRequestTimeout(3)
    50  	engine.SetUserAgent(app, version, "go.ek")
    51  
    52  	response, err := engine.Get(req.Request{
    53  		URL:         storage + "/latest.json",
    54  		Accept:      req.CONTENT_TYPE_JSON,
    55  		AutoDiscard: true,
    56  	})
    57  
    58  	if err != nil || response.StatusCode != 200 {
    59  		return nil
    60  	}
    61  
    62  	release := &ReleaseInfo{}
    63  	err = response.JSON(release)
    64  
    65  	if err != nil {
    66  		return nil
    67  	}
    68  
    69  	return release
    70  }
    71  
    72  // isUpdateCheckRequired checks if update check is required
    73  func isUpdateCheckRequired() bool {
    74  	return !(os.Getenv("CI") == "true" && os.Getenv("EK_TEST_PORT") == "")
    75  }