2
0
Эх сурвалжийг харах

:gear: Enable active dynamic relay discovery

Ettore Di Giacinto 3 жил өмнө
parent
commit
19f85e833b

+ 8 - 2
cmd/util.go

@@ -80,9 +80,14 @@ var CommonFlags []cli.Flag = []cli.Flag{
 	},
 	&cli.StringFlag{
 		Name:   "autorelay-discovery-interval",
-		Usage:  "Autorelay discovery interval (Experimental. 0 to disable)",
+		Usage:  "Autorelay discovery interval",
 		EnvVar: "EDGEVPNAUTORELAYDISCOVERYINTERVAL",
-		Value:  "0",
+		Value:  "5m",
+	},
+	&cli.BoolFlag{
+		Name:   "autorelay-static-only",
+		Usage:  "Use only defined static relays",
+		EnvVar: "EDGEVPNAUTORELAYSTATICONLY",
 	},
 	&cli.IntFlag{
 		Name:   "ledger-syncronization-interval",
@@ -425,6 +430,7 @@ func cliToOpts(c *cli.Context) ([]node.Option, []vpn.Option, *logger.Logger) {
 			Mplex:                      c.Bool("mplex-multiplexer"),
 			StaticRelays:               c.StringSlice("autorelay-static-peer"),
 			AutoRelayDiscoveryInterval: autorelayInterval,
+			OnlyStaticRelays:           c.Bool("autorelay-static-only"),
 		},
 		Limit: config.ResourceLimit{
 			Enable:      c.Bool("limit-enable"),

+ 18 - 3
pkg/config/config.go

@@ -113,6 +113,7 @@ type Connection struct {
 	AutoRelayDiscoveryInterval time.Duration
 	RelayV1                    bool
 	StaticRelays               []string
+	OnlyStaticRelays           bool
 
 	Mplex          bool
 	MaxConnections int
@@ -243,12 +244,26 @@ func (c Config) ToOpts(l *logger.Logger) ([]node.Option, []vpn.Option, error) {
 		}
 
 		// If no relays are specified and no discovery interval, then just use default static relays (to be deprecated)
-		if len(c.Connection.StaticRelays) == 0 && c.Connection.AutoRelayDiscoveryInterval == 0 {
-			relayOpts = append(relayOpts, autorelay.WithDefaultStaticRelays())
-		} else if len(c.Connection.StaticRelays) > 0 {
+		if len(c.Connection.StaticRelays) > 0 && c.Connection.OnlyStaticRelays {
 			relayOpts = append(relayOpts, autorelay.WithStaticRelays(peers2AddrInfo(c.Connection.StaticRelays)))
 		} else {
 			peerChan := make(chan peer.AddrInfo)
+
+			if c.Connection.AutoRelayDiscoveryInterval == 0 {
+				c.Connection.AutoRelayDiscoveryInterval = 5 * time.Minute
+			}
+
+			staticRelays := append(autorelay.DefaultRelays, c.Connection.StaticRelays...)
+			if len(staticRelays) > 0 {
+				opts = append(opts, node.WithNetworkService(
+					services.AutoRelayStaticFeederService(
+						llger, peerChan, append(autorelay.DefaultRelays, c.Connection.StaticRelays...),
+						c.Connection.AutoRelayDiscoveryInterval,
+						false,
+					),
+				))
+			}
+
 			// Add AutoRelayFeederService (needs a DHT Service discovery)
 			opts = append(opts, func(cfg *node.Config) error {
 				for _, sd := range cfg.ServiceDiscovery {

+ 39 - 0
pkg/services/dht_relay_discovery.go

@@ -27,6 +27,45 @@ import (
 	"github.com/mudler/edgevpn/pkg/utils"
 )
 
+// AutoRelayStaticFeederService is a service responsible to discover relays from static peers
+func AutoRelayStaticFeederService(ll log.StandardLogger, peerChan chan peer.AddrInfo, relays []string, duration time.Duration, bootstrapOnly bool) node.NetworkService {
+	queue := func() {
+		for _, r := range relays {
+			pi, err := peer.AddrInfoFromString(r)
+			if err == nil {
+				ll.Debug("[static relay discovery] scanning ", pi.ID)
+				peerChan <- peer.AddrInfo{ID: pi.ID, Addrs: pi.Addrs}
+			}
+		}
+	}
+
+	return func(ctx context.Context, c node.Config, n *node.Node, l *blockchain.Ledger) error {
+		ctx, cancel := context.WithCancel(ctx)
+
+		go func() {
+			if bootstrapOnly {
+				queue()
+				return
+			}
+
+			t := utils.NewBackoffTicker(utils.BackoffMaxInterval(duration))
+			defer t.Stop()
+			defer cancel()
+			for {
+				select {
+				case <-t.C:
+				case <-ctx.Done():
+					ll.Debug("[static relay discovery] stopped")
+					return
+				}
+				queue()
+			}
+		}()
+
+		return nil
+	}
+}
+
 // AutoRelayFeederService is a service responsible to returning periodically peers to
 // scan for relays from a DHT discovery service
 func AutoRelayFeederService(ll log.StandardLogger, peerChan chan peer.AddrInfo, dht *discovery.DHT, duration time.Duration) node.NetworkService {