diff --git a/weed/command/shell.go b/weed/command/shell.go index eae68c3be..7f971c477 100644 --- a/weed/command/shell.go +++ b/weed/command/shell.go @@ -1,6 +1,11 @@ package command import ( + "fmt" + "net/url" + "strconv" + "strings" + "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/shell" "github.com/chrislusf/seaweedfs/weed/util" @@ -8,18 +13,15 @@ import ( ) var ( - shellOptions shell.ShellOptions + shellOptions shell.ShellOptions + shellInitialFilerUrl *string + ) func init() { cmdShell.Run = runShell // break init cycle shellOptions.Masters = cmdShell.Flag.String("master", "localhost:9333", "comma-separated master servers") - filerHost := cmdShell.Flag.String("filer.host", "localhost", "comma-separated filer server host") - flierPort := cmdShell.Flag.Int64("filer.port", 8888, "comma-separated filer server port") - directory := cmdShell.Flag.String("filer.dir", "/", "comma-separated filer server directory") - shellOptions.FilerHost = *filerHost - shellOptions.FilerPort = *flierPort - shellOptions.Directory = *directory + shellInitialFilerUrl = cmdShell.Flag.String("filer.url", "http://localhost:8888/", "initial filer url") } var cmdShell = &Command{ @@ -36,8 +38,35 @@ func runShell(command *Command, args []string) bool { util.LoadConfiguration("security", false) shellOptions.GrpcDialOption = security.LoadClientTLS(viper.Sub("grpc"), "client") + + var filerPwdErr error + shellOptions.FilerHost, shellOptions.FilerPort, shellOptions.Directory, filerPwdErr = parseFilerUrl(*shellInitialFilerUrl) + if filerPwdErr != nil { + fmt.Printf("failed to parse url filer.url=%s : %v\n", *shellInitialFilerUrl, filerPwdErr) + return false + } + shell.RunShell(shellOptions) return true -} \ No newline at end of file +} + +func parseFilerUrl(entryPath string) (filerServer string, filerPort int64, path string, err error) { + if !strings.HasPrefix(entryPath, "http://") && !strings.HasPrefix(entryPath, "https://") { + entryPath = "http://" + entryPath + } + + var u *url.URL + u, err = url.Parse(entryPath) + if err != nil { + return + } + filerServer = u.Hostname() + portString := u.Port() + if portString != "" { + filerPort, err = strconv.ParseInt(portString, 10, 32) + } + path = u.Path + return +} diff --git a/weed/shell/commands.go b/weed/shell/commands.go index b642ec253..02f576011 100644 --- a/weed/shell/commands.go +++ b/weed/shell/commands.go @@ -16,8 +16,8 @@ import ( ) type ShellOptions struct { - Masters *string - GrpcDialOption grpc.DialOption + Masters *string + GrpcDialOption grpc.DialOption // shell transient context FilerHost string FilerPort int64