danielflira
4 years ago
2 changed files with 164 additions and 0 deletions
@ -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" |
|||
`, |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue