modify.go 3.2 KB

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