Browse Source

:wrench: Allow to optionally enable/disable mDNS and DHT discovery

Ettore Di Giacinto 3 years ago
parent
commit
b8da2e842d
6 changed files with 43 additions and 14 deletions
  1. 6 1
      .github/filetest.sh
  2. 1 1
      .github/servicestest.sh
  3. 13 2
      cmd/util.go
  4. 10 1
      pkg/edgevpn/connection.go
  5. 12 6
      pkg/edgevpn/options.go
  6. 1 3
      pkg/edgevpn/services.go

+ 6 - 1
.github/filetest.sh

@@ -6,7 +6,7 @@ if [ $1 == "sender" ]; then
 
 
     ./edgevpn file-send --name "test" --path $PWD/test &
     ./edgevpn file-send --name "test" --path $PWD/test &
 
 
-    ((count = 100))                        
+    ((count = 240))                        
     while [[ $count -ne 0 ]] ; do
     while [[ $count -ne 0 ]] ; do
         sleep 2
         sleep 2
         curl http://localhost:8080/api/ledger/tests/test | grep "done"
         curl http://localhost:8080/api/ledger/tests/test | grep "done"
@@ -29,6 +29,11 @@ if [ $1 == "sender" ]; then
 else
 else
     ./edgevpn file-receive --name "test" --path $PWD/test
     ./edgevpn file-receive --name "test" --path $PWD/test
 
 
+    if [ ! -e $PWD/test ]; then
+        echo "No file downloaded"
+        exit 1
+    fi
+
     curl -X PUT http://localhost:8080/api/ledger/tests/test/done
     curl -X PUT http://localhost:8080/api/ledger/tests/test/done
 
 
     t=$(cat $PWD/test)
     t=$(cat $PWD/test)

+ 1 - 1
.github/servicestest.sh

@@ -27,7 +27,7 @@ if [ $1 == "expose" ]; then
 else
 else
     ./edgevpn service-connect --name "testservice" --srcaddress ":9090" &
     ./edgevpn service-connect --name "testservice" --srcaddress ":9090" &
 
 
-    ((count = 100))                        
+    ((count = 240))                        
     while [[ $count -ne 0 ]] ; do
     while [[ $count -ne 0 ]] ; do
         sleep 2
         sleep 2
         curl http://localhost:9090/ | grep "EdgeVPN"
         curl http://localhost:9090/ | grep "EdgeVPN"

+ 13 - 2
cmd/util.go

@@ -49,6 +49,16 @@ var CommonFlags []cli.Flag = []cli.Flag{
 		Usage:  "Specify a ledger state directory",
 		Usage:  "Specify a ledger state directory",
 		EnvVar: "EDGEVPNLEDGERSTATE",
 		EnvVar: "EDGEVPNLEDGERSTATE",
 	},
 	},
