From 1319d7333cf8dfc80392e3ac1795b68a0528168b Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Thu, 14 May 2020 16:05:23 +0100 Subject: [PATCH] mountlib: add rc command mount/types and rename mountOption to mountType --- cmd/mountlib/rc.go | 130 +++++++++++++++++++++++++++++---------------- 1 file changed, 83 insertions(+), 47 deletions(-) diff --git a/cmd/mountlib/rc.go b/cmd/mountlib/rc.go index 1515273b8..07686be04 100644 --- a/cmd/mountlib/rc.go +++ b/cmd/mountlib/rc.go @@ -3,6 +3,7 @@ package mountlib import ( "context" "log" + "sort" "github.com/pkg/errors" "github.com/rclone/rclone/fs" @@ -16,6 +17,18 @@ var ( unmountFns map[string]UnmountFn ) +// AddRc adds mount and unmount functionality to rc +func AddRc(mountUtilName string, mountFunction MountFn) { + if mountFns == nil { + mountFns = make(map[string]MountFn) + } + if unmountFns == nil { + unmountFns = make(map[string]UnmountFn) + } + // rcMount allows the mount command to be run from rc + mountFns[mountUtilName] = mountFunction +} + func init() { rc.Add(rc.Call{ Path: "mount/mount", @@ -25,21 +38,60 @@ func init() { Help: `rclone allows Linux, FreeBSD, macOS and Windows to mount any of Rclone's cloud storage systems as a file system with FUSE. -If no mountOption is provided, the priority is given as follows: 1. mount 2.cmount 3.mount2 +If no mountType is provided, the priority is given as follows: 1. mount 2.cmount 3.mount2 This takes the following parameters - fs - a remote path to be mounted (required) - mountPoint: valid path on the local machine (required) -- mountOption: One of the values (mount, cmount, mount2) specifies the mount implementation to use +- mountType: One of the values (mount, cmount, mount2) specifies the mount implementation to use Eg rclone rc mount/mount fs=mydrive: mountPoint=/home//mountPoint - rclone rc mount/mount fs=mydrive: mountPoint=/home//mountPoint mountOption=mount + rclone rc mount/mount fs=mydrive: mountPoint=/home//mountPoint mountType=mount `, }) +} +// rcMount allows the mount command to be run from rc +func mountRc(_ context.Context, in rc.Params) (out rc.Params, err error) { + mountPoint, err := in.GetString("mountPoint") + if err != nil { + return nil, err + } + + mountType, err := in.GetString("mountType") + + if err != nil || mountType == "" { + if mountFns["mount"] != nil { + mountType = "mount" + } else if mountFns["cmount"] != nil { + mountType = "cmount" + } else if mountFns["mount2"] != nil { + mountType = "mount2" + } + } + + // Get Fs.fs to be mounted from fs parameter in the params + fdst, err := rc.GetFs(in) + if err != nil { + return nil, err + } + + if mountFns[mountType] != nil { + _, _, unmountFns[mountPoint], err = mountFns[mountType](fdst, mountPoint) + if err != nil { + log.Printf("mount FAILED: %v", err) + return nil, err + } + fs.Debugf(nil, "Mount for %s created at %s using %s", fdst.String(), mountPoint, mountType) + return nil, nil + } + return nil, errors.New("Mount Option specified is not registered, or is invalid") +} + +func init() { rc.Add(rc.Call{ Path: "mount/unmount", AuthRequired: true, @@ -59,19 +111,6 @@ Eg rclone rc mount/unmount mountPoint=/home//mountPoint `, }) - -} - -// AddRc adds mount and unmount functionality to rc -func AddRc(mountUtilName string, mountFunction MountFn) { - if mountFns == nil { - mountFns = make(map[string]MountFn) - } - if unmountFns == nil { - unmountFns = make(map[string]UnmountFn) - } - // rcMount allows the mount command to be run from rc - mountFns[mountUtilName] = mountFunction } // rcMount allows the umount command to be run from rc @@ -94,39 +133,36 @@ func unMountRc(_ context.Context, in rc.Params) (out rc.Params, err error) { return nil, nil } -// rcMount allows the mount command to be run from rc -func mountRc(_ context.Context, in rc.Params) (out rc.Params, err error) { - mountPoint, err := in.GetString("mountPoint") - if err != nil { - return nil, err - } +func init() { + rc.Add(rc.Call{ + Path: "mount/types", + AuthRequired: true, + Fn: mountTypesRc, + Title: "Show all possible mount types", + Help: `This shows all possible mount types and returns them as a list. - mountOption, err := in.GetString("mountOption") +This takes no parameters and returns - if err != nil || mountOption == "" { - if mountFns["mount"] != nil { - mountOption = "mount" - } else if mountFns["cmount"] != nil { - mountOption = "cmount" - } else if mountFns["mount2"] != nil { - mountOption = "mount2" - } - } +- mountTypes: list of mount types - // Get Fs.fs to be mounted from fs parameter in the params - fdst, err := rc.GetFs(in) - if err != nil { - return nil, err - } +The mount types are strings like "mount", "mount2", "cmount" and can +be passed to mount/mount as the mountType parameter. - if mountFns[mountOption] != nil { - _, _, unmountFns[mountPoint], err = mountFns[mountOption](fdst, mountPoint) - if err != nil { - log.Printf("mount FAILED: %v", err) - return nil, err - } - fs.Debugf(nil, "Mount for %s created at %s using %s", fdst.String(), mountPoint, mountOption) - return nil, nil - } - return nil, errors.New("Mount Option specified is not registered, or is invalid") +Eg + + rclone rc mount/types +`, + }) +} + +// mountTypesRc returns a list of available mount types. +func mountTypesRc(_ context.Context, in rc.Params) (out rc.Params, err error) { + var mountTypes = []string{} + for mountType := range mountFns { + mountTypes = append(mountTypes, mountType) + } + sort.Strings(mountTypes) + return rc.Params{ + "mountTypes": mountTypes, + }, nil }