nodes.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  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. go RemoveNodeFromAclPolicy(*node)
  292. return nil
  293. }
  294. // GetNodeByHostRef - gets the node by host id and network
  295. func GetNodeByHostRef(hostid, network string) (node models.Node, err error) {
  296. nodes, err := GetNetworkNodes(network)
  297. if err != nil {
  298. return models.Node{}, err
  299. }
  300. for _, node := range nodes {
  301. if node.HostID.String() == hostid && node.Network == network {
  302. return node, nil
  303. }
  304. }
  305. return models.Node{}, errors.New("node not found")
  306. }
  307. // DeleteNodeByID - deletes a node from database
  308. func DeleteNodeByID(node *models.Node) error {
  309. var err error
  310. var key = node.ID.String()
  311. if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
  312. if !database.IsEmptyRecord(err) {
  313. return err
  314. }
  315. }
  316. if servercfg.CacheEnabled() {
  317. deleteNodeFromCache(node.ID.String())
  318. deleteNodeFromNetworkCache(node.ID.String(), node.Network)
  319. }
  320. if servercfg.IsDNSMode() {
  321. SetDNS()
  322. }
  323. _, err = nodeacls.RemoveNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()))
  324. if err != nil {
  325. // ignoring for now, could hit a nil pointer if delete called twice
  326. logger.Log(2, "attempted to remove node ACL for node", node.ID.String())
  327. }
  328. // removeZombie <- node.ID
  329. if err = DeleteMetrics(node.ID.String()); err != nil {
  330. logger.Log(1, "unable to remove metrics from DB for node", node.ID.String(), err.Error())
  331. }
  332. //recycle ip address
  333. if node.Address.IP != nil {
  334. RemoveIpFromAllocatedIpMap(node.Network, node.Address.IP.String())
  335. }
  336. if node.Address6.IP != nil {
  337. RemoveIpFromAllocatedIpMap(node.Network, node.Address6.IP.String())
  338. }
  339. return nil
  340. }
  341. // IsNodeIDUnique - checks if node id is unique
  342. func IsNodeIDUnique(node *models.Node) (bool, error) {
  343. _, err := database.FetchRecord(database.NODES_TABLE_NAME, node.ID.String())
  344. return database.IsEmptyRecord(err), err
  345. }
  346. // ValidateNode - validates node values
  347. func ValidateNode(node *models.Node, isUpdate bool) error {
  348. v := validator.New()
  349. _ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
  350. if isUpdate {
  351. return true
  352. }
  353. isFieldUnique, _ := IsNodeIDUnique(node)
  354. return isFieldUnique
  355. })
  356. _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
  357. _, err := GetNetworkByNode(node)
  358. return err == nil
  359. })
  360. _ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool {
  361. return validation.CheckYesOrNoOrUnset(f1)
  362. })
  363. err := v.Struct(node)
  364. return err
  365. }
  366. // GetAllNodes - returns all nodes in the DB
  367. func GetAllNodes() ([]models.Node, error) {
  368. var nodes []models.Node
  369. if servercfg.CacheEnabled() {
  370. nodes = getNodesFromCache()
  371. if len(nodes) != 0 {
  372. return nodes, nil
  373. }
  374. }
  375. nodesMap := make(map[string]models.Node)
  376. if servercfg.CacheEnabled() {
  377. defer loadNodesIntoCache(nodesMap)
  378. defer loadNodesIntoNetworkCache(nodesMap)
  379. }
  380. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  381. if err != nil {
  382. if database.IsEmptyRecord(err) {
  383. return []models.Node{}, nil
  384. }
  385. return []models.Node{}, err
  386. }
  387. for _, value := range collection {
  388. var node models.Node
  389. // ignore legacy nodes in database
  390. if err := json.Unmarshal([]byte(value), &node); err != nil {
  391. logger.Log(3, "legacy node detected: ", err.Error())
  392. continue
  393. }
  394. // add node to our array
  395. nodes = append(nodes, node)
  396. nodesMap[node.ID.String()] = node
  397. }
  398. return nodes, nil
  399. }
  400. func AddStaticNodestoList(nodes []models.Node) []models.Node {
  401. netMap := make(map[string]struct{})
  402. for _, node := range nodes {
  403. if _, ok := netMap[node.Network]; ok {
  404. continue
  405. }
  406. if node.IsIngressGateway {
  407. nodes = append(nodes, GetStaticNodesByNetwork(models.NetworkID(node.Network), false)...)
  408. netMap[node.Network] = struct{}{}
  409. }
  410. }
  411. return nodes
  412. }
  413. func AddStatusToNodes(nodes []models.Node) (nodesWithStatus []models.Node) {
  414. aclDefaultPolicyStatusMap := make(map[string]bool)
  415. for _, node := range nodes {
  416. if _, ok := aclDefaultPolicyStatusMap[node.Network]; !ok {
  417. // check default policy if all allowed return true
  418. defaultPolicy, _ := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
  419. aclDefaultPolicyStatusMap[node.Network] = defaultPolicy.Enabled
  420. }
  421. GetNodeStatus(&node, aclDefaultPolicyStatusMap[node.Network])
  422. nodesWithStatus = append(nodesWithStatus, node)
  423. }
  424. return
  425. }
  426. // GetNetworkByNode - gets the network model from a node
  427. func GetNetworkByNode(node *models.Node) (models.Network, error) {
  428. var network = models.Network{}
  429. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, node.Network)
  430. if err != nil {
  431. return network, err
  432. }
  433. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  434. return models.Network{}, err
  435. }
  436. return network, nil
  437. }
  438. // SetNodeDefaults - sets the defaults of a node to avoid empty fields
  439. func SetNodeDefaults(node *models.Node, resetConnected bool) {
  440. parentNetwork, _ := GetNetworkByNode(node)
  441. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  442. if err == nil {
  443. node.NetworkRange = *cidr
  444. }
  445. _, cidr, err = net.ParseCIDR(parentNetwork.AddressRange6)
  446. if err == nil {
  447. node.NetworkRange6 = *cidr
  448. }
  449. if node.DefaultACL == "" {
  450. node.DefaultACL = parentNetwork.DefaultACL
  451. }
  452. if node.FailOverPeers == nil {
  453. node.FailOverPeers = make(map[string]struct{})
  454. }
  455. node.SetLastModified()
  456. node.SetLastCheckIn()
  457. if resetConnected {
  458. node.SetDefaultConnected()
  459. }
  460. node.SetExpirationDateTime()
  461. if node.Tags == nil {
  462. node.Tags = make(map[models.TagID]struct{})
  463. }
  464. }
  465. // GetRecordKey - get record key
  466. // depricated
  467. func GetRecordKey(id string, network string) (string, error) {
  468. if id == "" || network == "" {
  469. return "", errors.New("unable to get record key")
  470. }
  471. return id + "###" + network, nil
  472. }
  473. func GetNodeByID(uuid string) (models.Node, error) {
  474. if servercfg.CacheEnabled() {
  475. if node, ok := getNodeFromCache(uuid); ok {
  476. return node, nil
  477. }
  478. }
  479. var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
  480. if err != nil {
  481. return models.Node{}, err
  482. }
  483. var node models.Node
  484. if err = json.Unmarshal([]byte(record), &node); err != nil {
  485. return models.Node{}, err
  486. }
  487. if servercfg.CacheEnabled() {
  488. storeNodeInCache(node)
  489. storeNodeInNetworkCache(node, node.Network)
  490. }
  491. return node, nil
  492. }
  493. // GetDeletedNodeByID - get a deleted node
  494. func GetDeletedNodeByID(uuid string) (models.Node, error) {
  495. var node models.Node
  496. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, uuid)
  497. if err != nil {
  498. return models.Node{}, err
  499. }
  500. if err = json.Unmarshal([]byte(record), &node); err != nil {
  501. return models.Node{}, err
  502. }
  503. SetNodeDefaults(&node, true)
  504. return node, nil
  505. }
  506. // FindRelay - returns the node that is the relay for a relayed node
  507. func FindRelay(node *models.Node) *models.Node {
  508. relay, err := GetNodeByID(node.RelayedBy)
  509. if err != nil {
  510. logger.Log(0, "FindRelay: "+err.Error())
  511. return nil
  512. }
  513. return &relay
  514. }
  515. // GetAllNodesAPI - get all nodes for api usage
  516. func GetAllNodesAPI(nodes []models.Node) []models.ApiNode {
  517. apiNodes := []models.ApiNode{}
  518. for i := range nodes {
  519. newApiNode := nodes[i].ConvertToAPINode()
  520. apiNodes = append(apiNodes, *newApiNode)
  521. }
  522. return apiNodes[:]
  523. }
  524. // DeleteExpiredNodes - goroutine which deletes nodes which are expired
  525. func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
  526. // Delete Expired Nodes Every Hour
  527. ticker := time.NewTicker(time.Hour)
  528. for {
  529. select {
  530. case <-ctx.Done():
  531. ticker.Stop()
  532. return
  533. case <-ticker.C:
  534. allnodes, err := GetAllNodes()
  535. if err != nil {
  536. slog.Error("failed to retrieve all nodes", "error", err.Error())
  537. return
  538. }
  539. for _, node := range allnodes {
  540. node := node
  541. if time.Now().After(node.ExpirationDateTime) {
  542. peerUpdate <- &node
  543. slog.Info("deleting expired node", "nodeid", node.ID.String())
  544. }
  545. }
  546. }
  547. }
  548. }
  549. // createNode - creates a node in database
  550. func createNode(node *models.Node) error {
  551. // lock because we need unique IPs and having it concurrent makes parallel calls result in same "unique" IPs
  552. addressLock.Lock()
  553. defer addressLock.Unlock()
  554. host, err := GetHost(node.HostID.String())
  555. if err != nil {
  556. return err
  557. }
  558. if !node.DNSOn {
  559. if servercfg.IsDNSMode() {
  560. node.DNSOn = true
  561. } else {
  562. node.DNSOn = false
  563. }
  564. }
  565. SetNodeDefaults(node, true)
  566. defaultACLVal := acls.Allowed
  567. parentNetwork, err := GetNetwork(node.Network)
  568. if err == nil {
  569. if parentNetwork.DefaultACL != "yes" {
  570. defaultACLVal = acls.NotAllowed
  571. }
  572. }
  573. if node.DefaultACL == "" {
  574. node.DefaultACL = "unset"
  575. }
  576. if node.Address.IP == nil {
  577. if parentNetwork.IsIPv4 == "yes" {
  578. if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil {
  579. return err
  580. }
  581. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  582. if err != nil {
  583. return err
  584. }
  585. node.Address.Mask = net.CIDRMask(cidr.Mask.Size())
  586. }
  587. } else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) {
  588. return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique")
  589. }
  590. if node.Address6.IP == nil {
  591. if parentNetwork.IsIPv6 == "yes" {
  592. if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil {
  593. return err
  594. }
  595. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6)
  596. if err != nil {
  597. return err
  598. }
  599. node.Address6.Mask = net.CIDRMask(cidr.Mask.Size())
  600. }
  601. } else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) {
  602. return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique")
  603. }
  604. node.ID = uuid.New()
  605. //Create a JWT for the node
  606. tokenString, _ := CreateJWT(node.ID.String(), host.MacAddress.String(), node.Network)
  607. if tokenString == "" {
  608. //logic.ReturnErrorResponse(w, r, errorResponse)
  609. return err
  610. }
  611. err = ValidateNode(node, false)
  612. if err != nil {
  613. return err
  614. }
  615. CheckZombies(node)
  616. nodebytes, err := json.Marshal(&node)
  617. if err != nil {
  618. return err
  619. }
  620. err = database.Insert(node.ID.String(), string(nodebytes), database.NODES_TABLE_NAME)
  621. if err != nil {
  622. return err
  623. }
  624. if servercfg.CacheEnabled() {
  625. storeNodeInCache(*node)
  626. storeNodeInNetworkCache(*node, node.Network)
  627. }
  628. if _, ok := allocatedIpMap[node.Network]; ok {
  629. if node.Address.IP != nil {
  630. AddIpToAllocatedIpMap(node.Network, node.Address.IP)
  631. }
  632. if node.Address6.IP != nil {
  633. AddIpToAllocatedIpMap(node.Network, node.Address6.IP)
  634. }
  635. }
  636. _, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), defaultACLVal)
  637. if err != nil {
  638. logger.Log(1, "failed to create node ACL for node,", node.ID.String(), "err:", err.Error())
  639. return err
  640. }
  641. if err = UpdateProNodeACLs(node); err != nil {
  642. logger.Log(1, "failed to apply node level ACLs during creation of node", node.ID.String(), "-", err.Error())
  643. return err
  644. }
  645. if err = UpdateMetrics(node.ID.String(), &models.Metrics{Connectivity: make(map[string]models.Metric)}); err != nil {
  646. logger.Log(1, "failed to initialize metrics for node", node.ID.String(), err.Error())
  647. }
  648. SetNetworkNodesLastModified(node.Network)
  649. if servercfg.IsDNSMode() {
  650. err = SetDNS()
  651. }
  652. return err
  653. }
  654. // SortApiNodes - Sorts slice of ApiNodes by their ID alphabetically with numbers first
  655. func SortApiNodes(unsortedNodes []models.ApiNode) {
  656. sort.Slice(unsortedNodes, func(i, j int) bool {
  657. return unsortedNodes[i].ID < unsortedNodes[j].ID
  658. })
  659. }
  660. func ValidateParams(nodeid, netid string) (models.Node, error) {
  661. node, err := GetNodeByID(nodeid)
  662. if err != nil {
  663. slog.Error("error fetching node", "node", nodeid, "error", err.Error())
  664. return node, fmt.Errorf("error fetching node during parameter validation: %v", err)
  665. }
  666. if node.Network != netid {
  667. slog.Error("network url param does not match node id", "url nodeid", netid, "node", node.Network)
  668. return node, fmt.Errorf("network url param does not match node network")
  669. }
  670. return node, nil
  671. }
  672. func ValidateNodeIp(currentNode *models.Node, newNode *models.ApiNode) error {
  673. if currentNode.Address.IP != nil && currentNode.Address.String() != newNode.Address {
  674. newIp, _, _ := net.ParseCIDR(newNode.Address)
  675. ipAllocated := allocatedIpMap[currentNode.Network]
  676. if _, ok := ipAllocated[newIp.String()]; ok {
  677. return errors.New("ip specified is already allocated: " + newNode.Address)
  678. }
  679. }
  680. if currentNode.Address6.IP != nil && currentNode.Address6.String() != newNode.Address6 {
  681. newIp, _, _ := net.ParseCIDR(newNode.Address6)
  682. ipAllocated := allocatedIpMap[currentNode.Network]
  683. if _, ok := ipAllocated[newIp.String()]; ok {
  684. return errors.New("ip specified is already allocated: " + newNode.Address6)
  685. }
  686. }
  687. return nil
  688. }
  689. func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
  690. network, err := GetNetworkSettings(gateway.NetID)
  691. if err != nil {
  692. slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
  693. return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
  694. }
  695. ipv4Net := network.AddressRange
  696. ipv6Net := network.AddressRange6
  697. for _, v := range gateway.Ranges {
  698. if ipv4Net != "" {
  699. if ContainsCIDR(ipv4Net, v) {
  700. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
  701. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv4Net)
  702. }
  703. }
  704. if ipv6Net != "" {
  705. if ContainsCIDR(ipv6Net, v) {
  706. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv6Net)
  707. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv6Net)
  708. }
  709. }
  710. }
  711. return nil
  712. }
  713. func ContainsCIDR(net1, net2 string) bool {
  714. one, two := ipaddr.NewIPAddressString(net1),
  715. ipaddr.NewIPAddressString(net2)
  716. return one.Contains(two) || two.Contains(one)
  717. }
  718. // GetAllFailOvers - gets all the nodes that are failovers
  719. func GetAllFailOvers() ([]models.Node, error) {
  720. nodes, err := GetAllNodes()
  721. if err != nil {
  722. return nil, err
  723. }
  724. igs := make([]models.Node, 0)
  725. for _, node := range nodes {
  726. if node.IsFailOver {
  727. igs = append(igs, node)
  728. }
  729. }
  730. return igs, nil
  731. }
  732. func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
  733. tagNodesMap = make(map[models.TagID][]models.Node)
  734. nodes, _ := GetAllNodes()
  735. for _, nodeI := range nodes {
  736. if nodeI.Tags == nil {
  737. continue
  738. }
  739. for nodeTagID := range nodeI.Tags {
  740. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  741. }
  742. }
  743. return
  744. }
  745. func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (tagNodesMap map[models.TagID][]models.Node) {
  746. tagNodesMap = make(map[models.TagID][]models.Node)
  747. nodes, _ := GetNetworkNodes(netID.String())
  748. for _, nodeI := range nodes {
  749. if nodeI.Tags == nil {
  750. continue
  751. }
  752. for nodeTagID := range nodeI.Tags {
  753. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  754. }
  755. }
  756. tagNodesMap["*"] = nodes
  757. if !withStaticNodes {
  758. return
  759. }
  760. return AddTagMapWithStaticNodes(netID, tagNodesMap)
  761. }
  762. func AddTagMapWithStaticNodes(netID models.NetworkID,
  763. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  764. extclients, err := GetNetworkExtClients(netID.String())
  765. if err != nil {
  766. return tagNodesMap
  767. }
  768. for _, extclient := range extclients {
  769. if extclient.Tags == nil || extclient.RemoteAccessClientID != "" {
  770. continue
  771. }
  772. for tagID := range extclient.Tags {
  773. tagNodesMap[tagID] = append(tagNodesMap[tagID], models.Node{
  774. IsStatic: true,
  775. StaticNode: extclient,
  776. })
  777. tagNodesMap["*"] = append(tagNodesMap["*"], models.Node{
  778. IsStatic: true,
  779. StaticNode: extclient,
  780. })
  781. }
  782. }
  783. return tagNodesMap
  784. }
  785. func AddTagMapWithStaticNodesWithUsers(netID models.NetworkID,
  786. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  787. extclients, err := GetNetworkExtClients(netID.String())
  788. if err != nil {
  789. return tagNodesMap
  790. }
  791. for _, extclient := range extclients {
  792. if extclient.Tags == nil {
  793. continue
  794. }
  795. for tagID := range extclient.Tags {
  796. tagNodesMap[tagID] = append(tagNodesMap[tagID], models.Node{
  797. IsStatic: true,
  798. StaticNode: extclient,
  799. })
  800. }
  801. }
  802. return tagNodesMap
  803. }
  804. func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
  805. nMap := make(map[string]models.Node)
  806. tag, err := GetTag(tagID)
  807. if err != nil {
  808. return nMap
  809. }
  810. nodes, _ := GetNetworkNodes(tag.Network.String())
  811. for _, nodeI := range nodes {
  812. if nodeI.Tags == nil {
  813. continue
  814. }
  815. if _, ok := nodeI.Tags[tagID]; ok {
  816. nMap[nodeI.ID.String()] = nodeI
  817. }
  818. }
  819. return AddStaticNodesWithTag(tag, nMap)
  820. }
  821. func AddStaticNodesWithTag(tag models.Tag, nMap map[string]models.Node) map[string]models.Node {
  822. extclients, err := GetNetworkExtClients(tag.Network.String())
  823. if err != nil {
  824. return nMap
  825. }
  826. for _, extclient := range extclients {
  827. if extclient.RemoteAccessClientID != "" {
  828. continue
  829. }
  830. if _, ok := extclient.Tags[tag.ID]; ok {
  831. nMap[extclient.ClientID] = models.Node{
  832. IsStatic: true,
  833. StaticNode: extclient,
  834. }
  835. }
  836. }
  837. return nMap
  838. }
  839. func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
  840. nMap := make(map[string]models.Node)
  841. tag, err := GetTag(tagID)
  842. if err != nil {
  843. return nMap
  844. }
  845. extclients, err := GetNetworkExtClients(tag.Network.String())
  846. if err != nil {
  847. return nMap
  848. }
  849. for _, extclient := range extclients {
  850. nMap[extclient.ClientID] = models.Node{
  851. IsStatic: true,
  852. StaticNode: extclient,
  853. }
  854. }
  855. return nMap
  856. }