nodes.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. package logic
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "github.com/google/uuid"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "golang.org/x/exp/slog"
  10. )
  11. var (
  12. IPv4Network = "0.0.0.0/0"
  13. IPv6Network = "::/0"
  14. )
  15. // GetNetworkIngresses - gets the gateways of a network
  16. func GetNetworkIngresses(network string) ([]models.Node, error) {
  17. var ingresses []models.Node
  18. netNodes, err := logic.GetNetworkNodes(network)
  19. if err != nil {
  20. return []models.Node{}, err
  21. }
  22. for i := range netNodes {
  23. if netNodes[i].IsIngressGateway {
  24. ingresses = append(ingresses, netNodes[i])
  25. }
  26. }
  27. return ingresses, nil
  28. }
  29. func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
  30. tagNodesMap = make(map[models.TagID][]models.Node)
  31. nodes, _ := logic.GetAllNodes()
  32. for _, nodeI := range nodes {
  33. if nodeI.Tags == nil {
  34. continue
  35. }
  36. if nodeI.Mutex != nil {
  37. nodeI.Mutex.Lock()
  38. }
  39. for nodeTagID := range nodeI.Tags {
  40. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  41. }
  42. if nodeI.Mutex != nil {
  43. nodeI.Mutex.Unlock()
  44. }
  45. }
  46. return
  47. }
  48. func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (tagNodesMap map[models.TagID][]models.Node) {
  49. tagNodesMap = make(map[models.TagID][]models.Node)
  50. nodes, _ := logic.GetNetworkNodes(netID.String())
  51. for _, nodeI := range nodes {
  52. tagNodesMap[models.TagID(nodeI.ID.String())] = []models.Node{
  53. nodeI,
  54. }
  55. if nodeI.Tags == nil {
  56. continue
  57. }
  58. if nodeI.Mutex != nil {
  59. nodeI.Mutex.Lock()
  60. }
  61. for nodeTagID := range nodeI.Tags {
  62. if nodeTagID == models.TagID(nodeI.ID.String()) {
  63. continue
  64. }
  65. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  66. }
  67. if nodeI.Mutex != nil {
  68. nodeI.Mutex.Unlock()
  69. }
  70. }
  71. tagNodesMap["*"] = nodes
  72. if !withStaticNodes {
  73. return
  74. }
  75. return AddTagMapWithStaticNodes(netID, tagNodesMap)
  76. }
  77. func AddTagMapWithStaticNodes(netID models.NetworkID,
  78. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  79. extclients, err := logic.GetNetworkExtClients(netID.String())
  80. if err != nil {
  81. return tagNodesMap
  82. }
  83. for _, extclient := range extclients {
  84. if extclient.RemoteAccessClientID != "" {
  85. continue
  86. }
  87. tagNodesMap[models.TagID(extclient.ClientID)] = []models.Node{
  88. {
  89. IsStatic: true,
  90. StaticNode: extclient,
  91. },
  92. }
  93. if extclient.Tags == nil {
  94. continue
  95. }
  96. if extclient.Mutex != nil {
  97. extclient.Mutex.Lock()
  98. }
  99. for tagID := range extclient.Tags {
  100. if tagID == models.TagID(extclient.ClientID) {
  101. continue
  102. }
  103. tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
  104. tagNodesMap["*"] = append(tagNodesMap["*"], extclient.ConvertToStaticNode())
  105. }
  106. if extclient.Mutex != nil {
  107. extclient.Mutex.Unlock()
  108. }
  109. }
  110. return tagNodesMap
  111. }
  112. func AddTagMapWithStaticNodesWithUsers(netID models.NetworkID,
  113. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  114. extclients, err := logic.GetNetworkExtClients(netID.String())
  115. if err != nil {
  116. return tagNodesMap
  117. }
  118. for _, extclient := range extclients {
  119. tagNodesMap[models.TagID(extclient.ClientID)] = []models.Node{
  120. {
  121. IsStatic: true,
  122. StaticNode: extclient,
  123. },
  124. }
  125. if extclient.Tags == nil {
  126. continue
  127. }
  128. if extclient.Mutex != nil {
  129. extclient.Mutex.Lock()
  130. }
  131. for tagID := range extclient.Tags {
  132. tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
  133. }
  134. if extclient.Mutex != nil {
  135. extclient.Mutex.Unlock()
  136. }
  137. }
  138. return tagNodesMap
  139. }
  140. func GetNodeIDsWithTag(tagID models.TagID) (ids []string) {
  141. tag, err := GetTag(tagID)
  142. if err != nil {
  143. return
  144. }
  145. nodes, _ := logic.GetNetworkNodes(tag.Network.String())
  146. for _, nodeI := range nodes {
  147. if nodeI.Tags == nil {
  148. continue
  149. }
  150. if nodeI.Mutex != nil {
  151. nodeI.Mutex.Lock()
  152. }
  153. if _, ok := nodeI.Tags[tagID]; ok {
  154. ids = append(ids, nodeI.ID.String())
  155. }
  156. if nodeI.Mutex != nil {
  157. nodeI.Mutex.Unlock()
  158. }
  159. }
  160. return
  161. }
  162. func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
  163. nMap := make(map[string]models.Node)
  164. tag, err := GetTag(tagID)
  165. if err != nil {
  166. return nMap
  167. }
  168. nodes, _ := logic.GetNetworkNodes(tag.Network.String())
  169. for _, nodeI := range nodes {
  170. if nodeI.Tags == nil {
  171. continue
  172. }
  173. if nodeI.Mutex != nil {
  174. nodeI.Mutex.Lock()
  175. }
  176. if _, ok := nodeI.Tags[tagID]; ok {
  177. nMap[nodeI.ID.String()] = nodeI
  178. }
  179. if nodeI.Mutex != nil {
  180. nodeI.Mutex.Unlock()
  181. }
  182. }
  183. return AddStaticNodesWithTag(tag, nMap)
  184. }
  185. func AddStaticNodesWithTag(tag models.Tag, nMap map[string]models.Node) map[string]models.Node {
  186. extclients, err := logic.GetNetworkExtClients(tag.Network.String())
  187. if err != nil {
  188. return nMap
  189. }
  190. for _, extclient := range extclients {
  191. if extclient.RemoteAccessClientID != "" {
  192. continue
  193. }
  194. if extclient.Mutex != nil {
  195. extclient.Mutex.Lock()
  196. }
  197. if _, ok := extclient.Tags[tag.ID]; ok {
  198. nMap[extclient.ClientID] = extclient.ConvertToStaticNode()
  199. }
  200. if extclient.Mutex != nil {
  201. extclient.Mutex.Unlock()
  202. }
  203. }
  204. return nMap
  205. }
  206. func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
  207. nMap := make(map[string]models.Node)
  208. tag, err := GetTag(tagID)
  209. if err != nil {
  210. return nMap
  211. }
  212. extclients, err := logic.GetNetworkExtClients(tag.Network.String())
  213. if err != nil {
  214. return nMap
  215. }
  216. for _, extclient := range extclients {
  217. nMap[extclient.ClientID] = extclient.ConvertToStaticNode()
  218. }
  219. return nMap
  220. }
  221. func ValidateInetGwReq(inetNode models.Node, req models.InetNodeReq, update bool) error {
  222. inetHost, err := logic.GetHost(inetNode.HostID.String())
  223. if err != nil {
  224. return err
  225. }
  226. if inetHost.FirewallInUse == models.FIREWALL_NONE {
  227. return errors.New("iptables or nftables needs to be installed")
  228. }
  229. if inetNode.InternetGwID != "" {
  230. return fmt.Errorf("node %s is using a internet gateway already", inetHost.Name)
  231. }
  232. if inetNode.IsRelayed {
  233. return fmt.Errorf("node %s is being relayed", inetHost.Name)
  234. }
  235. for _, clientNodeID := range req.InetNodeClientIDs {
  236. clientNode, err := logic.GetNodeByID(clientNodeID)
  237. if err != nil {
  238. return err
  239. }
  240. if clientNode.IsFailOver {
  241. return errors.New("failover node cannot be set to use internet gateway")
  242. }
  243. clientHost, err := logic.GetHost(clientNode.HostID.String())
  244. if err != nil {
  245. return err
  246. }
  247. if clientHost.IsDefault {
  248. return errors.New("default host cannot be set to use internet gateway")
  249. }
  250. if clientHost.OS != models.OS_Types.Linux && clientHost.OS != models.OS_Types.Windows {
  251. return errors.New("can only attach linux or windows machine to a internet gateway")
  252. }
  253. if clientNode.IsInternetGateway {
  254. return fmt.Errorf("node %s acting as internet gateway cannot use another internet gateway", clientHost.Name)
  255. }
  256. if update {
  257. if clientNode.InternetGwID != "" && clientNode.InternetGwID != inetNode.ID.String() {
  258. return fmt.Errorf("node %s is already using a internet gateway", clientHost.Name)
  259. }
  260. } else {
  261. if clientNode.InternetGwID != "" {
  262. return fmt.Errorf("node %s is already using a internet gateway", clientHost.Name)
  263. }
  264. }
  265. if clientNode.FailedOverBy != uuid.Nil {
  266. ResetFailedOverPeer(&clientNode)
  267. }
  268. if clientNode.IsRelayed && clientNode.RelayedBy != inetNode.ID.String() {
  269. return fmt.Errorf("node %s is being relayed", clientHost.Name)
  270. }
  271. for _, nodeID := range clientHost.Nodes {
  272. node, err := logic.GetNodeByID(nodeID)
  273. if err != nil {
  274. continue
  275. }
  276. if node.InternetGwID != "" && node.InternetGwID != inetNode.ID.String() {
  277. return errors.New("nodes on same host cannot use different internet gateway")
  278. }
  279. }
  280. }
  281. return nil
  282. }
  283. // SetInternetGw - sets the node as internet gw based on flag bool
  284. func SetInternetGw(node *models.Node, req models.InetNodeReq) {
  285. node.IsInternetGateway = true
  286. node.InetNodeReq = req
  287. for _, clientNodeID := range req.InetNodeClientIDs {
  288. clientNode, err := logic.GetNodeByID(clientNodeID)
  289. if err != nil {
  290. continue
  291. }
  292. clientNode.InternetGwID = node.ID.String()
  293. logic.UpsertNode(&clientNode)
  294. }
  295. }
  296. func UnsetInternetGw(node *models.Node) {
  297. nodes, err := logic.GetNetworkNodes(node.Network)
  298. if err != nil {
  299. slog.Error("failed to get network nodes", "network", node.Network, "error", err)
  300. return
  301. }
  302. for _, clientNode := range nodes {
  303. if node.ID.String() == clientNode.InternetGwID {
  304. clientNode.InternetGwID = ""
  305. logic.UpsertNode(&clientNode)
  306. }
  307. }
  308. node.IsInternetGateway = false
  309. node.InetNodeReq = models.InetNodeReq{}
  310. }
  311. func SetDefaultGwForRelayedUpdate(relayed, relay models.Node, peerUpdate models.HostPeerUpdate) models.HostPeerUpdate {
  312. if relay.InternetGwID != "" {
  313. relayedHost, err := logic.GetHost(relayed.HostID.String())
  314. if err != nil {
  315. return peerUpdate
  316. }
  317. peerUpdate.ChangeDefaultGw = true
  318. peerUpdate.DefaultGwIp = relay.Address.IP
  319. if peerUpdate.DefaultGwIp == nil || relayedHost.EndpointIP == nil {
  320. peerUpdate.DefaultGwIp = relay.Address6.IP
  321. }
  322. }
  323. return peerUpdate
  324. }
  325. func SetDefaultGw(node models.Node, peerUpdate models.HostPeerUpdate) models.HostPeerUpdate {
  326. if node.InternetGwID != "" {
  327. inetNode, err := logic.GetNodeByID(node.InternetGwID)
  328. if err != nil {
  329. return peerUpdate
  330. }
  331. host, err := logic.GetHost(node.HostID.String())
  332. if err != nil {
  333. return peerUpdate
  334. }
  335. peerUpdate.ChangeDefaultGw = true
  336. peerUpdate.DefaultGwIp = inetNode.Address.IP
  337. if peerUpdate.DefaultGwIp == nil || host.EndpointIP == nil {
  338. peerUpdate.DefaultGwIp = inetNode.Address6.IP
  339. }
  340. }
  341. return peerUpdate
  342. }
  343. // GetAllowedIpForInetNodeClient - get inet cidr for node using a inet gw
  344. func GetAllowedIpForInetNodeClient(node, peer *models.Node) []net.IPNet {
  345. var allowedips = []net.IPNet{}
  346. if peer.Address.IP != nil {
  347. _, ipnet, _ := net.ParseCIDR(IPv4Network)
  348. allowedips = append(allowedips, *ipnet)
  349. }
  350. if peer.Address6.IP != nil {
  351. _, ipnet, _ := net.ParseCIDR(IPv6Network)
  352. allowedips = append(allowedips, *ipnet)
  353. }
  354. return allowedips
  355. }