nodes.go 25 KB

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