2
0

modify.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package nodeacls
  2. import (
  3. "github.com/gravitl/netmaker/database"
  4. "github.com/gravitl/netmaker/logic/acls"
  5. "github.com/gravitl/netmaker/servercfg"
  6. )
  7. // CreateNodeACL - inserts or updates a node ACL on given network and adds to state
  8. func CreateNodeACL(networkID NetworkID, nodeID NodeID, defaultVal byte) (acls.ACL, error) {
  9. if defaultVal != acls.NotAllowed && defaultVal != acls.Allowed {
  10. defaultVal = acls.NotAllowed
  11. }
  12. var currentNetworkACL, err = FetchAllACLs(networkID)
  13. if err != nil {
  14. if database.IsEmptyRecord(err) {
  15. currentNetworkACL, err = currentNetworkACL.New(acls.ContainerID(networkID))
  16. if err != nil {
  17. return nil, err
  18. }
  19. } else {
  20. return nil, err
  21. }
  22. }
  23. acls.AclMutex.Lock()
  24. var newNodeACL = make(acls.ACL)
  25. for existingNodeID := range currentNetworkACL {
  26. if currentNetworkACL[existingNodeID] == nil {
  27. currentNetworkACL[existingNodeID] = make(acls.ACL)
  28. }
  29. currentNetworkACL[existingNodeID][acls.AclID(nodeID)] = defaultVal // set the old nodes to default value for new node
  30. newNodeACL[existingNodeID] = defaultVal // set the old nodes in new node ACL to default value
  31. }
  32. currentNetworkACL[acls.AclID(nodeID)] = newNodeACL // append the new node's ACL
  33. acls.AclMutex.Unlock()
  34. retNetworkACL, err := currentNetworkACL.Save(acls.ContainerID(networkID)) // insert into db
  35. if err != nil {
  36. return nil, err
  37. }
  38. return retNetworkACL[acls.AclID(nodeID)], nil
  39. }
  40. // AllowNode - allow access between two nodes in memory
  41. func AllowNodes(networkID NetworkID, node1, node2 NodeID) (acls.ACLContainer, error) {
  42. container, err := FetchAllACLs(networkID)
  43. if err != nil {
  44. return nil, err
  45. }
  46. container[acls.AclID(node1)].Allow(acls.AclID(node2))
  47. container[acls.AclID(node2)].Allow(acls.AclID(node1))
  48. return container, nil
  49. }
  50. // DisallowNodes - deny access between two nodes
  51. func DisallowNodes(networkID NetworkID, node1, node2 NodeID) (acls.ACLContainer, error) {
  52. container, err := FetchAllACLs(networkID)
  53. if err != nil {
  54. return nil, err
  55. }
  56. container[acls.AclID(node1)].Disallow(acls.AclID(node2))
  57. container[acls.AclID(node2)].Disallow(acls.AclID(node1))
  58. return container, nil
  59. }
  60. // UpdateNodeACL - updates a node's ACL in state
  61. func UpdateNodeACL(networkID NetworkID, nodeID NodeID, acl acls.ACL) (acls.ACL, error) {
  62. var currentNetworkACL, err = FetchAllACLs(networkID)
  63. if err != nil {
  64. return nil, err
  65. }
  66. acls.AclMutex.Lock()
  67. currentNetworkACL[acls.AclID(nodeID)] = acl
  68. acls.AclMutex.Unlock()
  69. return currentNetworkACL[acls.AclID(nodeID)].Save(acls.ContainerID(networkID), acls.AclID(nodeID))
  70. }
  71. // RemoveNodeACL - removes a specific Node's ACL, returns the NetworkACL and error
  72. func RemoveNodeACL(networkID NetworkID, nodeID NodeID) (acls.ACLContainer, error) {
  73. var currentNetworkACL, err = FetchAllACLs(networkID)
  74. if err != nil {
  75. return nil, err
  76. }
  77. for currentNodeID := range currentNetworkACL {
  78. if NodeID(currentNodeID) != nodeID {
  79. currentNetworkACL[currentNodeID].Remove(acls.AclID(nodeID))
  80. }
  81. }
  82. delete(currentNetworkACL, acls.AclID(nodeID))
  83. return currentNetworkACL.Save(acls.ContainerID(networkID))
  84. }
  85. // DeleteACLContainer - removes an ACLContainer state from db
  86. func DeleteACLContainer(network NetworkID) error {
  87. err := database.DeleteRecord(database.NODE_ACLS_TABLE_NAME, string(network))
  88. if err != nil {
  89. return err
  90. }
  91. if servercfg.CacheEnabled() {
  92. acls.DeleteAclFromCache(acls.ContainerID(network))
  93. }
  94. return nil
  95. }