You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
5.4 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
5 years ago
7 years ago
5 years ago
7 years ago
5 years ago
5 years ago
7 years ago
5 years ago
5 years ago
6 years ago
  1. package s3api
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/chrislusf/seaweedfs/weed/glog"
  6. "github.com/chrislusf/seaweedfs/weed/pb"
  7. "github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
  8. "github.com/chrislusf/seaweedfs/weed/pb/iam_pb"
  9. proto "github.com/golang/protobuf/proto"
  10. "google.golang.org/grpc"
  11. "strings"
  12. )
  13. func (s3a *S3ApiServer) mkdir(parentDirectoryPath string, dirName string, fn func(entry *filer_pb.Entry)) error {
  14. return filer_pb.Mkdir(s3a, parentDirectoryPath, dirName, fn)
  15. }
  16. func (s3a *S3ApiServer) mkFile(parentDirectoryPath string, fileName string, chunks []*filer_pb.FileChunk) error {
  17. return filer_pb.MkFile(s3a, parentDirectoryPath, fileName, chunks)
  18. }
  19. func (s3a *S3ApiServer) list(parentDirectoryPath, prefix, startFrom string, inclusive bool, limit uint32) (entries []*filer_pb.Entry, isLast bool, err error) {
  20. err = filer_pb.List(s3a, parentDirectoryPath, prefix, func(entry *filer_pb.Entry, isLastEntry bool) error {
  21. entries = append(entries, entry)
  22. if isLastEntry {
  23. isLast = true
  24. }
  25. return nil
  26. }, startFrom, inclusive, limit)
  27. return
  28. }
  29. func (s3a *S3ApiServer) rm(parentDirectoryPath, entryName string, isDeleteData, isRecursive bool) error {
  30. return s3a.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
  31. err := doDeleteEntry(client, parentDirectoryPath, entryName, isDeleteData, isRecursive)
  32. if err != nil {
  33. return err
  34. }
  35. return nil
  36. })
  37. }
  38. func doDeleteEntry(client filer_pb.SeaweedFilerClient, parentDirectoryPath string, entryName string, isDeleteData bool, isRecursive bool) error {
  39. request := &filer_pb.DeleteEntryRequest{
  40. Directory: parentDirectoryPath,
  41. Name: entryName,
  42. IsDeleteData: isDeleteData,
  43. IsRecursive: isRecursive,
  44. }
  45. glog.V(1).Infof("delete entry %v/%v: %v", parentDirectoryPath, entryName, request)
  46. if resp, err := client.DeleteEntry(context.Background(), request); err != nil {
  47. glog.V(0).Infof("delete entry %v: %v", request, err)
  48. return fmt.Errorf("delete entry %s/%s: %v", parentDirectoryPath, entryName, err)
  49. } else {
  50. if resp.Error != "" {
  51. return fmt.Errorf("delete entry %s/%s: %v", parentDirectoryPath, entryName, resp.Error)
  52. }
  53. }
  54. return nil
  55. }
  56. func (s3a *S3ApiServer) exists(parentDirectoryPath string, entryName string, isDirectory bool) (exists bool, err error) {
  57. return filer_pb.Exists(s3a, parentDirectoryPath, entryName, isDirectory)
  58. }
  59. func loadS3config(iam *IdentityAccessManagement, option *S3ApiServerOption) error {
  60. return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
  61. client := filer_pb.NewSeaweedFilerClient(grpcConnection)
  62. resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
  63. Directory: "/.configs",
  64. Name: "s3identities",
  65. })
  66. if err != nil {
  67. return err
  68. }
  69. for name, ident := range resp.Entry.Extended {
  70. t := &Identity{
  71. Name: name,
  72. Credentials: nil,
  73. Actions: nil,
  74. }
  75. identity := &iam_pb.Identity{}
  76. if err := proto.Unmarshal(ident, identity); err != nil {
  77. return err
  78. }
  79. for _, action := range identity.Actions {
  80. t.Actions = append(t.Actions, Action(action))
  81. }
  82. for _, cred := range identity.Credentials {
  83. t.Credentials = append(t.Credentials, &Credential{
  84. AccessKey: cred.AccessKey,
  85. SecretKey: cred.SecretKey,
  86. })
  87. glog.V(0).Infof("AccessKey %s, SecretKey: %s", cred.AccessKey, cred.SecretKey)
  88. }
  89. iam.identities = append(iam.identities, t)
  90. }
  91. return nil
  92. }, option.FilerGrpcAddress, option.GrpcDialOption)
  93. }
  94. /* testing save
  95. func saveS3config(iam *IdentityAccessManagement, option *S3ApiServerOption) (error) {
  96. return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
  97. client := filer_pb.NewSeaweedFilerClient(grpcConnection)
  98. entry := &filer_pb.Entry{
  99. Name: "s3identities",
  100. IsDirectory: false,
  101. Attributes: &filer_pb.FuseAttributes{
  102. Mtime: time.Now().Unix(),
  103. Crtime: time.Now().Unix(),
  104. FileMode: uint32(0644),
  105. Collection: "",
  106. Replication: "",
  107. },
  108. Extended: make(map[string][]byte),
  109. }
  110. for _, identity := range iam.identities {
  111. glog.V(0).Infof("get iam identities %s", identity.Name)
  112. i := &iam_pb.Identity{
  113. Name: identity.Name,
  114. Credentials: []*iam_pb.Credential{},
  115. Actions: []string{},
  116. }
  117. for _, cred := range identity.Credentials {
  118. i.Credentials = append(i.Credentials, &iam_pb.Credential{
  119. AccessKey: cred.AccessKey,
  120. SecretKey: cred.SecretKey,
  121. })
  122. }
  123. for _, action := range identity.Actions {
  124. i.Actions = append(i.Actions, string(action))
  125. }
  126. ident, err := proto.Marshal(i)
  127. if err != nil {
  128. return err
  129. }
  130. entry.Extended[identity.Name] = ident
  131. }
  132. _, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
  133. Directory: "/.configs",
  134. Name: "s3identities",
  135. })
  136. if err == filer_pb.ErrNotFound {
  137. err = filer_pb.CreateEntry(client, &filer_pb.CreateEntryRequest{
  138. Directory: "/.configs",
  139. Entry: entry,
  140. IsFromOtherCluster: false,
  141. Signatures: nil,
  142. })
  143. } else {
  144. err = filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{
  145. Directory: "/.configs",
  146. Entry: entry,
  147. IsFromOtherCluster: false,
  148. Signatures: nil,
  149. })
  150. }
  151. return err
  152. },option.FilerGrpcAddress, option.GrpcDialOption)
  153. }
  154. */
  155. func objectKey(key *string) *string {
  156. if strings.HasPrefix(*key, "/") {
  157. t := (*key)[1:]
  158. return &t
  159. }
  160. return key
  161. }