relay.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "time"
  7. "github.com/gravitl/netmaker/database"
  8. "github.com/gravitl/netmaker/logger"
  9. "github.com/gravitl/netmaker/models"
  10. )
  11. // CreateRelay - creates a relay
  12. func CreateRelay(relay models.RelayRequest) ([]models.Node, models.Node, error) {
  13. var returnnodes []models.Node
  14. node, err := GetNodeByID(relay.NodeID)
  15. if err != nil {
  16. return returnnodes, models.Node{}, err
  17. }
  18. if node.OS != "linux" {
  19. return returnnodes, models.Node{}, fmt.Errorf("only linux machines can be relay nodes")
  20. }
  21. err = ValidateRelay(relay)
  22. if err != nil {
  23. return returnnodes, models.Node{}, err
  24. }
  25. node.IsRelay = "yes"
  26. node.RelayAddrs = relay.RelayAddrs
  27. node.SetLastModified()
  28. node.PullChanges = "yes"
  29. nodeData, err := json.Marshal(&node)
  30. if err != nil {
  31. return returnnodes, node, err
  32. }
  33. if err = database.Insert(node.ID, string(nodeData), database.NODES_TABLE_NAME); err != nil {
  34. return returnnodes, models.Node{}, err
  35. }
  36. returnnodes, err = SetRelayedNodes("yes", node.Network, node.RelayAddrs)
  37. if err != nil {
  38. return returnnodes, node, err
  39. }
  40. if err = NetworkNodesUpdatePullChanges(node.Network); err != nil {
  41. return returnnodes, models.Node{}, err
  42. }
  43. return returnnodes, node, nil
  44. }
  45. // SetRelayedNodes- set relayed nodes
  46. func SetRelayedNodes(yesOrno string, networkName string, addrs []string) ([]models.Node, error) {
  47. var returnnodes []models.Node
  48. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  49. if err != nil {
  50. return returnnodes, err
  51. }
  52. network, err := GetNetworkSettings(networkName)
  53. if err != nil {
  54. return returnnodes, err
  55. }
  56. for _, value := range collections {
  57. var node models.Node
  58. err := json.Unmarshal([]byte(value), &node)
  59. if err != nil {
  60. return returnnodes, err
  61. }
  62. if node.Network == networkName && !(node.IsServer == "yes") {
  63. for _, addr := range addrs {
  64. if addr == node.Address || addr == node.Address6 {
  65. node.IsRelayed = yesOrno
  66. if yesOrno == "yes" {
  67. node.UDPHolePunch = "no"
  68. } else {
  69. node.UDPHolePunch = network.DefaultUDPHolePunch
  70. }
  71. data, err := json.Marshal(&node)
  72. if err != nil {
  73. return returnnodes, err
  74. }
  75. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  76. returnnodes = append(returnnodes, node)
  77. }
  78. }
  79. }
  80. }
  81. return returnnodes, nil
  82. }
  83. // SetNodeIsRelayed - Sets IsRelayed to on or off for relay
  84. func SetNodeIsRelayed(yesOrno string, id string) error {
  85. node, err := GetNodeByID(id)
  86. if err != nil {
  87. return err
  88. }
  89. network, err := GetNetworkByNode(&node)
  90. if err != nil {
  91. return err
  92. }
  93. node.IsRelayed = yesOrno
  94. if yesOrno == "yes" {
  95. node.UDPHolePunch = "no"
  96. } else {
  97. node.UDPHolePunch = network.DefaultUDPHolePunch
  98. }
  99. data, err := json.Marshal(&node)
  100. if err != nil {
  101. return err
  102. }
  103. return database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  104. }
  105. // PeerListUnRelay - call this function if a relayed node fails to get its relay: unrelays node and gets new peer list
  106. func PeerListUnRelay(id string, network string) ([]models.Node, error) {
  107. err := SetNodeIsRelayed("no", id)
  108. if err != nil {
  109. return nil, err
  110. }
  111. return GetPeersList(network, true, "")
  112. }
  113. // ValidateRelay - checks if relay is valid
  114. func ValidateRelay(relay models.RelayRequest) error {
  115. var err error
  116. //isIp := functions.IsIpCIDR(gateway.RangeString)
  117. empty := len(relay.RelayAddrs) == 0
  118. if empty {
  119. err = errors.New("IP Ranges Cannot Be Empty")
  120. }
  121. return err
  122. }
  123. // UpdateRelay - updates a relay
  124. func UpdateRelay(network string, oldAddrs []string, newAddrs []string) []models.Node {
  125. var returnnodes []models.Node
  126. time.Sleep(time.Second / 4)
  127. returnnodes, err := SetRelayedNodes("no", network, oldAddrs)
  128. if err != nil {
  129. logger.Log(1, err.Error())
  130. }
  131. returnnodes, err = SetRelayedNodes("yes", network, newAddrs)
  132. if err != nil {
  133. logger.Log(1, err.Error())
  134. }
  135. return returnnodes
  136. }
  137. // DeleteRelay - deletes a relay
  138. func DeleteRelay(network, nodeid string) ([]models.Node, models.Node, error) {
  139. var returnnodes []models.Node
  140. node, err := GetNodeByID(nodeid)
  141. if err != nil {
  142. return returnnodes, models.Node{}, err
  143. }
  144. _, err = SetRelayedNodes("no", node.Network, node.RelayAddrs)
  145. if err != nil {
  146. return returnnodes, node, err
  147. }
  148. node.IsRelay = "no"
  149. node.RelayAddrs = []string{}
  150. node.SetLastModified()
  151. node.PullChanges = "yes"
  152. data, err := json.Marshal(&node)
  153. if err != nil {
  154. return returnnodes, models.Node{}, err
  155. }
  156. if err = database.Insert(nodeid, string(data), database.NODES_TABLE_NAME); err != nil {
  157. return returnnodes, models.Node{}, err
  158. }
  159. if err = NetworkNodesUpdatePullChanges(network); err != nil {
  160. return returnnodes, models.Node{}, err
  161. }
  162. return returnnodes, node, nil
  163. }