nodes.go 27 KB

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