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}