nodes.go 28 KB

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