Browse Source

feat(netclient): add listing of nodes with hostnames

Adrien Raffin-Caboisse 3 years ago
parent
commit
51a09167fc
5 changed files with 127 additions and 30 deletions
  1. 2 0
      logic/util.go
  2. 4 3
      models/node.go
  3. 0 26
      netclient/functions/common.go
  4. 120 0
      netclient/functions/list.go
  5. 1 1
      scripts/netclient-install.sh

+ 2 - 0
logic/util.go

@@ -7,6 +7,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/dnslogic"
 	"github.com/gravitl/netmaker/functions"
@@ -277,6 +278,7 @@ func setPeerInfo(node models.Node) models.Node {
 	peer.IsRelayed = node.IsRelayed
 	peer.PublicKey = node.PublicKey
 	peer.Endpoint = node.Endpoint
+	peer.Name = node.Name
 	peer.LocalAddress = node.LocalAddress
 	peer.ListenPort = node.ListenPort
 	peer.AllowedIPs = node.AllowedIPs

+ 4 - 3
models/node.go

@@ -4,13 +4,14 @@ import (
 	"bytes"
 	"encoding/json"
 	"errors"
-	"github.com/go-playground/validator/v10"
-	"github.com/gravitl/netmaker/database"
-	"golang.org/x/crypto/bcrypt"
 	"math/rand"
 	"net"
 	"strings"
 	"time"
+
+	"github.com/go-playground/validator/v10"
+	"github.com/gravitl/netmaker/database"
+	"golang.org/x/crypto/bcrypt"
 )
 
 const charset = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

+ 0 - 26
netclient/functions/common.go

@@ -255,32 +255,6 @@ func DeleteInterface(ifacename string, postdown string) error {
 	return err
 }
 
-// List - lists all networks on local machine
-func List() error {
-
-	networks, err := ncutils.GetSystemNetworks()
-	if err != nil {
-		return err
-	}
-	for _, network := range networks {
-		cfg, err := config.ReadConfig(network)
-		if err == nil {
-			jsoncfg, _ := json.Marshal(
-				map[string]string{
-					"Name":           cfg.Node.Name,
-					"Interface":      cfg.Node.Interface,
-					"PrivateIPv4":    cfg.Node.Address,
-					"PrivateIPv6":    cfg.Node.Address6,
-					"PublicEndpoint": cfg.Node.Endpoint,
-				})
-			fmt.Println(network + ": " + string(jsoncfg))
-		} else {
-			ncutils.PrintLog(network+": Could not retrieve network configuration.", 1)
-		}
-	}
-	return nil
-}
-
 // WipeLocal - wipes local instance
 func WipeLocal(network string) error {
 	cfg, err := config.ReadConfig(network)

+ 120 - 0
netclient/functions/list.go

@@ -0,0 +1,120 @@
+package functions
+
+import (
+	"encoding/json"
+	"fmt"
+	"log"
+
+	nodepb "github.com/gravitl/netmaker/grpc"
+	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/netclient/auth"
+	"github.com/gravitl/netmaker/netclient/config"
+	"github.com/gravitl/netmaker/netclient/ncutils"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/metadata"
+)
+
+type Peer struct {
+	Name           string `json:"name"`
+	Interface      string `json:"interface,omitempty"`
+	PrivateIPv4    string `json:"private_ipv4,omitempty"`
+	PrivateIPv6    string `json:"private_ipv6,omitempty"`
+	PublicEndpoint string `json:"public_endoint,omitempty"`
+}
+
+type Network struct {
+	Name        string `json:"name"`
+	CurrentNode Peer   `json:"current_node"`
+	Peers       []Peer `json:"peers"`
+}
+
+func List() error {
+	networks, err := ncutils.GetSystemNetworks()
+	if err != nil {
+		return err
+	}
+
+	nets := []Network{}
+	for _, network := range networks {
+		cfg, err := config.ReadConfig(network)
+		if err != nil {
+			ncutils.PrintLog(network+": Could not retrieve network configuration.", 1)
+			return err
+		}
+		peers, err := getPeers(network)
+		if err != nil {
+			ncutils.PrintLog(network+": Could not retrieve network configuration.", 1)
+			return err
+		}
+
+		nets = append(nets, Network{
+			Name:  network,
+			Peers: peers,
+			CurrentNode: Peer{
+				Name:           cfg.Node.Name,
+				Interface:      cfg.Node.Interface,
+				PrivateIPv4:    cfg.Node.Address,
+				PrivateIPv6:    cfg.Node.Address6,
+				PublicEndpoint: cfg.Node.Endpoint,
+			},
+		})
+	}
+
+	jsoncfg, _ := json.Marshal(struct {
+		Networks []Network `json:"networks"`
+	}{nets})
+	fmt.Println(string(jsoncfg))
+
+	return nil
+}
+
+func getPeers(network string) ([]Peer, error) {
+	cfg, err := config.ReadConfig(network)
+	if err != nil {
+		return []Peer{}, err
+	}
+	nodecfg := cfg.Node
+	var nodes []models.Node
+
+	var wcclient nodepb.NodeServiceClient
+	conn, err := grpc.Dial(cfg.Server.GRPCAddress,
+		ncutils.GRPCRequestOpts(cfg.Server.GRPCSSL))
+
+	if err != nil {
+		log.Fatalf("Unable to establish client connection to localhost:50051: %v", err)
+	}
+	defer conn.Close()
+	// Instantiate the BlogServiceClient with our client connection to the server
+	wcclient = nodepb.NewNodeServiceClient(conn)
+
+	req := &nodepb.Object{
+		Data: nodecfg.MacAddress + "###" + nodecfg.Network,
+		Type: nodepb.STRING_TYPE,
+	}
+
+	ctx, err := auth.SetJWT(wcclient, network)
+	if err != nil {
+		log.Println("Failed to authenticate.")
+		return []Peer{}, err
+	}
+	var header metadata.MD
+
+	response, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
+	if err != nil {
+		log.Println("Error retrieving peers")
+		return []Peer{}, err
+	}
+	if err := json.Unmarshal([]byte(response.GetData()), &nodes); err != nil {
+		log.Println("Error unmarshaling data for peers")
+		return []Peer{}, err
+	}
+
+	peers := []Peer{}
+	for _, node := range nodes {
+		if node.Name != cfg.Node.Name {
+			peers = append(peers, Peer{Name: fmt.Sprintf("%v.%v", node.Name, network), PrivateIPv4: node.Address, PrivateIPv6: node.Address6})
+		}
+	}
+
+	return peers, nil
+}

+ 1 - 1
scripts/netclient-install.sh

@@ -2,7 +2,7 @@
 set -e
 
 if [[ $EUID -ne 0 ]]; then
-   echo "This script must be run as root" 
+   echo "This script must be run as root"
    exit 1
 fi