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