retrieve.go 2.0 KB

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