list.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package functions
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. nodepb "github.com/gravitl/netmaker/grpc"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/gravitl/netmaker/netclient/auth"
  9. "github.com/gravitl/netmaker/netclient/config"
  10. "github.com/gravitl/netmaker/netclient/ncutils"
  11. "google.golang.org/grpc"
  12. "google.golang.org/grpc/metadata"
  13. )
  14. // Peer - the peer struct for list
  15. type Peer struct {
  16. Name string `json:"name"`
  17. Interface string `json:"interface,omitempty"`
  18. PrivateIPv4 string `json:"private_ipv4,omitempty"`
  19. PrivateIPv6 string `json:"private_ipv6,omitempty"`
  20. PublicEndpoint string `json:"public_endpoint,omitempty"`
  21. }
  22. // Network - the local node network representation for list command
  23. type Network struct {
  24. Name string `json:"name"`
  25. ID string `json:"node_id"`
  26. CurrentNode Peer `json:"current_node"`
  27. Peers []Peer `json:"peers"`
  28. }
  29. // List - lists the current peers for the local node with name and node ID
  30. func List(network string) error {
  31. nets := []Network{}
  32. var err error
  33. var networks []string
  34. if network == "all" {
  35. networks, err = ncutils.GetSystemNetworks()
  36. if err != nil {
  37. return err
  38. }
  39. } else {
  40. networks = append(networks, network)
  41. }
  42. for _, network := range networks {
  43. net, err := getNetwork(network)
  44. if err != nil {
  45. logger.Log(1, network+": Could not retrieve network configuration.")
  46. return err
  47. }
  48. nets = append(nets, net)
  49. }
  50. jsoncfg, _ := json.Marshal(struct {
  51. Networks []Network `json:"networks"`
  52. }{nets})
  53. fmt.Println(string(jsoncfg))
  54. return nil
  55. }
  56. func getNetwork(network string) (Network, error) {
  57. cfg, err := config.ReadConfig(network)
  58. if err != nil {
  59. return Network{}, fmt.Errorf("reading configuration for network %v: %w", network, err)
  60. }
  61. peers, err := getPeers(network)
  62. if err != nil {
  63. return Network{}, fmt.Errorf("listing peers for network %v: %w", network, err)
  64. }
  65. return Network{
  66. Name: network,
  67. ID: cfg.Node.ID,
  68. Peers: peers,
  69. CurrentNode: Peer{
  70. Name: cfg.Node.Name,
  71. Interface: cfg.Node.Interface,
  72. PrivateIPv4: cfg.Node.Address,
  73. PrivateIPv6: cfg.Node.Address6,
  74. PublicEndpoint: cfg.Node.Endpoint,
  75. },
  76. }, nil
  77. }
  78. func getPeers(network string) ([]Peer, error) {
  79. cfg, err := config.ReadConfig(network)
  80. if err != nil {
  81. return []Peer{}, err
  82. }
  83. nodecfg := cfg.Node
  84. var nodes []models.Node
  85. var wcclient nodepb.NodeServiceClient
  86. conn, err := grpc.Dial(cfg.Server.GRPCAddress,
  87. ncutils.GRPCRequestOpts(cfg.Server.GRPCSSL))
  88. if err != nil {
  89. return []Peer{}, fmt.Errorf("connecting to %v: %w", cfg.Server.GRPCAddress, err)
  90. }
  91. defer conn.Close()
  92. // Instantiate the BlogServiceClient with our client connection to the server
  93. wcclient = nodepb.NewNodeServiceClient(conn)
  94. nodeData, err := json.Marshal(&nodecfg)
  95. if err != nil {
  96. return []Peer{}, fmt.Errorf("could not parse config node on network %s : %w", network, err)
  97. }
  98. req := &nodepb.Object{
  99. Data: string(nodeData),
  100. Type: nodepb.NODE_TYPE,
  101. }
  102. ctx, err := auth.SetJWT(wcclient, network)
  103. if err != nil {
  104. return []Peer{}, fmt.Errorf("authenticating: %w", err)
  105. }
  106. var header metadata.MD
  107. response, err := wcclient.GetPeers(ctx, req, grpc.Header(&header))
  108. if err != nil {
  109. return []Peer{}, fmt.Errorf("retrieving peers: %w", err)
  110. }
  111. if err := json.Unmarshal([]byte(response.GetData()), &nodes); err != nil {
  112. return []Peer{}, fmt.Errorf("unmarshaling data for peers: %w", err)
  113. }
  114. peers := []Peer{}
  115. for _, node := range nodes {
  116. if node.Name != cfg.Node.Name {
  117. peers = append(peers, Peer{Name: fmt.Sprintf("%v.%v", node.Name, network), PrivateIPv4: node.Address, PrivateIPv6: node.Address6})
  118. }
  119. }
  120. return peers, nil
  121. }