diff --git a/client/ui/client_ui.go b/client/ui/client_ui.go index 2b74c31d1..b7f98951e 100644 --- a/client/ui/client_ui.go +++ b/client/ui/client_ui.go @@ -280,7 +280,7 @@ func newServiceClient(addr string, logFile string, a fyne.App, showSettings bool showAdvancedSettings: showSettings, showNetworks: showNetworks, - update: version.NewUpdate(), + update: version.NewUpdate("nb/client-ui"), } s.eventHandler = newEventHandler(s) diff --git a/management/cmd/management.go b/management/cmd/management.go index bce09efdd..27376e068 100644 --- a/management/cmd/management.go +++ b/management/cmd/management.go @@ -357,6 +357,13 @@ var ( log.WithContext(ctx).Infof("running HTTP server and gRPC server on the same port: %s", listener.Addr().String()) serveGRPCWithHTTP(ctx, listener, rootHandler, tlsEnabled) + update := version.NewUpdate("nb/management") + update.SetDaemonVersion(version.NetbirdVersion()) + update.SetOnUpdateListener(func() { + log.WithContext(ctx).Infof("your management version, \"%s\", is outdated, a new management version is available. Learn more here: https://github.com/netbirdio/netbird/releases", version.NetbirdVersion()) + }) + defer update.StopWatch() + SetupCloseHandler() <-stopCh diff --git a/version/update.go b/version/update.go index 3f548ea85..272eef4c6 100644 --- a/version/update.go +++ b/version/update.go @@ -21,6 +21,7 @@ var ( // Update fetch the version info periodically and notify the onUpdateListener in case the UI version or the // daemon version are deprecated type Update struct { + httpAgent string uiVersion *goversion.Version daemonVersion *goversion.Version latestAvailable *goversion.Version @@ -34,7 +35,7 @@ type Update struct { } // NewUpdate instantiate Update and start to fetch the new version information -func NewUpdate() *Update { +func NewUpdate(httpAgent string) *Update { currentVersion, err := goversion.NewVersion(version) if err != nil { currentVersion, _ = goversion.NewVersion("0.0.0") @@ -43,6 +44,7 @@ func NewUpdate() *Update { latestAvailable, _ := goversion.NewVersion("0.0.0") u := &Update{ + httpAgent: httpAgent, latestAvailable: latestAvailable, uiVersion: currentVersion, fetchTicker: time.NewTicker(fetchPeriod), @@ -112,7 +114,15 @@ func (u *Update) startFetcher() { func (u *Update) fetchVersion() bool { log.Debugf("fetching version info from %s", versionURL) - resp, err := http.Get(versionURL) + req, err := http.NewRequest("GET", versionURL, nil) + if err != nil { + log.Errorf("failed to create request for version info: %s", err) + return false + } + + req.Header.Set("User-Agent", u.httpAgent) + + resp, err := http.DefaultClient.Do(req) if err != nil { log.Errorf("failed to fetch version info: %s", err) return false diff --git a/version/update_test.go b/version/update_test.go index 4537ce220..a733714cf 100644 --- a/version/update_test.go +++ b/version/update_test.go @@ -9,6 +9,8 @@ import ( "time" ) +const httpAgent = "pkg/test" + func TestNewUpdate(t *testing.T) { version = "1.0.0" svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -21,7 +23,7 @@ func TestNewUpdate(t *testing.T) { wg.Add(1) onUpdate := false - u := NewUpdate() + u := NewUpdate(httpAgent) defer u.StopWatch() u.SetOnUpdateListener(func() { onUpdate = true @@ -46,7 +48,7 @@ func TestDoNotUpdate(t *testing.T) { wg.Add(1) onUpdate := false - u := NewUpdate() + u := NewUpdate(httpAgent) defer u.StopWatch() u.SetOnUpdateListener(func() { onUpdate = true @@ -71,7 +73,7 @@ func TestDaemonUpdate(t *testing.T) { wg.Add(1) onUpdate := false - u := NewUpdate() + u := NewUpdate(httpAgent) defer u.StopWatch() u.SetOnUpdateListener(func() { onUpdate = true