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	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 tracerr.Wrap(err)
 27	}
 28	fmt.Println("TODO", cfg)
 29	return tracerr.Wrap(err)
 30}
 31
 32func cmdRun(c *cli.Context) error {
 33	cfg, err := parseCli(c)
 34	if err != nil {
 35		return tracerr.Wrap(fmt.Errorf("error parsing flags and config: %w", err))
 36	}
 37	node, err := node.NewNode(cfg.mode, cfg.node)
 38	if err != nil {
 39		return tracerr.Wrap(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}
 66
 67func parseCli(c *cli.Context) (*Config, error) {
 68	cfg, err := getConfig(c)
 69	if err != nil {
 70		if err := cli.ShowAppHelp(c); err != nil {
 71			panic(err)
 72		}
 73		return nil, tracerr.Wrap(err)
 74	}
 75	return cfg, nil
 76}
 77
 78func getConfig(c *cli.Context) (*Config, error) {
 79	var cfg Config
 80	mode := c.String(flagMode)
 81	nodeCfgPath := c.String(flagCfg)
 82	if nodeCfgPath == "" {
 83		return nil, tracerr.Wrap(fmt.Errorf("required flag \"%v\" not set", flagCfg))
 84	}
 85	var err error
 86	switch mode {
 87	case modeSync:
 88		cfg.mode = node.ModeSynchronizer
 89		cfg.node, err = config.LoadNode(nodeCfgPath)
 90		if err != nil {
 91			return nil, tracerr.Wrap(err)
 92		}
 93	case modeCoord:
 94		cfg.mode = node.ModeCoordinator
 95		cfg.node, err = config.LoadCoordinator(nodeCfgPath)
 96		if err != nil {
 97			return nil, tracerr.Wrap(err)
 98		}
 99	default:
100		return nil, tracerr.Wrap(fmt.Errorf("invalid mode \"%v\"", mode))
101	}
102
103	return &cfg, nil
104}
105
106func main() {
107	app := cli.NewApp()
108	app.Name = "hermez-node"
109	app.Version = "0.1.0-alpha"
110	app.Flags = []cli.Flag{
111		&cli.StringFlag{
112			Name:     flagMode,
113			Usage:    fmt.Sprintf("Set node `MODE` (can be \"%v\" or \"%v\")", modeSync, modeCoord),
114			Required: true,
115		},
116		&cli.StringFlag{
117			Name:     flagCfg,
118			Usage:    "Node configuration `FILE`",
119			Required: true,
120		},
121	}
122
123	app.Commands = []*cli.Command{
124		{
125			Name:    "init",
126			Aliases: []string{},
127			Usage:   "Initialize the hermez-node",
128			Action:  cmdInit,
129		},
130		{
131			Name:    "run",
132			Aliases: []string{},
133			Usage:   "Run the hermez-node in the indicated mode",
134			Action:  cmdRun,
135		},
136	}
137
138	err := app.Run(os.Args)
139	if err != nil {
140		fmt.Printf("\nError: %v\n", tracerr.Sprint(err))
141		os.Exit(1)
142	}
143}