modify.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. currentNetworkACL[existingNodeID][acls.AclID(nodeID)] = defaultVal // set the old nodes to default value for new node
  27. newNodeACL[existingNodeID] = defaultVal // set the old nodes in new node ACL to default value
  28. }
  29. currentNetworkACL[acls.AclID(nodeID)] = newNodeACL // append the new node's ACL
  30. acls.AclMutex.Unlock()
  31. retNetworkACL, err := currentNetworkACL.Save(acls.ContainerID(networkID)) // insert into db
  32. if err != nil {
  33. return nil, err
  34. }
  35. return retNetworkACL[acls.AclID(nodeID)], nil
  36. }
  37. // AllowNode - allow access between two nodes in memory
  38. func AllowNodes(networkID NetworkID, node1, node2 NodeID) (acls.ACLContainer, error) {
  39. container, err := FetchAllACLs(networkID)
  40. if err != nil {
  41. return nil, err
  42. }
  43. container[acls.AclID(node1)].Allow(acls.AclID(node2))
  44. container[acls.AclID(node2)].Allow(acls.AclID(node1))
  45. return container, nil
  46. }
  47. // DisallowNodes - deny access between two nodes
  48. func DisallowNodes(networkID NetworkID, node1, node2 NodeID) (acls.ACLContainer, error) {
  49. container, err := FetchAllACLs(networkID)
  50. if err != nil {
  51. return nil, err
  52. }
  53. container[acls.AclID(node1)].Disallow(acls.AclID(node2))
  54. container[acls.AclID(node2)].Disallow(acls.AclID(node1))
  55. return container, nil
  56. }
  57. // UpdateNodeACL - updates a node's ACL in state
  58. func UpdateNodeACL(networkID NetworkID, nodeID NodeID, acl acls.ACL) (acls.ACL, error) {
  59. var currentNetworkACL, err = FetchAllACLs(networkID)
  60. if err != nil {
  61. return nil, err
  62. }
  63. acls.AclMutex.Lock()
  64. currentNetworkACL[acls.AclID(nodeID)] = acl
  65. acls.AclMutex.Unlock()
  66. return currentNetworkACL[acls.AclID(nodeID)].Save(acls.ContainerID(networkID), acls.AclID(nodeID))
  67. }
  68. // RemoveNodeACL - removes a specific Node's ACL, returns the NetworkACL and error
  69. func RemoveNodeACL(networkID NetworkID, nodeID NodeID) (acls.ACLContainer, error) {
  70. var currentNetworkACL, err = FetchAllACLs(networkID)
  71. if err != nil {
  72. return nil, err
  73. }
  74. for currentNodeID := range currentNetworkACL {
  75. if NodeID(currentNodeID) != nodeID {
  76. currentNetworkACL[currentNodeID].Remove(acls.AclID(nodeID))
  77. }
  78. }
  79. delete(currentNetworkACL, acls.AclID(nodeID))
  80. return currentNetworkACL.Save(acls.ContainerID(networkID))
  81. }
  82. // DeleteACLContainer - removes an ACLContainer state from db
  83. func DeleteACLContainer(network NetworkID) error {
  84. err := database.DeleteRecord(database.NODE_ACLS_TABLE_NAME, string(network))
  85. if err != nil {
  86. return err
  87. }
  88. if servercfg.CacheEnabled() {
  89. acls.DeleteAclFromCache(acls.ContainerID(network))
  90. }
  91. return nil
  92. }