nodes.go 2.0 KB

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