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