nodes.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. package logic
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "maps"
  8. "net"
  9. "slices"
  10. "sort"
  11. "sync"
  12. "time"
  13. validator "github.com/go-playground/validator/v10"
  14. "github.com/google/uuid"
  15. "github.com/gravitl/netmaker/database"
  16. "github.com/gravitl/netmaker/logger"
  17. "github.com/gravitl/netmaker/logic/acls"
  18. "github.com/gravitl/netmaker/logic/acls/nodeacls"
  19. "github.com/gravitl/netmaker/models"
  20. "github.com/gravitl/netmaker/servercfg"
  21. "github.com/gravitl/netmaker/validation"
  22. "github.com/seancfoley/ipaddress-go/ipaddr"
  23. "golang.org/x/exp/slog"
  24. )
  25. var (
  26. nodeCacheMutex = &sync.RWMutex{}
  27. nodeNetworkCacheMutex = &sync.RWMutex{}
  28. nodesCacheMap = make(map[string]models.Node)
  29. nodesNetworkCacheMap = make(map[string]map[string]models.Node)
  30. )
  31. func getNodeFromCache(nodeID string) (node models.Node, ok bool) {
  32. nodeCacheMutex.RLock()
  33. node, ok = nodesCacheMap[nodeID]
  34. if node.Mutex == nil {
  35. node.Mutex = &sync.Mutex{}
  36. }
  37. nodeCacheMutex.RUnlock()
  38. return
  39. }
  40. func getNodesFromCache() (nodes []models.Node) {
  41. nodeCacheMutex.RLock()
  42. for _, node := range nodesCacheMap {
  43. if node.Mutex == nil {
  44. node.Mutex = &sync.Mutex{}
  45. }
  46. nodes = append(nodes, node)
  47. }
  48. nodeCacheMutex.RUnlock()
  49. return
  50. }
  51. func deleteNodeFromCache(nodeID string) {
  52. nodeCacheMutex.Lock()
  53. delete(nodesCacheMap, nodeID)
  54. nodeCacheMutex.Unlock()
  55. }
  56. func deleteNodeFromNetworkCache(nodeID string, network string) {
  57. nodeNetworkCacheMutex.Lock()
  58. delete(nodesNetworkCacheMap[network], nodeID)
  59. nodeNetworkCacheMutex.Unlock()
  60. }
  61. func storeNodeInNetworkCache(node models.Node, network string) {
  62. nodeNetworkCacheMutex.Lock()
  63. if nodesNetworkCacheMap[network] == nil {
  64. nodesNetworkCacheMap[network] = make(map[string]models.Node)
  65. }
  66. nodesNetworkCacheMap[network][node.ID.String()] = node
  67. nodeNetworkCacheMutex.Unlock()
  68. }
  69. func storeNodeInCache(node models.Node) {
  70. nodeCacheMutex.Lock()
  71. nodesCacheMap[node.ID.String()] = node
  72. nodeCacheMutex.Unlock()
  73. }
  74. func loadNodesIntoNetworkCache(nMap map[string]models.Node) {
  75. nodeNetworkCacheMutex.Lock()
  76. for _, v := range nMap {
  77. network := v.Network
  78. if nodesNetworkCacheMap[network] == nil {
  79. nodesNetworkCacheMap[network] = make(map[string]models.Node)
  80. }
  81. nodesNetworkCacheMap[network][v.ID.String()] = v
  82. }
  83. nodeNetworkCacheMutex.Unlock()
  84. }
  85. func loadNodesIntoCache(nMap map[string]models.Node) {
  86. nodeCacheMutex.Lock()
  87. nodesCacheMap = nMap
  88. nodeCacheMutex.Unlock()
  89. }
  90. func ClearNodeCache() {
  91. nodeCacheMutex.Lock()
  92. nodesCacheMap = make(map[string]models.Node)
  93. nodesNetworkCacheMap = make(map[string]map[string]models.Node)
  94. nodeCacheMutex.Unlock()
  95. }
  96. const (
  97. // RELAY_NODE_ERR - error to return if relay node is unfound
  98. RELAY_NODE_ERR = "could not find relay for node"
  99. // NodePurgeTime time to wait for node to response to a NODE_DELETE actions
  100. NodePurgeTime = time.Second * 10
  101. // NodePurgeCheckTime is how often to check nodes for Pending Delete
  102. NodePurgeCheckTime = time.Second * 30
  103. )
  104. // GetNetworkNodes - gets the nodes of a network
  105. func GetNetworkNodes(network string) ([]models.Node, error) {
  106. if networkNodes, ok := nodesNetworkCacheMap[network]; ok {
  107. nodeNetworkCacheMutex.Lock()
  108. defer nodeNetworkCacheMutex.Unlock()
  109. return slices.Collect(maps.Values(networkNodes)), nil
  110. }
  111. allnodes, err := GetAllNodes()
  112. if err != nil {
  113. return []models.Node{}, err
  114. }
  115. return GetNetworkNodesMemory(allnodes, network), nil
  116. }
  117. // GetHostNodes - fetches all nodes part of the host
  118. func GetHostNodes(host *models.Host) []models.Node {
  119. nodes := []models.Node{}
  120. for _, nodeID := range host.Nodes {
  121. node, err := GetNodeByID(nodeID)
  122. if err == nil {
  123. nodes = append(nodes, node)
  124. }
  125. }
  126. return nodes
  127. }
  128. // GetNetworkNodesMemory - gets all nodes belonging to a network from list in memory
  129. func GetNetworkNodesMemory(allNodes []models.Node, network string) []models.Node {
  130. if networkNodes, ok := nodesNetworkCacheMap[network]; ok {
  131. nodeNetworkCacheMutex.Lock()
  132. defer nodeNetworkCacheMutex.Unlock()
  133. return slices.Collect(maps.Values(networkNodes))
  134. }
  135. var nodes = make([]models.Node, 0, len(allNodes))
  136. for i := range allNodes {
  137. node := allNodes[i]
  138. if node.Network == network {
  139. nodes = append(nodes, node)
  140. }
  141. }
  142. return nodes
  143. }
  144. // UpdateNodeCheckin - updates the checkin time of a node
  145. func UpdateNodeCheckin(node *models.Node) error {
  146. node.SetLastCheckIn()
  147. data, err := json.Marshal(node)
  148. if err != nil {
  149. return err
  150. }
  151. err = database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
  152. if err != nil {
  153. return err
  154. }
  155. if servercfg.CacheEnabled() {
  156. storeNodeInCache(*node)
  157. storeNodeInNetworkCache(*node, node.Network)
  158. }
  159. return nil
  160. }
  161. // UpsertNode - updates node in the DB
  162. func UpsertNode(newNode *models.Node) error {
  163. newNode.SetLastModified()
  164. data, err := json.Marshal(newNode)
  165. if err != nil {
  166. return err
  167. }
  168. err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
  169. if err != nil {
  170. return err
  171. }
  172. if servercfg.CacheEnabled() {
  173. storeNodeInCache(*newNode)
  174. storeNodeInNetworkCache(*newNode, newNode.Network)
  175. }
  176. return nil
  177. }
  178. // UpdateNode - takes a node and updates another node with it's values
  179. func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
  180. if newNode.Address.IP.String() != currentNode.Address.IP.String() {
  181. if network, err := GetParentNetwork(newNode.Network); err == nil {
  182. if !IsAddressInCIDR(newNode.Address.IP, network.AddressRange) {
  183. return fmt.Errorf("invalid address provided; out of network range for node %s", newNode.ID)
  184. }
  185. }
  186. }
  187. nodeACLDelta := currentNode.DefaultACL != newNode.DefaultACL
  188. newNode.Fill(currentNode, servercfg.IsPro)
  189. // check for un-settable server values
  190. if err := ValidateNode(newNode, true); err != nil {
  191. return err
  192. }
  193. if newNode.ID == currentNode.ID {
  194. if nodeACLDelta {
  195. if err := UpdateProNodeACLs(newNode); err != nil {
  196. logger.Log(1, "failed to apply node level ACLs during creation of node", newNode.ID.String(), "-", err.Error())
  197. return err
  198. }
  199. }
  200. newNode.SetLastModified()
  201. if data, err := json.Marshal(newNode); err != nil {
  202. return err
  203. } else {
  204. err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
  205. if err != nil {
  206. return err
  207. }
  208. if servercfg.CacheEnabled() {
  209. storeNodeInCache(*newNode)
  210. storeNodeInNetworkCache(*newNode, newNode.Network)
  211. if _, ok := allocatedIpMap[newNode.Network]; ok {
  212. if newNode.Address.IP != nil && !newNode.Address.IP.Equal(currentNode.Address.IP) {
  213. AddIpToAllocatedIpMap(newNode.Network, newNode.Address.IP)
  214. RemoveIpFromAllocatedIpMap(currentNode.Network, currentNode.Address.IP.String())
  215. }
  216. if newNode.Address6.IP != nil && !newNode.Address6.IP.Equal(currentNode.Address6.IP) {
  217. AddIpToAllocatedIpMap(newNode.Network, newNode.Address6.IP)
  218. RemoveIpFromAllocatedIpMap(currentNode.Network, currentNode.Address6.IP.String())
  219. }
  220. }
  221. }
  222. return nil
  223. }
  224. }
  225. return fmt.Errorf("failed to update node %s, cannot change ID", currentNode.ID.String())
  226. }
  227. // DeleteNode - marks node for deletion (and adds to zombie list) if called by UI or deletes node if called by node
  228. func DeleteNode(node *models.Node, purge bool) error {
  229. alreadyDeleted := node.PendingDelete || node.Action == models.NODE_DELETE
  230. node.Action = models.NODE_DELETE
  231. //delete ext clients if node is ingress gw
  232. if node.IsIngressGateway {
  233. if err := DeleteGatewayExtClients(node.ID.String(), node.Network); err != nil {
  234. slog.Error("failed to delete ext clients", "nodeid", node.ID.String(), "error", err.Error())
  235. }
  236. }
  237. if node.IsRelayed {
  238. // cleanup node from relayednodes on relay node
  239. relayNode, err := GetNodeByID(node.RelayedBy)
  240. if err == nil {
  241. relayedNodes := []string{}
  242. for _, relayedNodeID := range relayNode.RelayedNodes {
  243. if relayedNodeID == node.ID.String() {
  244. continue
  245. }
  246. relayedNodes = append(relayedNodes, relayedNodeID)
  247. }
  248. relayNode.RelayedNodes = relayedNodes
  249. UpsertNode(&relayNode)
  250. }
  251. }
  252. if node.FailedOverBy != uuid.Nil {
  253. ResetFailedOverPeer(node)
  254. }
  255. if node.IsRelay {
  256. // unset all the relayed nodes
  257. SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
  258. }
  259. if node.InternetGwID != "" {
  260. inetNode, err := GetNodeByID(node.InternetGwID)
  261. if err == nil {
  262. clientNodeIDs := []string{}
  263. for _, inetNodeClientID := range inetNode.InetNodeReq.InetNodeClientIDs {
  264. if inetNodeClientID == node.ID.String() {
  265. continue
  266. }
  267. clientNodeIDs = append(clientNodeIDs, inetNodeClientID)
  268. }
  269. inetNode.InetNodeReq.InetNodeClientIDs = clientNodeIDs
  270. UpsertNode(&inetNode)
  271. }
  272. }
  273. if node.IsInternetGateway {
  274. UnsetInternetGw(node)
  275. }
  276. if !purge && !alreadyDeleted {
  277. newnode := *node
  278. newnode.PendingDelete = true
  279. if err := UpdateNode(node, &newnode); err != nil {
  280. return err
  281. }
  282. newZombie <- node.ID
  283. return nil
  284. }
  285. if alreadyDeleted {
  286. logger.Log(1, "forcibly deleting node", node.ID.String())
  287. }
  288. host, err := GetHost(node.HostID.String())
  289. if err != nil {
  290. logger.Log(1, "no host found for node", node.ID.String(), "deleting..")
  291. if delErr := DeleteNodeByID(node); delErr != nil {
  292. logger.Log(0, "failed to delete node", node.ID.String(), delErr.Error())
  293. }
  294. return err
  295. }
  296. if err := DissasociateNodeFromHost(node, host); err != nil {
  297. return err
  298. }
  299. return nil
  300. }
  301. // GetNodeByHostRef - gets the node by host id and network
  302. func GetNodeByHostRef(hostid, network string) (node models.Node, err error) {
  303. nodes, err := GetNetworkNodes(network)
  304. if err != nil {
  305. return models.Node{}, err
  306. }
  307. for _, node := range nodes {
  308. if node.HostID.String() == hostid && node.Network == network {
  309. return node, nil
  310. }
  311. }
  312. return models.Node{}, errors.New("node not found")
  313. }
  314. // DeleteNodeByID - deletes a node from database
  315. func DeleteNodeByID(node *models.Node) error {
  316. var err error
  317. var key = node.ID.String()
  318. if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
  319. if !database.IsEmptyRecord(err) {
  320. return err
  321. }
  322. }
  323. if servercfg.CacheEnabled() {
  324. deleteNodeFromCache(node.ID.String())
  325. deleteNodeFromNetworkCache(node.ID.String(), node.Network)
  326. }
  327. if servercfg.IsDNSMode() {
  328. SetDNS()
  329. }
  330. _, err = nodeacls.RemoveNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()))
  331. if err != nil {
  332. // ignoring for now, could hit a nil pointer if delete called twice
  333. logger.Log(2, "attempted to remove node ACL for node", node.ID.String())
  334. }
  335. // removeZombie <- node.ID
  336. if err = DeleteMetrics(node.ID.String()); err != nil {
  337. logger.Log(1, "unable to remove metrics from DB for node", node.ID.String(), err.Error())
  338. }
  339. //recycle ip address
  340. if servercfg.CacheEnabled() {
  341. if node.Address.IP != nil {
  342. RemoveIpFromAllocatedIpMap(node.Network, node.Address.IP.String())
  343. }
  344. if node.Address6.IP != nil {
  345. RemoveIpFromAllocatedIpMap(node.Network, node.Address6.IP.String())
  346. }
  347. }
  348. return nil
  349. }
  350. // IsNodeIDUnique - checks if node id is unique
  351. func IsNodeIDUnique(node *models.Node) (bool, error) {
  352. _, err := database.FetchRecord(database.NODES_TABLE_NAME, node.ID.String())
  353. return database.IsEmptyRecord(err), err
  354. }
  355. // ValidateNode - validates node values
  356. func ValidateNode(node *models.Node, isUpdate bool) error {
  357. v := validator.New()
  358. _ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
  359. if isUpdate {
  360. return true
  361. }
  362. isFieldUnique, _ := IsNodeIDUnique(node)
  363. return isFieldUnique
  364. })
  365. _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
  366. _, err := GetNetworkByNode(node)
  367. return err == nil
  368. })
  369. _ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool {
  370. return validation.CheckYesOrNoOrUnset(f1)
  371. })
  372. err := v.Struct(node)
  373. return err
  374. }
  375. // GetAllNodes - returns all nodes in the DB
  376. func GetAllNodes() ([]models.Node, error) {
  377. var nodes []models.Node
  378. if servercfg.CacheEnabled() {
  379. nodes = getNodesFromCache()
  380. if len(nodes) != 0 {
  381. return nodes, nil
  382. }
  383. }
  384. nodesMap := make(map[string]models.Node)
  385. if servercfg.CacheEnabled() {
  386. defer loadNodesIntoCache(nodesMap)
  387. defer loadNodesIntoNetworkCache(nodesMap)
  388. }
  389. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  390. if err != nil {
  391. if database.IsEmptyRecord(err) {
  392. return []models.Node{}, nil
  393. }
  394. return []models.Node{}, err
  395. }
  396. for _, value := range collection {
  397. var node models.Node
  398. // ignore legacy nodes in database
  399. if err := json.Unmarshal([]byte(value), &node); err != nil {
  400. logger.Log(3, "legacy node detected: ", err.Error())
  401. continue
  402. }
  403. // add node to our array
  404. nodes = append(nodes, node)
  405. if node.Mutex == nil {
  406. node.Mutex = &sync.Mutex{}
  407. }
  408. nodesMap[node.ID.String()] = node
  409. }
  410. return nodes, nil
  411. }
  412. func AddStaticNodestoList(nodes []models.Node) []models.Node {
  413. netMap := make(map[string]struct{})
  414. for _, node := range nodes {
  415. if _, ok := netMap[node.Network]; ok {
  416. continue
  417. }
  418. if node.IsIngressGateway {
  419. nodes = append(nodes, GetStaticNodesByNetwork(models.NetworkID(node.Network), false)...)
  420. netMap[node.Network] = struct{}{}
  421. }
  422. }
  423. return nodes
  424. }
  425. func AddStatusToNodes(nodes []models.Node) (nodesWithStatus []models.Node) {
  426. aclDefaultPolicyStatusMap := make(map[string]bool)
  427. for _, node := range nodes {
  428. if _, ok := aclDefaultPolicyStatusMap[node.Network]; !ok {
  429. // check default policy if all allowed return true
  430. defaultPolicy, _ := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
  431. aclDefaultPolicyStatusMap[node.Network] = defaultPolicy.Enabled
  432. }
  433. GetNodeStatus(&node, aclDefaultPolicyStatusMap[node.Network])
  434. nodesWithStatus = append(nodesWithStatus, node)
  435. }
  436. return
  437. }
  438. // GetNetworkByNode - gets the network model from a node
  439. func GetNetworkByNode(node *models.Node) (models.Network, error) {
  440. var network = models.Network{}
  441. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, node.Network)
  442. if err != nil {
  443. return network, err
  444. }
  445. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  446. return models.Network{}, err
  447. }
  448. return network, nil
  449. }
  450. // SetNodeDefaults - sets the defaults of a node to avoid empty fields
  451. func SetNodeDefaults(node *models.Node, resetConnected bool) {
  452. parentNetwork, _ := GetNetworkByNode(node)
  453. _, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
  454. if err == nil {
  455. node.NetworkRange = *cidr
  456. }
  457. _, cidr, err = net.ParseCIDR(parentNetwork.AddressRange6)
  458. if err == nil {
  459. node.NetworkRange6 = *cidr
  460. }
  461. if node.DefaultACL == "" {
  462. node.DefaultACL = parentNetwork.DefaultACL
  463. }
  464. if node.FailOverPeers == nil {
  465. node.FailOverPeers = make(map[string]struct{})
  466. }
  467. node.SetLastModified()
  468. node.SetLastCheckIn()
  469. if resetConnected {
  470. node.SetDefaultConnected()
  471. }
  472. node.SetExpirationDateTime()
  473. if node.Tags == nil {
  474. node.Tags = make(map[models.TagID]struct{})
  475. }
  476. }
  477. // GetRecordKey - get record key
  478. // depricated
  479. func GetRecordKey(id string, network string) (string, error) {
  480. if id == "" || network == "" {
  481. return "", errors.New("unable to get record key")
  482. }
  483. return id + "###" + network, nil
  484. }
  485. func GetNodeByID(uuid string) (models.Node, error) {
  486. if servercfg.CacheEnabled() {
  487. if node, ok := getNodeFromCache(uuid); ok {
  488. return node, nil
  489. }
  490. }
  491. var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
  492. if err != nil {
  493. return models.Node{}, err
  494. }
  495. var node models.Node
  496. if err = json.Unmarshal([]byte(record), &node); err != nil {
  497. return models.Node{}, err
  498. }
  499. if servercfg.CacheEnabled() {
  500. storeNodeInCache(node)
  501. storeNodeInNetworkCache(node, node.Network)
  502. }
  503. return node, nil
  504. }
  505. // GetDeletedNodeByID - get a deleted node
  506. func GetDeletedNodeByID(uuid string) (models.Node, error) {
  507. var node models.Node
  508. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, uuid)
  509. if err != nil {
  510. return models.Node{}, err
  511. }
  512. if err = json.Unmarshal([]byte(record), &node); err != nil {
  513. return models.Node{}, err
  514. }
  515. SetNodeDefaults(&node, true)
  516. return node, nil
  517. }
  518. // FindRelay - returns the node that is the relay for a relayed node
  519. func FindRelay(node *models.Node) *models.Node {
  520. relay, err := GetNodeByID(node.RelayedBy)
  521. if err != nil {
  522. logger.Log(0, "FindRelay: "+err.Error())
  523. return nil
  524. }
  525. return &relay
  526. }
  527. // GetAllNodesAPI - get all nodes for api usage
  528. func GetAllNodesAPI(nodes []models.Node) []models.ApiNode {
  529. apiNodes := []models.ApiNode{}
  530. for i := range nodes {
  531. newApiNode := nodes[i].ConvertToAPINode()
  532. apiNodes = append(apiNodes, *newApiNode)
  533. }
  534. return apiNodes[:]
  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. if _, ok := allocatedIpMap[node.Network]; ok {
  640. if node.Address.IP != nil {
  641. AddIpToAllocatedIpMap(node.Network, node.Address.IP)
  642. }
  643. if node.Address6.IP != nil {
  644. AddIpToAllocatedIpMap(node.Network, node.Address6.IP)
  645. }
  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. if !IsIPUnique(newNode.Network, newNode.Address, database.NODES_TABLE_NAME, false) ||
  687. !IsIPUnique(newNode.Network, newNode.Address, database.EXT_CLIENT_TABLE_NAME, false) {
  688. return errors.New("ip specified is already allocated: " + newNode.Address)
  689. }
  690. }
  691. if currentNode.Address6.IP != nil && currentNode.Address6.String() != newNode.Address6 {
  692. if !IsIPUnique(newNode.Network, newNode.Address6, database.NODES_TABLE_NAME, false) ||
  693. !IsIPUnique(newNode.Network, newNode.Address6, database.EXT_CLIENT_TABLE_NAME, false) {
  694. return errors.New("ip specified is already allocated: " + newNode.Address6)
  695. }
  696. }
  697. return nil
  698. }
  699. func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
  700. network, err := GetNetworkSettings(gateway.NetID)
  701. if err != nil {
  702. slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
  703. return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
  704. }
  705. ipv4Net := network.AddressRange
  706. ipv6Net := network.AddressRange6
  707. for _, v := range gateway.Ranges {
  708. if ipv4Net != "" {
  709. if ContainsCIDR(ipv4Net, v) {
  710. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
  711. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv4Net)
  712. }
  713. }
  714. if ipv6Net != "" {
  715. if ContainsCIDR(ipv6Net, v) {
  716. slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv6Net)
  717. return errors.New("egress range should not be the same as or contained in the netmaker network address" + v + " " + ipv6Net)
  718. }
  719. }
  720. }
  721. return nil
  722. }
  723. func ContainsCIDR(net1, net2 string) bool {
  724. one, two := ipaddr.NewIPAddressString(net1),
  725. ipaddr.NewIPAddressString(net2)
  726. return one.Contains(two) || two.Contains(one)
  727. }
  728. // GetAllFailOvers - gets all the nodes that are failovers
  729. func GetAllFailOvers() ([]models.Node, error) {
  730. nodes, err := GetAllNodes()
  731. if err != nil {
  732. return nil, err
  733. }
  734. igs := make([]models.Node, 0)
  735. for _, node := range nodes {
  736. if node.IsFailOver {
  737. igs = append(igs, node)
  738. }
  739. }
  740. return igs, nil
  741. }
  742. func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
  743. tagNodesMap = make(map[models.TagID][]models.Node)
  744. nodes, _ := GetAllNodes()
  745. for _, nodeI := range nodes {
  746. if nodeI.Tags == nil {
  747. continue
  748. }
  749. if nodeI.Mutex != nil {
  750. nodeI.Mutex.Lock()
  751. }
  752. for nodeTagID := range nodeI.Tags {
  753. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  754. }
  755. if nodeI.Mutex != nil {
  756. nodeI.Mutex.Unlock()
  757. }
  758. }
  759. return
  760. }
  761. func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (tagNodesMap map[models.TagID][]models.Node) {
  762. tagNodesMap = make(map[models.TagID][]models.Node)
  763. nodes, _ := GetNetworkNodes(netID.String())
  764. for _, nodeI := range nodes {
  765. if nodeI.Tags == nil {
  766. continue
  767. }
  768. if nodeI.Mutex != nil {
  769. nodeI.Mutex.Lock()
  770. }
  771. for nodeTagID := range nodeI.Tags {
  772. tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
  773. }
  774. if nodeI.Mutex != nil {
  775. nodeI.Mutex.Unlock()
  776. }
  777. }
  778. tagNodesMap["*"] = nodes
  779. if !withStaticNodes {
  780. return
  781. }
  782. return AddTagMapWithStaticNodes(netID, tagNodesMap)
  783. }
  784. func AddTagMapWithStaticNodes(netID models.NetworkID,
  785. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  786. extclients, err := GetNetworkExtClients(netID.String())
  787. if err != nil {
  788. return tagNodesMap
  789. }
  790. for _, extclient := range extclients {
  791. if extclient.Tags == nil || extclient.RemoteAccessClientID != "" {
  792. continue
  793. }
  794. if extclient.Mutex != nil {
  795. extclient.Mutex.Lock()
  796. }
  797. for tagID := range extclient.Tags {
  798. tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
  799. tagNodesMap["*"] = append(tagNodesMap["*"], extclient.ConvertToStaticNode())
  800. }
  801. if extclient.Mutex != nil {
  802. extclient.Mutex.Unlock()
  803. }
  804. }
  805. return tagNodesMap
  806. }
  807. func AddTagMapWithStaticNodesWithUsers(netID models.NetworkID,
  808. tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
  809. extclients, err := GetNetworkExtClients(netID.String())
  810. if err != nil {
  811. return tagNodesMap
  812. }
  813. for _, extclient := range extclients {
  814. if extclient.Tags == nil {
  815. continue
  816. }
  817. if extclient.Mutex != nil {
  818. extclient.Mutex.Lock()
  819. }
  820. for tagID := range extclient.Tags {
  821. tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
  822. }
  823. if extclient.Mutex != nil {
  824. extclient.Mutex.Unlock()
  825. }
  826. }
  827. return tagNodesMap
  828. }
  829. func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
  830. nMap := make(map[string]models.Node)
  831. tag, err := GetTag(tagID)
  832. if err != nil {
  833. return nMap
  834. }
  835. nodes, _ := GetNetworkNodes(tag.Network.String())
  836. for _, nodeI := range nodes {
  837. if nodeI.Tags == nil {
  838. continue
  839. }
  840. if nodeI.Mutex != nil {
  841. nodeI.Mutex.Lock()
  842. }
  843. if _, ok := nodeI.Tags[tagID]; ok {
  844. nMap[nodeI.ID.String()] = nodeI
  845. }
  846. if nodeI.Mutex != nil {
  847. nodeI.Mutex.Unlock()
  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 extclient.Mutex != nil {
  862. extclient.Mutex.Lock()
  863. }
  864. if _, ok := extclient.Tags[tag.ID]; ok {
  865. nMap[extclient.ClientID] = extclient.ConvertToStaticNode()
  866. }
  867. if extclient.Mutex != nil {
  868. extclient.Mutex.Unlock()
  869. }
  870. }
  871. return nMap
  872. }
  873. func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
  874. nMap := make(map[string]models.Node)
  875. tag, err := GetTag(tagID)
  876. if err != nil {
  877. return nMap
  878. }
  879. extclients, err := GetNetworkExtClients(tag.Network.String())
  880. if err != nil {
  881. return nMap
  882. }
  883. for _, extclient := range extclients {
  884. nMap[extclient.ClientID] = extclient.ConvertToStaticNode()
  885. }
  886. return nMap
  887. }