2
0

nodes.go 24 KB

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