nodes.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. package logic
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "maps"
  8. "net"
  9. "slices"
  10. "sort"
  11. "sync"
  12. "time"
  13. validator "github.com/go-playground/validator/v10"
  14. "github.com/google/uuid"
  15. "github.com/gravitl/netmaker/database"
  16. "github.com/gravitl/netmaker/logger"
  17. "github.com/gravitl/netmaker/logic/acls"
  18. "github.com/gravitl/netmaker/logic/acls/nodeacls"
  19. "github.com/gravitl/netmaker/models"
  20. "github.com/gravitl/netmaker/servercfg"
  21. "github.com/gravitl/netmaker/validation"
  22. "github.com/seancfoley/ipaddress-go/ipaddr"
  23. "golang.org/x/exp/slog"
  24. )
  25. var (
  26. nodeCacheMutex = &sync.RWMutex{}
  27. nodeNetworkCacheMutex = &sync.RWMutex{}
  28. nodesCacheMap = make(map[string]models.Node)
  29. nodesNetworkCacheMap = make(map[string]map[string]models.Node)
  30. )
  31. func getNodeFromCache(nodeID string) (node models.Node, ok bool) {
  32. nodeCacheMutex.RLock()
  33. node, ok = nodesCacheMap[nodeID]
  34. nodeCacheMutex.RUnlock()
  35. return
  36. }
  37. func getNodesFromCache() (nodes []models.Node) {
  38. nodeCacheMutex.RLock()
  39. nodes = slices.Collect(maps.Values(nodesCacheMap))
  40. nodeCacheMutex.RUnlock()
  41. return
  42. }
  43. func deleteNodeFromCache(nodeID string) {
  44. nodeCacheMutex.Lock()
  45. delete(nodesCacheMap, nodeID)
  46. nodeCacheMutex.Unlock()
  47. }
  48. func deleteNodeFromNetworkCache(nodeID string, network string) {
  49. nodeNetworkCacheMutex.Lock()
  50. delete(nodesNetworkCacheMap[network], nodeID)
  51. nodeNetworkCacheMutex.Unlock()
  52. }
  53. func storeNodeInNetworkCache(node models.Node, network string) {
  54. nodeNetworkCacheMutex.Lock()
  55. if nodesNetworkCacheMap[network] == nil {
  56. nodesNetworkCacheMap[network] = make(map[string]models.Node)
  57. }
  58. nodesNetworkCacheMap[network][node.ID.String()] = node
  59. nodeNetworkCacheMutex.Unlock()
  60. }
  61. func storeNodeInCache(node models.Node) {
  62. nodeCacheMutex.Lock()
  63. nodesCacheMap[node.ID.String()] = node
  64. nodeCacheMutex.Unlock()
  65. }
  66. func loadNodesIntoNetworkCache(nMap map[string]models.Node) {
  67. nodeNetworkCacheMutex.Lock()
  68. for _, v := range nMap {
  69. network := v.Network
  70. if nodesNetworkCacheMap[network] == nil {
  71. nodesNetworkCacheMap[network] = make(map[string]models.Node)
  72. }
  73. nodesNetworkCacheMap[network][v.ID.String()] = v
  74. }
  75. nodeNetworkCacheMutex.Unlock()
  76. }
  77. func loadNodesIntoCache(nMap map[string]models.Node) {
  78. nodeCacheMutex.Lock()
  79. nodesCacheMap = nMap
  80. nodeCacheMutex.Unlock()
  81. }
  82. func ClearNodeCache() {
  83. nodeCacheMutex.Lock()
  84. nodesCacheMap = make(map[string]models.Node)
  85. nodesNetworkCacheMap = make(map[string]map[string]models.Node)
  86. nodeCacheMutex.Unlock()
  87. }
  88. const (
  89. // RELAY_NODE_ERR - error to return if relay node is unfound
  90. RELAY_NODE_ERR = "could not find relay for node"
  91. // NodePurgeTime time to wait for node to response to a NODE_DELETE actions
  92. NodePurgeTime = time.Second * 10
  93. // NodePurgeCheckTime is how often to check nodes for Pending Delete
  94. NodePurgeCheckTime = time.Second * 30
  95. )
  96. // GetNetworkNodes - gets the nodes of a network
  97. func GetNetworkNodes(network string) ([]models.Node, error) {
  98. if networkNodes, ok := nodesNetworkCacheMap[network]; ok {
  99. nodeNetworkCacheMutex.Lock()
  100. defer nodeNetworkCacheMutex.Unlock()
  101. return slices.Collect(maps.Values(networkNodes)), nil
  102. }
  103. allnodes, err := GetAllNodes()
  104. if err != nil {
  105. return []models.Node{}, err
  106. }
  107. return GetNetworkNodesMemory(allnodes, network), nil
  108. }
  109. // GetHostNodes - fetches all nodes part of the host
  110. func GetHostNodes(host *models.Host) []models.Node {
  111. nodes := []models.Node{}
  112. for _, nodeID := range host.Nodes {
  113. node, err := GetNodeByID(nodeID)
  114. if err == nil {
  115. nodes = append(nodes, node)
  116. }
  117. }
  118. return nodes
  119. }
  120. // GetNetworkNodesMemory - gets all nodes belonging to a network from list in memory
  121. func GetNetworkNodesMemory(allNodes []models.Node, network string) []models.Node {
  122. if networkNodes, ok := nodesNetworkCacheMap[network]; ok {
  123. nodeNetworkCacheMutex.Lock()
  124. defer nodeNetworkCacheMutex.Unlock()
  125. return slices.Collect(maps.Values(networkNodes))
  126. }
  127. var nodes = make([]models.Node, 0, len(allNodes))
  128. for i := range allNodes {
  129. node := allNodes[i]
  130. if node.Network == network {
  131. nodes = append(nodes, node)
  132. }
  133. }
  134. return nodes
  135. }
  136. // UpdateNodeCheckin - updates the checkin time of a node
  137. func UpdateNodeCheckin(node *models.Node) error {
  138. node.SetLastCheckIn()
  139. data, err := json.Marshal(node)
  140. if err != nil {
  141. return err
  142. }
  143. err = database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
  144. if err != nil {
  145. return err
  146. }
  147. if servercfg.CacheEnabled() {
  148. storeNodeInCache(*node)
  149. storeNodeInNetworkCache(*node, node.Network)
  150. }
  151. return nil
  152. }
  153. // UpsertNode - updates node in the DB
  154. func UpsertNode(newNode *models.Node) error {
  155. newNode.SetLastModified()
  156. data, err := json.Marshal(newNode)
  157. if err != nil {
  158. return err
  159. }
  160. err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
  161. if err != nil {
  162. return err
  163. }
  164. if servercfg.CacheEnabled() {
  165. storeNodeInCache(*newNode)
  166. storeNodeInNetworkCache(*newNode, newNode.Network)
  167. }
  168. return nil
  169. }
  170. // UpdateNode - takes a node and updates another node with it's values
  171. func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
  172. if newNode.Address.IP.String() != currentNode.Address.IP.String() {
  173. if network, err := GetParentNetwork(newNode.Network); err == nil {
  174. if !IsAddressInCIDR(newNode.Address.IP, network.AddressRange) {
  175. return fmt.Errorf("invalid address provided; out of network range for node %s", newNode.ID)
  176. }
  177. }
  178. }
  179. nodeACLDelta := currentNode.DefaultACL != newNode.DefaultACL
  180. newNode.Fill(currentNode, servercfg.IsPro)
  181. // check for un-settable server values
  182. if err := ValidateNode(newNode, true); err != nil {
  183. return err
  184. }
  185. if newNode.ID == currentNode.ID {
  186. if nodeACLDelta {
  187. if err := UpdateProNodeACLs(newNode); err != nil {
  188. logger.Log(1, "failed to apply node level ACLs during creation of node", newNode.ID.String(), "-", err.Error())
  189. return err
  190. }
  191. }
  192. newNode.SetLastModified()
  193. if data, err := json.Marshal(newNode); err != nil {
  194. return err
  195. } else {
  196. err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
  197. if err != nil {
  198. return err
  199. }
  200. if servercfg.CacheEnabled() {
  201. storeNodeInCache(*newNode)
  202. storeNodeInNetworkCache(*newNode, newNode.Network)
  203. if _, ok := allocatedIpMap[newNode.Network]; ok {
  204. if newNode.Address.IP != nil && !newNode.Address.IP.Equal(currentNode.Address.IP) {
  205. AddIpToAllocatedIpMap(newNode.Network, newNode.Address.IP)
  206. RemoveIpFromAllocatedIpMap(currentNode.Network, currentNode.Address.IP.String())
  207. }
  208. if newNode.Address6.IP != nil && !newNode.Address6.IP.Equal(currentNode.Address6.IP) {
  209. AddIpToAllocatedIpMap(newNode.Network, newNode.Address6.IP)
  210. RemoveIpFromAllocatedIpMap(currentNode.Network, currentNode.Address6.IP.String())
  211. }
  212. }
  213. }
  214. return nil
  215. }
  216. }
  217. return fmt.Errorf("failed to update node %s, cannot change ID", currentNode.ID.String())
  218. }
  219. // DeleteNode - marks node for deletion (and adds to zombie list) if called by UI or deletes node if called by node
  220. func DeleteNode(node *models.Node, purge bool) error {
  221. alreadyDeleted := node.PendingDelete || node.Action == models.NODE_DELETE
  222. node.Action = models.NODE_DELETE
  223. //delete ext clients if node is ingress gw
  224. if node.IsIngressGateway {
  225. if err := DeleteGatewayExtClients(node.ID.String(), node.Network); err != nil {
  226. slog.Error("failed to delete ext clients", "nodeid", node.ID.String(), "error", err.Error())
  227. }
  228. }
  229. if node.IsRelayed {
  230. // cleanup node from relayednodes on relay node
  231. relayNode, err := GetNodeByID(node.RelayedBy)
  232. if err == nil {
  233. relayedNodes := []string{}
  234. for _, relayedNodeID := range relayNode.RelayedNodes {
  235. if relayedNodeID == node.ID.String() {
  236. continue
  237. }
  238. relayedNodes = append(relayedNodes, relayedNodeID)
  239. }
  240. relayNode.RelayedNodes = relayedNodes
  241. UpsertNode(&relayNode)
  242. }
  243. }
  244. if node.FailedOverBy != uuid.Nil {
  245. ResetFailedOverPeer(node)
  246. }
  247. if node.IsRelay {
  248. // unset all the relayed nodes
  249. SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
  250. }
  251. if node.InternetGwID != "" {
  252. inetNode, err := GetNodeByID(node.InternetGwID)
  253. if err == nil {
  254. clientNodeIDs := []string{}
  255. for _, inetNodeClientID := range inetNode.InetNodeReq.InetNodeClientIDs {
  256. if inetNodeClientID == node.ID.String() {
  257. continue
  258. }
  259. clientNodeIDs = append(clientNodeIDs, inetNodeClientID)
  260. }
  261. inetNode.InetNodeReq.InetNodeClientIDs = clientNodeIDs
  262. UpsertNode(&inetNode)
  263. }
  264. }
  265. if node.IsInternetGateway {
  266. UnsetInternetGw(node)
  267. }
  268. if !purge && !alreadyDeleted {
  269. newnode := *node
  270. newnode.PendingDelete = true
  271. if err := UpdateNode(node, &newnode); err != nil {
  272. return err
  273. }
  274. newZombie <- node.ID
  275. return nil
  276. }
  277. if alreadyDeleted {
  278. logger.Log(1, "forcibly deleting node", node.ID.String())
  279. }
  280. host, err := GetHost(node.HostID.String())
  281. if err != nil {
  282. logger.Log(1, "no host found for node", node.ID.String(), "deleting..")
  283. if delErr := DeleteNodeByID(node); delErr != nil {
  284. logger.Log(0, "failed to delete node", node.ID.String(), delErr.Error())
  285. }
  286. return err
  287. }
  288. if err := DissasociateNodeFromHost(node, host); err != nil {
  289. return err
  290. }
  291. return nil
  292. }
  293. // GetNodeByHostRef - gets the node by host id and network
  294. func GetNodeByHostRef(hostid, network string) (node models.Node, err error) {
  295. nodes, err := GetNetworkNodes(network)
  296. if err != nil {
  297. return models.Node{}, err
  298. }
  299. for _, node := range nodes {
  300. if node.HostID.String() == hostid && node.Network == network {
  301. return node, nil
  302. }
  303. }
  304. return models.Node{}, errors.New("node not found")
  305. }
  306. // DeleteNodeByID - deletes a node from database
  307. func DeleteNodeByID(node *models.Node) error {
  308. var err error
  309. var key = node.ID.String()
  310. if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
  311. if !database.IsEmptyRecord(err) {
  312. return err
  313. }
  314. }
  315. if servercfg.CacheEnabled() {
  316. deleteNodeFromCache(node.ID.String())
  317. deleteNodeFromNetworkCache(node.ID.String(), node.Network)
  318. }
  319. if servercfg.IsDNSMode() {
  320. SetDNS()
  321. }
  322. _, err = nodeacls.RemoveNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()))
  323. if err != nil {
  324. // ignoring for now, could hit a nil pointer if delete called twice
  325. logger.Log(2, "attempted to remove node ACL for node", node.ID.String())
  326. }
  327. // removeZombie <- node.ID
  328. if err = DeleteMetrics(node.ID.String()); err != nil {
  329. logger.Log(1, "unable to remove metrics from DB for node", node.ID.String(), err.Error())
  330. }
  331. //recycle ip address
  332. if node.Address.IP != nil {
  333. RemoveIpFromAllocatedIpMap(node.Network, node.Address.IP.String())
  334. }
  335. if node.Address6.IP != nil {
  336. RemoveIpFromAllocatedIpMap(node.Network, node.Address6.IP.String())
  337. }
  338. return nil
  339. }
  340. // IsNodeIDUnique - checks if node id is unique
  341. func IsNodeIDUnique(node *models.Node) (bool, error) {
  342. _, err := database.FetchRecord(database.NODES_TABLE_NAME, node.ID.String())
  343. return database.IsEmptyRecord(err), err
  344. }
  345. // ValidateNode - validates node values
  346. func ValidateNode(node *models.Node, isUpdate bool) error {
  347. v := validator.New()
  348. _ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
  349. if isUpdate {
  350. return true
  351. }
  352. isFieldUnique, _ := IsNodeIDUnique(node)
  353. return isFieldUnique
  354. })
  355. _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
  356. _, err := GetNetworkByNode(node)
  357. return err == nil
  358. })
  359. _ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool {
  360. return validation.CheckYesOrNoOrUnset(f1)
  361. })
  362. err := v.Struct(node)
  363. return err
  364. }
  365. // GetAllNodes - returns all nodes in the DB
  366. func GetAllNodes() ([]models.Node, error) {
  367. var nodes []models.Node
  368. if servercfg.CacheEnabled() {
  369. nodes = getNodesFromCache()
  370. if len(nodes) != 0 {
  371. return nodes, nil
  372. }
  373. }
  374. nodesMap := make(map[string]models.Node)
  375. if servercfg.CacheEnabled() {
  376. defer loadNodesIntoCache(nodesMap)
  377. defer loadNodesIntoNetworkCache(nodesMap)
  378. }
  379. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  380. if err != nil {
  381. if database.IsEmptyRecord(err) {
  382. return []models.Node{}, nil
  383. }
  384. return []models.Node{}, err
  385. }
  386. for _, value := range collection {
  387. var node models.Node
  388. // ignore legacy nodes in database
  389. if err := json.Unmarshal([]byte(value), &node); err != nil {
  390. logger.Log(3, "legacy node detected: ", err.Error())
  391. continue
  392. }
  393. // add node to our array
  394. nodes = append(nodes, node)
  395. nodesMap[node.ID.String()] = node
  396. }
  397. return nodes, nil
  398. }
  399. func AddStaticNodestoList(nodes []models.Node) []models.Node {
  400. netMap := make(map[string]struct{})
  401. for _, node := range nodes {
  402. if _, ok := netMap[node.Network]; ok {
  403. continue
  404. }
  405. if node.IsIngressGateway {
  406. nodes = append(nodes, GetStaticNodesByNetwork(models.NetworkID(node.Network), false)...)
  407. netMap[node.Network] = struct{}{}
  408. }
  409. }
  410. return nodes
  411. }
  412. func AddStatusToNodes(nodes []models.Node) (nodesWithStatus []models.Node) {
  413. aclDefaultPolicyStatusMap := make(map[string]bool)
  414. for _, node := range nodes {
  415. if _, ok := aclDefaultPolicyStatusMap[node.Network]; !ok {
  416. // check default policy if all allowed return true
  417. defaultPolicy, _ := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
  418. aclDefaultPolicyStatusMap[node.Network] = defaultPolicy.Enabled
  419. }
  420. GetNodeStatus(&node, aclDefaultPolicyStatusMap[node.Network])
  421. nodesWithStatus = append(nodesWithStatus, node)
  422. }
  423. return
  424. }
  425. // GetNetworkByNode - gets the network model from a node
  426. func GetNetworkByNode(node *models.Node) (models.Network, error) {
  427. var network = models.Network{}
  428. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, node.Network)
  429. if err != nil {
  430. return network, err
  431. }
  432. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  433. return models.Network{}, err
  434. }
  435. return network, nil
  436. }
  437. // SetNodeDefaults - sets the defaults of a node to avoid empty fields
  438. func SetNodeDefaults(node *models.Node, resetConnected bool) {
  439. parentNetwork, _ := GetNetworkByNode(node)
  440. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  441. if err == nil {
  442. node.NetworkRange = *cidr
  443. }
  444. _, cidr, err = net.ParseCIDR(parentNetwork.AddressRange6)
  445. if err == nil {
  446. node.NetworkRange6 = *cidr
  447. }
  448. if node.DefaultACL == "" {
  449. node.DefaultACL = parentNetwork.DefaultACL
  450. }
  451. if node.FailOverPeers == nil {
  452. node.FailOverPeers = make(map[string]struct{})
  453. }
  454. node.SetLastModified()
  455. node.SetLastCheckIn()
  456. if resetConnected {
  457. node.SetDefaultConnected()
  458. }
  459. node.SetExpirationDateTime()
  460. if node.Tags == nil {
  461. node.Tags = make(map[models.TagID]struct{})
  462. }
  463. }
  464. // GetRecordKey - get record key
  465. // depricated
  466. func GetRecordKey(id string, network string) (string, error) {
  467. if id == "" || network == "" {
  468. return "", errors.New("unable to get record key")
  469. }
  470. return id + "###" + network, nil
  471. }
  472. func GetNodeByID(uuid string) (models.Node, error) {
  473. if servercfg.CacheEnabled() {
  474. if node, ok := getNodeFromCache(uuid); ok {
  475. return node, nil
  476. }
  477. }
  478. var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
  479. if err != nil {
  480. return models.Node{}, err
  481. }
  482. var node models.Node
  483. if err = json.Unmarshal([]byte(record), &node); err != nil {
  484. return models.Node{}, err
  485. }
  486. if servercfg.CacheEnabled() {
  487. storeNodeInCache(node)
  488. storeNodeInNetworkCache(node, node.Network)
  489. }
  490. return node, nil
  491. }
  492. // GetDeletedNodeByID - get a deleted node
  493. func GetDeletedNodeByID(uuid string) (models.Node, error) {
  494. var node models.Node
  495. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, uuid)
  496. if err != nil {
  497. return models.Node{}, err
  498. }
  499. if err = json.Unmarshal([]byte(record), &node); err != nil {
  500. return models.Node{}, err
  501. }
  502. SetNodeDefaults(&node, true)
  503. return node, nil
  504. }
  505. // FindRelay - returns the node that is the relay for a relayed node
  506. func FindRelay(node *models.Node) *models.Node {
  507. relay, err := GetNodeByID(node.RelayedBy)
  508. if err != nil {
  509. logger.Log(0, "FindRelay: "+err.Error())
  510. return nil
  511. }
  512. return &relay
  513. }
  514. // GetAllNodesAPI - get all nodes for api usage
  515. func GetAllNodesAPI(nodes []models.Node) []models.ApiNode {
  516. apiNodes := []models.ApiNode{}
  517. for i := range nodes {
  518. newApiNode := nodes[i].ConvertToAPINode()
  519. apiNodes = append(apiNodes, *newApiNode)
  520. }
  521. return apiNodes[:]
  522. }
  523. // DeleteExpiredNodes - goroutine which deletes nodes which are expired
  524. func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
  525. // Delete Expired Nodes Every Hour
  526. ticker := time.NewTicker(time.Hour)
  527. for {
  528. select {
  529. case <-ctx.Done():
  530. ticker.Stop()
  531. return
  532. case <-ticker.C:
  533. allnodes, err := GetAllNodes()
  534. if err != nil {
  535. slog.Error("failed to retrieve all nodes", "error", err.Error())
  536. return
  537. }
  538. for _, node := range allnodes {
  539. node := node
  540. if time.Now().After(node.ExpirationDateTime) {
  541. peerUpdate <- &node
  542. slog.Info("deleting expired node", "nodeid", node.ID.String())
  543. }
  544. }
  545. }
  546. }
  547. }
  548. // createNode - creates a node in database
  549. func createNode(node *models.Node) error {
  550. // lock because we need unique IPs and having it concurrent makes parallel calls result in same "unique" IPs
  551. addressLock.Lock()
  552. defer addressLock.Unlock()
  553. host, err := GetHost(node.HostID.String())
  554. if err != nil {
  555. return err
  556. }
  557. if !node.DNSOn {
  558. if servercfg.IsDNSMode() {
  559. node.DNSOn = true
  560. } else {
  561. node.DNSOn = false
  562. }
  563. }
  564. SetNodeDefaults(node, true)
  565. defaultACLVal := acls.Allowed
  566. parentNetwork, err := GetNetwork(node.Network)
  567. if err == nil {
  568. if parentNetwork.DefaultACL != "yes" {
  569. defaultACLVal = acls.NotAllowed
  570. }
  571. }
  572. if node.DefaultACL == "" {
  573. node.DefaultACL = "unset"
  574. }
  575. if node.Address.IP == nil {
  576. if parentNetwork.IsIPv4 == "yes" {
  577. if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil {
  578. return err
  579. }
  580. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  581. if err != nil {
  582. return err
  583. }
  584. node.Address.Mask = net.CIDRMask(cidr.Mask.Size())
  585. }
  586. } else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) {
  587. return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique")
  588. }
  589. if node.Address6.IP == nil {
  590. if parentNetwork.IsIPv6 == "yes" {
  591. if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil {
  592. return err
  593. }
  594. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6)
  595. if err != nil {
  596. return err
  597. }
  598. node.Address6.Mask = net.CIDRMask(cidr.Mask.Size())
  599. }
  600. } else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) {
  601. return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique")
  602. }
  603. node.ID = uuid.New()
  604. //Create a JWT for the node
  605. tokenString, _ := CreateJWT(node.ID.String(), host.MacAddress.String(), node.Network)
  606. if tokenString == "" {
  607. //logic.ReturnErrorResponse(w, r, errorResponse)
  608. return err
  609. }
  610. err = ValidateNode(node, false)
  611. if err != nil {
  612. return err
  613. }
  614. CheckZombies(node)
  615. nodebytes, err := json.Marshal(&node)
  616. if err != nil {
  617. return err
  618. }
  619. err = database.Insert(node.ID.String(), string(nodebytes), database.NODES_TABLE_NAME)
  620. if err != nil {
  621. return err
  622. }
  623. if servercfg.CacheEnabled() {
  624. storeNodeInCache(*node)
  625. storeNodeInNetworkCache(*node, node.Network)
  626. }
  627. if _, ok := allocatedIpMap[node.Network]; ok {
  628. if node.Address.IP != nil {
  629. AddIpToAllocatedIpMap(node.Network, node.Address.IP)
  630. }
  631. if node.Address6.IP != nil {
  632. AddIpToAllocatedIpMap(node.Network, node.Address6.IP)
  633. }
  634. }
  635. _, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), defaultACLVal)
  636. if err != nil {
  637. logger.Log(1, "failed to create node ACL for node,", node.ID.String(), "err:", err.Error())
  638. return err
  639. }
  640. if err = UpdateProNodeACLs(node); err != nil {
  641. logger.Log(1, "failed to apply node level ACLs during creation of node", node.ID.String(), "-", err.Error())
  642. return err
  643. }
  644. if err = UpdateMetrics(node.ID.String(), &models.Metrics{Connectivity: make(map[string]models.Metric)}); err != nil {
  645. logger.Log(1, "failed to initialize metrics for node", node.ID.String(), err.Error())
  646. }
  647. SetNetworkNodesLastModified(node.Network)
  648. if servercfg.IsDNSMode() {
  649. err = SetDNS()
  650. }
  651. return err
  652. }
  653. // SortApiNodes - Sorts slice of ApiNodes by their ID alphabetically with numbers first
  654. func SortApiNodes(unsortedNodes []models.ApiNode) {
  655. sort.Slice(unsortedNodes, func(i, j int) bool {
  656. return unsortedNodes[i].ID < unsortedNodes[j].ID
  657. })
  658. }
  659. func ValidateParams(nodeid, netid string) (models.Node, error) {
  660. node, err := GetNodeByID(nodeid)
  661. if err != nil {
  662. slog.Error("error fetching node", "node", nodeid, "error", err.Error())
  663. return node, fmt.Errorf("error fetching node during parameter validation: %v", err)
  664. }
  665. if node.Network != netid {
  666. slog.Error("network url param does not match node id", "url nodeid", netid, "node", node.Network)
  667. return node, fmt.Errorf("network url param does not match node network")
  668. }
  669. return node, nil
  670. }
  671. func ValidateNodeIp(currentNode *models.Node, newNode *models.ApiNode) error {
  672. if currentNode.Address.IP != nil && currentNode.Address.String() != newNode.Address {
  673. newIp, _, _ := net.ParseCIDR(newNode.Address)
  674. ipAllocated := allocatedIpMap[currentNode.Network]
  675. if _, ok := ipAllocated[newIp.String()]; ok {
  676. return errors.New("ip specified is already allocated: " + newNode.Address)
  677. }
  678. }
  679. if currentNode.Address6.IP != nil && currentNode.Address6.String() != newNode.Address6 {
  680. newIp, _, _ := net.ParseCIDR(newNode.Address6)
  681. ipAllocated := allocatedIpMap[currentNode.Network]
  682. if _, ok := ipAllocated[newIp.String()]; ok {
  683. return errors.New("ip specified is already allocated: " + newNode.Address6)
  684. }
  685. }
  686. return nil
  687. }
  688. func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
  689. network, err := GetNetworkSettings(gateway.NetID)
  690. if err != nil {
  691. slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
  692. return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
  693. }
  694. ipv4Net := network.AddressRange
  695. ipv6Net := network.AddressRange6
  696. for _, v := range gateway.Ranges {
  697. if ipv4Net != "" {
  698. if ContainsCIDR(ipv4Net, v) {
  699. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
  700. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv4Net)
  701. }
  702. }
  703. if ipv6Net != "" {
  704. if ContainsCIDR(ipv6Net, v) {
  705. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv6Net)
  706. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv6Net)
  707. }
  708. }
  709. }
  710. return nil
  711. }
  712. func ContainsCIDR(net1, net2 string) bool {
  713. one, two := ipaddr.NewIPAddressString(net1),
  714. ipaddr.NewIPAddressString(net2)
  715. return one.Contains(two) || two.Contains(one)
  716. }
  717. // GetAllFailOvers - gets all the nodes that are failovers
  718. func GetAllFailOvers() ([]models.Node, error) {
  719. nodes, err := GetAllNodes()
  720. if err != nil {
  721. return nil, err
  722. }
  723. igs := make([]models.Node, 0)
  724. for _, node := range nodes {
  725. if node.IsFailOver {
  726. igs = append(igs, node)
  727. }
  728. }
  729. return igs, nil
  730. }
  731. func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
  732. tagNodesMap = make(map[models.TagID][]models.Node)
  733. nodes, _ := GetAllNodes()
  734. for _, nodeI := range nodes {
  735. if nodeI.Tags == nil {
  736. continue
  737. }
  738. for nodeTagID := range nodeI.Tags {
  739. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  740. }
  741. }
  742. return
  743. }
  744. func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (tagNodesMap map[models.TagID][]models.Node) {
  745. tagNodesMap = make(map[models.TagID][]models.Node)
  746. nodes, _ := GetNetworkNodes(netID.String())
  747. for _, nodeI := range nodes {
  748. if nodeI.Tags == nil {
  749. continue
  750. }
  751. for nodeTagID := range nodeI.Tags {
  752. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  753. }
  754. }
  755. tagNodesMap["*"] = nodes
  756. if !withStaticNodes {
  757. return
  758. }
  759. return AddTagMapWithStaticNodes(netID, tagNodesMap)
  760. }
  761. func AddTagMapWithStaticNodes(netID models.NetworkID,
  762. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  763. extclients, err := GetNetworkExtClients(netID.String())
  764. if err != nil {
  765. return tagNodesMap
  766. }
  767. for _, extclient := range extclients {
  768. if extclient.Tags == nil || extclient.RemoteAccessClientID != "" {
  769. continue
  770. }
  771. for tagID := range extclient.Tags {
  772. tagNodesMap[tagID] = append(tagNodesMap[tagID], models.Node{
  773. IsStatic: true,
  774. StaticNode: extclient,
  775. })
  776. tagNodesMap["*"] = append(tagNodesMap["*"], models.Node{
  777. IsStatic: true,
  778. StaticNode: extclient,
  779. })
  780. }
  781. }
  782. return tagNodesMap
  783. }
  784. func AddTagMapWithStaticNodesWithUsers(netID models.NetworkID,
  785. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  786. extclients, err := GetNetworkExtClients(netID.String())
  787. if err != nil {
  788. return tagNodesMap
  789. }
  790. for _, extclient := range extclients {
  791. if extclient.Tags == nil {
  792. continue
  793. }
  794. for tagID := range extclient.Tags {
  795. tagNodesMap[tagID] = append(tagNodesMap[tagID], models.Node{
  796. IsStatic: true,
  797. StaticNode: extclient,
  798. })
  799. }
  800. }
  801. return tagNodesMap
  802. }
  803. func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
  804. nMap := make(map[string]models.Node)
  805. tag, err := GetTag(tagID)
  806. if err != nil {
  807. return nMap
  808. }
  809. nodes, _ := GetNetworkNodes(tag.Network.String())
  810. for _, nodeI := range nodes {
  811. if nodeI.Tags == nil {
  812. continue
  813. }
  814. if _, ok := nodeI.Tags[tagID]; ok {
  815. nMap[nodeI.ID.String()] = nodeI
  816. }
  817. }
  818. return AddStaticNodesWithTag(tag, nMap)
  819. }
  820. func AddStaticNodesWithTag(tag models.Tag, nMap map[string]models.Node) map[string]models.Node {
  821. extclients, err := GetNetworkExtClients(tag.Network.String())
  822. if err != nil {
  823. return nMap
  824. }
  825. for _, extclient := range extclients {
  826. if extclient.RemoteAccessClientID != "" {
  827. continue
  828. }
  829. if _, ok := extclient.Tags[tag.ID]; ok {
  830. nMap[extclient.ClientID] = models.Node{
  831. IsStatic: true,
  832. StaticNode: extclient,
  833. }
  834. }
  835. }
  836. return nMap
  837. }
  838. func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
  839. nMap := make(map[string]models.Node)
  840. tag, err := GetTag(tagID)
  841. if err != nil {
  842. return nMap
  843. }
  844. extclients, err := GetNetworkExtClients(tag.Network.String())
  845. if err != nil {
  846. return nMap
  847. }
  848. for _, extclient := range extclients {
  849. nMap[extclient.ClientID] = models.Node{
  850. IsStatic: true,
  851. StaticNode: extclient,
  852. }
  853. }
  854. return nMap
  855. }