nodes.go 25 KB

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