12
"golang.org/x/text/cases"
13
"golang.org/x/text/language"
17
type cfsOption struct {
18
AccessKey string `json:"accessKey"`
19
AttrValid string `json:"attrValid"`
20
Authenticate string `json:"authenticate"`
21
AutoInvalData string `json:"autoInvalData"`
22
BcacheBatchCnt string `json:"bcacheBatchCnt"`
23
BcacheCheckIntervalS string `json:"bcacheCheckIntervalS"`
24
BcacheDir string `json:"bcacheDir"`
25
BcacheFilterFiles string `json:"bcacheFilterFiles"`
26
BuffersTotalLimit string `json:"buffersTotalLimit"`
28
CacheAction string `json:"cacheAction"`
29
CertFile string `json:"certFile"`
31
ClientKey string `json:"clientKey"`
32
DisableDcache string `json:"disableDcache"`
33
EbsBlockSize string `json:"ebsBlockSize"`
34
EbsEndpoint string `json:"ebsEndpoint"`
35
EbsServerPath string `json:"ebsServerPath"`
36
EnablePosixACL string `json:"enablePosixACL"`
37
EnSyncWrite string `json:"enSyncWrite"`
38
EnableAudit string `json:"enableAudit"`
39
EnableHTTPS string `json:"enableHTTPS"`
40
EnableSummary string `json:"enableSummary"`
41
EnableUnixPermission string `json:"enableUnixPermission"`
42
EnableXattr string `json:"enableXattr"`
43
FollowerRead string `json:"followerRead"`
44
FsyncOnClose string `json:"fsyncOnClose"`
45
IcacheTimeout string `json:"icacheTimeout"`
46
Keepcache string `json:"keepcache"`
47
LogDir string `json:"logDir"`
48
LogLevel string `json:"logLevel"`
49
LookupValid string `json:"lookupValid"`
50
MasterAddr string `json:"masterAddr"`
51
MaxStreamerLimit string `json:"maxStreamerLimit"`
52
Maxcpus string `json:"maxcpus"`
53
MetaSendTimeout string `json:"metaSendTimeout"`
54
MountPoint string `json:"mountPoint"`
56
NearRead string `json:"nearRead"`
57
Owner string `json:"owner"`
59
ProfPort string `json:"profPort"`
61
Rdonly string `json:"rdonly"`
62
ReadRate string `json:"readRate"`
63
ReadThreads string `json:"readThreads"`
65
SecretKey string `json:"secretKey"`
66
Subdir string `json:"subdir"`
67
TicketHost string `json:"ticketHost"`
68
VolName string `json:"volName"`
69
VolType string `json:"volType"`
70
WarnLogDir string `json:"warnLogDir"`
71
WriteRate string `json:"writeRate"`
72
WriteThreads string `json:"writeThreads"`
73
Writecache string `json:"writecache"`
76
func (c *cfsOption) ConvertToCliOptions() (s []string) {
77
tp := reflect.TypeOf(*c)
78
el := reflect.ValueOf(c).Elem()
80
// run foreground, since "daemon start failed" issue
83
for i := 0; i < tp.NumField(); i++ {
86
js := fi.Tag.Get("json")
91
v := strings.Trim(el.FieldByName(fi.Name).String(), " ")
93
if js == "n" || js == "r" {
96
s = append(s, "-"+js, v)
105
// cfsParse Parse from string
106
func cfsParse(mountPoint, options string) (c *cfsOption) {
107
c = &cfsOption{MountPoint: mountPoint}
109
sli := strings.Split(options, ",")
111
el := reflect.ValueOf(c).Elem()
113
cas := cases.Title(language.Und, cases.NoLower)
115
for _, v := range sli {
116
oSli := strings.Split(v, "=")
121
field := el.FieldByName(cas.String(oSli[0]))
123
log.Println("Warn: field can not set. field: ", oSli[0])
130
field.SetString(strings.Join(oSli[1:], "="))
138
func cfsIsMounted(mountPoint string) bool {
141
mps, err := mo.List()
143
log.Fatalf("mountListErr, err: %s", err.Error())
146
for _, v := range mps {
147
if v.Path == mountPoint {
155
// cfsMountPre exception handling
156
func cfsMountPre(mountPoint string) error {
157
if _, err := os.Stat(mountPoint); os.IsNotExist(err) {
161
if cfsIsMounted(mountPoint) {
162
return cfsUmount(mountPoint)
168
func cfsList() error {
171
mps, err := mo.List()
173
log.Fatalf("mountListErr, err: %s", err.Error())
176
for _, v := range mps {
177
if v.Type == "fuse" || v.Type == "fuse.cubefs" {
178
fmt.Println(fmt.Sprintf("%s on %s type %s (%s)", v.Device, v.Path, v.Type, strings.Join(v.Opts, ",")))
185
func cfsMount(mountPoint, options string) error {
186
err := cfsMountPre(mountPoint)
191
c := cfsParse(mountPoint, options)
193
co := c.ConvertToCliOptions()
195
log.Println("cfsMount commands: ", getCfsClientPath(), strings.Join(co, " "))
196
cmd := exec.Command(getCfsClientPath(), co...)
197
cmd.Env = append(cmd.Env, "PATH=/usr/bin/:/bin/:$PATH")
200
log.Println("[info] cfsMount, env: ", cmd.Env)
204
log.Println("cfsMountCmdStartErr, err: ", err.Error())
208
log.Println("[info] cfsMount started")
210
err = cfsMountPost(mountPoint)
217
// log.Println("[error] cfsMountWaitErr, err: ", err)
224
// cfsMountPost async mount check
225
func cfsMountPost(mountPoint string) error {
226
log.Println("[info] cfsMountPost run")
228
for i := 0; i < 20*5; i++ {
229
if cfsIsMounted(mountPoint) {
230
log.Println("[info] cfsMount mounted")
233
time.Sleep(50 * time.Millisecond)
239
func cfsUmount(mountPoint string) error {
241
return mo.Unmount(mountPoint)