nodes.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  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. if _, ok := allocatedIpMap[newNode.Network]; ok {
  164. if newNode.Address.IP != nil && !newNode.Address.IP.Equal(currentNode.Address.IP) {
  165. AddIpToAllocatedIpMap(newNode.Network, newNode.Address.IP)
  166. RemoveIpFromAllocatedIpMap(currentNode.Network, currentNode.Address.IP.String())
  167. }
  168. if newNode.Address6.IP != nil && !newNode.Address6.IP.Equal(currentNode.Address6.IP) {
  169. AddIpToAllocatedIpMap(newNode.Network, newNode.Address6.IP)
  170. RemoveIpFromAllocatedIpMap(currentNode.Network, currentNode.Address6.IP.String())
  171. }
  172. }
  173. }
  174. return nil
  175. }
  176. }
  177. return fmt.Errorf("failed to update node " + currentNode.ID.String() + ", cannot change ID.")
  178. }
  179. // DeleteNode - marks node for deletion (and adds to zombie list) if called by UI or deletes node if called by node
  180. func DeleteNode(node *models.Node, purge bool) error {
  181. alreadyDeleted := node.PendingDelete || node.Action == models.NODE_DELETE
  182. node.Action = models.NODE_DELETE
  183. //delete ext clients if node is ingress gw
  184. if node.IsIngressGateway {
  185. if err := DeleteGatewayExtClients(node.ID.String(), node.Network); err != nil {
  186. slog.Error("failed to delete ext clients", "nodeid", node.ID.String(), "error", err.Error())
  187. }
  188. }
  189. if node.IsRelayed {
  190. // cleanup node from relayednodes on relay node
  191. relayNode, err := GetNodeByID(node.RelayedBy)
  192. if err == nil {
  193. relayedNodes := []string{}
  194. for _, relayedNodeID := range relayNode.RelayedNodes {
  195. if relayedNodeID == node.ID.String() {
  196. continue
  197. }
  198. relayedNodes = append(relayedNodes, relayedNodeID)
  199. }
  200. relayNode.RelayedNodes = relayedNodes
  201. UpsertNode(&relayNode)
  202. }
  203. }
  204. if node.FailedOverBy != uuid.Nil {
  205. ResetFailedOverPeer(node)
  206. }
  207. if node.IsRelay {
  208. // unset all the relayed nodes
  209. SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
  210. }
  211. if node.InternetGwID != "" {
  212. inetNode, err := GetNodeByID(node.InternetGwID)
  213. if err == nil {
  214. clientNodeIDs := []string{}
  215. for _, inetNodeClientID := range inetNode.InetNodeReq.InetNodeClientIDs {
  216. if inetNodeClientID == node.ID.String() {
  217. continue
  218. }
  219. clientNodeIDs = append(clientNodeIDs, inetNodeClientID)
  220. }
  221. inetNode.InetNodeReq.InetNodeClientIDs = clientNodeIDs
  222. UpsertNode(&inetNode)
  223. }
  224. }
  225. if node.IsInternetGateway {
  226. UnsetInternetGw(node)
  227. }
  228. if !purge && !alreadyDeleted {
  229. newnode := *node
  230. newnode.PendingDelete = true
  231. if err := UpdateNode(node, &newnode); err != nil {
  232. return err
  233. }
  234. newZombie <- node.ID
  235. return nil
  236. }
  237. if alreadyDeleted {
  238. logger.Log(1, "forcibly deleting node", node.ID.String())
  239. }
  240. host, err := GetHost(node.HostID.String())
  241. if err != nil {
  242. logger.Log(1, "no host found for node", node.ID.String(), "deleting..")
  243. if delErr := DeleteNodeByID(node); delErr != nil {
  244. logger.Log(0, "failed to delete node", node.ID.String(), delErr.Error())
  245. }
  246. return err
  247. }
  248. if err := DissasociateNodeFromHost(node, host); err != nil {
  249. return err
  250. }
  251. return nil
  252. }
  253. // GetNodeByHostRef - gets the node by host id and network
  254. func GetNodeByHostRef(hostid, network string) (node models.Node, err error) {
  255. nodes, err := GetNetworkNodes(network)
  256. if err != nil {
  257. return models.Node{}, err
  258. }
  259. for _, node := range nodes {
  260. if node.HostID.String() == hostid && node.Network == network {
  261. return node, nil
  262. }
  263. }
  264. return models.Node{}, errors.New("node not found")
  265. }
  266. // DeleteNodeByID - deletes a node from database
  267. func DeleteNodeByID(node *models.Node) error {
  268. var err error
  269. var key = node.ID.String()
  270. if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
  271. if !database.IsEmptyRecord(err) {
  272. return err
  273. }
  274. }
  275. if servercfg.CacheEnabled() {
  276. deleteNodeFromCache(node.ID.String())
  277. }
  278. if servercfg.IsDNSMode() {
  279. SetDNS()
  280. }
  281. _, err = nodeacls.RemoveNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()))
  282. if err != nil {
  283. // ignoring for now, could hit a nil pointer if delete called twice
  284. logger.Log(2, "attempted to remove node ACL for node", node.ID.String())
  285. }
  286. // removeZombie <- node.ID
  287. if err = DeleteMetrics(node.ID.String()); err != nil {
  288. logger.Log(1, "unable to remove metrics from DB for node", node.ID.String(), err.Error())
  289. }
  290. //recycle ip address
  291. if node.Address.IP != nil {
  292. RemoveIpFromAllocatedIpMap(node.Network, node.Address.IP.String())
  293. }
  294. if node.Address6.IP != nil {
  295. RemoveIpFromAllocatedIpMap(node.Network, node.Address6.IP.String())
  296. }
  297. return nil
  298. }
  299. // IsNodeIDUnique - checks if node id is unique
  300. func IsNodeIDUnique(node *models.Node) (bool, error) {
  301. _, err := database.FetchRecord(database.NODES_TABLE_NAME, node.ID.String())
  302. return database.IsEmptyRecord(err), err
  303. }
  304. // ValidateNode - validates node values
  305. func ValidateNode(node *models.Node, isUpdate bool) error {
  306. v := validator.New()
  307. _ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
  308. if isUpdate {
  309. return true
  310. }
  311. isFieldUnique, _ := IsNodeIDUnique(node)
  312. return isFieldUnique
  313. })
  314. _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
  315. _, err := GetNetworkByNode(node)
  316. return err == nil
  317. })
  318. _ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool {
  319. return validation.CheckYesOrNoOrUnset(f1)
  320. })
  321. err := v.Struct(node)
  322. return err
  323. }
  324. // GetAllNodes - returns all nodes in the DB
  325. func GetAllNodes() ([]models.Node, error) {
  326. var nodes []models.Node
  327. if servercfg.CacheEnabled() {
  328. nodes = getNodesFromCache()
  329. if len(nodes) != 0 {
  330. return nodes, nil
  331. }
  332. }
  333. nodesMap := make(map[string]models.Node)
  334. if servercfg.CacheEnabled() {
  335. defer loadNodesIntoCache(nodesMap)
  336. }
  337. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  338. if err != nil {
  339. if database.IsEmptyRecord(err) {
  340. return []models.Node{}, nil
  341. }
  342. return []models.Node{}, err
  343. }
  344. for _, value := range collection {
  345. var node models.Node
  346. // ignore legacy nodes in database
  347. if err := json.Unmarshal([]byte(value), &node); err != nil {
  348. logger.Log(3, "legacy node detected: ", err.Error())
  349. continue
  350. }
  351. // add node to our array
  352. nodes = append(nodes, node)
  353. nodesMap[node.ID.String()] = node
  354. }
  355. return nodes, nil
  356. }
  357. func AddStaticNodestoList(nodes []models.Node) []models.Node {
  358. netMap := make(map[string]struct{})
  359. for _, node := range nodes {
  360. if _, ok := netMap[node.Network]; ok {
  361. continue
  362. }
  363. if node.IsIngressGateway {
  364. nodes = append(nodes, GetStaticNodesByNetwork(models.NetworkID(node.Network), false)...)
  365. netMap[node.Network] = struct{}{}
  366. }
  367. }
  368. return nodes
  369. }
  370. // GetNetworkByNode - gets the network model from a node
  371. func GetNetworkByNode(node *models.Node) (models.Network, error) {
  372. var network = models.Network{}
  373. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, node.Network)
  374. if err != nil {
  375. return network, err
  376. }
  377. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  378. return models.Network{}, err
  379. }
  380. return network, nil
  381. }
  382. // SetNodeDefaults - sets the defaults of a node to avoid empty fields
  383. func SetNodeDefaults(node *models.Node, resetConnected bool) {
  384. parentNetwork, _ := GetNetworkByNode(node)
  385. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  386. if err == nil {
  387. node.NetworkRange = *cidr
  388. }
  389. _, cidr, err = net.ParseCIDR(parentNetwork.AddressRange6)
  390. if err == nil {
  391. node.NetworkRange6 = *cidr
  392. }
  393. if node.DefaultACL == "" {
  394. node.DefaultACL = parentNetwork.DefaultACL
  395. }
  396. if node.FailOverPeers == nil {
  397. node.FailOverPeers = make(map[string]struct{})
  398. }
  399. node.SetLastModified()
  400. node.SetLastCheckIn()
  401. if resetConnected {
  402. node.SetDefaultConnected()
  403. }
  404. node.SetExpirationDateTime()
  405. if node.Tags == nil {
  406. node.Tags = make(map[models.TagID]struct{})
  407. }
  408. }
  409. // GetRecordKey - get record key
  410. // depricated
  411. func GetRecordKey(id string, network string) (string, error) {
  412. if id == "" || network == "" {
  413. return "", errors.New("unable to get record key")
  414. }
  415. return id + "###" + network, nil
  416. }
  417. func GetNodeByID(uuid string) (models.Node, error) {
  418. if servercfg.CacheEnabled() {
  419. if node, ok := getNodeFromCache(uuid); ok {
  420. return node, nil
  421. }
  422. }
  423. var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
  424. if err != nil {
  425. return models.Node{}, err
  426. }
  427. var node models.Node
  428. if err = json.Unmarshal([]byte(record), &node); err != nil {
  429. return models.Node{}, err
  430. }
  431. if servercfg.CacheEnabled() {
  432. storeNodeInCache(node)
  433. }
  434. return node, nil
  435. }
  436. // GetDeletedNodeByID - get a deleted node
  437. func GetDeletedNodeByID(uuid string) (models.Node, error) {
  438. var node models.Node
  439. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, uuid)
  440. if err != nil {
  441. return models.Node{}, err
  442. }
  443. if err = json.Unmarshal([]byte(record), &node); err != nil {
  444. return models.Node{}, err
  445. }
  446. SetNodeDefaults(&node, true)
  447. return node, nil
  448. }
  449. // FindRelay - returns the node that is the relay for a relayed node
  450. func FindRelay(node *models.Node) *models.Node {
  451. relay, err := GetNodeByID(node.RelayedBy)
  452. if err != nil {
  453. logger.Log(0, "FindRelay: "+err.Error())
  454. return nil
  455. }
  456. return &relay
  457. }
  458. // GetAllNodesAPI - get all nodes for api usage
  459. func GetAllNodesAPI(nodes []models.Node) []models.ApiNode {
  460. apiNodes := []models.ApiNode{}
  461. for i := range nodes {
  462. newApiNode := nodes[i].ConvertToAPINode()
  463. apiNodes = append(apiNodes, *newApiNode)
  464. }
  465. return apiNodes[:]
  466. }
  467. // DeleteExpiredNodes - goroutine which deletes nodes which are expired
  468. func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
  469. // Delete Expired Nodes Every Hour
  470. ticker := time.NewTicker(time.Hour)
  471. for {
  472. select {
  473. case <-ctx.Done():
  474. ticker.Stop()
  475. return
  476. case <-ticker.C:
  477. allnodes, err := GetAllNodes()
  478. if err != nil {
  479. slog.Error("failed to retrieve all nodes", "error", err.Error())
  480. return
  481. }
  482. for _, node := range allnodes {
  483. node := node
  484. if time.Now().After(node.ExpirationDateTime) {
  485. peerUpdate <- &node
  486. slog.Info("deleting expired node", "nodeid", node.ID.String())
  487. }
  488. }
  489. }
  490. }
  491. }
  492. // createNode - creates a node in database
  493. func createNode(node *models.Node) error {
  494. // lock because we need unique IPs and having it concurrent makes parallel calls result in same "unique" IPs
  495. addressLock.Lock()
  496. defer addressLock.Unlock()
  497. host, err := GetHost(node.HostID.String())
  498. if err != nil {
  499. return err
  500. }
  501. if !node.DNSOn {
  502. if servercfg.IsDNSMode() {
  503. node.DNSOn = true
  504. } else {
  505. node.DNSOn = false
  506. }
  507. }
  508. SetNodeDefaults(node, true)
  509. defaultACLVal := acls.Allowed
  510. parentNetwork, err := GetNetwork(node.Network)
  511. if err == nil {
  512. if parentNetwork.DefaultACL != "yes" {
  513. defaultACLVal = acls.NotAllowed
  514. }
  515. }
  516. if node.DefaultACL == "" {
  517. node.DefaultACL = "unset"
  518. }
  519. if node.Address.IP == nil {
  520. if parentNetwork.IsIPv4 == "yes" {
  521. if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil {
  522. return err
  523. }
  524. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  525. if err != nil {
  526. return err
  527. }
  528. node.Address.Mask = net.CIDRMask(cidr.Mask.Size())
  529. }
  530. } else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) {
  531. return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique")
  532. }
  533. if node.Address6.IP == nil {
  534. if parentNetwork.IsIPv6 == "yes" {
  535. if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil {
  536. return err
  537. }
  538. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6)
  539. if err != nil {
  540. return err
  541. }
  542. node.Address6.Mask = net.CIDRMask(cidr.Mask.Size())
  543. }
  544. } else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) {
  545. return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique")
  546. }
  547. node.ID = uuid.New()
  548. //Create a JWT for the node
  549. tokenString, _ := CreateJWT(node.ID.String(), host.MacAddress.String(), node.Network)
  550. if tokenString == "" {
  551. //logic.ReturnErrorResponse(w, r, errorResponse)
  552. return err
  553. }
  554. err = ValidateNode(node, false)
  555. if err != nil {
  556. return err
  557. }
  558. CheckZombies(node)
  559. nodebytes, err := json.Marshal(&node)
  560. if err != nil {
  561. return err
  562. }
  563. err = database.Insert(node.ID.String(), string(nodebytes), database.NODES_TABLE_NAME)
  564. if err != nil {
  565. return err
  566. }
  567. if servercfg.CacheEnabled() {
  568. storeNodeInCache(*node)
  569. }
  570. if _, ok := allocatedIpMap[node.Network]; ok {
  571. if node.Address.IP != nil {
  572. AddIpToAllocatedIpMap(node.Network, node.Address.IP)
  573. }
  574. if node.Address6.IP != nil {
  575. AddIpToAllocatedIpMap(node.Network, node.Address6.IP)
  576. }
  577. }
  578. _, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), defaultACLVal)
  579. if err != nil {
  580. logger.Log(1, "failed to create node ACL for node,", node.ID.String(), "err:", err.Error())
  581. return err
  582. }
  583. if err = UpdateProNodeACLs(node); err != nil {
  584. logger.Log(1, "failed to apply node level ACLs during creation of node", node.ID.String(), "-", err.Error())
  585. return err
  586. }
  587. if err = UpdateMetrics(node.ID.String(), &models.Metrics{Connectivity: make(map[string]models.Metric)}); err != nil {
  588. logger.Log(1, "failed to initialize metrics for node", node.ID.String(), err.Error())
  589. }
  590. SetNetworkNodesLastModified(node.Network)
  591. if servercfg.IsDNSMode() {
  592. err = SetDNS()
  593. }
  594. return err
  595. }
  596. // SortApiNodes - Sorts slice of ApiNodes by their ID alphabetically with numbers first
  597. func SortApiNodes(unsortedNodes []models.ApiNode) {
  598. sort.Slice(unsortedNodes, func(i, j int) bool {
  599. return unsortedNodes[i].ID < unsortedNodes[j].ID
  600. })
  601. }
  602. func ValidateParams(nodeid, netid string) (models.Node, error) {
  603. node, err := GetNodeByID(nodeid)
  604. if err != nil {
  605. slog.Error("error fetching node", "node", nodeid, "error", err.Error())
  606. return node, fmt.Errorf("error fetching node during parameter validation: %v", err)
  607. }
  608. if node.Network != netid {
  609. slog.Error("network url param does not match node id", "url nodeid", netid, "node", node.Network)
  610. return node, fmt.Errorf("network url param does not match node network")
  611. }
  612. return node, nil
  613. }
  614. func ValidateNodeIp(currentNode *models.Node, newNode *models.ApiNode) error {
  615. if currentNode.Address.IP != nil && currentNode.Address.String() != newNode.Address {
  616. newIp, _, _ := net.ParseCIDR(newNode.Address)
  617. ipAllocated := allocatedIpMap[currentNode.Network]
  618. if _, ok := ipAllocated[newIp.String()]; ok {
  619. return errors.New("ip specified is already allocated: " + newNode.Address)
  620. }
  621. }
  622. if currentNode.Address6.IP != nil && currentNode.Address6.String() != newNode.Address6 {
  623. newIp, _, _ := net.ParseCIDR(newNode.Address6)
  624. ipAllocated := allocatedIpMap[currentNode.Network]
  625. if _, ok := ipAllocated[newIp.String()]; ok {
  626. return errors.New("ip specified is already allocated: " + newNode.Address6)
  627. }
  628. }
  629. return nil
  630. }
  631. func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
  632. network, err := GetNetworkSettings(gateway.NetID)
  633. if err != nil {
  634. slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
  635. return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
  636. }
  637. ipv4Net := network.AddressRange
  638. ipv6Net := network.AddressRange6
  639. for _, v := range gateway.Ranges {
  640. if ipv4Net != "" {
  641. if ContainsCIDR(ipv4Net, v) {
  642. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
  643. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv4Net)
  644. }
  645. }
  646. if ipv6Net != "" {
  647. if ContainsCIDR(ipv6Net, v) {
  648. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv6Net)
  649. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv6Net)
  650. }
  651. }
  652. }
  653. return nil
  654. }
  655. func ContainsCIDR(net1, net2 string) bool {
  656. one, two := ipaddr.NewIPAddressString(net1),
  657. ipaddr.NewIPAddressString(net2)
  658. return one.Contains(two) || two.Contains(one)
  659. }
  660. // GetAllFailOvers - gets all the nodes that are failovers
  661. func GetAllFailOvers() ([]models.Node, error) {
  662. nodes, err := GetAllNodes()
  663. if err != nil {
  664. return nil, err
  665. }
  666. igs := make([]models.Node, 0)
  667. for _, node := range nodes {
  668. if node.IsFailOver {
  669. igs = append(igs, node)
  670. }
  671. }
  672. return igs, nil
  673. }
  674. func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
  675. tagNodesMap = make(map[models.TagID][]models.Node)
  676. nodes, _ := GetAllNodes()
  677. for _, nodeI := range nodes {
  678. if nodeI.Tags == nil {
  679. continue
  680. }
  681. for nodeTagID := range nodeI.Tags {
  682. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  683. }
  684. }
  685. return
  686. }
  687. func GetTagMapWithNodesByNetwork(netID models.NetworkID) (tagNodesMap map[models.TagID][]models.Node) {
  688. tagNodesMap = make(map[models.TagID][]models.Node)
  689. nodes, _ := GetNetworkNodes(netID.String())
  690. for _, nodeI := range nodes {
  691. if nodeI.Tags == nil {
  692. continue
  693. }
  694. for nodeTagID := range nodeI.Tags {
  695. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  696. }
  697. }
  698. return AddTagMapWithStaticNodes(netID, tagNodesMap)
  699. }
  700. func AddTagMapWithStaticNodes(netID models.NetworkID,
  701. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  702. extclients, err := GetNetworkExtClients(netID.String())
  703. if err != nil {
  704. return tagNodesMap
  705. }
  706. for _, extclient := range extclients {
  707. if extclient.Tags == nil || extclient.RemoteAccessClientID != "" {
  708. continue
  709. }
  710. for tagID := range extclient.Tags {
  711. tagNodesMap[tagID] = append(tagNodesMap[tagID], models.Node{
  712. IsStatic: true,
  713. StaticNode: extclient,
  714. })
  715. }
  716. }
  717. return tagNodesMap
  718. }
  719. func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
  720. nMap := make(map[string]models.Node)
  721. tag, err := GetTag(tagID)
  722. if err != nil {
  723. return nMap
  724. }
  725. nodes, _ := GetNetworkNodes(tag.Network.String())
  726. for _, nodeI := range nodes {
  727. if nodeI.Tags == nil {
  728. continue
  729. }
  730. if _, ok := nodeI.Tags[tagID]; ok {
  731. nMap[nodeI.ID.String()] = nodeI
  732. }
  733. }
  734. return AddStaticNodesWithTag(tag, nMap)
  735. }
  736. func AddStaticNodesWithTag(tag models.Tag, nMap map[string]models.Node) map[string]models.Node {
  737. extclients, err := GetNetworkExtClients(tag.Network.String())
  738. if err != nil {
  739. return nMap
  740. }
  741. for _, extclient := range extclients {
  742. if extclient.RemoteAccessClientID != "" {
  743. continue
  744. }
  745. if _, ok := extclient.Tags[tag.ID]; ok {
  746. nMap[extclient.ClientID] = models.Node{
  747. IsStatic: true,
  748. StaticNode: extclient,
  749. }
  750. }
  751. }
  752. return nMap
  753. }
  754. func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
  755. nMap := make(map[string]models.Node)
  756. tag, err := GetTag(tagID)
  757. if err != nil {
  758. return nMap
  759. }
  760. extclients, err := GetNetworkExtClients(tag.Network.String())
  761. if err != nil {
  762. return nMap
  763. }
  764. for _, extclient := range extclients {
  765. nMap[extclient.ClientID] = models.Node{
  766. IsStatic: true,
  767. StaticNode: extclient,
  768. }
  769. }
  770. return nMap
  771. }