TUN-1381: should tell you if you're on the latest version rather than just exiting silently

This commit is contained in:
Areg Harutyunyan 2019-02-14 16:26:33 -06:00
parent 99713e3439
commit e3aed15c08
1 changed files with 31 additions and 19 deletions

View File

@ -30,45 +30,56 @@ EKx0BZogHSor9Wy5VztdFaAaVbsJiCbO
logger = log.CreateLogger() logger = log.CreateLogger()
) )
type ReleaseInfo struct { type UpdateOutcome struct {
Updated bool Updated bool
Version string Version string
Error error Error error
} }
func checkForUpdates() ReleaseInfo { func (uo *UpdateOutcome) noUpdate() bool {
return uo.Error != nil && uo.Updated == false
}
func checkForUpdateAndApply() UpdateOutcome {
var opts equinox.Options var opts equinox.Options
if err := opts.SetPublicKeyPEM(publicKey); err != nil { if err := opts.SetPublicKeyPEM(publicKey); err != nil {
return ReleaseInfo{Error: err} return UpdateOutcome{Error: err}
} }
resp, err := equinox.Check(appID, opts) resp, err := equinox.Check(appID, opts)
switch { switch {
case err == equinox.NotAvailableErr: case err == equinox.NotAvailableErr:
return ReleaseInfo{} return UpdateOutcome{}
case err != nil: case err != nil:
return ReleaseInfo{Error: err} return UpdateOutcome{Error: err}
} }
err = resp.Apply() err = resp.Apply()
if err != nil { if err != nil {
return ReleaseInfo{Error: err} return UpdateOutcome{Error: err}
} }
return ReleaseInfo{Updated: true, Version: resp.ReleaseVersion} return UpdateOutcome{Updated: true, Version: resp.ReleaseVersion}
} }
func Update(_ *cli.Context) error { func Update(_ *cli.Context) error {
if updateApplied() { updateOutcome := loggedUpdate()
os.Exit(64) if updateOutcome.Error != nil {
os.Exit(10)
} }
return nil
if updateOutcome.noUpdate() {
logger.Infof("cloudflared is up to date (%s)", updateOutcome.Version)
}
return updateOutcome.Error
} }
func Autoupdate(freq time.Duration, listeners *gracenet.Net, shutdownC chan struct{}) error { func Autoupdate(freq time.Duration, listeners *gracenet.Net, shutdownC chan struct{}) error {
tickC := time.Tick(freq) tickC := time.Tick(freq)
for { for {
if updateApplied() { updateOutcome := loggedUpdate()
if updateOutcome.Updated {
os.Args = append(os.Args, "--is-autoupdated=true") os.Args = append(os.Args, "--is-autoupdated=true")
pid, err := listeners.StartProcess() pid, err := listeners.StartProcess()
if err != nil { if err != nil {
@ -88,16 +99,17 @@ func Autoupdate(freq time.Duration, listeners *gracenet.Net, shutdownC chan stru
} }
} }
func updateApplied() bool { // Checks for an update and applies it if one is available
releaseInfo := checkForUpdates() func loggedUpdate() UpdateOutcome {
if releaseInfo.Updated { updateOutcome := checkForUpdateAndApply()
logger.Infof("Updated to version %s", releaseInfo.Version) if updateOutcome.Updated {
return true logger.Infof("cloudflared has been updated to version %s", updateOutcome.Version)
} }
if releaseInfo.Error != nil { if updateOutcome.Error != nil {
logger.WithError(releaseInfo.Error).Error("Update check failed") logger.WithError(updateOutcome.Error).Error("update check failed")
} }
return false
return updateOutcome
} }
func IsAutoupdateEnabled(c *cli.Context) bool { func IsAutoupdateEnabled(c *cli.Context) bool {