Chris Lu
7 years ago
11 changed files with 950 additions and 254 deletions
-
23weed/command/filer.go
-
125weed/filer/client_operations.go
-
583weed/filer/filer.pb.go
-
108weed/filesys/dir.go
-
67weed/filesys/file.go
-
20weed/filesys/wfs.go
-
1weed/pb/Makefile
-
85weed/pb/filer.proto
-
108weed/server/filer_grpc_server.go
-
1weed/server/filer_server.go
-
83weed/server/filer_server_handlers_api.go
@ -1,125 +0,0 @@ |
|||||
package filer |
|
||||
|
|
||||
import ( |
|
||||
"encoding/json" |
|
||||
"errors" |
|
||||
"fmt" |
|
||||
"net/url" |
|
||||
|
|
||||
"github.com/chrislusf/seaweedfs/weed/util" |
|
||||
) |
|
||||
|
|
||||
type ApiRequest struct { |
|
||||
Command string //"listFiles", "listDirectories", "getFileSize"
|
|
||||
Directory string |
|
||||
FileName string |
|
||||
FileId string |
|
||||
} |
|
||||
|
|
||||
type ListFilesResult struct { |
|
||||
Files []FileEntry |
|
||||
Error string `json:"error,omitempty"` |
|
||||
} |
|
||||
|
|
||||
func ListFiles(server string, directory string, fileName string) (ret *ListFilesResult, err error) { |
|
||||
ret = new(ListFilesResult) |
|
||||
if err = call(server, ApiRequest{Command: "listFiles", Directory: directory, FileName: fileName}, ret); err == nil { |
|
||||
if ret.Error != "" { |
|
||||
return nil, errors.New(ret.Error) |
|
||||
} |
|
||||
return ret, nil |
|
||||
} |
|
||||
return nil, err |
|
||||
} |
|
||||
|
|
||||
type GetFileSizeResult struct { |
|
||||
Size uint64 |
|
||||
Error string `json:"error,omitempty"` |
|
||||
} |
|
||||
|
|
||||
func GetFileSize(server string, fileId string) (ret *GetFileSizeResult, err error) { |
|
||||
ret = new(GetFileSizeResult) |
|
||||
if err = call(server, ApiRequest{Command: "getFileSize", FileId: fileId}, ret); err == nil { |
|
||||
if ret.Error != "" { |
|
||||
return nil, errors.New(ret.Error) |
|
||||
} |
|
||||
return ret, nil |
|
||||
} |
|
||||
return nil, err |
|
||||
} |
|
||||
|
|
||||
type GetFileContentResult struct { |
|
||||
Content []byte |
|
||||
Error string `json:"error,omitempty"` |
|
||||
} |
|
||||
|
|
||||
func GetFileContent(server string, fileId string) (ret *GetFileContentResult, err error) { |
|
||||
ret = new(GetFileContentResult) |
|
||||
if err = call(server, ApiRequest{Command: "getFileContent", FileId: fileId}, ret); err == nil { |
|
||||
if ret.Error != "" { |
|
||||
return nil, errors.New(ret.Error) |
|
||||
} |
|
||||
return ret, nil |
|
||||
} |
|
||||
return nil, err |
|
||||
} |
|
||||
|
|
||||
type ListDirectoriesResult struct { |
|
||||
Directories []DirectoryName |
|
||||
Error string `json:"error,omitempty"` |
|
||||
} |
|
||||
|
|
||||
func ListDirectories(server string, directory string) (ret *ListDirectoriesResult, err error) { |
|
||||
ret = new(ListDirectoriesResult) |
|
||||
if err := call(server, ApiRequest{Command: "listDirectories", Directory: directory}, ret); err == nil { |
|
||||
if ret.Error != "" { |
|
||||
return nil, errors.New(ret.Error) |
|
||||
} |
|
||||
return ret, nil |
|
||||
} |
|
||||
return nil, err |
|
||||
} |
|
||||
|
|
||||
type LookupDirectoryEntryResult struct { |
|
||||
Found bool |
|
||||
FileId string |
|
||||
Error string `json:"error,omitempty"` |
|
||||
} |
|
||||
|
|
||||
func LookupDirectoryEntry(server string, directory string, name string) (ret *LookupDirectoryEntryResult, err error) { |
|
||||
ret = new(LookupDirectoryEntryResult) |
|
||||
if err := call(server, ApiRequest{Command: "lookupDirectoryEntry", Directory: directory, FileName: name}, ret); err == nil { |
|
||||
if ret.Error != "" { |
|
||||
return nil, errors.New(ret.Error) |
|
||||
} |
|
||||
return ret, nil |
|
||||
} |
|
||||
return nil, err |
|
||||
} |
|
||||
|
|
||||
func DeleteDirectoryOrFile(server string, path string, isDir bool) error { |
|
||||
destUrl := fmt.Sprintf("http://%s%s", server, path) |
|
||||
if isDir { |
|
||||
destUrl += "/?recursive=true" |
|
||||
} |
|
||||
return util.Delete(destUrl, "") |
|
||||
} |
|
||||
|
|
||||
func call(server string, request ApiRequest, ret interface{}) error { |
|
||||
b, err := json.Marshal(request) |
|
||||
if err != nil { |
|
||||
fmt.Println("error:", err) |
|
||||
return nil |
|
||||
} |
|
||||
values := make(url.Values) |
|
||||
values.Add("request", string(b)) |
|
||||
jsonBlob, err := util.Post("http://"+server+"/__api__", values) |
|
||||
if err != nil { |
|
||||
return err |
|
||||
} |
|
||||
err = json.Unmarshal(jsonBlob, ret) |
|
||||
if err != nil { |
|
||||
return err |
|
||||
} |
|
||||
return nil |
|
||||
} |
|
@ -0,0 +1,583 @@ |
|||||
|
// Code generated by protoc-gen-go.
|
||||
|
// source: filer.proto
|
||||
|
// DO NOT EDIT!
|
||||
|
|
||||
|
/* |
||||
|
Package filer is a generated protocol buffer package. |
||||
|
|
||||
|
It is generated from these files: |
||||
|
filer.proto |
||||
|
|
||||
|
It has these top-level messages: |
||||
|
LookupDirectoryEntryRequest |
||||
|
LookupDirectoryEntryResponse |
||||
|
ListEntriesRequest |
||||
|
ListEntriesResponse |
||||
|
Entry |
||||
|
FuseAttributes |
||||
|
GetFileAttributesRequest |
||||
|
GetFileAttributesResponse |
||||
|
GetFileContentRequest |
||||
|
GetFileContentResponse |
||||
|
DeleteEntryRequest |
||||
|
DeleteEntryResponse |
||||
|
*/ |
||||
|
package filer |
||||
|
|
||||
|
import proto "github.com/golang/protobuf/proto" |
||||
|
import fmt "fmt" |
||||
|
import math "math" |
||||
|
|
||||
|
import ( |
||||
|
context "golang.org/x/net/context" |
||||
|
grpc "google.golang.org/grpc" |
||||
|
) |
||||
|
|
||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
var _ = proto.Marshal |
||||
|
var _ = fmt.Errorf |
||||
|
var _ = math.Inf |
||||
|
|
||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||
|
// is compatible with the proto package it is being compiled against.
|
||||
|
// A compilation error at this line likely means your copy of the
|
||||
|
// proto package needs to be updated.
|
||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||
|
|
||||
|
type LookupDirectoryEntryRequest struct { |
||||
|
Directory string `protobuf:"bytes,1,opt,name=directory" json:"directory,omitempty"` |
||||
|
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *LookupDirectoryEntryRequest) Reset() { *m = LookupDirectoryEntryRequest{} } |
||||
|
func (m *LookupDirectoryEntryRequest) String() string { return proto.CompactTextString(m) } |
||||
|
func (*LookupDirectoryEntryRequest) ProtoMessage() {} |
||||
|
func (*LookupDirectoryEntryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } |
||||
|
|
||||
|
func (m *LookupDirectoryEntryRequest) GetDirectory() string { |
||||
|
if m != nil { |
||||
|
return m.Directory |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *LookupDirectoryEntryRequest) GetName() string { |
||||
|
if m != nil { |
||||
|
return m.Name |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
type LookupDirectoryEntryResponse struct { |
||||
|
Entry *Entry `protobuf:"bytes,1,opt,name=entry" json:"entry,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *LookupDirectoryEntryResponse) Reset() { *m = LookupDirectoryEntryResponse{} } |
||||
|
func (m *LookupDirectoryEntryResponse) String() string { return proto.CompactTextString(m) } |
||||
|
func (*LookupDirectoryEntryResponse) ProtoMessage() {} |
||||
|
func (*LookupDirectoryEntryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } |
||||
|
|
||||
|
func (m *LookupDirectoryEntryResponse) GetEntry() *Entry { |
||||
|
if m != nil { |
||||
|
return m.Entry |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
type ListEntriesRequest struct { |
||||
|
Directory string `protobuf:"bytes,1,opt,name=directory" json:"directory,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *ListEntriesRequest) Reset() { *m = ListEntriesRequest{} } |
||||
|
func (m *ListEntriesRequest) String() string { return proto.CompactTextString(m) } |
||||
|
func (*ListEntriesRequest) ProtoMessage() {} |
||||
|
func (*ListEntriesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } |
||||
|
|
||||
|
func (m *ListEntriesRequest) GetDirectory() string { |
||||
|
if m != nil { |
||||
|
return m.Directory |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
type ListEntriesResponse struct { |
||||
|
Entries []*Entry `protobuf:"bytes,1,rep,name=entries" json:"entries,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *ListEntriesResponse) Reset() { *m = ListEntriesResponse{} } |
||||
|
func (m *ListEntriesResponse) String() string { return proto.CompactTextString(m) } |
||||
|
func (*ListEntriesResponse) ProtoMessage() {} |
||||
|
func (*ListEntriesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } |
||||
|
|
||||
|
func (m *ListEntriesResponse) GetEntries() []*Entry { |
||||
|
if m != nil { |
||||
|
return m.Entries |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
type Entry struct { |
||||
|
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` |
||||
|
IsDirectory bool `protobuf:"varint,2,opt,name=is_directory,json=isDirectory" json:"is_directory,omitempty"` |
||||
|
FileId string `protobuf:"bytes,3,opt,name=file_id,json=fileId" json:"file_id,omitempty"` |
||||
|
Attributes *FuseAttributes `protobuf:"bytes,4,opt,name=attributes" json:"attributes,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *Entry) Reset() { *m = Entry{} } |
||||
|
func (m *Entry) String() string { return proto.CompactTextString(m) } |
||||
|
func (*Entry) ProtoMessage() {} |
||||
|
func (*Entry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } |
||||
|
|
||||
|
func (m *Entry) GetName() string { |
||||
|
if m != nil { |
||||
|
return m.Name |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *Entry) GetIsDirectory() bool { |
||||
|
if m != nil { |
||||
|
return m.IsDirectory |
||||
|
} |
||||
|
return false |
||||
|
} |
||||
|
|
||||
|
func (m *Entry) GetFileId() string { |
||||
|
if m != nil { |
||||
|
return m.FileId |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *Entry) GetAttributes() *FuseAttributes { |
||||
|
if m != nil { |
||||
|
return m.Attributes |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
type FuseAttributes struct { |
||||
|
FileSize uint64 `protobuf:"varint,1,opt,name=file_size,json=fileSize" json:"file_size,omitempty"` |
||||
|
Mtime int64 `protobuf:"varint,2,opt,name=mtime" json:"mtime,omitempty"` |
||||
|
FileMode uint32 `protobuf:"varint,3,opt,name=file_mode,json=fileMode" json:"file_mode,omitempty"` |
||||
|
Uid uint32 `protobuf:"varint,4,opt,name=uid" json:"uid,omitempty"` |
||||
|
Gid uint32 `protobuf:"varint,5,opt,name=gid" json:"gid,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *FuseAttributes) Reset() { *m = FuseAttributes{} } |
||||
|
func (m *FuseAttributes) String() string { return proto.CompactTextString(m) } |
||||
|
func (*FuseAttributes) ProtoMessage() {} |
||||
|
func (*FuseAttributes) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } |
||||
|
|
||||
|
func (m *FuseAttributes) GetFileSize() uint64 { |
||||
|
if m != nil { |
||||
|
return m.FileSize |
||||
|
} |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
func (m *FuseAttributes) GetMtime() int64 { |
||||
|
if m != nil { |
||||
|
return m.Mtime |
||||
|
} |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
func (m *FuseAttributes) GetFileMode() uint32 { |
||||
|
if m != nil { |
||||
|
return m.FileMode |
||||
|
} |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
func (m *FuseAttributes) GetUid() uint32 { |
||||
|
if m != nil { |
||||
|
return m.Uid |
||||
|
} |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
func (m *FuseAttributes) GetGid() uint32 { |
||||
|
if m != nil { |
||||
|
return m.Gid |
||||
|
} |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
type GetFileAttributesRequest struct { |
||||
|
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` |
||||
|
ParentDir string `protobuf:"bytes,2,opt,name=parent_dir,json=parentDir" json:"parent_dir,omitempty"` |
||||
|
FileId string `protobuf:"bytes,3,opt,name=file_id,json=fileId" json:"file_id,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *GetFileAttributesRequest) Reset() { *m = GetFileAttributesRequest{} } |
||||
|
func (m *GetFileAttributesRequest) String() string { return proto.CompactTextString(m) } |
||||
|
func (*GetFileAttributesRequest) ProtoMessage() {} |
||||
|
func (*GetFileAttributesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } |
||||
|
|
||||
|
func (m *GetFileAttributesRequest) GetName() string { |
||||
|
if m != nil { |
||||
|
return m.Name |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *GetFileAttributesRequest) GetParentDir() string { |
||||
|
if m != nil { |
||||
|
return m.ParentDir |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *GetFileAttributesRequest) GetFileId() string { |
||||
|
if m != nil { |
||||
|
return m.FileId |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
type GetFileAttributesResponse struct { |
||||
|
Attributes *FuseAttributes `protobuf:"bytes,1,opt,name=attributes" json:"attributes,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *GetFileAttributesResponse) Reset() { *m = GetFileAttributesResponse{} } |
||||
|
func (m *GetFileAttributesResponse) String() string { return proto.CompactTextString(m) } |
||||
|
func (*GetFileAttributesResponse) ProtoMessage() {} |
||||
|
func (*GetFileAttributesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } |
||||
|
|
||||
|
func (m *GetFileAttributesResponse) GetAttributes() *FuseAttributes { |
||||
|
if m != nil { |
||||
|
return m.Attributes |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
type GetFileContentRequest struct { |
||||
|
FileId string `protobuf:"bytes,1,opt,name=file_id,json=fileId" json:"file_id,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *GetFileContentRequest) Reset() { *m = GetFileContentRequest{} } |
||||
|
func (m *GetFileContentRequest) String() string { return proto.CompactTextString(m) } |
||||
|
func (*GetFileContentRequest) ProtoMessage() {} |
||||
|
func (*GetFileContentRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } |
||||
|
|
||||
|
func (m *GetFileContentRequest) GetFileId() string { |
||||
|
if m != nil { |
||||
|
return m.FileId |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
type GetFileContentResponse struct { |
||||
|
Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *GetFileContentResponse) Reset() { *m = GetFileContentResponse{} } |
||||
|
func (m *GetFileContentResponse) String() string { return proto.CompactTextString(m) } |
||||
|
func (*GetFileContentResponse) ProtoMessage() {} |
||||
|
func (*GetFileContentResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } |
||||
|
|
||||
|
func (m *GetFileContentResponse) GetContent() []byte { |
||||
|
if m != nil { |
||||
|
return m.Content |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
type DeleteEntryRequest struct { |
||||
|
Directory string `protobuf:"bytes,1,opt,name=directory" json:"directory,omitempty"` |
||||
|
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` |
||||
|
IsDirectory bool `protobuf:"varint,3,opt,name=is_directory,json=isDirectory" json:"is_directory,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (m *DeleteEntryRequest) Reset() { *m = DeleteEntryRequest{} } |
||||
|
func (m *DeleteEntryRequest) String() string { return proto.CompactTextString(m) } |
||||
|
func (*DeleteEntryRequest) ProtoMessage() {} |
||||
|
func (*DeleteEntryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } |
||||
|
|
||||
|
func (m *DeleteEntryRequest) GetDirectory() string { |
||||
|
if m != nil { |
||||
|
return m.Directory |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *DeleteEntryRequest) GetName() string { |
||||
|
if m != nil { |
||||
|
return m.Name |
||||
|
} |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
func (m *DeleteEntryRequest) GetIsDirectory() bool { |
||||
|
if m != nil { |
||||
|
return m.IsDirectory |
||||
|
} |
||||
|
return false |
||||
|
} |
||||
|
|
||||
|
type DeleteEntryResponse struct { |
||||
|
} |
||||
|
|
||||
|
func (m *DeleteEntryResponse) Reset() { *m = DeleteEntryResponse{} } |
||||
|
func (m *DeleteEntryResponse) String() string { return proto.CompactTextString(m) } |
||||
|
func (*DeleteEntryResponse) ProtoMessage() {} |
||||
|
func (*DeleteEntryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } |
||||
|
|
||||
|
func init() { |
||||
|
proto.RegisterType((*LookupDirectoryEntryRequest)(nil), "filer.LookupDirectoryEntryRequest") |
||||
|
proto.RegisterType((*LookupDirectoryEntryResponse)(nil), "filer.LookupDirectoryEntryResponse") |
||||
|
proto.RegisterType((*ListEntriesRequest)(nil), "filer.ListEntriesRequest") |
||||
|
proto.RegisterType((*ListEntriesResponse)(nil), "filer.ListEntriesResponse") |
||||
|
proto.RegisterType((*Entry)(nil), "filer.Entry") |
||||
|
proto.RegisterType((*FuseAttributes)(nil), "filer.FuseAttributes") |
||||
|
proto.RegisterType((*GetFileAttributesRequest)(nil), "filer.GetFileAttributesRequest") |
||||
|
proto.RegisterType((*GetFileAttributesResponse)(nil), "filer.GetFileAttributesResponse") |
||||
|
proto.RegisterType((*GetFileContentRequest)(nil), "filer.GetFileContentRequest") |
||||
|
proto.RegisterType((*GetFileContentResponse)(nil), "filer.GetFileContentResponse") |
||||
|
proto.RegisterType((*DeleteEntryRequest)(nil), "filer.DeleteEntryRequest") |
||||
|
proto.RegisterType((*DeleteEntryResponse)(nil), "filer.DeleteEntryResponse") |
||||
|
} |
||||
|
|
||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
var _ context.Context |
||||
|
var _ grpc.ClientConn |
||||
|
|
||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||
|
// is compatible with the grpc package it is being compiled against.
|
||||
|
const _ = grpc.SupportPackageIsVersion4 |
||||
|
|
||||
|
// Client API for SeaweedFiler service
|
||||
|
|
||||
|
type SeaweedFilerClient interface { |
||||
|
LookupDirectoryEntry(ctx context.Context, in *LookupDirectoryEntryRequest, opts ...grpc.CallOption) (*LookupDirectoryEntryResponse, error) |
||||
|
ListEntries(ctx context.Context, in *ListEntriesRequest, opts ...grpc.CallOption) (*ListEntriesResponse, error) |
||||
|
GetFileAttributes(ctx context.Context, in *GetFileAttributesRequest, opts ...grpc.CallOption) (*GetFileAttributesResponse, error) |
||||
|
GetFileContent(ctx context.Context, in *GetFileContentRequest, opts ...grpc.CallOption) (*GetFileContentResponse, error) |
||||
|
DeleteEntry(ctx context.Context, in *DeleteEntryRequest, opts ...grpc.CallOption) (*DeleteEntryResponse, error) |
||||
|
} |
||||
|
|
||||
|
type seaweedFilerClient struct { |
||||
|
cc *grpc.ClientConn |
||||
|
} |
||||
|
|
||||
|
func NewSeaweedFilerClient(cc *grpc.ClientConn) SeaweedFilerClient { |
||||
|
return &seaweedFilerClient{cc} |
||||
|
} |
||||
|
|
||||
|
func (c *seaweedFilerClient) LookupDirectoryEntry(ctx context.Context, in *LookupDirectoryEntryRequest, opts ...grpc.CallOption) (*LookupDirectoryEntryResponse, error) { |
||||
|
out := new(LookupDirectoryEntryResponse) |
||||
|
err := grpc.Invoke(ctx, "/filer.SeaweedFiler/LookupDirectoryEntry", in, out, c.cc, opts...) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
return out, nil |
||||
|
} |
||||
|
|
||||
|
func (c *seaweedFilerClient) ListEntries(ctx context.Context, in *ListEntriesRequest, opts ...grpc.CallOption) (*ListEntriesResponse, error) { |
||||
|
out := new(ListEntriesResponse) |
||||
|
err := grpc.Invoke(ctx, "/filer.SeaweedFiler/ListEntries", in, out, c.cc, opts...) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
return out, nil |
||||
|
} |
||||
|
|
||||
|
func (c *seaweedFilerClient) GetFileAttributes(ctx context.Context, in *GetFileAttributesRequest, opts ...grpc.CallOption) (*GetFileAttributesResponse, error) { |
||||
|
out := new(GetFileAttributesResponse) |
||||
|
err := grpc.Invoke(ctx, "/filer.SeaweedFiler/GetFileAttributes", in, out, c.cc, opts...) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
return out, nil |
||||
|
} |
||||
|
|
||||
|
func (c *seaweedFilerClient) GetFileContent(ctx context.Context, in *GetFileContentRequest, opts ...grpc.CallOption) (*GetFileContentResponse, error) { |
||||
|
out := new(GetFileContentResponse) |
||||
|
err := grpc.Invoke(ctx, "/filer.SeaweedFiler/GetFileContent", in, out, c.cc, opts...) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
return out, nil |
||||
|
} |
||||
|
|
||||
|
func (c *seaweedFilerClient) DeleteEntry(ctx context.Context, in *DeleteEntryRequest, opts ...grpc.CallOption) (*DeleteEntryResponse, error) { |
||||
|
out := new(DeleteEntryResponse) |
||||
|
err := grpc.Invoke(ctx, "/filer.SeaweedFiler/DeleteEntry", in, out, c.cc, opts...) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
return out, nil |
||||
|
} |
||||
|
|
||||
|
// Server API for SeaweedFiler service
|
||||
|
|
||||
|
type SeaweedFilerServer interface { |
||||
|
LookupDirectoryEntry(context.Context, *LookupDirectoryEntryRequest) (*LookupDirectoryEntryResponse, error) |
||||
|
ListEntries(context.Context, *ListEntriesRequest) (*ListEntriesResponse, error) |
||||
|
GetFileAttributes(context.Context, *GetFileAttributesRequest) (*GetFileAttributesResponse, error) |
||||
|
GetFileContent(context.Context, *GetFileContentRequest) (*GetFileContentResponse, error) |
||||
|
DeleteEntry(context.Context, *DeleteEntryRequest) (*DeleteEntryResponse, error) |
||||
|
} |
||||
|
|
||||
|
func RegisterSeaweedFilerServer(s *grpc.Server, srv SeaweedFilerServer) { |
||||
|
s.RegisterService(&_SeaweedFiler_serviceDesc, srv) |
||||
|
} |
||||
|
|
||||
|
func _SeaweedFiler_LookupDirectoryEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |
||||
|
in := new(LookupDirectoryEntryRequest) |
||||
|
if err := dec(in); err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
if interceptor == nil { |
||||
|
return srv.(SeaweedFilerServer).LookupDirectoryEntry(ctx, in) |
||||
|
} |
||||
|
info := &grpc.UnaryServerInfo{ |
||||
|
Server: srv, |
||||
|
FullMethod: "/filer.SeaweedFiler/LookupDirectoryEntry", |
||||
|
} |
||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) { |
||||
|
return srv.(SeaweedFilerServer).LookupDirectoryEntry(ctx, req.(*LookupDirectoryEntryRequest)) |
||||
|
} |
||||
|
return interceptor(ctx, in, info, handler) |
||||
|
} |
||||
|
|
||||
|
func _SeaweedFiler_ListEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |
||||
|
in := new(ListEntriesRequest) |
||||
|
if err := dec(in); err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
if interceptor == nil { |
||||
|
return srv.(SeaweedFilerServer).ListEntries(ctx, in) |
||||
|
} |
||||
|
info := &grpc.UnaryServerInfo{ |
||||
|
Server: srv, |
||||
|
FullMethod: "/filer.SeaweedFiler/ListEntries", |
||||
|
} |
||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) { |
||||
|
return srv.(SeaweedFilerServer).ListEntries(ctx, req.(*ListEntriesRequest)) |
||||
|
} |
||||
|
return interceptor(ctx, in, info, handler) |
||||
|
} |
||||
|
|
||||
|
func _SeaweedFiler_GetFileAttributes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |
||||
|
in := new(GetFileAttributesRequest) |
||||
|
if err := dec(in); err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
if interceptor == nil { |
||||
|
return srv.(SeaweedFilerServer).GetFileAttributes(ctx, in) |
||||
|
} |
||||
|
info := &grpc.UnaryServerInfo{ |
||||
|
Server: srv, |
||||
|
FullMethod: "/filer.SeaweedFiler/GetFileAttributes", |
||||
|
} |
||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) { |
||||
|
return srv.(SeaweedFilerServer).GetFileAttributes(ctx, req.(*GetFileAttributesRequest)) |
||||
|
} |
||||
|
return interceptor(ctx, in, info, handler) |
||||
|
} |
||||
|
|
||||
|
func _SeaweedFiler_GetFileContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |
||||
|
in := new(GetFileContentRequest) |
||||
|
if err := dec(in); err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
if interceptor == nil { |
||||
|
return srv.(SeaweedFilerServer).GetFileContent(ctx, in) |
||||
|
} |
||||
|
info := &grpc.UnaryServerInfo{ |
||||
|
Server: srv, |
||||
|
FullMethod: "/filer.SeaweedFiler/GetFileContent", |
||||
|
} |
||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) { |
||||
|
return srv.(SeaweedFilerServer).GetFileContent(ctx, req.(*GetFileContentRequest)) |
||||
|
} |
||||
|
return interceptor(ctx, in, info, handler) |
||||
|
} |
||||
|
|
||||
|
func _SeaweedFiler_DeleteEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |
||||
|
in := new(DeleteEntryRequest) |
||||
|
if err := dec(in); err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
if interceptor == nil { |
||||
|
return srv.(SeaweedFilerServer).DeleteEntry(ctx, in) |
||||
|
} |
||||
|
info := &grpc.UnaryServerInfo{ |
||||
|
Server: srv, |
||||
|
FullMethod: "/filer.SeaweedFiler/DeleteEntry", |
||||
|
} |
||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) { |
||||
|
return srv.(SeaweedFilerServer).DeleteEntry(ctx, req.(*DeleteEntryRequest)) |
||||
|
} |
||||
|
return interceptor(ctx, in, info, handler) |
||||
|
} |
||||
|
|
||||
|
var _SeaweedFiler_serviceDesc = grpc.ServiceDesc{ |
||||
|
ServiceName: "filer.SeaweedFiler", |
||||
|
HandlerType: (*SeaweedFilerServer)(nil), |
||||
|
Methods: []grpc.MethodDesc{ |
||||
|
{ |
||||
|
MethodName: "LookupDirectoryEntry", |
||||
|
Handler: _SeaweedFiler_LookupDirectoryEntry_Handler, |
||||
|
}, |
||||
|
{ |
||||
|
MethodName: "ListEntries", |
||||
|
Handler: _SeaweedFiler_ListEntries_Handler, |
||||
|
}, |
||||
|
{ |
||||
|
MethodName: "GetFileAttributes", |
||||
|
Handler: _SeaweedFiler_GetFileAttributes_Handler, |
||||
|
}, |
||||
|
{ |
||||
|
MethodName: "GetFileContent", |
||||
|
Handler: _SeaweedFiler_GetFileContent_Handler, |
||||
|
}, |
||||
|
{ |
||||
|
MethodName: "DeleteEntry", |
||||
|
Handler: _SeaweedFiler_DeleteEntry_Handler, |
||||
|
}, |
||||
|
}, |
||||
|
Streams: []grpc.StreamDesc{}, |
||||
|
Metadata: "filer.proto", |
||||
|
} |
||||
|
|
||||
|
func init() { proto.RegisterFile("filer.proto", fileDescriptor0) } |
||||
|
|
||||
|
var fileDescriptor0 = []byte{ |
||||
|
// 523 bytes of a gzipped FileDescriptorProto
|
||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x54, 0x4d, 0x6f, 0xd3, 0x40, |
||||
|
0x10, 0xad, 0x71, 0xdc, 0x34, 0x93, 0xb4, 0x82, 0x69, 0x03, 0xae, 0x9b, 0x8a, 0xb0, 0x48, 0x88, |
||||
|
0x53, 0x85, 0x82, 0x38, 0x72, 0x00, 0x42, 0x10, 0x52, 0x51, 0x25, 0xf7, 0xc2, 0xad, 0x72, 0xeb, |
||||
|
0x69, 0xb5, 0x22, 0xb1, 0x83, 0x77, 0x2d, 0xd4, 0x9e, 0x39, 0xf3, 0x4b, 0xf8, 0x91, 0x68, 0x3f, |
||||
|
0xec, 0xd8, 0xd8, 0xa9, 0x22, 0xf5, 0xe6, 0x7d, 0x33, 0x6f, 0xe6, 0xcd, 0x97, 0xa1, 0x7f, 0xcd, |
||||
|
0xe7, 0x94, 0x9d, 0x2c, 0xb3, 0x54, 0xa6, 0xe8, 0xe9, 0x07, 0x3b, 0x83, 0xa3, 0xd3, 0x34, 0xfd, |
||||
|
0x91, 0x2f, 0xa7, 0x3c, 0xa3, 0x2b, 0x99, 0x66, 0xb7, 0x9f, 0x13, 0x99, 0xdd, 0x86, 0xf4, 0x33, |
||||
|
0x27, 0x21, 0x71, 0x04, 0xbd, 0xb8, 0x30, 0xf8, 0xce, 0xd8, 0x79, 0xdd, 0x0b, 0x57, 0x00, 0x22, |
||||
|
0x74, 0x92, 0x68, 0x41, 0xfe, 0x23, 0x6d, 0xd0, 0xdf, 0xec, 0x23, 0x8c, 0xda, 0x03, 0x8a, 0x65, |
||||
|
0x9a, 0x08, 0x42, 0x06, 0x1e, 0x29, 0x40, 0x47, 0xeb, 0x4f, 0x06, 0x27, 0x46, 0x94, 0x71, 0x32, |
||||
|
0x26, 0x36, 0x01, 0x3c, 0xe5, 0x42, 0x2a, 0x8c, 0x93, 0xd8, 0x48, 0x0b, 0x7b, 0x0f, 0xfb, 0x35, |
||||
|
0x8e, 0x4d, 0xf7, 0x0a, 0xba, 0x64, 0x20, 0xdf, 0x19, 0xbb, 0x8d, 0x84, 0x85, 0x91, 0xfd, 0x71, |
||||
|
0xc0, 0xd3, 0x50, 0x59, 0x94, 0xb3, 0x2a, 0x0a, 0x5f, 0xc0, 0x80, 0x8b, 0x8b, 0x55, 0x76, 0x55, |
||||
|
0xf0, 0x4e, 0xd8, 0xe7, 0xa2, 0x2c, 0x12, 0x9f, 0x41, 0x57, 0x05, 0xbe, 0xe0, 0xb1, 0xef, 0x6a, |
||||
|
0xe6, 0xb6, 0x7a, 0x7e, 0x8d, 0xf1, 0x1d, 0x40, 0x24, 0x65, 0xc6, 0x2f, 0x73, 0x49, 0xc2, 0xef, |
||||
|
0xe8, 0xaa, 0x87, 0x56, 0xc4, 0x2c, 0x17, 0xf4, 0xa1, 0x34, 0x86, 0x15, 0x47, 0xf6, 0xdb, 0x81, |
||||
|
0xbd, 0xba, 0x19, 0x8f, 0xa0, 0xa7, 0x53, 0x08, 0x7e, 0x67, 0xe4, 0x75, 0xc2, 0x1d, 0x05, 0x9c, |
||||
|
0xf3, 0x3b, 0xc2, 0x03, 0xf0, 0x16, 0x92, 0xdb, 0x61, 0xb8, 0xa1, 0x79, 0x94, 0x94, 0x45, 0x1a, |
||||
|
0x93, 0xd6, 0xb5, 0x6b, 0x28, 0xdf, 0xd2, 0x98, 0xf0, 0x31, 0xb8, 0x39, 0x8f, 0xb5, 0xa4, 0xdd, |
||||
|
0x50, 0x7d, 0x2a, 0xe4, 0x86, 0xc7, 0xbe, 0x67, 0x90, 0x1b, 0x1e, 0xb3, 0x6b, 0xf0, 0xbf, 0x90, |
||||
|
0x9c, 0xf1, 0x79, 0x55, 0xa7, 0x1d, 0x48, 0x5b, 0xa7, 0x8e, 0x01, 0x96, 0x51, 0x46, 0x89, 0x54, |
||||
|
0xdd, 0xb2, 0x8b, 0xd1, 0x33, 0xc8, 0x94, 0x67, 0x6b, 0xbb, 0xc4, 0x42, 0x38, 0x6c, 0xc9, 0x63, |
||||
|
0x87, 0x58, 0x6f, 0xa1, 0xb3, 0x69, 0x0b, 0xdf, 0xc0, 0xd0, 0xc6, 0xfc, 0x94, 0x26, 0x92, 0x12, |
||||
|
0x59, 0x08, 0xaf, 0xa8, 0x70, 0x6a, 0x2a, 0x26, 0xf0, 0xf4, 0x7f, 0x86, 0x95, 0xe0, 0x43, 0xf7, |
||||
|
0xca, 0x40, 0x9a, 0x32, 0x08, 0x8b, 0x27, 0xe3, 0x80, 0x53, 0x9a, 0x93, 0xa4, 0x87, 0x1d, 0x4e, |
||||
|
0x63, 0xc7, 0xdc, 0xc6, 0x8e, 0xb1, 0x21, 0xec, 0xd7, 0x52, 0x19, 0x6d, 0x93, 0xbf, 0x2e, 0x0c, |
||||
|
0xce, 0x29, 0xfa, 0x45, 0x14, 0x2b, 0xe9, 0x19, 0x46, 0x70, 0xd0, 0x76, 0x83, 0xc8, 0x6c, 0xcf, |
||||
|
0xee, 0xb9, 0xf8, 0xe0, 0xe5, 0xbd, 0x3e, 0x26, 0x23, 0xdb, 0xc2, 0x19, 0xf4, 0x2b, 0xe7, 0x86, |
||||
|
0x87, 0x05, 0xab, 0x71, 0xb6, 0x41, 0xd0, 0x66, 0x2a, 0xe3, 0x7c, 0x87, 0x27, 0x8d, 0xb9, 0xe3, |
||||
|
0x73, 0x4b, 0x59, 0xb7, 0x79, 0xc1, 0x78, 0xbd, 0x43, 0x19, 0xf9, 0x0c, 0xf6, 0xea, 0xb3, 0xc4, |
||||
|
0x51, 0x9d, 0x55, 0x5f, 0x8a, 0xe0, 0x78, 0x8d, 0xb5, 0x5a, 0x72, 0xa5, 0xfb, 0x65, 0xc9, 0xcd, |
||||
|
0xe1, 0x97, 0x25, 0xb7, 0x0c, 0x8b, 0x6d, 0x5d, 0x6e, 0xeb, 0x1f, 0xf0, 0xdb, 0x7f, 0x01, 0x00, |
||||
|
0x00, 0xff, 0xff, 0x6f, 0xb3, 0x14, 0x9b, 0x8f, 0x05, 0x00, 0x00, |
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
syntax = "proto3"; |
||||
|
|
||||
|
package filer; |
||||
|
|
||||
|
////////////////////////////////////////////////// |
||||
|
|
||||
|
service SeaweedFiler { |
||||
|
|
||||
|
rpc LookupDirectoryEntry (LookupDirectoryEntryRequest) returns (LookupDirectoryEntryResponse) { |
||||
|
} |
||||
|
|
||||
|
rpc ListEntries (ListEntriesRequest) returns (ListEntriesResponse) { |
||||
|
} |
||||
|
|
||||
|
rpc GetFileAttributes (GetFileAttributesRequest) returns (GetFileAttributesResponse) { |
||||
|
} |
||||
|
|
||||
|
rpc GetFileContent (GetFileContentRequest) returns (GetFileContentResponse) { |
||||
|
} |
||||
|
|
||||
|
rpc DeleteEntry (DeleteEntryRequest) returns (DeleteEntryResponse) { |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
////////////////////////////////////////////////// |
||||
|
|
||||
|
message LookupDirectoryEntryRequest { |
||||
|
string directory = 1; |
||||
|
string name = 2; |
||||
|
} |
||||
|
|
||||
|
message LookupDirectoryEntryResponse { |
||||
|
Entry entry = 1; |
||||
|
} |
||||
|
|
||||
|
message ListEntriesRequest { |
||||
|
string directory = 1; |
||||
|
} |
||||
|
|
||||
|
message ListEntriesResponse { |
||||
|
repeated Entry entries = 1; |
||||
|
} |
||||
|
|
||||
|
message Entry { |
||||
|
string name = 1; |
||||
|
bool is_directory = 2; |
||||
|
string file_id = 3; |
||||
|
FuseAttributes attributes = 4; |
||||
|
} |
||||
|
|
||||
|
message FuseAttributes { |
||||
|
uint64 file_size = 1; |
||||
|
int64 mtime = 2; |
||||
|
uint32 file_mode = 3; |
||||
|
uint32 uid = 4; |
||||
|
uint32 gid = 5; |
||||
|
} |
||||
|
|
||||
|
message GetFileAttributesRequest { |
||||
|
string name = 1; |
||||
|
string parent_dir = 2; |
||||
|
string file_id = 3; |
||||
|
} |
||||
|
|
||||
|
message GetFileAttributesResponse { |
||||
|
FuseAttributes attributes = 1; |
||||
|
} |
||||
|
|
||||
|
message GetFileContentRequest { |
||||
|
string file_id = 1; |
||||
|
} |
||||
|
|
||||
|
message GetFileContentResponse { |
||||
|
bytes content = 1; |
||||
|
} |
||||
|
|
||||
|
message DeleteEntryRequest { |
||||
|
string directory = 1; |
||||
|
string name = 2; |
||||
|
bool is_directory = 3; |
||||
|
} |
||||
|
|
||||
|
message DeleteEntryResponse { |
||||
|
} |
@ -0,0 +1,108 @@ |
|||||
|
package weed_server |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filer" |
||||
|
"bazil.org/fuse" |
||||
|
"github.com/chrislusf/seaweedfs/weed/operation" |
||||
|
"github.com/chrislusf/seaweedfs/weed/util" |
||||
|
"strconv" |
||||
|
) |
||||
|
|
||||
|
func (fs *FilerServer) LookupDirectoryEntry(ctx context.Context, req *filer.LookupDirectoryEntryRequest) (*filer.LookupDirectoryEntryResponse, error) { |
||||
|
|
||||
|
found, fileId, err := fs.filer.LookupDirectoryEntry(req.Directory, req.Name) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
if !found { |
||||
|
return nil, fuse.ENOENT |
||||
|
} |
||||
|
|
||||
|
return &filer.LookupDirectoryEntryResponse{ |
||||
|
Entry: &filer.Entry{ |
||||
|
Name: req.Name, |
||||
|
IsDirectory: fileId == "", |
||||
|
FileId: fileId, |
||||
|
}, |
||||
|
}, nil |
||||
|
} |
||||
|
|
||||
|
func (fs *FilerServer) ListEntries(ctx context.Context, req *filer.ListEntriesRequest) (*filer.ListEntriesResponse, error) { |
||||
|
|
||||
|
directoryNames, err := fs.filer.ListDirectories(req.Directory) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
files, err := fs.filer.ListFiles(req.Directory, "", 1000) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
resp := &filer.ListEntriesResponse{} |
||||
|
for _, dir := range directoryNames { |
||||
|
resp.Entries = append(resp.Entries, &filer.Entry{ |
||||
|
Name: string(dir), |
||||
|
IsDirectory: true, |
||||
|
}) |
||||
|
} |
||||
|
for _, fileEntry := range files { |
||||
|
resp.Entries = append(resp.Entries, &filer.Entry{ |
||||
|
Name: fileEntry.Name, |
||||
|
IsDirectory: false, |
||||
|
FileId: string(fileEntry.Id), |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
return resp, nil |
||||
|
} |
||||
|
|
||||
|
func (fs *FilerServer) GetFileAttributes(ctx context.Context, req *filer.GetFileAttributesRequest) (*filer.GetFileAttributesResponse, error) { |
||||
|
|
||||
|
attributes := &filer.FuseAttributes{} |
||||
|
|
||||
|
server, err := operation.LookupFileId(fs.getMasterNode(), req.FileId) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
head, err := util.Head(server) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
attributes.FileSize, err = strconv.ParseUint(head.Get("Content-Length"), 10, 0) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
return &filer.GetFileAttributesResponse{ |
||||
|
Attributes: attributes, |
||||
|
}, nil |
||||
|
} |
||||
|
|
||||
|
func (fs *FilerServer) GetFileContent(ctx context.Context, req *filer.GetFileContentRequest) (*filer.GetFileContentResponse, error) { |
||||
|
|
||||
|
server, err := operation.LookupFileId(fs.getMasterNode(), req.FileId) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
content, err := util.Get(server) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
return &filer.GetFileContentResponse{ |
||||
|
Content: content, |
||||
|
}, nil |
||||
|
} |
||||
|
|
||||
|
func (fs *FilerServer) DeleteEntry(ctx context.Context, req *filer.DeleteEntryRequest) (resp *filer.DeleteEntryResponse, err error) { |
||||
|
if req.IsDirectory { |
||||
|
err = fs.filer.DeleteDirectory(req.Directory+req.Name, false) |
||||
|
} else { |
||||
|
fid, err := fs.filer.DeleteFile(req.Directory + req.Name) |
||||
|
if err == nil && fid != "" { |
||||
|
err = operation.DeleteFile(fs.getMasterNode(), fid, fs.jwt(fid)) |
||||
|
} |
||||
|
} |
||||
|
return nil, err |
||||
|
} |
@ -1,83 +0,0 @@ |
|||||
package weed_server |
|
||||
|
|
||||
import ( |
|
||||
"encoding/json" |
|
||||
"net/http" |
|
||||
"strconv" |
|
||||
|
|
||||
"github.com/chrislusf/seaweedfs/weed/filer" |
|
||||
"github.com/chrislusf/seaweedfs/weed/glog" |
|
||||
"github.com/chrislusf/seaweedfs/weed/operation" |
|
||||
"github.com/chrislusf/seaweedfs/weed/util" |
|
||||
) |
|
||||
|
|
||||
func (fs *FilerServer) apiHandler(w http.ResponseWriter, r *http.Request) { |
|
||||
request := r.FormValue("request") |
|
||||
apiRequest := filer.ApiRequest{} |
|
||||
|
|
||||
err := json.Unmarshal([]byte(request), &apiRequest) |
|
||||
if err != nil { |
|
||||
glog.V(0).Infoln("failing to read request", r.RequestURI, request) |
|
||||
writeJsonError(w, r, http.StatusInternalServerError, err) |
|
||||
} |
|
||||
|
|
||||
glog.V(2).Infof("api request: %+v", apiRequest) |
|
||||
|
|
||||
switch apiRequest.Command { |
|
||||
case "lookupDirectoryEntry": |
|
||||
res := filer.LookupDirectoryEntryResult{} |
|
||||
res.Found, res.FileId, err = fs.filer.LookupDirectoryEntry(apiRequest.Directory, apiRequest.FileName) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
} |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
case "listDirectories": |
|
||||
res := filer.ListDirectoriesResult{} |
|
||||
res.Directories, err = fs.filer.ListDirectories(apiRequest.Directory) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
} |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
case "listFiles": |
|
||||
res := filer.ListFilesResult{} |
|
||||
res.Files, err = fs.filer.ListFiles(apiRequest.Directory, apiRequest.FileName, 1000) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
} |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
case "getFileSize": |
|
||||
res := filer.GetFileSizeResult{} |
|
||||
server, err := operation.LookupFileId(fs.getMasterNode(), apiRequest.FileId) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
return |
|
||||
} |
|
||||
head, err := util.Head(server) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
return |
|
||||
} |
|
||||
res.Size, err = strconv.ParseUint(head.Get("Content-Length"), 10, 0) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
} |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
case "getFileContent": |
|
||||
res := filer.GetFileContentResult{} |
|
||||
server, err := operation.LookupFileId(fs.getMasterNode(), apiRequest.FileId) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
return |
|
||||
} |
|
||||
res.Content, err = util.Get(server) |
|
||||
if err != nil { |
|
||||
res.Error = err.Error() |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
return |
|
||||
} |
|
||||
writeJsonQuiet(w, r, http.StatusOK, res) |
|
||||
} |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue