aboutsummaryrefslogtreecommitdiff
path: root/weed/shell/commands.go
blob: 2a262d913de76d48a24d651e34c7ce62258a2bdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package shell

import (
	"fmt"
	"github.com/chrislusf/seaweedfs/weed/wdclient"
	"google.golang.org/grpc"
	"io"
	"net/url"
	"path/filepath"
	"strconv"
	"strings"
)

type ShellOptions struct {
	Masters        *string
	GrpcDialOption grpc.DialOption
	// shell transient context
	FilerHost string
	FilerPort int64
	Directory string
}

type commandEnv struct {
	env          map[string]string
	masterClient *wdclient.MasterClient
	option       ShellOptions
}

type command interface {
	Name() string
	Help() string
	Do([]string, *commandEnv, io.Writer) error
}

var (
	commands = []command{}
)

func (ce *commandEnv) parseUrl(input string) (filerServer string, filerPort int64, path string, err error) {
	if strings.HasPrefix(input, "http") {
		return parseFilerUrl(input)
	}
	if !strings.HasPrefix(input, "/") {
		input = filepath.ToSlash(filepath.Join(ce.option.Directory, input))
	}
	return ce.option.FilerHost, ce.option.FilerPort, input, err
}

func parseFilerUrl(entryPath string) (filerServer string, filerPort int64, path string, err error) {
	if strings.HasPrefix(entryPath, "http") {
		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
	} else {
		err = fmt.Errorf("path should have full url http://<filer_server>:<port>/path/to/dirOrFile : %s", entryPath)
	}
	return
}