relay.go 6.0 KB

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