nodes.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package logic
  2. import (
  3. "encoding/json"
  4. "sort"
  5. "time"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/functions"
  8. "github.com/gravitl/netmaker/models"
  9. )
  10. // GetNetworkNodes - gets the nodes of a network
  11. func GetNetworkNodes(network string) ([]models.Node, error) {
  12. var nodes []models.Node
  13. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  14. if err != nil {
  15. if database.IsEmptyRecord(err) {
  16. return []models.Node{}, nil
  17. }
  18. return nodes, err
  19. }
  20. for _, value := range collection {
  21. var node models.Node
  22. err := json.Unmarshal([]byte(value), &node)
  23. if err != nil {
  24. continue
  25. }
  26. if node.Network == network {
  27. nodes = append(nodes, node)
  28. }
  29. }
  30. return nodes, nil
  31. }
  32. // GetSortedNetworkServerNodes - gets nodes of a network, except sorted by update time
  33. func GetSortedNetworkServerNodes(network string) ([]models.Node, error) {
  34. var nodes []models.Node
  35. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  36. if err != nil {
  37. if database.IsEmptyRecord(err) {
  38. return []models.Node{}, nil
  39. }
  40. return nodes, err
  41. }
  42. for _, value := range collection {
  43. var node models.Node
  44. err := json.Unmarshal([]byte(value), &node)
  45. if err != nil {
  46. continue
  47. }
  48. if node.Network == network && node.IsServer == "yes" {
  49. nodes = append(nodes, node)
  50. }
  51. }
  52. sort.Sort(models.NodesArray(nodes))
  53. return nodes, nil
  54. }
  55. // GetPeers - gets the peers of a given node
  56. func GetPeers(node models.Node) ([]models.Node, error) {
  57. if node.IsServer == "yes" && IsLeader(&node) {
  58. SetNetworkServerPeers(&node)
  59. }
  60. excludeIsRelayed := node.IsRelay != "yes"
  61. var relayedNode string
  62. if node.IsRelayed == "yes" {
  63. relayedNode = node.Address
  64. }
  65. peers, err := GetPeersList(node.Network, excludeIsRelayed, relayedNode)
  66. if err != nil {
  67. return nil, err
  68. }
  69. return peers, nil
  70. }
  71. // IsLeader - determines if a given server node is a leader
  72. func IsLeader(node *models.Node) bool {
  73. nodes, err := GetSortedNetworkServerNodes(node.Network)
  74. if err != nil {
  75. functions.PrintUserLog("", "ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.", 0)
  76. return false
  77. }
  78. for _, n := range nodes {
  79. if n.LastModified > time.Now().Add(-1*time.Minute).Unix() {
  80. return n.Address == node.Address
  81. }
  82. }
  83. return len(nodes) <= 1 || nodes[1].Address == node.Address
  84. }