package proxy import ( "context" "fmt" "strings" "time" "forge.cadoles.com/cadoles/bouncer/internal/command/common" "forge.cadoles.com/cadoles/bouncer/internal/config" "forge.cadoles.com/cadoles/bouncer/internal/proxy" "forge.cadoles.com/cadoles/bouncer/internal/proxy/director" "forge.cadoles.com/cadoles/bouncer/internal/queue" "forge.cadoles.com/cadoles/bouncer/internal/setup" "github.com/pkg/errors" "github.com/urfave/cli/v2" "gitlab.com/wpetit/goweb/logger" ) func RunCommand() *cli.Command { flags := common.Flags() return &cli.Command{ Name: "run", Usage: "Run the proxy server", Flags: flags, Action: func(ctx *cli.Context) error { conf, err := common.LoadConfig(ctx) if err != nil { return errors.Wrap(err, "could not load configuration") } logger.SetFormat(logger.Format(conf.Logger.Format)) logger.SetLevel(logger.Level(conf.Logger.Level)) layers, err := initDirectorLayers(ctx.Context, conf) if err != nil { return errors.Wrap(err, "could not initialize director layers") } srv := proxy.NewServer( proxy.WithServerConfig(conf.Proxy), proxy.WithRedisConfig(conf.Redis), proxy.WithDirectorLayers(layers...), ) addrs, srvErrs := srv.Start(ctx.Context) select { case addr := <-addrs: url := fmt.Sprintf("http://%s", addr.String()) url = strings.Replace(url, "0.0.0.0", "127.0.0.1", 1) logger.Info(ctx.Context, "listening", logger.F("url", url)) case err = <-srvErrs: return errors.WithStack(err) } if err = <-srvErrs; err != nil { return errors.WithStack(err) } return nil }, } } func initDirectorLayers(ctx context.Context, conf *config.Config) ([]director.Layer, error) { layers := make([]director.Layer, 0) queue, err := initQueueLayer(ctx, conf) if err != nil { return nil, errors.Wrap(err, "could not initialize queue layer") } layers = append(layers, queue) return layers, nil } func initQueueLayer(ctx context.Context, conf *config.Config) (*queue.Queue, error) { adapter, err := setup.NewQueueAdapter(ctx, conf.Redis) if err != nil { return nil, errors.WithStack(err) } options := []queue.OptionFunc{ queue.WithTemplateDir(string(conf.Layers.Queue.TemplateDir)), } if conf.Layers.Queue.DefaultKeepAlive != nil { options = append(options, queue.WithDefaultKeepAlive(time.Duration(*conf.Layers.Queue.DefaultKeepAlive))) } return queue.New( adapter, options..., ), nil }