mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-10-21 07:27:24 +08:00
create fuse subcommand to use weed with mount
This commit is contained in:
@@ -22,6 +22,7 @@ var Commands = []*Command{
|
|||||||
cmdFilerReplicate,
|
cmdFilerReplicate,
|
||||||
cmdFilerSynchronize,
|
cmdFilerSynchronize,
|
||||||
cmdFix,
|
cmdFix,
|
||||||
|
cmdFuse,
|
||||||
cmdGateway,
|
cmdGateway,
|
||||||
cmdMaster,
|
cmdMaster,
|
||||||
cmdMount,
|
cmdMount,
|
||||||
|
163
weed/command/fuse.go
Normal file
163
weed/command/fuse.go
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
package command
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
cmdFuse.Run = runFuse // break init cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
func runFuse(cmd *Command, args []string) bool {
|
||||||
|
argsLen := len(args)
|
||||||
|
options := []string{}
|
||||||
|
|
||||||
|
// at least target mount path should be passed
|
||||||
|
if argsLen < 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// first option is always target mount path
|
||||||
|
mountOptions.dir = &args[0]
|
||||||
|
|
||||||
|
// scan parameters looking for one or more -o options
|
||||||
|
// -o options receive parameters on format key=value[,key=value]...
|
||||||
|
for i := 0; i < argsLen; i++ {
|
||||||
|
if args[i] == "-o" && i+1 <= argsLen {
|
||||||
|
options = strings.Split(args[i+1], ",")
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for each option passed with -o
|
||||||
|
for _, option := range options {
|
||||||
|
// split just first = character
|
||||||
|
parts := strings.SplitN(option, "=", 2)
|
||||||
|
|
||||||
|
// if doesn't key and value skip
|
||||||
|
if len(parts) != 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// switch key keeping "weed mount" parameters
|
||||||
|
switch parts[0] {
|
||||||
|
case "filer":
|
||||||
|
mountOptions.filer = &parts[1]
|
||||||
|
case "filer.path":
|
||||||
|
mountOptions.filerMountRootPath = &parts[1]
|
||||||
|
case "dirAutoCreate":
|
||||||
|
if value, err := strconv.ParseBool(parts[1]); err != nil {
|
||||||
|
mountOptions.dirAutoCreate = &value
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("dirAutoCreate: %s", err))
|
||||||
|
}
|
||||||
|
case "collection":
|
||||||
|
mountOptions.collection = &parts[1]
|
||||||
|
case "replication":
|
||||||
|
mountOptions.replication = &parts[1]
|
||||||
|
case "disk":
|
||||||
|
mountOptions.diskType = &parts[1]
|
||||||
|
case "ttl":
|
||||||
|
if value, err := strconv.ParseInt(parts[1], 0, 32); err != nil {
|
||||||
|
intValue := int(value)
|
||||||
|
mountOptions.ttlSec = &intValue
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("ttl: %s", err))
|
||||||
|
}
|
||||||
|
case "chunkSizeLimitMB":
|
||||||
|
if value, err := strconv.ParseInt(parts[1], 0, 32); err != nil {
|
||||||
|
intValue := int(value)
|
||||||
|
mountOptions.chunkSizeLimitMB = &intValue
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("chunkSizeLimitMB: %s", err))
|
||||||
|
}
|
||||||
|
case "concurrentWriters":
|
||||||
|
if value, err := strconv.ParseInt(parts[1], 0, 32); err != nil {
|
||||||
|
intValue := int(value)
|
||||||
|
mountOptions.concurrentWriters = &intValue
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("concurrentWriters: %s", err))
|
||||||
|
}
|
||||||
|
case "cacheDir":
|
||||||
|
mountOptions.cacheDir = &parts[1]
|
||||||
|
case "cacheCapacityMB":
|
||||||
|
if value, err := strconv.ParseInt(parts[1], 0, 64); err != nil {
|
||||||
|
mountOptions.cacheSizeMB = &value
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("cacheCapacityMB: %s", err))
|
||||||
|
}
|
||||||
|
case "dataCenter":
|
||||||
|
mountOptions.dataCenter = &parts[1]
|
||||||
|
case "allowOthers":
|
||||||
|
if value, err := strconv.ParseBool(parts[1]); err != nil {
|
||||||
|
mountOptions.allowOthers = &value
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("allowOthers: %s", err))
|
||||||
|
}
|
||||||
|
case "umask":
|
||||||
|
mountOptions.umaskString = &parts[1]
|
||||||
|
case "nonempty":
|
||||||
|
if value, err := strconv.ParseBool(parts[1]); err != nil {
|
||||||
|
mountOptions.nonempty = &value
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("nonempty: %s", err))
|
||||||
|
}
|
||||||
|
case "volumeServerAccess":
|
||||||
|
mountOptions.volumeServerAccess = &parts[1]
|
||||||
|
case "map.uid":
|
||||||
|
mountOptions.uidMap = &parts[1]
|
||||||
|
case "map.gid":
|
||||||
|
mountOptions.gidMap = &parts[1]
|
||||||
|
case "readOnly":
|
||||||
|
if value, err := strconv.ParseBool(parts[1]); err != nil {
|
||||||
|
mountOptions.readOnly = &value
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("readOnly: %s", err))
|
||||||
|
}
|
||||||
|
case "cpuprofile":
|
||||||
|
mountCpuProfile = &parts[1]
|
||||||
|
case "memprofile":
|
||||||
|
mountMemProfile = &parts[1]
|
||||||
|
case "readRetryTime":
|
||||||
|
if value, err := time.ParseDuration(parts[1]); err != nil {
|
||||||
|
mountReadRetryTime = &value
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("readRetryTime: %s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// I don't know why PATH environment variable is lost
|
||||||
|
if err := os.Setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); err != nil {
|
||||||
|
panic(fmt.Errorf("setenv: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
// just call "weed mount" command
|
||||||
|
return runMount(cmdMount, []string{})
|
||||||
|
}
|
||||||
|
|
||||||
|
var cmdFuse = &Command{
|
||||||
|
UsageLine: "fuse /mnt/mount/point -o \"filer=localhost:8888,filer.remote=/\"",
|
||||||
|
Short: "Allow use weed with linux's mount command",
|
||||||
|
Long: `Allow use weed with linux's mount command
|
||||||
|
|
||||||
|
You can use -t weed on mount command:
|
||||||
|
mv weed /sbin/mount.weed
|
||||||
|
mount -t weed fuse /mnt -o "filer=localhost:8888,filer.remote=/"
|
||||||
|
|
||||||
|
Or you can use -t fuse on mount command:
|
||||||
|
mv weed /sbin/weed
|
||||||
|
mount -t fuse.weed fuse /mnt -o "filer=localhost:8888,filer.remote=/"
|
||||||
|
mount -t fuse "weed#fuse" /mnt -o "filer=localhost:8888,filer.remote=/"
|
||||||
|
|
||||||
|
To use without mess with your /sbin:
|
||||||
|
mount -t fuse./home/user/bin/weed fuse /mnt -o "filer=localhost:8888,filer.remote=/"
|
||||||
|
mount -t fuse "/home/user/bin/weed#fuse" /mnt -o "filer=localhost:8888,filer.remote=/"
|
||||||
|
|
||||||
|
To check valid options look "weed mount --help"
|
||||||
|
`,
|
||||||
|
}
|
Reference in New Issue
Block a user