nodes.go 28 KB

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