2
0

nodes.go 25 KB

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