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	cfg.node = nodeCfg
111
112	return &cfg, nil
113}
114
115func main() {
116	app := cli.NewApp()
117	app.Name = "hermez-node"
118	app.Version = "0.1.0-alpha"
119	app.Flags = []cli.Flag{
120		&cli.StringFlag{
121			Name:     flagMode,
122			Usage:    fmt.Sprintf("Set node `MODE` (can be \"%v\" or \"%v\")", modeSync, modeCoord),
123			Required: true,
124		},
125		&cli.StringFlag{
126			Name:     flagCfg,
127			Usage:    "Node configuration `FILE`",
128			Required: true,
129		},
130		&cli.StringFlag{
131			Name:  flagCoordCfg,
132			Usage: "Coordinator configuration `FILE`",
133		},
134	}
135
136	app.Commands = []*cli.Command{
137		{
138			Name:    "init",
139			Aliases: []string{},
140			Usage:   "Initialize the hermez-node",
141			Action:  cmdInit,
142		},
143		{
144			Name:    "run",
145			Aliases: []string{},
146			Usage:   "Run the hermez-node in the indicated mode",
147			Action:  cmdRun,
148		},
149	}
150
151	err := app.Run(os.Args)
152	if err != nil {
153		fmt.Printf("\nError: %v\n", err)
154		os.Exit(1)
155	}
156}