retrieve.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package nodeacls
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "maps"
  6. "sync"
  7. "github.com/gravitl/netmaker/logic/acls"
  8. )
  9. var NodesAllowedACLMutex = &sync.Mutex{}
  10. // AreNodesAllowed - checks if nodes are allowed to communicate in their network ACL
  11. func AreNodesAllowed(networkID NetworkID, node1, node2 NodeID) bool {
  12. return true
  13. NodesAllowedACLMutex.Lock()
  14. defer NodesAllowedACLMutex.Unlock()
  15. var currentNetworkACL, err = FetchAllACLs(networkID)
  16. if err != nil {
  17. return false
  18. }
  19. var allowed bool
  20. acls.AclMutex.Lock()
  21. currNetworkACLNode1 := currentNetworkACL[acls.AclID(node1)]
  22. currNetworkACLNode2 := currentNetworkACL[acls.AclID(node2)]
  23. acls.AclMutex.Unlock()
  24. allowed = currNetworkACLNode1.IsAllowed(acls.AclID(node2)) && currNetworkACLNode2.IsAllowed(acls.AclID(node1))
  25. return allowed
  26. }
  27. // FetchNodeACL - fetches a specific node's ACL in a given network
  28. func FetchNodeACL(networkID NetworkID, nodeID NodeID) (acls.ACL, error) {
  29. var currentNetworkACL, err = FetchAllACLs(networkID)
  30. if err != nil {
  31. return nil, err
  32. }
  33. var acl acls.ACL
  34. acls.AclMutex.RLock()
  35. if currentNetworkACL[acls.AclID(nodeID)] == nil {
  36. acls.AclMutex.RUnlock()
  37. return nil, fmt.Errorf("no node ACL present for node %s", nodeID)
  38. }
  39. acl = currentNetworkACL[acls.AclID(nodeID)]
  40. acls.AclMutex.RUnlock()
  41. return acl, nil
  42. }
  43. // FetchNodeACLJson - fetches a node's acl in given network except returns the json string
  44. func FetchNodeACLJson(networkID NetworkID, nodeID NodeID) (acls.ACLJson, error) {
  45. currentNodeACL, err := FetchNodeACL(networkID, nodeID)
  46. if err != nil {
  47. return "", err
  48. }
  49. acls.AclMutex.RLock()
  50. defer acls.AclMutex.RUnlock()
  51. jsonData, err := json.Marshal(&currentNodeACL)
  52. if err != nil {
  53. return "", err
  54. }
  55. return acls.ACLJson(jsonData), nil
  56. }
  57. // FetchAllACLs - fetchs all node
  58. func FetchAllACLs(networkID NetworkID) (acls.ACLContainer, error) {
  59. var err error
  60. var currentNetworkACL acls.ACLContainer
  61. currentNetworkACL, err = currentNetworkACL.Get(acls.ContainerID(networkID))
  62. if err != nil {
  63. return nil, err
  64. }
  65. return maps.Clone(currentNetworkACL), nil
  66. }