diff --git a/cmd/flamenco-worker/main.go b/cmd/flamenco-worker/main.go index 813114d1..d3bc74f4 100644 --- a/cmd/flamenco-worker/main.go +++ b/cmd/flamenco-worker/main.go @@ -35,9 +35,11 @@ var cliArgs struct { quiet, debug, trace bool - managerURL *url.URL - manager string - register bool + managerURL *url.URL + findManager bool + + manager string + register bool } func main() { @@ -58,6 +60,19 @@ func main() { Msgf("starting %v Worker", appinfo.ApplicationName) configLogLevel() + if cliArgs.findManager { + // TODO: move this to a more suitable place. + discoverTimeout := 1 * time.Minute + discoverCtx, discoverCancel := context.WithTimeout(context.Background(), discoverTimeout) + defer discoverCancel() + managerURL, err := worker.AutodiscoverManager(discoverCtx) + if err != nil { + logFatalManagerDiscoveryError(err, discoverTimeout) + } + log.Info().Str("manager", managerURL).Msg("found Manager") + return + } + configWrangler := worker.NewConfigWrangler() // Give the auto-discovery some time to find a Manager. @@ -65,11 +80,7 @@ func main() { discoverCtx, discoverCancel := context.WithTimeout(context.Background(), discoverTimeout) defer discoverCancel() if err := worker.MaybeAutodiscoverManager(discoverCtx, &configWrangler); err != nil { - if errors.Is(err, context.DeadlineExceeded) { - log.Fatal().Str("timeout", discoverTimeout.String()).Msg("could not discover Manager in time") - } else { - log.Fatal().Err(err).Msg("auto-discovery error") - } + logFatalManagerDiscoveryError(err, discoverTimeout) } // Startup can take arbitrarily long, as it only ends when the Manager can be @@ -150,6 +161,7 @@ func parseCliArgs() { // TODO: make this override whatever was stored in the configuration file. // flag.StringVar(&cliArgs.manager, "manager", "", "URL of the Flamenco Manager.") flag.BoolVar(&cliArgs.register, "register", false, "(Re-)register at the Manager.") + flag.BoolVar(&cliArgs.findManager, "find-manager", false, "Autodiscover a Manager, then quit.") flag.Parse() @@ -193,3 +205,11 @@ func upstreamBufferOrDie(client worker.FlamencoClient, timeService clock.Clock) return buffer } + +func logFatalManagerDiscoveryError(err error, discoverTimeout time.Duration) { + if errors.Is(err, context.DeadlineExceeded) { + log.Fatal().Str("timeout", discoverTimeout.String()).Msg("could not discover Manager in time") + } else { + log.Fatal().Err(err).Msg("auto-discovery error") + } +} diff --git a/internal/worker/autodiscovery.go b/internal/worker/autodiscovery.go index 44ab00f6..2fbbb771 100644 --- a/internal/worker/autodiscovery.go +++ b/internal/worker/autodiscovery.go @@ -27,7 +27,7 @@ func MaybeAutodiscoverManager(ctx context.Context, configWrangler *FileConfigWra return nil } - foundManager, err := autodiscoverManager(ctx) + foundManager, err := AutodiscoverManager(ctx) if err != nil { return err } @@ -36,8 +36,8 @@ func MaybeAutodiscoverManager(ctx context.Context, configWrangler *FileConfigWra return nil } -// autodiscoverManager uses UPnP/SSDP to find a Manager, and returns its URL if found. -func autodiscoverManager(ctx context.Context) (string, error) { +// AutodiscoverManager uses UPnP/SSDP to find a Manager, and returns its URL if found. +func AutodiscoverManager(ctx context.Context) (string, error) { c, err := upnp_ssdp.NewClient(log.Logger) if err != nil { return "", fmt.Errorf("unable to create UPnP/SSDP client: %w", err)