+	&cli.BoolFlag{
+		Name:   "enable-mdns",
+		Usage:  "Enable mDNS for peer discovery",
+		EnvVar: "EDGEVPNMDNS",
+	},
+	&cli.BoolTFlag{
+		Name:   "enable-dht",
+		Usage:  "Enable DHT for peer discovery",
+		EnvVar: "EDGEVPNDHT",
+	},
 	&cli.StringFlag{
 	&cli.StringFlag{
 		Name:   "log-level",
 		Name:   "log-level",
 		Usage:  "Specify loglevel",
 		Usage:  "Specify loglevel",
@@ -84,6 +94,7 @@ func cliToOpts(c *cli.Context) []edgevpn.Option {
 	iface := c.String("interface")
 	iface := c.String("interface")
 	logLevel := c.String("log-level")
 	logLevel := c.String("log-level")
 	libp2plogLevel := c.String("libp2p-log-level")
 	libp2plogLevel := c.String("libp2p-log-level")
+	dht, mDNS := c.Bool("enable-dht"), c.Bool("enable-mdns")
 
 
 	ledgerState := c.String("ledger-state")
 	ledgerState := c.String("ledger-state")
 
 
@@ -127,8 +138,8 @@ func cliToOpts(c *cli.Context) []edgevpn.Option {
 		edgevpn.WithInterfaceName(iface),
 		edgevpn.WithInterfaceName(iface),
 		edgevpn.WithInterfaceType(water.TUN),
 		edgevpn.WithInterfaceType(water.TUN),
 		edgevpn.NetLinkBootstrap(true),
 		edgevpn.NetLinkBootstrap(true),
-		edgevpn.FromBase64(token),
-		edgevpn.FromYaml(config),
+		edgevpn.FromBase64(mDNS, dht, token),
+		edgevpn.FromYaml(mDNS, dht, config),
 	}
 	}
 
 
 	if ledgerState != "" {
 	if ledgerState != "" {

+ 10 - 1
pkg/edgevpn/connection.go

@@ -11,6 +11,7 @@ import (
 	"github.com/libp2p/go-libp2p-core/crypto"
 	"github.com/libp2p/go-libp2p-core/crypto"
 	"github.com/libp2p/go-libp2p-core/host"
 	"github.com/libp2p/go-libp2p-core/host"
 	conngater "github.com/libp2p/go-libp2p/p2p/net/conngater"
 	conngater "github.com/libp2p/go-libp2p/p2p/net/conngater"
+	"github.com/mudler/edgevpn/pkg/discovery"
 	hub "github.com/mudler/edgevpn/pkg/hub"
 	hub "github.com/mudler/edgevpn/pkg/hub"
 	multiaddr "github.com/multiformats/go-multiaddr"
 	multiaddr "github.com/multiformats/go-multiaddr"
 	"github.com/xlzd/gotp"
 	"github.com/xlzd/gotp"
@@ -23,7 +24,6 @@ const (
 )
 )
 
 
 var defaultLibp2pOptions = []libp2p.Option{
 var defaultLibp2pOptions = []libp2p.Option{
-	libp2p.EnableAutoRelay(),
 	libp2p.EnableNATService(),
 	libp2p.EnableNATService(),
 	libp2p.NATPortMap(),
 	libp2p.NATPortMap(),
 }
 }
@@ -82,9 +82,18 @@ func (e *EdgeVPN) genHost(ctx context.Context) (host.Host, error) {
 	opts = append(opts, e.config.AdditionalOptions...)
 	opts = append(opts, e.config.AdditionalOptions...)
 
 
 	if e.config.Insecure {
 	if e.config.Insecure {
+		e.config.Logger.Info("Disabling Security transport layer")
 		opts = append(opts, libp2p.NoSecurity)
 		opts = append(opts, libp2p.NoSecurity)
 	}
 	}
 
 
+	for _, d := range e.config.ServiceDiscovery {
+		switch d.(type) {
+		case *discovery.DHT:
+			opts = append(opts, libp2p.EnableAutoRelay())
+			e.config.Logger.Info("DHT Discovery enabled, enabling autorelay")
+		}
+	}
+
 	opts = append(opts, libp2p.FallbackDefaults)
 	opts = append(opts, libp2p.FallbackDefaults)
 
 
 	return libp2p.New(ctx, opts...)
 	return libp2p.New(ctx, opts...)

+ 12 - 6
pkg/edgevpn/options.go

@@ -230,7 +230,7 @@ type YAMLConnectionConfig struct {
 	MaxMessageSize int    `yaml:"max_message_size"`
 	MaxMessageSize int    `yaml:"max_message_size"`
 }
 }
 
 
-func (y YAMLConnectionConfig) copy(cfg *Config) {
+func (y YAMLConnectionConfig) copy(mdns, dht bool, cfg *Config) {
 	d := &discovery.DHT{
 	d := &discovery.DHT{
 		RefreshDiscoveryTime: cfg.DiscoveryInterval,
 		RefreshDiscoveryTime: cfg.DiscoveryInterval,
 		OTPInterval:          y.OTP.DHT.Interval,
 		OTPInterval:          y.OTP.DHT.Interval,
@@ -243,7 +243,13 @@ func (y YAMLConnectionConfig) copy(cfg *Config) {
 	cfg.ExchangeKey = y.OTP.Crypto.Key
 	cfg.ExchangeKey = y.OTP.Crypto.Key
 	cfg.RoomName = y.RoomName
 	cfg.RoomName = y.RoomName
 	cfg.SealKeyInterval = y.OTP.Crypto.Interval
 	cfg.SealKeyInterval = y.OTP.Crypto.Interval
-	cfg.ServiceDiscovery = []ServiceDiscovery{d, m}
+	//	cfg.ServiceDiscovery = []ServiceDiscovery{d, m}
+	if mdns {
+		cfg.ServiceDiscovery = append(cfg.ServiceDiscovery, m)
+	}
+	if dht {
+		cfg.ServiceDiscovery = append(cfg.ServiceDiscovery, d)
+	}
 	cfg.SealKeyLength = y.OTP.Crypto.Length
 	cfg.SealKeyLength = y.OTP.Crypto.Length
 	cfg.MaxMessageSize = y.MaxMessageSize
 	cfg.MaxMessageSize = y.MaxMessageSize
 }
 }
@@ -269,7 +275,7 @@ func GenerateNewConnectionData() *YAMLConnectionConfig {
 	}
 	}
 }
 }
 
 
-func FromYaml(path string) func(cfg *Config) error {
+func FromYaml(enablemDNS, enableDHT bool, path string) func(cfg *Config) error {
 	return func(cfg *Config) error {
 	return func(cfg *Config) error {
 		if len(path) == 0 {
 		if len(path) == 0 {
 			return nil
 			return nil
@@ -285,12 +291,12 @@ func FromYaml(path string) func(cfg *Config) error {
 			return errors.Wrap(err, "parsing yaml")
 			return errors.Wrap(err, "parsing yaml")
 		}
 		}
 
 
-		t.copy(cfg)
+		t.copy(enablemDNS, enableDHT, cfg)
 		return nil
 		return nil
 	}
 	}
 }
 }
 
 
-func FromBase64(bb string) func(cfg *Config) error {
+func FromBase64(enablemDNS, enableDHT bool, bb string) func(cfg *Config) error {
 	return func(cfg *Config) error {
 	return func(cfg *Config) error {
 		if len(bb) == 0 {
 		if len(bb) == 0 {
 			return nil
 			return nil
@@ -304,7 +310,7 @@ func FromBase64(bb string) func(cfg *Config) error {
 		if err := yaml.Unmarshal(configDec, &t); err != nil {
 		if err := yaml.Unmarshal(configDec, &t); err != nil {
 			return errors.Wrap(err, "parsing yaml")
 			return errors.Wrap(err, "parsing yaml")
 		}
 		}
-		t.copy(cfg)
+		t.copy(enablemDNS, enableDHT, cfg)
 		return nil
 		return nil
 	}
 	}
 }
 }

+ 1 - 3
pkg/edgevpn/services.go

@@ -56,9 +56,7 @@ func (e *EdgeVPN) ExposeService(ledger *blockchain.Ledger, serviceID, dstaddress
 				return
 				return
 			}
 			}
 
 
-			// we need a list of known peers
-			e.config.Logger.Info("Dialing", dstaddress)
-
+			e.config.Logger.Infof("Connecting to '%s'", dstaddress)
 			c, err := net.Dial("tcp", dstaddress)
 			c, err := net.Dial("tcp", dstaddress)
 			if err != nil {
 			if err != nil {
 				e.config.Logger.Debugf("Reset %s: %s", stream.Conn().RemotePeer().String(), err.Error())
 				e.config.Logger.Debugf("Reset %s: %s", stream.Conn().RemotePeer().String(), err.Error())