2
0

nodes.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. package logic
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "net"
  8. "sort"
  9. "sync"
  10. "time"
  11. validator "github.com/go-playground/validator/v10"
  12. "github.com/google/uuid"
  13. "github.com/gravitl/netmaker/database"
  14. "github.com/gravitl/netmaker/logger"
  15. "github.com/gravitl/netmaker/logic/acls"
  16. "github.com/gravitl/netmaker/logic/acls/nodeacls"
  17. "github.com/gravitl/netmaker/models"
  18. "github.com/gravitl/netmaker/servercfg"
  19. "github.com/gravitl/netmaker/validation"
  20. "github.com/seancfoley/ipaddress-go/ipaddr"
  21. "golang.org/x/exp/slog"
  22. )
  23. var (
  24. nodeCacheMutex = &sync.RWMutex{}
  25. nodesCacheMap = make(map[string]models.Node)
  26. )
  27. func getNodeFromCache(nodeID string) (node models.Node, ok bool) {
  28. nodeCacheMutex.RLock()
  29. node, ok = nodesCacheMap[nodeID]
  30. nodeCacheMutex.RUnlock()
  31. return
  32. }
  33. func getNodesFromCache() (nodes []models.Node) {
  34. nodeCacheMutex.RLock()
  35. for _, node := range nodesCacheMap {
  36. nodes = append(nodes, node)
  37. }
  38. nodeCacheMutex.RUnlock()
  39. return
  40. }
  41. func deleteNodeFromCache(nodeID string) {
  42. nodeCacheMutex.Lock()
  43. delete(nodesCacheMap, nodeID)
  44. nodeCacheMutex.Unlock()
  45. }
  46. func storeNodeInCache(node models.Node) {
  47. nodeCacheMutex.Lock()
  48. nodesCacheMap[node.ID.String()] = node
  49. nodeCacheMutex.Unlock()
  50. }
  51. func loadNodesIntoCache(nMap map[string]models.Node) {
  52. nodeCacheMutex.Lock()
  53. nodesCacheMap = nMap
  54. nodeCacheMutex.Unlock()
  55. }
  56. func ClearNodeCache() {
  57. nodeCacheMutex.Lock()
  58. nodesCacheMap = make(map[string]models.Node)
  59. nodeCacheMutex.Unlock()
  60. }
  61. const (
  62. // RELAY_NODE_ERR - error to return if relay node is unfound
  63. RELAY_NODE_ERR = "could not find relay for node"
  64. // NodePurgeTime time to wait for node to response to a NODE_DELETE actions
  65. NodePurgeTime = time.Second * 10
  66. // NodePurgeCheckTime is how often to check nodes for Pending Delete
  67. NodePurgeCheckTime = time.Second * 30
  68. )
  69. // GetNetworkNodes - gets the nodes of a network
  70. func GetNetworkNodes(network string) ([]models.Node, error) {
  71. allnodes, err := GetAllNodes()
  72. if err != nil {
  73. return []models.Node{}, err
  74. }
  75. return GetNetworkNodesMemory(allnodes, network), nil
  76. }
  77. // GetHostNodes - fetches all nodes part of the host
  78. func GetHostNodes(host *models.Host) []models.Node {
  79. nodes := []models.Node{}
  80. for _, nodeID := range host.Nodes {
  81. node, err := GetNodeByID(nodeID)
  82. if err == nil {
  83. nodes = append(nodes, node)
  84. }
  85. }
  86. return nodes
  87. }
  88. // GetNetworkNodesMemory - gets all nodes belonging to a network from list in memory
  89. func GetNetworkNodesMemory(allNodes []models.Node, network string) []models.Node {
  90. var nodes = []models.Node{}
  91. for i := range allNodes {
  92. node := allNodes[i]
  93. if node.Network == network {
  94. nodes = append(nodes, node)
  95. }
  96. }
  97. return nodes
  98. }
  99. // UpdateNodeCheckin - updates the checkin time of a node
  100. func UpdateNodeCheckin(node *models.Node) error {
  101. node.SetLastCheckIn()
  102. data, err := json.Marshal(node)
  103. if err != nil {
  104. return err
  105. }
  106. err = database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
  107. if err != nil {
  108. return err
  109. }
  110. if servercfg.CacheEnabled() {
  111. storeNodeInCache(*node)
  112. }
  113. return nil
  114. }
  115. // UpsertNode - updates node in the DB
  116. func UpsertNode(newNode *models.Node) error {
  117. newNode.SetLastModified()
  118. data, err := json.Marshal(newNode)
  119. if err != nil {
  120. return err
  121. }
  122. err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
  123. if err != nil {
  124. return err
  125. }
  126. if servercfg.CacheEnabled() {
  127. storeNodeInCache(*newNode)
  128. }
  129. return nil
  130. }
  131. // UpdateNode - takes a node and updates another node with it's values
  132. func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
  133. if newNode.Address.IP.String() != currentNode.Address.IP.String() {
  134. if network, err := GetParentNetwork(newNode.Network); err == nil {
  135. if !IsAddressInCIDR(newNode.Address.IP, network.AddressRange) {
  136. return fmt.Errorf("invalid address provided; out of network range for node %s", newNode.ID)
  137. }
  138. }
  139. }
  140. nodeACLDelta := currentNode.DefaultACL != newNode.DefaultACL
  141. newNode.Fill(currentNode, servercfg.IsPro)
  142. // check for un-settable server values
  143. if err := ValidateNode(newNode, true); err != nil {
  144. return err
  145. }
  146. if newNode.ID == currentNode.ID {
  147. if nodeACLDelta {
  148. if err := UpdateProNodeACLs(newNode); err != nil {
  149. logger.Log(1, "failed to apply node level ACLs during creation of node", newNode.ID.String(), "-", err.Error())
  150. return err
  151. }
  152. }
  153. newNode.SetLastModified()
  154. if data, err := json.Marshal(newNode); err != nil {
  155. return err
  156. } else {
  157. err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
  158. if err != nil {
  159. return err
  160. }
  161. if servercfg.CacheEnabled() {
  162. storeNodeInCache(*newNode)
  163. }
  164. return nil
  165. }
  166. }
  167. return fmt.Errorf("failed to update node " + currentNode.ID.String() + ", cannot change ID.")
  168. }
  169. // DeleteNode - marks node for deletion (and adds to zombie list) if called by UI or deletes node if called by node
  170. func DeleteNode(node *models.Node, purge bool) error {
  171. alreadyDeleted := node.PendingDelete || node.Action == models.NODE_DELETE
  172. node.Action = models.NODE_DELETE
  173. //delete ext clients if node is ingress gw
  174. if node.IsIngressGateway {
  175. if err := DeleteGatewayExtClients(node.ID.String(), node.Network); err != nil {
  176. slog.Error("failed to delete ext clients", "nodeid", node.ID.String(), "error", err.Error())
  177. }
  178. host, err := GetHost(node.HostID.String())
  179. if err == nil {
  180. go DeleteRole(models.GetRAGRoleID(node.Network, host.ID.String()), true)
  181. }
  182. }
  183. if node.IsRelayed {
  184. // cleanup node from relayednodes on relay node
  185. relayNode, err := GetNodeByID(node.RelayedBy)
  186. if err == nil {
  187. relayedNodes := []string{}
  188. for _, relayedNodeID := range relayNode.RelayedNodes {
  189. if relayedNodeID == node.ID.String() {
  190. continue
  191. }
  192. relayedNodes = append(relayedNodes, relayedNodeID)
  193. }
  194. relayNode.RelayedNodes = relayedNodes
  195. UpsertNode(&relayNode)
  196. }
  197. }
  198. if node.FailedOverBy != uuid.Nil {
  199. ResetFailedOverPeer(node)
  200. }
  201. if node.IsRelay {
  202. // unset all the relayed nodes
  203. SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
  204. }
  205. if node.InternetGwID != "" {
  206. inetNode, err := GetNodeByID(node.InternetGwID)
  207. if err == nil {
  208. clientNodeIDs := []string{}
  209. for _, inetNodeClientID := range inetNode.InetNodeReq.InetNodeClientIDs {
  210. if inetNodeClientID == node.ID.String() {
  211. continue
  212. }
  213. clientNodeIDs = append(clientNodeIDs, inetNodeClientID)
  214. }
  215. inetNode.InetNodeReq.InetNodeClientIDs = clientNodeIDs
  216. UpsertNode(&inetNode)
  217. }
  218. }
  219. if node.IsInternetGateway {
  220. UnsetInternetGw(node)
  221. }
  222. if !purge && !alreadyDeleted {
  223. newnode := *node
  224. newnode.PendingDelete = true
  225. if err := UpdateNode(node, &newnode); err != nil {
  226. return err
  227. }
  228. newZombie <- node.ID
  229. return nil
  230. }
  231. if alreadyDeleted {
  232. logger.Log(1, "forcibly deleting node", node.ID.String())
  233. }
  234. host, err := GetHost(node.HostID.String())
  235. if err != nil {
  236. logger.Log(1, "no host found for node", node.ID.String(), "deleting..")
  237. if delErr := DeleteNodeByID(node); delErr != nil {
  238. logger.Log(0, "failed to delete node", node.ID.String(), delErr.Error())
  239. }
  240. return err
  241. }
  242. if err := DissasociateNodeFromHost(node, host); err != nil {
  243. return err
  244. }
  245. return nil
  246. }
  247. // GetNodeByHostRef - gets the node by host id and network
  248. func GetNodeByHostRef(hostid, network string) (node models.Node, err error) {
  249. nodes, err := GetNetworkNodes(network)
  250. if err != nil {
  251. return models.Node{}, err
  252. }
  253. for _, node := range nodes {
  254. if node.HostID.String() == hostid && node.Network == network {
  255. return node, nil
  256. }
  257. }
  258. return models.Node{}, errors.New("node not found")
  259. }
  260. // DeleteNodeByID - deletes a node from database
  261. func DeleteNodeByID(node *models.Node) error {
  262. var err error
  263. var key = node.ID.String()
  264. if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
  265. if !database.IsEmptyRecord(err) {
  266. return err
  267. }
  268. }
  269. if servercfg.CacheEnabled() {
  270. deleteNodeFromCache(node.ID.String())
  271. }
  272. if servercfg.IsDNSMode() {
  273. SetDNS()
  274. }
  275. _, err = nodeacls.RemoveNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()))
  276. if err != nil {
  277. // ignoring for now, could hit a nil pointer if delete called twice
  278. logger.Log(2, "attempted to remove node ACL for node", node.ID.String())
  279. }
  280. // removeZombie <- node.ID
  281. if err = DeleteMetrics(node.ID.String()); err != nil {
  282. logger.Log(1, "unable to remove metrics from DB for node", node.ID.String(), err.Error())
  283. }
  284. //recycle ip address
  285. if node.Address.IP != nil {
  286. RemoveIpFromAllocatedIpMap(node.Network, node.Address.IP.String())
  287. }
  288. if node.Address6.IP != nil {
  289. RemoveIpFromAllocatedIpMap(node.Network, node.Address6.IP.String())
  290. }
  291. return nil
  292. }
  293. // IsNodeIDUnique - checks if node id is unique
  294. func IsNodeIDUnique(node *models.Node) (bool, error) {
  295. _, err := database.FetchRecord(database.NODES_TABLE_NAME, node.ID.String())
  296. return database.IsEmptyRecord(err), err
  297. }
  298. // ValidateNode - validates node values
  299. func ValidateNode(node *models.Node, isUpdate bool) error {
  300. v := validator.New()
  301. _ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
  302. if isUpdate {
  303. return true
  304. }
  305. isFieldUnique, _ := IsNodeIDUnique(node)
  306. return isFieldUnique
  307. })
  308. _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
  309. _, err := GetNetworkByNode(node)
  310. return err == nil
  311. })
  312. _ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool {
  313. return validation.CheckYesOrNoOrUnset(f1)
  314. })
  315. err := v.Struct(node)
  316. return err
  317. }
  318. // GetAllNodes - returns all nodes in the DB
  319. func GetAllNodes() ([]models.Node, error) {
  320. var nodes []models.Node
  321. if servercfg.CacheEnabled() {
  322. nodes = getNodesFromCache()
  323. if len(nodes) != 0 {
  324. return nodes, nil
  325. }
  326. }
  327. nodesMap := make(map[string]models.Node)
  328. if servercfg.CacheEnabled() {
  329. defer loadNodesIntoCache(nodesMap)
  330. }
  331. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  332. if err != nil {
  333. if database.IsEmptyRecord(err) {
  334. return []models.Node{}, nil
  335. }
  336. return []models.Node{}, err
  337. }
  338. for _, value := range collection {
  339. var node models.Node
  340. // ignore legacy nodes in database
  341. if err := json.Unmarshal([]byte(value), &node); err != nil {
  342. logger.Log(3, "legacy node detected: ", err.Error())
  343. continue
  344. }
  345. // add node to our array
  346. nodes = append(nodes, node)
  347. nodesMap[node.ID.String()] = node
  348. }
  349. return nodes, nil
  350. }
  351. // GetNetworkByNode - gets the network model from a node
  352. func GetNetworkByNode(node *models.Node) (models.Network, error) {
  353. var network = models.Network{}
  354. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, node.Network)
  355. if err != nil {
  356. return network, err
  357. }
  358. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  359. return models.Network{}, err
  360. }
  361. return network, nil
  362. }
  363. // SetNodeDefaults - sets the defaults of a node to avoid empty fields
  364. func SetNodeDefaults(node *models.Node) {
  365. parentNetwork, _ := GetNetworkByNode(node)
  366. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  367. if err == nil {
  368. node.NetworkRange = *cidr
  369. }
  370. _, cidr, err = net.ParseCIDR(parentNetwork.AddressRange6)
  371. if err == nil {
  372. node.NetworkRange6 = *cidr
  373. }
  374. if node.DefaultACL == "" {
  375. node.DefaultACL = parentNetwork.DefaultACL
  376. }
  377. if node.FailOverPeers == nil {
  378. node.FailOverPeers = make(map[string]struct{})
  379. }
  380. node.SetLastModified()
  381. node.SetLastCheckIn()
  382. node.SetDefaultConnected()
  383. node.SetExpirationDateTime()
  384. }
  385. // GetRecordKey - get record key
  386. // depricated
  387. func GetRecordKey(id string, network string) (string, error) {
  388. if id == "" || network == "" {
  389. return "", errors.New("unable to get record key")
  390. }
  391. return id + "###" + network, nil
  392. }
  393. func GetNodeByID(uuid string) (models.Node, error) {
  394. if servercfg.CacheEnabled() {
  395. if node, ok := getNodeFromCache(uuid); ok {
  396. return node, nil
  397. }
  398. }
  399. var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
  400. if err != nil {
  401. return models.Node{}, err
  402. }
  403. var node models.Node
  404. if err = json.Unmarshal([]byte(record), &node); err != nil {
  405. return models.Node{}, err
  406. }
  407. if servercfg.CacheEnabled() {
  408. storeNodeInCache(node)
  409. }
  410. return node, nil
  411. }
  412. // GetDeletedNodeByID - get a deleted node
  413. func GetDeletedNodeByID(uuid string) (models.Node, error) {
  414. var node models.Node
  415. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, uuid)
  416. if err != nil {
  417. return models.Node{}, err
  418. }
  419. if err = json.Unmarshal([]byte(record), &node); err != nil {
  420. return models.Node{}, err
  421. }
  422. SetNodeDefaults(&node)
  423. return node, nil
  424. }
  425. // FindRelay - returns the node that is the relay for a relayed node
  426. func FindRelay(node *models.Node) *models.Node {
  427. relay, err := GetNodeByID(node.RelayedBy)
  428. if err != nil {
  429. logger.Log(0, "FindRelay: "+err.Error())
  430. return nil
  431. }
  432. return &relay
  433. }
  434. // GetAllNodesAPI - get all nodes for api usage
  435. func GetAllNodesAPI(nodes []models.Node) []models.ApiNode {
  436. apiNodes := []models.ApiNode{}
  437. for i := range nodes {
  438. newApiNode := nodes[i].ConvertToAPINode()
  439. apiNodes = append(apiNodes, *newApiNode)
  440. }
  441. return apiNodes[:]
  442. }
  443. // DeleteExpiredNodes - goroutine which deletes nodes which are expired
  444. func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
  445. // Delete Expired Nodes Every Hour
  446. ticker := time.NewTicker(time.Hour)
  447. for {
  448. select {
  449. case <-ctx.Done():
  450. ticker.Stop()
  451. return
  452. case <-ticker.C:
  453. allnodes, err := GetAllNodes()
  454. if err != nil {
  455. slog.Error("failed to retrieve all nodes", "error", err.Error())
  456. return
  457. }
  458. for _, node := range allnodes {
  459. node := node
  460. if time.Now().After(node.ExpirationDateTime) {
  461. peerUpdate <- &node
  462. slog.Info("deleting expired node", "nodeid", node.ID.String())
  463. }
  464. }
  465. }
  466. }
  467. }
  468. // createNode - creates a node in database
  469. func createNode(node *models.Node) error {
  470. // lock because we need unique IPs and having it concurrent makes parallel calls result in same "unique" IPs
  471. addressLock.Lock()
  472. defer addressLock.Unlock()
  473. host, err := GetHost(node.HostID.String())
  474. if err != nil {
  475. return err
  476. }
  477. if !node.DNSOn {
  478. if servercfg.IsDNSMode() {
  479. node.DNSOn = true
  480. } else {
  481. node.DNSOn = false
  482. }
  483. }
  484. SetNodeDefaults(node)
  485. defaultACLVal := acls.Allowed
  486. parentNetwork, err := GetNetwork(node.Network)
  487. if err == nil {
  488. if parentNetwork.DefaultACL != "yes" {
  489. defaultACLVal = acls.NotAllowed
  490. }
  491. }
  492. if node.DefaultACL == "" {
  493. node.DefaultACL = "unset"
  494. }
  495. if node.Address.IP == nil {
  496. if parentNetwork.IsIPv4 == "yes" {
  497. if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil {
  498. return err
  499. }
  500. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  501. if err != nil {
  502. return err
  503. }
  504. node.Address.Mask = net.CIDRMask(cidr.Mask.Size())
  505. }
  506. } else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) {
  507. return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique")
  508. }
  509. if node.Address6.IP == nil {
  510. if parentNetwork.IsIPv6 == "yes" {
  511. if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil {
  512. return err
  513. }
  514. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6)
  515. if err != nil {
  516. return err
  517. }
  518. node.Address6.Mask = net.CIDRMask(cidr.Mask.Size())
  519. }
  520. } else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) {
  521. return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique")
  522. }
  523. node.ID = uuid.New()
  524. //Create a JWT for the node
  525. tokenString, _ := CreateJWT(node.ID.String(), host.MacAddress.String(), node.Network)
  526. if tokenString == "" {
  527. //logic.ReturnErrorResponse(w, r, errorResponse)
  528. return err
  529. }
  530. err = ValidateNode(node, false)
  531. if err != nil {
  532. return err
  533. }
  534. CheckZombies(node)
  535. nodebytes, err := json.Marshal(&node)
  536. if err != nil {
  537. return err
  538. }
  539. err = database.Insert(node.ID.String(), string(nodebytes), database.NODES_TABLE_NAME)
  540. if err != nil {
  541. return err
  542. }
  543. if servercfg.CacheEnabled() {
  544. storeNodeInCache(*node)
  545. }
  546. if _, ok := allocatedIpMap[node.Network]; ok {
  547. if node.Address.IP != nil {
  548. AddIpToAllocatedIpMap(node.Network, node.Address.IP)
  549. }
  550. if node.Address6.IP != nil {
  551. AddIpToAllocatedIpMap(node.Network, node.Address6.IP)
  552. }
  553. }
  554. _, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), defaultACLVal)
  555. if err != nil {
  556. logger.Log(1, "failed to create node ACL for node,", node.ID.String(), "err:", err.Error())
  557. return err
  558. }
  559. if err = UpdateProNodeACLs(node); err != nil {
  560. logger.Log(1, "failed to apply node level ACLs during creation of node", node.ID.String(), "-", err.Error())
  561. return err
  562. }
  563. if err = UpdateMetrics(node.ID.String(), &models.Metrics{Connectivity: make(map[string]models.Metric)}); err != nil {
  564. logger.Log(1, "failed to initialize metrics for node", node.ID.String(), err.Error())
  565. }
  566. SetNetworkNodesLastModified(node.Network)
  567. if servercfg.IsDNSMode() {
  568. err = SetDNS()
  569. }
  570. return err
  571. }
  572. // SortApiNodes - Sorts slice of ApiNodes by their ID alphabetically with numbers first
  573. func SortApiNodes(unsortedNodes []models.ApiNode) {
  574. sort.Slice(unsortedNodes, func(i, j int) bool {
  575. return unsortedNodes[i].ID < unsortedNodes[j].ID
  576. })
  577. }
  578. func ValidateParams(nodeid, netid string) (models.Node, error) {
  579. node, err := GetNodeByID(nodeid)
  580. if err != nil {
  581. slog.Error("error fetching node", "node", nodeid, "error", err.Error())
  582. return node, fmt.Errorf("error fetching node during parameter validation: %v", err)
  583. }
  584. if node.Network != netid {
  585. slog.Error("network url param does not match node id", "url nodeid", netid, "node", node.Network)
  586. return node, fmt.Errorf("network url param does not match node network")
  587. }
  588. return node, nil
  589. }
  590. func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
  591. network, err := GetNetworkSettings(gateway.NetID)
  592. if err != nil {
  593. slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
  594. return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
  595. }
  596. ipv4Net := network.AddressRange
  597. ipv6Net := network.AddressRange6
  598. for _, v := range gateway.Ranges {
  599. if ipv4Net != "" {
  600. if ContainsCIDR(ipv4Net, v) {
  601. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
  602. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv4Net)
  603. }
  604. }
  605. if ipv6Net != "" {
  606. if ContainsCIDR(ipv6Net, v) {
  607. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv6Net)
  608. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv6Net)
  609. }
  610. }
  611. }
  612. return nil
  613. }
  614. func ContainsCIDR(net1, net2 string) bool {
  615. one, two := ipaddr.NewIPAddressString(net1),
  616. ipaddr.NewIPAddressString(net2)
  617. return one.Contains(two) || two.Contains(one)
  618. }
  619. // GetAllFailOvers - gets all the nodes that are failovers
  620. func GetAllFailOvers() ([]models.Node, error) {
  621. nodes, err := GetAllNodes()
  622. if err != nil {
  623. return nil, err
  624. }
  625. igs := make([]models.Node, 0)
  626. for _, node := range nodes {
  627. if node.IsFailOver {
  628. igs = append(igs, node)
  629. }
  630. }
  631. return igs, nil
  632. }