relay.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. host, err := GetHost(node.HostID.String())
  19. if err != nil {
  20. return returnnodes, models.Node{}, err
  21. }
  22. if host.OS != "linux" {
  23. return returnnodes, models.Node{}, fmt.Errorf("only linux machines can be relay nodes")
  24. }
  25. err = ValidateRelay(relay)
  26. if err != nil {
  27. return returnnodes, models.Node{}, err
  28. }
  29. node.IsRelay = true
  30. node.RelayAddrs = relay.RelayAddrs
  31. node.SetLastModified()
  32. nodeData, err := json.Marshal(&node)
  33. if err != nil {
  34. return returnnodes, node, err
  35. }
  36. // invalidate cache
  37. CacheNodesMutex.Lock()
  38. CacheNodes = nil
  39. CacheNodesMutex.Unlock()
  40. if err = database.Insert(node.ID.String(), string(nodeData), database.NODES_TABLE_NAME); err != nil {
  41. return returnnodes, models.Node{}, err
  42. }
  43. returnnodes, err = SetRelayedNodes(true, node.Network, node.RelayAddrs)
  44. if err != nil {
  45. return returnnodes, node, err
  46. }
  47. return returnnodes, node, nil
  48. }
  49. // CreateHostRelay - creates a host relay
  50. func CreateHostRelay(relay models.HostRelayRequest) (relayHost *models.Host, relayedHosts []models.Host, err error) {
  51. relayHost, err = GetHost(relay.HostID)
  52. if err != nil {
  53. return
  54. }
  55. err = validateHostRelay(relay)
  56. if err != nil {
  57. return
  58. }
  59. relayHost.IsRelay = true
  60. relayHost.ProxyEnabled = true
  61. relayHost.RelayedHosts = relay.RelayedHosts
  62. err = UpsertHost(relayHost)
  63. if err != nil {
  64. return
  65. }
  66. relayedHosts = SetRelayedHosts(true, relay.HostID, relay.RelayedHosts)
  67. return
  68. }
  69. // SetRelayedHosts - updates the relayed hosts status
  70. func SetRelayedHosts(setRelayed bool, relayHostID string, relayedHostIDs []string) []models.Host {
  71. var relayedHosts []models.Host
  72. for _, relayedHostID := range relayedHostIDs {
  73. host, err := GetHost(relayedHostID)
  74. if err == nil {
  75. if setRelayed {
  76. host.IsRelayed = true
  77. host.RelayedBy = relayHostID
  78. host.ProxyEnabled = true
  79. } else {
  80. host.IsRelayed = false
  81. host.RelayedBy = ""
  82. }
  83. err = UpsertHost(host)
  84. if err == nil {
  85. relayedHosts = append(relayedHosts, *host)
  86. }
  87. }
  88. }
  89. return relayedHosts
  90. }
  91. // SetRelayedNodes- set relayed nodes
  92. func SetRelayedNodes(setRelayed bool, networkName string, addrs []string) ([]models.Node, error) {
  93. var returnnodes []models.Node
  94. networkNodes, err := GetNetworkNodes(networkName)
  95. if err != nil {
  96. return returnnodes, err
  97. }
  98. for _, node := range networkNodes {
  99. for _, addr := range addrs {
  100. if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
  101. if setRelayed {
  102. node.IsRelayed = true
  103. } else {
  104. node.IsRelayed = false
  105. }
  106. data, err := json.Marshal(&node)
  107. if err != nil {
  108. return returnnodes, err
  109. }
  110. // invalidate cache
  111. CacheNodesMutex.Lock()
  112. CacheNodes = nil
  113. CacheNodesMutex.Unlock()
  114. database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
  115. returnnodes = append(returnnodes, node)
  116. }
  117. }
  118. }
  119. return returnnodes, nil
  120. }
  121. func GetRelayedNodes(relayNode *models.Node) ([]models.Node, error) {
  122. var returnnodes []models.Node
  123. networkNodes, err := GetNetworkNodes(relayNode.Network)
  124. if err != nil {
  125. return returnnodes, err
  126. }
  127. for _, node := range networkNodes {
  128. for _, addr := range relayNode.RelayAddrs {
  129. if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
  130. returnnodes = append(returnnodes, node)
  131. }
  132. }
  133. }
  134. return returnnodes, nil
  135. }
  136. // GetRelayedHosts - gets the relayed hosts of a relay host
  137. func GetRelayedHosts(relayHost *models.Host) []models.Host {
  138. relayedHosts := []models.Host{}
  139. for _, hostID := range relayHost.RelayedHosts {
  140. relayedHost, err := GetHost(hostID)
  141. if err == nil {
  142. relayedHosts = append(relayedHosts, *relayedHost)
  143. }
  144. }
  145. return relayedHosts
  146. }
  147. // ValidateRelay - checks if relay is valid
  148. func ValidateRelay(relay models.RelayRequest) error {
  149. var err error
  150. //isIp := functions.IsIpCIDR(gateway.RangeString)
  151. empty := len(relay.RelayAddrs) == 0
  152. if empty {
  153. err = errors.New("IP Ranges Cannot Be Empty")
  154. }
  155. return err
  156. }
  157. func validateHostRelay(relay models.HostRelayRequest) error {
  158. if len(relay.RelayedHosts) == 0 {
  159. return errors.New("relayed hosts are empty")
  160. }
  161. return nil
  162. }
  163. // UpdateRelay - updates a relay
  164. func UpdateRelay(network string, oldAddrs []string, newAddrs []string) []models.Node {
  165. var returnnodes []models.Node
  166. time.Sleep(time.Second / 4)
  167. _, err := SetRelayedNodes(false, network, oldAddrs)
  168. if err != nil {
  169. logger.Log(1, err.Error())
  170. }
  171. returnnodes, err = SetRelayedNodes(true, network, newAddrs)
  172. if err != nil {
  173. logger.Log(1, err.Error())
  174. }
  175. return returnnodes
  176. }
  177. // DeleteRelay - deletes a relay
  178. func DeleteRelay(network, nodeid string) ([]models.Node, models.Node, error) {
  179. var returnnodes []models.Node
  180. node, err := GetNodeByID(nodeid)
  181. if err != nil {
  182. return returnnodes, models.Node{}, err
  183. }
  184. returnnodes, err = SetRelayedNodes(false, node.Network, node.RelayAddrs)
  185. if err != nil {
  186. return returnnodes, node, err
  187. }
  188. node.IsRelay = false
  189. node.RelayAddrs = []string{}
  190. node.SetLastModified()
  191. data, err := json.Marshal(&node)
  192. if err != nil {
  193. return returnnodes, models.Node{}, err
  194. }
  195. // invalidate cache
  196. CacheNodesMutex.Lock()
  197. CacheNodes = nil
  198. CacheNodesMutex.Unlock()
  199. if err = database.Insert(nodeid, string(data), database.NODES_TABLE_NAME); err != nil {
  200. return returnnodes, models.Node{}, err
  201. }
  202. return returnnodes, node, nil
  203. }
  204. // DeleteHostRelay - removes host as relay
  205. func DeleteHostRelay(relayHostID string) (relayHost *models.Host, relayedHosts []models.Host, err error) {
  206. relayHost, err = GetHost(relayHostID)
  207. if err != nil {
  208. return
  209. }
  210. relayedHosts = SetRelayedHosts(false, relayHostID, relayHost.RelayedHosts)
  211. relayHost.IsRelay = false
  212. relayHost.RelayedHosts = []string{}
  213. err = UpsertHost(relayHost)
  214. if err != nil {
  215. return
  216. }
  217. return
  218. }
  219. // UpdateHostRelay - updates the relay host with new relayed hosts
  220. func UpdateHostRelay(relayHostID string, oldRelayedHosts, newRelayedHosts []string) {
  221. _ = SetRelayedHosts(false, relayHostID, oldRelayedHosts)
  222. _ = SetRelayedHosts(true, relayHostID, newRelayedHosts)
  223. }