Worker: add -find-manager CLI arg

With `-find-manager` the Worker will use UPnP/SSDP autodiscovery, report
which Manager it found, and quit.
This commit is contained in:
Sybren A. Stüvel 2022-03-11 10:52:03 +01:00
parent b33db33d17
commit afc6b8e1c5
2 changed files with 31 additions and 11 deletions

@ -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")
}
}

@ -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)