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. nodebytes, err := json.Marshal(&node)
  643. if err != nil {
  644. return err
  645. }
  646. err = database.Insert(node.ID.String(), string(nodebytes), database.NODES_TABLE_NAME)
  647. if err != nil {
  648. return err
  649. }
  650. if servercfg.CacheEnabled() {
  651. storeNodeInCache(*node)
  652. storeNodeInNetworkCache(*node, node.Network)
  653. if _, ok := allocatedIpMap[node.Network]; ok {
  654. if node.Address.IP != nil {
  655. AddIpToAllocatedIpMap(node.Network, node.Address.IP)
  656. }
  657. if node.Address6.IP != nil {
  658. AddIpToAllocatedIpMap(node.Network, node.Address6.IP)
  659. }
  660. }
  661. }
  662. _, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), defaultACLVal)
  663. if err != nil {
  664. logger.Log(1, "failed to create node ACL for node,", node.ID.String(), "err:", err.Error())
  665. return err
  666. }
  667. if err = UpdateProNodeACLs(node); err != nil {
  668. logger.Log(1, "failed to apply node level ACLs during creation of node", node.ID.String(), "-", err.Error())
  669. return err
  670. }
  671. if err = UpdateMetrics(node.ID.String(), &models.Metrics{Connectivity: make(map[string]models.Metric)}); err != nil {
  672. logger.Log(1, "failed to initialize metrics for node", node.ID.String(), err.Error())
  673. }
  674. SetNetworkNodesLastModified(node.Network)
  675. if servercfg.IsDNSMode() {
  676. err = SetDNS()
  677. }
  678. return err
  679. }
  680. // SortApiNodes - Sorts slice of ApiNodes by their ID alphabetically with numbers first
  681. func SortApiNodes(unsortedNodes []models.ApiNode) {
  682. sort.Slice(unsortedNodes, func(i, j int) bool {
  683. return unsortedNodes[i].ID < unsortedNodes[j].ID
  684. })
  685. }
  686. func ValidateParams(nodeid, netid string) (models.Node, error) {
  687. node, err := GetNodeByID(nodeid)
  688. if err != nil {
  689. slog.Error("error fetching node", "node", nodeid, "error", err.Error())
  690. return node, fmt.Errorf("error fetching node during parameter validation: %v", err)
  691. }
  692. if node.Network != netid {
  693. slog.Error("network url param does not match node id", "url nodeid", netid, "node", node.Network)
  694. return node, fmt.Errorf("network url param does not match node network")
  695. }
  696. return node, nil
  697. }
  698. func ValidateNodeIp(currentNode *models.Node, newNode *models.ApiNode) error {
  699. if currentNode.Address.IP != nil && currentNode.Address.String() != newNode.Address {
  700. if !IsIPUnique(newNode.Network, newNode.Address, database.NODES_TABLE_NAME, false) ||
  701. !IsIPUnique(newNode.Network, newNode.Address, database.EXT_CLIENT_TABLE_NAME, false) {
  702. return errors.New("ip specified is already allocated: " + newNode.Address)
  703. }
  704. }
  705. if currentNode.Address6.IP != nil && currentNode.Address6.String() != newNode.Address6 {
  706. if !IsIPUnique(newNode.Network, newNode.Address6, database.NODES_TABLE_NAME, false) ||
  707. !IsIPUnique(newNode.Network, newNode.Address6, database.EXT_CLIENT_TABLE_NAME, false) {
  708. return errors.New("ip specified is already allocated: " + newNode.Address6)
  709. }
  710. }
  711. return nil
  712. }
  713. func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
  714. network, err := GetNetworkSettings(gateway.NetID)
  715. if err != nil {
  716. slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
  717. return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
  718. }
  719. ipv4Net := network.AddressRange
  720. ipv6Net := network.AddressRange6
  721. for _, v := range gateway.Ranges {
  722. if ipv4Net != "" {
  723. if ContainsCIDR(ipv4Net, v) {
  724. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
  725. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv4Net)
  726. }
  727. }
  728. if ipv6Net != "" {
  729. if ContainsCIDR(ipv6Net, v) {
  730. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv6Net)
  731. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv6Net)
  732. }
  733. }
  734. }
  735. return nil
  736. }
  737. func ContainsCIDR(net1, net2 string) bool {
  738. one, two := ipaddr.NewIPAddressString(net1),
  739. ipaddr.NewIPAddressString(net2)
  740. return one.Contains(two) || two.Contains(one)
  741. }
  742. // GetAllFailOvers - gets all the nodes that are failovers
  743. func GetAllFailOvers() ([]models.Node, error) {
  744. nodes, err := GetAllNodes()
  745. if err != nil {
  746. return nil, err
  747. }
  748. igs := make([]models.Node, 0)
  749. for _, node := range nodes {
  750. if node.IsFailOver {
  751. igs = append(igs, node)
  752. }
  753. }
  754. return igs, nil
  755. }
  756. func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
  757. tagNodesMap = make(map[models.TagID][]models.Node)
  758. nodes, _ := GetAllNodes()
  759. for _, nodeI := range nodes {
  760. if nodeI.Tags == nil {
  761. continue
  762. }
  763. if nodeI.Mutex != nil {
  764. nodeI.Mutex.Lock()
  765. }
  766. for nodeTagID := range nodeI.Tags {
  767. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  768. }
  769. if nodeI.Mutex != nil {
  770. nodeI.Mutex.Unlock()
  771. }
  772. }
  773. return
  774. }
  775. func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (tagNodesMap map[models.TagID][]models.Node) {
  776. tagNodesMap = make(map[models.TagID][]models.Node)
  777. nodes, _ := GetNetworkNodes(netID.String())
  778. for _, nodeI := range nodes {
  779. tagNodesMap[models.TagID(nodeI.ID.String())] = []models.Node{
  780. nodeI,
  781. }
  782. if nodeI.Tags == nil {
  783. continue
  784. }
  785. if nodeI.Mutex != nil {
  786. nodeI.Mutex.Lock()
  787. }
  788. for nodeTagID := range nodeI.Tags {
  789. if nodeTagID == models.TagID(nodeI.ID.String()) {
  790. continue
  791. }
  792. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  793. }
  794. if nodeI.Mutex != nil {
  795. nodeI.Mutex.Unlock()
  796. }
  797. }
  798. tagNodesMap["*"] = nodes
  799. if !withStaticNodes {
  800. return
  801. }
  802. return AddTagMapWithStaticNodes(netID, tagNodesMap)
  803. }
  804. func AddTagMapWithStaticNodes(netID models.NetworkID,
  805. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  806. extclients, err := GetNetworkExtClients(netID.String())
  807. if err != nil {
  808. return tagNodesMap
  809. }
  810. for _, extclient := range extclients {
  811. if extclient.RemoteAccessClientID != "" {
  812. continue
  813. }
  814. tagNodesMap[models.TagID(extclient.ClientID)] = []models.Node{
  815. {
  816. IsStatic: true,
  817. StaticNode: extclient,
  818. },
  819. }
  820. if extclient.Tags == nil {
  821. continue
  822. }
  823. if extclient.Mutex != nil {
  824. extclient.Mutex.Lock()
  825. }
  826. for tagID := range extclient.Tags {
  827. if tagID == models.TagID(extclient.ClientID) {
  828. continue
  829. }
  830. tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
  831. tagNodesMap["*"] = append(tagNodesMap["*"], extclient.ConvertToStaticNode())
  832. }
  833. if extclient.Mutex != nil {
  834. extclient.Mutex.Unlock()
  835. }
  836. }
  837. return tagNodesMap
  838. }
  839. func AddTagMapWithStaticNodesWithUsers(netID models.NetworkID,
  840. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  841. extclients, err := GetNetworkExtClients(netID.String())
  842. if err != nil {
  843. return tagNodesMap
  844. }
  845. for _, extclient := range extclients {
  846. tagNodesMap[models.TagID(extclient.ClientID)] = []models.Node{
  847. {
  848. IsStatic: true,
  849. StaticNode: extclient,
  850. },
  851. }
  852. if extclient.Tags == nil {
  853. continue
  854. }
  855. if extclient.Mutex != nil {
  856. extclient.Mutex.Lock()
  857. }
  858. for tagID := range extclient.Tags {
  859. tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
  860. }
  861. if extclient.Mutex != nil {
  862. extclient.Mutex.Unlock()
  863. }
  864. }
  865. return tagNodesMap
  866. }
  867. func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
  868. nMap := make(map[string]models.Node)
  869. tag, err := GetTag(tagID)
  870. if err != nil {
  871. return nMap
  872. }
  873. nodes, _ := GetNetworkNodes(tag.Network.String())
  874. for _, nodeI := range nodes {
  875. if nodeI.Tags == nil {
  876. continue
  877. }
  878. if nodeI.Mutex != nil {
  879. nodeI.Mutex.Lock()
  880. }
  881. if _, ok := nodeI.Tags[tagID]; ok {
  882. nMap[nodeI.ID.String()] = nodeI
  883. }
  884. if nodeI.Mutex != nil {
  885. nodeI.Mutex.Unlock()
  886. }
  887. }
  888. return AddStaticNodesWithTag(tag, nMap)
  889. }
  890. func AddStaticNodesWithTag(tag models.Tag, nMap map[string]models.Node) map[string]models.Node {
  891. extclients, err := GetNetworkExtClients(tag.Network.String())
  892. if err != nil {
  893. return nMap
  894. }
  895. for _, extclient := range extclients {
  896. if extclient.RemoteAccessClientID != "" {
  897. continue
  898. }
  899. if extclient.Mutex != nil {
  900. extclient.Mutex.Lock()
  901. }
  902. if _, ok := extclient.Tags[tag.ID]; ok {
  903. nMap[extclient.ClientID] = extclient.ConvertToStaticNode()
  904. }
  905. if extclient.Mutex != nil {
  906. extclient.Mutex.Unlock()
  907. }
  908. }
  909. return nMap
  910. }
  911. func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
  912. nMap := make(map[string]models.Node)
  913. tag, err := GetTag(tagID)
  914. if err != nil {
  915. return nMap
  916. }
  917. extclients, err := GetNetworkExtClients(tag.Network.String())
  918. if err != nil {
  919. return nMap
  920. }
  921. for _, extclient := range extclients {
  922. nMap[extclient.ClientID] = extclient.ConvertToStaticNode()
  923. }
  924. return nMap
  925. }