gateway.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package logic
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/servercfg"
  10. )
  11. // IsInternetGw - checks if node is acting as internet gw
  12. func IsInternetGw(node models.Node) bool {
  13. return node.IsInternetGateway
  14. }
  15. // GetInternetGateways - gets all the nodes that are internet gateways
  16. func GetInternetGateways() ([]models.Node, error) {
  17. nodes, err := GetAllNodes()
  18. if err != nil {
  19. return nil, err
  20. }
  21. igs := make([]models.Node, 0)
  22. for _, node := range nodes {
  23. if node.IsInternetGateway {
  24. igs = append(igs, node)
  25. }
  26. }
  27. return igs, nil
  28. }
  29. // GetAllIngresses - gets all the nodes that are ingresses
  30. func GetAllIngresses() ([]models.Node, error) {
  31. nodes, err := GetAllNodes()
  32. if err != nil {
  33. return nil, err
  34. }
  35. ingresses := make([]models.Node, 0)
  36. for _, node := range nodes {
  37. if node.IsIngressGateway {
  38. ingresses = append(ingresses, node)
  39. }
  40. }
  41. return ingresses, nil
  42. }
  43. // CreateIngressGateway - creates an ingress gateway
  44. func CreateIngressGateway(netid string, nodeid string, ingress models.IngressRequest) (models.Node, error) {
  45. node, err := GetNodeByID(nodeid)
  46. if err != nil {
  47. return models.Node{}, err
  48. }
  49. if node.IsRelayed {
  50. return models.Node{}, errors.New("gateway cannot be created on a relayed node")
  51. }
  52. host, err := GetHost(node.HostID.String())
  53. if err != nil {
  54. return models.Node{}, err
  55. }
  56. if host.OS != "linux" {
  57. return models.Node{}, errors.New("gateway can only be created on linux based node")
  58. }
  59. network, err := GetParentNetwork(netid)
  60. if err != nil {
  61. return models.Node{}, err
  62. }
  63. node.IsIngressGateway = true
  64. node.IsGw = true
  65. node.IsRelay = true
  66. if !servercfg.IsPro {
  67. node.IsInternetGateway = ingress.IsInternetGateway
  68. }
  69. node.IngressGatewayRange = network.AddressRange
  70. node.IngressGatewayRange6 = network.AddressRange6
  71. node.IngressDNS = ingress.ExtclientDNS
  72. if node.IsInternetGateway && node.IngressDNS == "" {
  73. node.IngressDNS = "1.1.1.1"
  74. }
  75. node.IngressPersistentKeepalive = 20
  76. if ingress.PersistentKeepalive != 0 {
  77. node.IngressPersistentKeepalive = ingress.PersistentKeepalive
  78. }
  79. node.IngressMTU = 1420
  80. if ingress.MTU != 0 {
  81. node.IngressMTU = ingress.MTU
  82. }
  83. if servercfg.IsPro {
  84. if _, exists := FailOverExists(node.Network); exists {
  85. ResetFailedOverPeer(&node)
  86. }
  87. }
  88. node.SetLastModified()
  89. node.Metadata = ingress.Metadata
  90. if node.Metadata == "" {
  91. node.Metadata = "This host can be used for remote access"
  92. }
  93. if node.Tags == nil {
  94. node.Tags = make(map[models.TagID]struct{})
  95. }
  96. node.Tags[models.TagID(fmt.Sprintf("%s.%s", netid, models.GwTagName))] = struct{}{}
  97. err = UpsertNode(&node)
  98. if err != nil {
  99. return models.Node{}, err
  100. }
  101. err = SetNetworkNodesLastModified(netid)
  102. return node, err
  103. }
  104. // GetIngressGwUsers - lists the users having to access to ingressGW
  105. func GetIngressGwUsers(node models.Node) (models.IngressGwUsers, error) {
  106. gwUsers := models.IngressGwUsers{
  107. NodeID: node.ID.String(),
  108. Network: node.Network,
  109. }
  110. users, err := GetUsers()
  111. if err != nil {
  112. return gwUsers, err
  113. }
  114. for _, user := range users {
  115. if !user.IsAdmin && !user.IsSuperAdmin {
  116. gwUsers.Users = append(gwUsers.Users, user)
  117. }
  118. }
  119. return gwUsers, nil
  120. }
  121. // DeleteIngressGateway - deletes an ingress gateway
  122. func DeleteIngressGateway(nodeid string) (models.Node, []models.ExtClient, error) {
  123. removedClients := []models.ExtClient{}
  124. node, err := GetNodeByID(nodeid)
  125. if err != nil {
  126. return models.Node{}, removedClients, err
  127. }
  128. clients, err := GetExtClientsByID(nodeid, node.Network)
  129. if err != nil && !database.IsEmptyRecord(err) {
  130. return models.Node{}, removedClients, err
  131. }
  132. removedClients = clients
  133. // delete ext clients belonging to ingress gateway
  134. if err = DeleteGatewayExtClients(node.ID.String(), node.Network); err != nil {
  135. return models.Node{}, removedClients, err
  136. }
  137. logger.Log(3, "deleting ingress gateway")
  138. node.LastModified = time.Now()
  139. node.IsIngressGateway = false
  140. if !servercfg.IsPro {
  141. node.IsInternetGateway = false
  142. }
  143. delete(node.Tags, models.TagID(fmt.Sprintf("%s.%s", node.Network, models.GwTagName)))
  144. node.IngressGatewayRange = ""
  145. node.Metadata = ""
  146. err = UpsertNode(&node)
  147. if err != nil {
  148. return models.Node{}, removedClients, err
  149. }
  150. err = SetNetworkNodesLastModified(node.Network)
  151. return node, removedClients, err
  152. }
  153. // DeleteGatewayExtClients - deletes ext clients based on gateway (mac) of ingress node and network
  154. func DeleteGatewayExtClients(gatewayID string, networkName string) error {
  155. currentExtClients, err := GetNetworkExtClients(networkName)
  156. if database.IsEmptyRecord(err) {
  157. return nil
  158. }
  159. if err != nil {
  160. return err
  161. }
  162. for _, extClient := range currentExtClients {
  163. if extClient.IngressGatewayID == gatewayID {
  164. if err = DeleteExtClient(networkName, extClient.ClientID); err != nil {
  165. logger.Log(1, "failed to remove ext client", extClient.ClientID)
  166. continue
  167. }
  168. }
  169. }
  170. return nil
  171. }
  172. // IsUserAllowedAccessToExtClient - checks if user has permission to access extclient
  173. func IsUserAllowedAccessToExtClient(username string, client models.ExtClient) bool {
  174. if username == MasterUser {
  175. return true
  176. }
  177. user, err := GetUser(username)
  178. if err != nil {
  179. return false
  180. }
  181. if user.UserName != client.OwnerID {
  182. return false
  183. }
  184. return true
  185. }