extpeers.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package logic
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "time"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/models"
  9. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  10. )
  11. // GetExtPeersList - gets the ext peers lists
  12. func GetExtPeersList(node *models.Node) ([]models.ExtPeersResponse, error) {
  13. var peers []models.ExtPeersResponse
  14. records, err := database.FetchRecords(database.EXT_CLIENT_TABLE_NAME)
  15. if err != nil {
  16. return peers, err
  17. }
  18. for _, value := range records {
  19. var peer models.ExtPeersResponse
  20. var extClient models.ExtClient
  21. err = json.Unmarshal([]byte(value), &peer)
  22. if err != nil {
  23. logger.Log(2, "failed to unmarshal peer when getting ext peer list")
  24. continue
  25. }
  26. err = json.Unmarshal([]byte(value), &extClient)
  27. if err != nil {
  28. logger.Log(2, "failed to unmarshal ext client")
  29. continue
  30. }
  31. if extClient.Enabled && extClient.Network == node.Network && extClient.IngressGatewayID == node.ID.String() {
  32. peers = append(peers, peer)
  33. }
  34. }
  35. return peers, err
  36. }
  37. // ExtClient.GetEgressRangesOnNetwork - returns the egress ranges on network of ext client
  38. func GetEgressRangesOnNetwork(client *models.ExtClient) ([]string, error) {
  39. var result []string
  40. networkNodes, err := GetNetworkNodes(client.Network)
  41. if err != nil {
  42. return []string{}, err
  43. }
  44. for _, currentNode := range networkNodes {
  45. if currentNode.Network != client.Network {
  46. continue
  47. }
  48. if currentNode.IsEgressGateway { // add the egress gateway range(s) to the result
  49. if len(currentNode.EgressGatewayRanges) > 0 {
  50. result = append(result, currentNode.EgressGatewayRanges...)
  51. }
  52. }
  53. }
  54. return result, nil
  55. }
  56. // DeleteExtClient - deletes an existing ext client
  57. func DeleteExtClient(network string, clientid string) error {
  58. key, err := GetRecordKey(clientid, network)
  59. if err != nil {
  60. return err
  61. }
  62. err = database.DeleteRecord(database.EXT_CLIENT_TABLE_NAME, key)
  63. return err
  64. }
  65. // GetNetworkExtClients - gets the ext clients of given network
  66. func GetNetworkExtClients(network string) ([]models.ExtClient, error) {
  67. var extclients []models.ExtClient
  68. records, err := database.FetchRecords(database.EXT_CLIENT_TABLE_NAME)
  69. if err != nil {
  70. return extclients, err
  71. }
  72. for _, value := range records {
  73. var extclient models.ExtClient
  74. err = json.Unmarshal([]byte(value), &extclient)
  75. if err != nil {
  76. continue
  77. }
  78. if extclient.Network == network {
  79. extclients = append(extclients, extclient)
  80. }
  81. }
  82. return extclients, err
  83. }
  84. // GetExtClient - gets a single ext client on a network
  85. func GetExtClient(clientid string, network string) (models.ExtClient, error) {
  86. var extclient models.ExtClient
  87. key, err := GetRecordKey(clientid, network)
  88. if err != nil {
  89. return extclient, err
  90. }
  91. data, err := database.FetchRecord(database.EXT_CLIENT_TABLE_NAME, key)
  92. if err != nil {
  93. return extclient, err
  94. }
  95. err = json.Unmarshal([]byte(data), &extclient)
  96. return extclient, err
  97. }
  98. // GetExtClient - gets a single ext client on a network
  99. func GetExtClientByPubKey(publicKey string, network string) (*models.ExtClient, error) {
  100. netClients, err := GetNetworkExtClients(network)
  101. if err != nil {
  102. return nil, err
  103. }
  104. for i := range netClients {
  105. ec := netClients[i]
  106. if ec.PublicKey == publicKey {
  107. return &ec, nil
  108. }
  109. }
  110. return nil, fmt.Errorf("no client found")
  111. }
  112. // CreateExtClient - creates an extclient
  113. func CreateExtClient(extclient *models.ExtClient) error {
  114. if len(extclient.PublicKey) == 0 {
  115. privateKey, err := wgtypes.GeneratePrivateKey()
  116. if err != nil {
  117. return err
  118. }
  119. extclient.PrivateKey = privateKey.String()
  120. extclient.PublicKey = privateKey.PublicKey().String()
  121. } else if len(extclient.PrivateKey) == 0 && len(extclient.PublicKey) > 0 {
  122. extclient.PrivateKey = "[ENTER PRIVATE KEY]"
  123. }
  124. parentNetwork, err := GetNetwork(extclient.Network)
  125. if err != nil {
  126. return err
  127. }
  128. if extclient.Address == "" {
  129. if parentNetwork.IsIPv4 == "yes" {
  130. newAddress, err := UniqueAddress(extclient.Network, true)
  131. if err != nil {
  132. return err
  133. }
  134. extclient.Address = newAddress.String()
  135. }
  136. }
  137. if extclient.Address6 == "" {
  138. if parentNetwork.IsIPv6 == "yes" {
  139. addr6, err := UniqueAddress6(extclient.Network, true)
  140. if err != nil {
  141. return err
  142. }
  143. extclient.Address6 = addr6.String()
  144. }
  145. }
  146. if extclient.ClientID == "" {
  147. extclient.ClientID = models.GenerateNodeName()
  148. }
  149. extclient.LastModified = time.Now().Unix()
  150. return SaveExtClient(extclient)
  151. }
  152. // SaveExtClient - saves an ext client to database
  153. func SaveExtClient(extclient *models.ExtClient) error {
  154. key, err := GetRecordKey(extclient.ClientID, extclient.Network)
  155. if err != nil {
  156. return err
  157. }
  158. data, err := json.Marshal(&extclient)
  159. if err != nil {
  160. return err
  161. }
  162. if err = database.Insert(key, string(data), database.EXT_CLIENT_TABLE_NAME); err != nil {
  163. return err
  164. }
  165. return SetNetworkNodesLastModified(extclient.Network)
  166. }
  167. // UpdateExtClient - updates an ext client with new values
  168. func UpdateExtClient(old *models.ExtClient, update *models.CustomExtClient) (*models.ExtClient, bool, error) {
  169. new := old
  170. replaceOldClient := false
  171. err := DeleteExtClient(old.Network, old.ClientID)
  172. if err != nil {
  173. return new, replaceOldClient, err
  174. }
  175. new.ClientID = update.ClientID
  176. if update.PublicKey != "" && old.PublicKey != update.PublicKey {
  177. replaceOldClient = true
  178. new.PublicKey = update.PublicKey
  179. }
  180. if update.DNS != "" && update.DNS != old.DNS {
  181. new.DNS = update.DNS
  182. }
  183. if update.Enabled != old.Enabled {
  184. new.Enabled = update.Enabled
  185. }
  186. if update.ExtraAllowedIPs != nil && StringDifference(old.ExtraAllowedIPs, update.ExtraAllowedIPs) != nil {
  187. new.ExtraAllowedIPs = update.ExtraAllowedIPs
  188. }
  189. return new, replaceOldClient, CreateExtClient(new)
  190. }
  191. // GetExtClientsByID - gets the clients of attached gateway
  192. func GetExtClientsByID(nodeid, network string) ([]models.ExtClient, error) {
  193. var result []models.ExtClient
  194. currentClients, err := GetNetworkExtClients(network)
  195. if err != nil {
  196. return result, err
  197. }
  198. for i := range currentClients {
  199. if currentClients[i].IngressGatewayID == nodeid {
  200. result = append(result, currentClients[i])
  201. }
  202. }
  203. return result, nil
  204. }
  205. // GetAllExtClients - gets all ext clients from DB
  206. func GetAllExtClients() ([]models.ExtClient, error) {
  207. var clients = []models.ExtClient{}
  208. currentNetworks, err := GetNetworks()
  209. if err != nil && database.IsEmptyRecord(err) {
  210. return clients, nil
  211. } else if err != nil {
  212. return clients, err
  213. }
  214. for i := range currentNetworks {
  215. netName := currentNetworks[i].NetID
  216. netClients, err := GetNetworkExtClients(netName)
  217. if err != nil {
  218. continue
  219. }
  220. clients = append(clients, netClients...)
  221. }
  222. return clients, nil
  223. }