list.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package functions
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/netclient/config"
  10. "github.com/gravitl/netmaker/netclient/ncutils"
  11. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  12. )
  13. // Peer - the peer struct for list
  14. type Peer struct {
  15. Name string `json:"name,omitempty"`
  16. Interface string `json:"interface,omitempty"`
  17. PrivateIPv4 string `json:"private_ipv4,omitempty"`
  18. PrivateIPv6 string `json:"private_ipv6,omitempty"`
  19. PublicKey string `json:"public_key,omitempty"`
  20. PublicEndpoint string `json:"public_endpoint,omitempty"`
  21. Addresses string `json:"addresses,omitempty"`
  22. }
  23. // Network - the local node network representation for list command
  24. type Network struct {
  25. Name string `json:"name"`
  26. ID string `json:"node_id"`
  27. CurrentNode Peer `json:"current_node"`
  28. Peers []Peer `json:"peers"`
  29. }
  30. // List - lists the current peers for the local node with name and node ID
  31. func List(network string) error {
  32. nets := []Network{}
  33. var err error
  34. var networks []string
  35. if network == "all" {
  36. networks, err = ncutils.GetSystemNetworks()
  37. if err != nil {
  38. return err
  39. }
  40. } else {
  41. networks = append(networks, network)
  42. }
  43. for _, network := range networks {
  44. net, err := getNetwork(network)
  45. if err != nil {
  46. logger.Log(1, network+": Could not retrieve network configuration.")
  47. return err
  48. }
  49. peers, err := getPeers(network)
  50. if err == nil && len(peers) > 0 {
  51. net.Peers = peers
  52. }
  53. nets = append(nets, net)
  54. }
  55. jsoncfg, _ := json.Marshal(struct {
  56. Networks []Network `json:"networks"`
  57. }{nets})
  58. fmt.Println(string(jsoncfg))
  59. return nil
  60. }
  61. func getNetwork(network string) (Network, error) {
  62. cfg, err := config.ReadConfig(network)
  63. if err != nil {
  64. return Network{}, fmt.Errorf("reading configuration for network %v: %w", network, err)
  65. }
  66. //peers, err := getPeers(network)
  67. peers := []Peer{}
  68. if err != nil {
  69. return Network{}, fmt.Errorf("listing peers for network %v: %w", network, err)
  70. }
  71. return Network{
  72. Name: network,
  73. ID: cfg.Node.ID,
  74. Peers: peers,
  75. CurrentNode: Peer{
  76. Name: cfg.Node.Name,
  77. Interface: cfg.Node.Interface,
  78. PrivateIPv4: cfg.Node.Address,
  79. PrivateIPv6: cfg.Node.Address6,
  80. PublicEndpoint: cfg.Node.Endpoint,
  81. },
  82. }, nil
  83. }
  84. func getPeers(network string) ([]Peer, error) {
  85. cfg, err := config.ReadConfig(network)
  86. if err != nil {
  87. return []Peer{}, err
  88. }
  89. token, err := Authenticate(cfg)
  90. if err != nil {
  91. return nil, err
  92. }
  93. url := "https://" + cfg.Server.API + "/api/nodes/" + cfg.Network + "/" + cfg.Node.ID
  94. response, err := API("", http.MethodGet, url, token)
  95. if err != nil {
  96. return nil, err
  97. }
  98. if response.StatusCode != http.StatusOK {
  99. bytes, err := io.ReadAll(response.Body)
  100. if err != nil {
  101. fmt.Println(err)
  102. }
  103. return nil, (fmt.Errorf("%s %w", string(bytes), err))
  104. }
  105. defer response.Body.Close()
  106. var nodeGET models.NodeGet
  107. if err := json.NewDecoder(response.Body).Decode(&nodeGET); err != nil {
  108. return nil, fmt.Errorf("error decoding node %w", err)
  109. }
  110. if nodeGET.Peers == nil {
  111. nodeGET.Peers = []wgtypes.PeerConfig{}
  112. }
  113. peers := []Peer{}
  114. for _, peer := range nodeGET.Peers {
  115. var addresses = ""
  116. for j := range peer.AllowedIPs {
  117. addresses += peer.AllowedIPs[j].String()
  118. if j < len(peer.AllowedIPs)-1 {
  119. addresses += ","
  120. }
  121. }
  122. peers = append(peers, Peer{
  123. PublicKey: peer.PublicKey.String(),
  124. PublicEndpoint: peer.Endpoint.String(),
  125. Addresses: addresses,
  126. })
  127. }
  128. return peers, nil
  129. }