arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/cli/node/main.go
cli/node/main.goRaw
  1package main
  2
  3import (
  4	"fmt"
  5	"os"
  6	"os/signal"
  7
  8	"github.com/hermeznetwork/hermez-node/config"
  9	"github.com/hermeznetwork/hermez-node/log"
 10	"github.com/hermeznetwork/hermez-node/node"
 11	"github.com/urfave/cli/v2"
 12)
 13
 14const (
 15	flagCfg      = "cfg"
 16	flagCoordCfg = "coordcfg"
 17	flagMode     = "mode"
 18	modeSync     = "sync"
 19	modeCoord    = "coord"
 20)
 21
 22func cmdInit(c *cli.Context) error {
 23	log.Info("Init")
 24	cfg, err := parseCli(c)
 25	if err != nil {
 26		return err
 27	}
 28	fmt.Println("TODO", cfg)
 29	return err
 30}
 31
 32func cmdRun(c *cli.Context) error {
 33	cfg, err := parseCli(c)
 34	if err != nil {
 35		return fmt.Errorf("error parsing flags and config: %w", err)
 36	}
 37	node, err := node.NewNode(cfg.mode, cfg.node, cfg.coord)
 38	if err != nil {
 39		return fmt.Errorf("error starting node: %w", err)
 40	}
 41	node.Start()
 42
 43	stopCh := make(chan interface{})
 44
 45	// catch ^C to send the stop signal
 46	ossig := make(chan os.Signal, 1)
 47	signal.Notify(ossig, os.Interrupt)
 48	go func() {
 49		for sig := range ossig {
 50			if sig == os.Interrupt {
 51				stopCh <- nil
 52			}
 53		}
 54	}()
 55	<-stopCh
 56	node.Stop()
 57
 58	return nil
 59}
 60
 61// Config is the configuration of the hermez node execution
 62type Config struct {
 63	mode  node.Mode
 64	node  *config.Node
 65	coord *config.Coordinator
 66}
 67
 68func parseCli(c *cli.Context) (*Config, error) {
 69	cfg, err := getConfig(c)
 70	if err != nil {
 71		if err := cli.ShowAppHelp(c); err != nil {
 72			panic(err)
 73		}
 74		return nil, err
 75	}
 76	return cfg, nil
 77}
 78
 79func getConfig(c *cli.Context) (*Config, error) {
 80	var cfg Config
 81	mode := c.String(flagMode)
 82	switch mode {
 83	case modeSync:
 84		cfg.mode = node.ModeSynchronizer
 85	case modeCoord:
 86		cfg.mode = node.ModeCoordinator
 87	default:
 88		return nil, fmt.Errorf("invalid mode \"%v\"", mode)
 89	}
 90
 91	if cfg.mode == node.ModeCoordinator {
 92		coordCfgPath := c.String(flagCoordCfg)
 93		if coordCfgPath == "" {
 94			return nil, fmt.Errorf("required flag \"%v\" not set", flagCoordCfg)
 95		}
 96		coordCfg, err := config.LoadCoordinator(coordCfgPath)
 97		if err != nil {
 98			return nil, err
 99		}
100		cfg.coord = coordCfg
101	}
102	nodeCfgPath := c.String(flagCfg)
103	if nodeCfgPath == "" {
104		return nil, fmt.Errorf("required flag \"%v\" not set", flagCfg)
105	}
106	nodeCfg, err := config.LoadNode(nodeCfgPath)
107	if err != nil {
108		return nil, err
109	}
110	// nodeCfg.Synchronizer.InitialVariables.WDelayer.HermezRollupAddress = nodeCfg.SmartContracts.Rollup
111	cfg.node = nodeCfg
112
113	return &cfg, nil
114}
115
116func main() {
117	app := cli.NewApp()
118	app.Name = "hermez-node"
119	app.Version = "0.1.0-alpha"
120	app.Flags = []cli.Flag{
121		&cli.StringFlag{
122			Name:     flagMode,
123			Usage:    fmt.Sprintf("Set node `MODE` (can be \"%v\" or \"%v\")", modeSync, modeCoord),
124			Required: true,
125		},
126		&cli.StringFlag{
127			Name:     flagCfg,
128			Usage:    "Node configuration `FILE`",
129			Required: true,
130		},
131		&cli.StringFlag{
132			Name:  flagCoordCfg,
133			Usage: "Coordinator configuration `FILE`",
134		},
135	}
136
137	app.Commands = []*cli.Command{
138		{
139			Name:    "init",
140			Aliases: []string{},
141			Usage:   "Initialize the hermez-node",
142			Action:  cmdInit,
143		},
144		{
145			Name:    "run",
146			Aliases: []string{},
147			Usage:   "Run the hermez-node in the indicated mode",
148			Action:  cmdRun,
149		},
150	}
151
152	err := app.Run(os.Args)
153	if err != nil {
154		fmt.Printf("\nError: %v\n", err)
155		os.Exit(1)
156	}
157}