util.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package cmd
  2. import (
  3. "time"
  4. "github.com/ipfs/go-log"
  5. "github.com/libp2p/go-libp2p"
  6. "github.com/mudler/edgevpn/internal"
  7. "github.com/mudler/edgevpn/pkg/blockchain"
  8. "github.com/mudler/edgevpn/pkg/discovery"
  9. "github.com/mudler/edgevpn/pkg/edgevpn"
  10. "github.com/mudler/edgevpn/pkg/logger"
  11. "github.com/peterbourgon/diskv"
  12. "github.com/songgao/water"
  13. "github.com/urfave/cli"
  14. )
  15. var CommonFlags []cli.Flag = []cli.Flag{
  16. &cli.StringFlag{
  17. Name: "config",
  18. Usage: "Specify a path to a edgevpn config file",
  19. EnvVar: "EDGEVPNCONFIG",
  20. },
  21. &cli.IntFlag{
  22. Name: "mtu",
  23. Usage: "Specify a mtu",
  24. EnvVar: "EDGEVPNMTU",
  25. Value: 1200,
  26. },
  27. &cli.IntFlag{
  28. Name: "discovery-interval",
  29. Usage: "DHT discovery interval time",
  30. EnvVar: "EDGEVPNDHTINTERVAL",
  31. Value: 120,
  32. },
  33. &cli.IntFlag{
  34. Name: "ledger-announce-interval",
  35. Usage: "Ledger announce interval time",
  36. EnvVar: "EDGEVPNLEDGERINTERVAL",
  37. Value: 10,
  38. },
  39. &cli.IntFlag{
  40. Name: "ledger-syncronization-interval",
  41. Usage: "Ledger syncronization interval time",
  42. EnvVar: "EDGEVPNLEDGERSYNCINTERVAL",
  43. Value: 10,
  44. },
  45. &cli.StringFlag{
  46. Name: "ledger-state",
  47. Usage: "Specify a ledger state directory",
  48. EnvVar: "EDGEVPNLEDGERSTATE",
  49. },
  50. &cli.BoolFlag{
  51. Name: "enable-mdns",
  52. Usage: "Enable mDNS for peer discovery",
  53. EnvVar: "EDGEVPNMDNS",
  54. },
  55. &cli.BoolTFlag{
  56. Name: "autorelay",
  57. Usage: "Automatically act as a relay if the node can accept inbound connections",
  58. EnvVar: "EDGEVPNAUTORELAY",
  59. },
  60. &cli.BoolTFlag{
  61. Name: "natservice",
  62. Usage: "Tries to determine reachability status of nodes",
  63. EnvVar: "EDGEVPNNATSERVICE",
  64. },
  65. &cli.BoolTFlag{
  66. Name: "natmap",
  67. Usage: "Tries to open a port in the firewall via upnp",
  68. EnvVar: "EDGEVPNNATMAP",
  69. },
  70. &cli.BoolTFlag{
  71. Name: "enable-dht",
  72. Usage: "Enable DHT for peer discovery",
  73. EnvVar: "EDGEVPNDHT",
  74. },
  75. &cli.StringFlag{
  76. Name: "log-level",
  77. Usage: "Specify loglevel",
  78. EnvVar: "EDGEVPNLOGLEVEL",
  79. Value: "info",
  80. },
  81. &cli.StringFlag{
  82. Name: "libp2p-log-level",
  83. Usage: "Specify libp2p loglevel",
  84. EnvVar: "EDGEVPNLIBP2PLOGLEVEL",
  85. Value: "fatal",
  86. },
  87. &cli.StringSliceFlag{
  88. Name: "discovery-bootstrap-peers",
  89. Usage: "List of discovery peers to use",
  90. EnvVar: "EDGEVPNBOOTSTRAPPEERS",
  91. },
  92. &cli.StringFlag{
  93. Name: "token",
  94. Usage: "Specify an edgevpn token in place of a config file",
  95. EnvVar: "EDGEVPNTOKEN",
  96. }}
  97. func displayStart(e *edgevpn.EdgeVPN) {
  98. e.Logger().Info(Copyright)
  99. e.Logger().Infof("Version: %s commit: %s", internal.Version, internal.Commit)
  100. }
  101. func cliToOpts(c *cli.Context) []edgevpn.Option {
  102. config := c.String("config")
  103. address := c.String("address")
  104. iface := c.String("interface")
  105. logLevel := c.String("log-level")
  106. libp2plogLevel := c.String("libp2p-log-level")
  107. dht, mDNS := c.Bool("enable-dht"), c.Bool("enable-mdns")
  108. ledgerState := c.String("ledger-state")
  109. addrsList := discovery.AddrList{}
  110. peers := c.StringSlice("discovery-bootstrap-peers")
  111. lvl, err := log.LevelFromString(logLevel)
  112. if err != nil {
  113. lvl = log.LevelError
  114. }
  115. llger := logger.New(lvl)
  116. libp2plvl, err := log.LevelFromString(libp2plogLevel)
  117. if err != nil {
  118. libp2plvl = log.LevelFatal
  119. }
  120. token := c.String("token")
  121. if config == "" &&
  122. token == "" {
  123. llger.Fatal("EDGEVPNCONFIG or EDGEVPNTOKEN not supplied. At least a config file is required")
  124. }
  125. for _, p := range peers {
  126. if err := addrsList.Set(p); err != nil {
  127. llger.Fatal("Failed reading bootstrap peer list", err.Error())
  128. }
  129. }
  130. opts := []edgevpn.Option{
  131. edgevpn.WithDiscoveryInterval(time.Duration(c.Int("discovery-interval")) * time.Second),
  132. edgevpn.WithLedgerAnnounceTime(time.Duration(c.Int("ledger-announce-interval")) * time.Second),
  133. edgevpn.WithLedgerInterval(time.Duration(c.Int("ledger-syncronization-interval")) * time.Second),
  134. edgevpn.Logger(llger),
  135. edgevpn.WithDiscoveryBootstrapPeers(addrsList),
  136. edgevpn.LibP2PLogLevel(libp2plvl),
  137. edgevpn.WithInterfaceMTU(c.Int("mtu")),
  138. edgevpn.WithPacketMTU(1420),
  139. edgevpn.WithInterfaceAddress(address),
  140. edgevpn.WithInterfaceName(iface),
  141. edgevpn.WithInterfaceType(water.TUN),
  142. edgevpn.NetLinkBootstrap(true),
  143. edgevpn.FromBase64(mDNS, dht, token),
  144. edgevpn.FromYaml(mDNS, dht, config),
  145. }
  146. libp2pOpts := []libp2p.Option{}
  147. if c.Bool("autorelay") {
  148. libp2pOpts = append(libp2pOpts, libp2p.EnableAutoRelay())
  149. }
  150. if c.Bool("natservice") {
  151. libp2pOpts = append(libp2pOpts, libp2p.EnableNATService())
  152. }
  153. if c.Bool("natmap") {
  154. libp2pOpts = append(libp2pOpts, libp2p.NATPortMap())
  155. }
  156. opts = append(opts, edgevpn.WithLibp2pOptions(libp2pOpts...))
  157. if ledgerState != "" {
  158. opts = append(opts, edgevpn.WithStore(blockchain.NewDiskStore(diskv.New(diskv.Options{
  159. BasePath: ledgerState,
  160. CacheSizeMax: uint64(50), // 50MB
  161. }))))
  162. } else {
  163. opts = append(opts, edgevpn.WithStore(&blockchain.MemoryStore{}))
  164. }
  165. return opts
  166. }