seaweedfs/weed/command/mount_std.go

121 lines
2.7 KiB
Go
Raw Normal View History

// +build linux darwin
package command
import (
"fmt"
2017-03-06 05:04:46 +00:00
"os"
"runtime"
2017-03-10 02:28:07 +00:00
"path"
"bazil.org/fuse"
"bazil.org/fuse/fs"
"github.com/chrislusf/seaweedfs/weed/filer"
"github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/storage"
"github.com/chrislusf/seaweedfs/weed/util"
"golang.org/x/net/context"
)
func runMount(cmd *Command, args []string) bool {
fmt.Printf("This is SeaweedFS version %s %s %s\n", util.VERSION, runtime.GOOS, runtime.GOARCH)
if *mountOptions.dir == "" {
fmt.Printf("Please specify the mount directory via \"-dir\"")
return false
}
2017-03-10 02:28:07 +00:00
c, err := fuse.Mount(*mountOptions.dir, fuse.LocalVolume())
if err != nil {
glog.Fatal(err)
return false
}
2014-05-13 22:04:04 +00:00
OnInterrupt(func() {
fuse.Unmount(*mountOptions.dir)
c.Close()
})
err = fs.Serve(c, WFS{})
if err != nil {
fuse.Unmount(*mountOptions.dir)
}
// check if the mount process has an error to report
<-c.Ready
if err := c.MountError; err != nil {
glog.Fatal(err)
}
return true
}
2017-03-06 05:04:46 +00:00
type WFS struct{}
2017-03-06 05:04:46 +00:00
func (WFS) Root() (fs.Node, error) {
2017-03-10 02:28:07 +00:00
return &Dir{Path: "/"}, nil
}
type Dir struct {
2017-03-10 02:28:07 +00:00
Id uint64
Path string
DirentMap map[string]*fuse.Dirent
}
2017-03-10 02:28:07 +00:00
func (dir *Dir) Attr(context context.Context, attr *fuse.Attr) error {
attr.Inode = dir.Id
2017-03-06 05:04:46 +00:00
attr.Mode = os.ModeDir | 0555
return nil
}
2017-03-10 02:28:07 +00:00
func (dir *Dir) Lookup(ctx context.Context, name string) (fs.Node, error) {
if dirent, ok := dir.DirentMap[name]; ok {
if dirent.Type == fuse.DT_File {
return &File{dirent.Inode, dirent.Name}, nil
}
return &Dir{
Id: dirent.Inode,
Path: path.Join(dir.Path, dirent.Name),
}, nil
}
2017-03-10 02:28:07 +00:00
return nil, fuse.ENOENT
}
2017-03-10 02:28:07 +00:00
func (dir *Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
2015-03-10 07:20:31 +00:00
var ret []fuse.Dirent
2017-03-10 02:28:07 +00:00
if dir.DirentMap == nil {
dir.DirentMap = make(map[string]*fuse.Dirent)
}
if dirs, e := filer.ListDirectories(*mountOptions.filer, dir.Path); e == nil {
for _, d := range dirs.Directories {
dirId := uint64(d.Id)
2017-03-10 02:28:07 +00:00
dirent := fuse.Dirent{Inode: dirId, Name: d.Name, Type: fuse.DT_Dir}
ret = append(ret, dirent)
dir.DirentMap[d.Name] = &dirent
}
}
if files, e := filer.ListFiles(*mountOptions.filer, dir.Path, ""); e == nil {
for _, f := range files.Files {
if fileId, e := storage.ParseFileId(string(f.Id)); e == nil {
fileInode := uint64(fileId.VolumeId)<<48 + fileId.Key
2017-03-10 02:28:07 +00:00
dirent := fuse.Dirent{Inode: fileInode, Name: f.Name, Type: fuse.DT_File}
ret = append(ret, dirent)
dir.DirentMap[f.Name] = &dirent
}
}
}
return ret, nil
}
2017-03-06 05:04:46 +00:00
type File struct {
2017-03-10 02:28:07 +00:00
Id uint64
// FileId filer.FileId
Name string
2017-03-06 05:04:46 +00:00
}
2017-03-10 02:28:07 +00:00
func (file *File) Attr(context context.Context, attr *fuse.Attr) error {
attr.Inode = file.Id
2017-03-10 06:45:53 +00:00
attr.Mode = 0000
2017-03-06 05:04:46 +00:00
return nil
}