diff --git a/internal/events/update.go b/internal/events/update.go index 30d3ec8a..7cdf73bd 100644 --- a/internal/events/update.go +++ b/internal/events/update.go @@ -106,10 +106,8 @@ func (event UpdateFailed) String() string { // UpdateForced is published when the bridge version is too old and must be updated. type UpdateForced struct { eventBase - - Version updater.VersionInfo } func (event UpdateForced) String() string { - return fmt.Sprintf("UpdateForced: Version %s", event.Version.Version) + return fmt.Sprintf("UpdateForced") } diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index ee63a542..e213e2bf 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -293,7 +293,17 @@ func (s *Service) watchEvents() { } case events.UpdateForced: - _ = s.SendEvent(NewUpdateForceEvent(event.Version.Version.String())) + var latest string + + if s.latest.Version != nil { + latest = s.latest.Version.String() + } else if version, ok := s.checkLatestVersion(); ok { + latest = version.Version.String() + } else { + latest = "unknown" + } + + _ = s.SendEvent(NewUpdateForceEvent(latest)) case events.TLSIssue: _ = s.SendEvent(NewMailApiCertIssue()) @@ -368,6 +378,25 @@ func (s *Service) triggerReset() { s.bridge.FactoryReset(context.Background()) } +func (s *Service) checkLatestVersion() (updater.VersionInfo, bool) { + updateCh, done := s.bridge.GetEvents(events.UpdateLatest{}) + defer done() + + s.bridge.CheckForUpdates() + + select { + case event := <-updateCh: + if latest, ok := event.(events.UpdateLatest); ok { + return latest.Version, true + } + + case <-time.After(5 * time.Second): + // ... + } + + return updater.VersionInfo{}, false +} + func newTLSConfig() (*tls.Config, []byte, error) { template, err := certs.NewTLSTemplate() if err != nil {