nodes.go 27 KB

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