mirror of
https://github.com/chrislusf/seaweedfs
synced 2024-09-06 00:50:37 +02:00
mount: add readOnly option
fix https://github.com/chrislusf/seaweedfs/issues/1961
This commit is contained in:
parent
6eee200c13
commit
0f64f5b9c8
|
@ -25,6 +25,7 @@ type MountOptions struct {
|
||||||
volumeServerAccess *string
|
volumeServerAccess *string
|
||||||
uidMap *string
|
uidMap *string
|
||||||
gidMap *string
|
gidMap *string
|
||||||
|
readOnly *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -55,6 +56,7 @@ func init() {
|
||||||
mountOptions.volumeServerAccess = cmdMount.Flag.String("volumeServerAccess", "direct", "access volume servers by [direct|publicUrl|filerProxy]")
|
mountOptions.volumeServerAccess = cmdMount.Flag.String("volumeServerAccess", "direct", "access volume servers by [direct|publicUrl|filerProxy]")
|
||||||
mountOptions.uidMap = cmdMount.Flag.String("map.uid", "", "map local uid to uid on filer, comma-separated <local_uid>:<filer_uid>")
|
mountOptions.uidMap = cmdMount.Flag.String("map.uid", "", "map local uid to uid on filer, comma-separated <local_uid>:<filer_uid>")
|
||||||
mountOptions.gidMap = cmdMount.Flag.String("map.gid", "", "map local gid to gid on filer, comma-separated <local_gid>:<filer_gid>")
|
mountOptions.gidMap = cmdMount.Flag.String("map.gid", "", "map local gid to gid on filer, comma-separated <local_gid>:<filer_gid>")
|
||||||
|
mountOptions.readOnly = cmdMount.Flag.Bool("readOnly", false, "read only")
|
||||||
|
|
||||||
mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file")
|
mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file")
|
||||||
mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file")
|
mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file")
|
||||||
|
|
|
@ -203,6 +203,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool {
|
||||||
VolumeServerAccess: *mountOptions.volumeServerAccess,
|
VolumeServerAccess: *mountOptions.volumeServerAccess,
|
||||||
Cipher: cipher,
|
Cipher: cipher,
|
||||||
UidGidMapper: uidGidMapper,
|
UidGidMapper: uidGidMapper,
|
||||||
|
ReadOnly: *option.readOnly,
|
||||||
})
|
})
|
||||||
|
|
||||||
// mount
|
// mount
|
||||||
|
|
|
@ -128,6 +128,10 @@ func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.N
|
||||||
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest,
|
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest,
|
||||||
resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
|
resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return nil, nil, fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0)
|
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -148,6 +152,10 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest,
|
||||||
|
|
||||||
func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) {
|
func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return nil, fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false)
|
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -202,6 +210,10 @@ func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, ex
|
||||||
|
|
||||||
func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) {
|
func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return nil, fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("mkdir %s: %s", dir.FullPath(), req.Name)
|
glog.V(4).Infof("mkdir %s: %s", dir.FullPath(), req.Name)
|
||||||
|
|
||||||
newEntry := &filer_pb.Entry{
|
newEntry := &filer_pb.Entry{
|
||||||
|
@ -356,6 +368,11 @@ func findFileType(mode uint16) fuse.DirentType {
|
||||||
|
|
||||||
func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error {
|
func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if !req.Dir {
|
if !req.Dir {
|
||||||
return dir.removeOneFile(req)
|
return dir.removeOneFile(req)
|
||||||
}
|
}
|
||||||
|
@ -429,6 +446,10 @@ func (dir *Dir) removeFolder(req *fuse.RemoveRequest) error {
|
||||||
|
|
||||||
func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
|
func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("%v dir setattr %+v", dir.FullPath(), req)
|
glog.V(4).Infof("%v dir setattr %+v", dir.FullPath(), req)
|
||||||
|
|
||||||
if err := dir.maybeLoadEntry(); err != nil {
|
if err := dir.maybeLoadEntry(); err != nil {
|
||||||
|
@ -457,6 +478,10 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus
|
||||||
|
|
||||||
func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error {
|
func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("dir Setxattr %s: %s", dir.FullPath(), req.Name)
|
glog.V(4).Infof("dir Setxattr %s: %s", dir.FullPath(), req.Name)
|
||||||
|
|
||||||
if err := dir.maybeLoadEntry(); err != nil {
|
if err := dir.maybeLoadEntry(); err != nil {
|
||||||
|
@ -473,6 +498,10 @@ func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error {
|
||||||
|
|
||||||
func (dir *Dir) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error {
|
func (dir *Dir) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("dir Removexattr %s: %s", dir.FullPath(), req.Name)
|
glog.V(4).Infof("dir Removexattr %s: %s", dir.FullPath(), req.Name)
|
||||||
|
|
||||||
if err := dir.maybeLoadEntry(); err != nil {
|
if err := dir.maybeLoadEntry(); err != nil {
|
||||||
|
|
|
@ -24,6 +24,10 @@ const (
|
||||||
|
|
||||||
func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (fs.Node, error) {
|
func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (fs.Node, error) {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return nil, fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
oldFile, ok := old.(*File)
|
oldFile, ok := old.(*File)
|
||||||
if !ok {
|
if !ok {
|
||||||
glog.Errorf("old node is not a file: %+v", old)
|
glog.Errorf("old node is not a file: %+v", old)
|
||||||
|
@ -105,6 +109,10 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f
|
||||||
|
|
||||||
func (dir *Dir) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, error) {
|
func (dir *Dir) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, error) {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return nil, fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("Symlink: %v/%v to %v", dir.FullPath(), req.NewName, req.Target)
|
glog.V(4).Infof("Symlink: %v/%v to %v", dir.FullPath(), req.NewName, req.Target)
|
||||||
|
|
||||||
request := &filer_pb.CreateEntryRequest{
|
request := &filer_pb.CreateEntryRequest{
|
||||||
|
|
|
@ -13,6 +13,10 @@ import (
|
||||||
|
|
||||||
func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirectory fs.Node) error {
|
func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirectory fs.Node) error {
|
||||||
|
|
||||||
|
if dir.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
newDir := newDirectory.(*Dir)
|
newDir := newDirectory.(*Dir)
|
||||||
|
|
||||||
newPath := util.NewFullPath(newDir.FullPath(), req.NewName)
|
newPath := util.NewFullPath(newDir.FullPath(), req.NewName)
|
||||||
|
|
|
@ -110,6 +110,10 @@ func (file *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.Op
|
||||||
|
|
||||||
func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
|
func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
|
||||||
|
|
||||||
|
if file.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("%v file setattr %+v", file.fullpath(), req)
|
glog.V(4).Infof("%v file setattr %+v", file.fullpath(), req)
|
||||||
|
|
||||||
entry, err := file.maybeLoadEntry(ctx)
|
entry, err := file.maybeLoadEntry(ctx)
|
||||||
|
@ -200,6 +204,10 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f
|
||||||
|
|
||||||
func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error {
|
func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error {
|
||||||
|
|
||||||
|
if file.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("file Setxattr %s: %s", file.fullpath(), req.Name)
|
glog.V(4).Infof("file Setxattr %s: %s", file.fullpath(), req.Name)
|
||||||
|
|
||||||
entry, err := file.maybeLoadEntry(ctx)
|
entry, err := file.maybeLoadEntry(ctx)
|
||||||
|
@ -217,6 +225,10 @@ func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error
|
||||||
|
|
||||||
func (file *File) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error {
|
func (file *File) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error {
|
||||||
|
|
||||||
|
if file.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
glog.V(4).Infof("file Removexattr %s: %s", file.fullpath(), req.Name)
|
glog.V(4).Infof("file Removexattr %s: %s", file.fullpath(), req.Name)
|
||||||
|
|
||||||
entry, err := file.maybeLoadEntry(ctx)
|
entry, err := file.maybeLoadEntry(ctx)
|
||||||
|
|
|
@ -154,6 +154,10 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) {
|
||||||
// Write to the file handle
|
// Write to the file handle
|
||||||
func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
|
func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
|
||||||
|
|
||||||
|
if fh.f.wfs.option.ReadOnly {
|
||||||
|
return fuse.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
fh.Lock()
|
fh.Lock()
|
||||||
defer fh.Unlock()
|
defer fh.Unlock()
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ type Option struct {
|
||||||
DataCenter string
|
DataCenter string
|
||||||
EntryCacheTtl time.Duration
|
EntryCacheTtl time.Duration
|
||||||
Umask os.FileMode
|
Umask os.FileMode
|
||||||
|
ReadOnly bool
|
||||||
|
|
||||||
MountUid uint32
|
MountUid uint32
|
||||||
MountGid uint32
|
MountGid uint32
|
||||||
|
|
Loading…
Reference in a new issue