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}