package admin import ( "fmt" "strings" "forge.cadoles.com/cadoles/bouncer/internal/admin" "forge.cadoles.com/cadoles/bouncer/internal/auth/jwt" "forge.cadoles.com/cadoles/bouncer/internal/command/common" "forge.cadoles.com/cadoles/bouncer/internal/jwk" "forge.cadoles.com/cadoles/bouncer/internal/setup" "github.com/pkg/errors" "github.com/urfave/cli/v2" "gitlab.com/wpetit/goweb/logger" ) const ( flagPrintDefaultToken = "print-default-token" ) func RunCommand() *cli.Command { flags := append( common.Flags(), &cli.BoolFlag{ Name: flagPrintDefaultToken, Usage: "Generate and print a default writer token in console at startup", Value: true, }, ) return &cli.Command{ Name: "run", Usage: "Run the admin 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)) projectVersion := ctx.String("projectVersion") flushSentry, err := setup.SetupSentry(ctx.Context, conf.Admin.Sentry, projectVersion) if err != nil { return errors.Wrap(err, "could not initialize sentry client") } defer flushSentry() if printDefaultToken := ctx.Bool(flagPrintDefaultToken); printDefaultToken { key, err := jwk.Generate(jwk.DefaultKeySize) if err != nil { return errors.Wrap(err, "could not generate default key") } token, err := jwt.GenerateToken(ctx.Context, key, string(conf.Admin.Auth.Issuer), "default-admin", jwt.Role(jwt.RoleWriter)) if err != nil { return errors.WithStack(err) } logger.SetLevel(logger.LevelInfo) logger.Info(ctx.Context, "default writer token", logger.F("token", token)) logger.SetLevel(logger.Level(conf.Logger.Level)) } srv := admin.NewServer( admin.WithServerConfig(conf.Admin), admin.WithRedisConfig(conf.Redis), admin.WithBootstrapConfig(conf.Bootstrap), ) 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 }, } }