Browse Source

:gear: Make vpn also register on start

Makes the services more uniform, so we can unify them further later on
in a common factory
Ettore Di Giacinto 3 years ago
parent
commit
6d9bf3ecda
3 changed files with 43 additions and 46 deletions
  1. 6 3
      README.md
  2. 4 3
      cmd/main.go
  3. 33 40
      pkg/vpn/vpn.go

+ 6 - 3
README.md

@@ -278,7 +278,8 @@ import (
     node "github.com/mudler/edgevpn/pkg/node"
 )
 
-e := node.New(edgevpn.Logger(l),
+e := node.New(
+    node.Logger(l),
     node.LogLevel(log.LevelInfo),
     node.MaxMessageSize(2 << 20),
     node.FromBase64( mDNSEnabled, DHTEnabled, token ),
@@ -298,7 +299,8 @@ import (
     node "github.com/mudler/edgevpn/pkg/node"
 )
 
-e := node.New(edgevpn.Logger(l),
+e := node.New(
+    node.Logger(l),
     node.LogLevel(log.LevelInfo),
     node.MaxMessageSize(2 << 20),
     node.FromBase64( mDNSEnabled, DHTEnabled, token ),
@@ -307,8 +309,9 @@ e := node.New(edgevpn.Logger(l),
 
 ledger := e.Ledger()
 
-vpn.Start(ctx, ledger, e, opts..)
+vpn.Register(ctx, ledger, e, opts..)
 
+e.Start()
 ```
 
 # 🐜 Contribution

+ 4 - 3
cmd/main.go

@@ -99,10 +99,11 @@ func Main() func(c *cli.Context) error {
 			go api.API(c.String("api-listen"), 5*time.Second, 20*time.Second, ledger)
 		}
 
-		if err := vpn.Start(context.Background(), ledger, e, vpnOpts...); err != nil {
-			ll.Fatal(err.Error())
+		err = vpn.Register(ledger, e, vpnOpts...)
+		if err != nil {
+			return err
 		}
 
-		return nil
+		return e.Start(context.Background())
 	}
 }

+ 33 - 40
pkg/vpn/vpn.go

@@ -43,7 +43,7 @@ import (
 
 // Start the node and the vpn. Returns an error in case of failure
 // When starting the vpn, there is no need to start the node
-func Start(ctx context.Context, ledger *blockchain.Ledger, n *node.Node, p ...Option) error {
+func Register(ledger *blockchain.Ledger, n *node.Node, p ...Option) error {
 	c := &Config{
 		Concurrency:        1,
 		LedgerAnnounceTime: 5 * time.Second,
@@ -56,51 +56,44 @@ func Start(ctx context.Context, ledger *blockchain.Ledger, n *node.Node, p ...Op
 	if err != nil {
 		return err
 	}
-	defer ifce.Close()
 
 	n.AddStreamHandler(protocol.EdgeVPN, streamHandler(ledger, ifce))
+	n.AddNetworkService(func(ctx context.Context, nc node.Config, n *node.Node, b *blockchain.Ledger) error {
+		defer ifce.Close()
+		// Announce our IP
+		ip, _, err := net.ParseCIDR(c.InterfaceAddress)
+		if err != nil {
+			return err
+		}
 
-	// Set the stream handler to get back the packets from the stream to the interface
-
-	// Join the node to the network, using our ledger
-	// it also starts up a goroutine that periodically sends
-	// messages to the network with our blockchain content
-	if err := n.Start(ctx); err != nil {
-		return err
-	}
-
-	// Announce our IP
-	ip, _, err := net.ParseCIDR(c.InterfaceAddress)
-	if err != nil {
-		return err
-	}
-
-	ledger.Announce(
-		ctx,
-		c.LedgerAnnounceTime,
-		func() {
-			machine := &types.Machine{}
-			// Retrieve current ID for ip in the blockchain
-			existingValue, found := ledger.GetKey(protocol.MachinesLedgerKey, ip.String())
-			existingValue.Unmarshal(machine)
-
-			// If mismatch, update the blockchain
-			if !found || machine.PeerID != n.Host().ID().String() {
-				updatedMap := map[string]interface{}{}
-				updatedMap[ip.String()] = newBlockChainData(n, ip.String())
-				ledger.Add(protocol.MachinesLedgerKey, updatedMap)
+		ledger.Announce(
+			ctx,
+			c.LedgerAnnounceTime,
+			func() {
+				machine := &types.Machine{}
+				// Retrieve current ID for ip in the blockchain
+				existingValue, found := ledger.GetKey(protocol.MachinesLedgerKey, ip.String())
+				existingValue.Unmarshal(machine)
+
+				// If mismatch, update the blockchain
+				if !found || machine.PeerID != n.Host().ID().String() {
+					updatedMap := map[string]interface{}{}
+					updatedMap[ip.String()] = newBlockChainData(n, ip.String())
+					ledger.Add(protocol.MachinesLedgerKey, updatedMap)
+				}
+			},
+		)
+
+		if c.NetLinkBootstrap {
+			if err := prepareInterface(c); err != nil {
+				return err
 			}
-		},
-	)
-
-	if c.NetLinkBootstrap {
-		if err := prepareInterface(c); err != nil {
-			return err
 		}
-	}
 
-	// read packets from the interface
-	return readPackets(ctx, c, n, ledger, ifce)
+		// read packets from the interface
+		return readPackets(ctx, c, n, ledger, ifce)
+	})
+	return nil
 }
 
 func streamHandler(l *blockchain.Ledger, ifce *water.Interface) func(stream network.Stream) {