package app import ( "context" "fmt" "os" "os/signal" "github.com/prometheus/client_golang/prometheus" "github.com/scroll-tech/go-ethereum/log" "github.com/urfave/cli/v2" "scroll-tech/common/database" "scroll-tech/common/observability" "scroll-tech/common/utils" "scroll-tech/common/version" "scroll-tech/coordinator/internal/config" "scroll-tech/coordinator/internal/controller/cron" ) var app *cli.App func init() { // Set up coordinator app info. app = cli.NewApp() app.Action = action app.Name = "coordinator cron" app.Usage = "The Scroll L2 Coordinator cron" app.Version = version.Version app.Flags = append(app.Flags, utils.CommonFlags...) app.Before = func(ctx *cli.Context) error { return utils.LogSetup(ctx) } // Register `coordinator-cron-test` app for integration-cron-test. utils.RegisterSimulation(app, utils.CoordinatorCronApp) } func action(ctx *cli.Context) error { cfgFile := ctx.String(utils.ConfigFileFlag.Name) cfg, err := config.NewConfig(cfgFile) if err != nil { log.Crit("failed to load config file", "config file", cfgFile, "error", err) } subCtx, cancel := context.WithCancel(ctx.Context) db, err := database.InitDB(cfg.DB) if err != nil { log.Crit("failed to init db connection", "err", err) } registry := prometheus.DefaultRegisterer observability.Server(ctx, db) proofCollector := cron.NewCollector(subCtx, db, cfg, registry) defer func() { proofCollector.Stop() cancel() if err = database.CloseDB(db); err != nil { log.Error("can not close db connection", "error", err) } }() log.Info( "coordinator cron start successfully", "version", version.Version, ) // Catch CTRL-C to ensure a graceful shutdown. interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) // Wait until the interrupt signal is received from an OS signal. <-interrupt log.Info("coordinator cron exiting success") return nil } // Run coordinator. func Run() { // RunApp the coordinator. if err := app.Run(os.Args); err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } }