nodes.go 26 KB

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