nodes.go 25 KB

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