diff --git a/logic/util.go b/logic/util.go index 9486c4e6..8fc2357c 100644 --- a/logic/util.go +++ b/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 diff --git a/models/node.go b/models/node.go index 41a66b02..c6596039 100644 --- a/models/node.go +++ b/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" diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 46f6a614..861be106 100644 --- a/netclient/functions/common.go +++ b/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) diff --git a/netclient/functions/list.go b/netclient/functions/list.go new file mode 100644 index 00000000..6a5e1116 --- /dev/null +++ b/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 +} diff --git a/scripts/netclient-install.sh b/scripts/netclient-install.sh index 28e03ef5..c59bc6c7 100755 --- a/scripts/netclient-install.sh +++ b/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