mount: add --devname to set the device name sent to FUSE for mount display

Before this change, the device name was always the remote:path rclone
was configured with. However this can contain sensitive information
and it appears in the `mount` output, so `--devname` allows the user
to configure it.

See: https://forum.rclone.org/t/rclone-mount-blomp-problem/29151/11
This commit is contained in:
Nick Craig-Wood 2022-02-09 11:56:43 +00:00
parent 9cc50a614b
commit f4c40bf79d
5 changed files with 18 additions and 8 deletions

View File

@ -168,7 +168,7 @@ func mount(VFS *vfs.VFS, mountPath string, opt *mountlib.Options) (<-chan error,
host.SetCapCaseInsensitive(f.Features().CaseInsensitive) host.SetCapCaseInsensitive(f.Features().CaseInsensitive)
// Create options // Create options
options := mountOptions(VFS, f.Name()+":"+f.Root(), mountpoint, opt) options := mountOptions(VFS, opt.DeviceName, mountpoint, opt)
fs.Debugf(f, "Mounting with options: %q", options) fs.Debugf(f, "Mounting with options: %q", options)
// Serve the mount point in the background returning error to errChan // Serve the mount point in the background returning error to errChan

View File

@ -86,7 +86,7 @@ func mount(VFS *vfs.VFS, mountpoint string, opt *mountlib.Options) (<-chan error
f := VFS.Fs() f := VFS.Fs()
fs.Debugf(f, "Mounting on %q", mountpoint) fs.Debugf(f, "Mounting on %q", mountpoint)
c, err := fuse.Mount(mountpoint, mountOptions(VFS, f.Name()+":"+f.Root(), opt)...) c, err := fuse.Mount(mountpoint, mountOptions(VFS, opt.DeviceName, opt)...)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

View File

@ -25,11 +25,10 @@ func init() {
// mountOptions configures the options from the command line flags // mountOptions configures the options from the command line flags
// //
// man mount.fuse for more info and note the -o flag for other options // man mount.fuse for more info and note the -o flag for other options
func mountOptions(fsys *FS, f fs.Fs) (mountOpts *fuse.MountOptions) { func mountOptions(fsys *FS, f fs.Fs, opt *mountlib.Options) (mountOpts *fuse.MountOptions) {
device := f.Name() + ":" + f.Root()
mountOpts = &fuse.MountOptions{ mountOpts = &fuse.MountOptions{
AllowOther: fsys.opt.AllowOther, AllowOther: fsys.opt.AllowOther,
FsName: device, FsName: opt.DeviceName,
Name: "rclone", Name: "rclone",
DisableXAttrs: true, DisableXAttrs: true,
Debug: fsys.opt.DebugFUSE, Debug: fsys.opt.DebugFUSE,
@ -120,7 +119,7 @@ func mountOptions(fsys *FS, f fs.Fs) (mountOpts *fuse.MountOptions) {
if runtime.GOOS == "darwin" { if runtime.GOOS == "darwin" {
opts = append(opts, opts = append(opts,
// VolumeName sets the volume name shown in Finder. // VolumeName sets the volume name shown in Finder.
fmt.Sprintf("volname=%s", device), fmt.Sprintf("volname=%s", opt.VolumeName),
// NoAppleXattr makes OSXFUSE disallow extended attributes with the // NoAppleXattr makes OSXFUSE disallow extended attributes with the
// prefix "com.apple.". This disables persistent Finder state and // prefix "com.apple.". This disables persistent Finder state and
@ -167,7 +166,7 @@ func mount(VFS *vfs.VFS, mountpoint string, opt *mountlib.Options) (<-chan error
//mOpts.Debug = mountlib.DebugFUSE //mOpts.Debug = mountlib.DebugFUSE
//conn := fusefs.NewFileSystemConnector(nodeFs.Root(), mOpts) //conn := fusefs.NewFileSystemConnector(nodeFs.Root(), mOpts)
mountOpts := mountOptions(fsys, f) mountOpts := mountOptions(fsys, f, opt)
// FIXME fill out // FIXME fill out
opts := fusefs.Options{ opts := fusefs.Options{

View File

@ -40,6 +40,7 @@ type Options struct {
ExtraOptions []string ExtraOptions []string
ExtraFlags []string ExtraFlags []string
AttrTimeout time.Duration // how long the kernel caches attribute for AttrTimeout time.Duration // how long the kernel caches attribute for
DeviceName string
VolumeName string VolumeName string
NoAppleDouble bool NoAppleDouble bool
NoAppleXattr bool NoAppleXattr bool
@ -125,6 +126,7 @@ func AddFlags(flagSet *pflag.FlagSet) {
flags.BoolVarP(flagSet, &Opt.AsyncRead, "async-read", "", Opt.AsyncRead, "Use asynchronous reads (not supported on Windows)") flags.BoolVarP(flagSet, &Opt.AsyncRead, "async-read", "", Opt.AsyncRead, "Use asynchronous reads (not supported on Windows)")
flags.FVarP(flagSet, &Opt.MaxReadAhead, "max-read-ahead", "", "The number of bytes that can be prefetched for sequential reads (not supported on Windows)") flags.FVarP(flagSet, &Opt.MaxReadAhead, "max-read-ahead", "", "The number of bytes that can be prefetched for sequential reads (not supported on Windows)")
flags.BoolVarP(flagSet, &Opt.WritebackCache, "write-back-cache", "", Opt.WritebackCache, "Makes kernel buffer writes before sending them to rclone (without this, writethrough caching is used) (not supported on Windows)") flags.BoolVarP(flagSet, &Opt.WritebackCache, "write-back-cache", "", Opt.WritebackCache, "Makes kernel buffer writes before sending them to rclone (without this, writethrough caching is used) (not supported on Windows)")
flags.StringVarP(flagSet, &Opt.DeviceName, "devname", "", Opt.DeviceName, "Set the device name - default is remote:path")
// Windows and OSX // Windows and OSX
flags.StringVarP(flagSet, &Opt.VolumeName, "volname", "", Opt.VolumeName, "Set the volume name (supported on Windows and OSX only)") flags.StringVarP(flagSet, &Opt.VolumeName, "volname", "", Opt.VolumeName, "Set the volume name (supported on Windows and OSX only)")
// OSX only // OSX only
@ -235,6 +237,7 @@ func (m *MountPoint) Mount() (daemon *os.Process, err error) {
return nil, err return nil, err
} }
m.SetVolumeName(m.MountOpt.VolumeName) m.SetVolumeName(m.MountOpt.VolumeName)
m.SetDeviceName(m.MountOpt.DeviceName)
// Start background task if --daemon is specified // Start background task if --daemon is specified
if m.MountOpt.Daemon { if m.MountOpt.Daemon {

View File

@ -87,7 +87,7 @@ func (m *MountPoint) CheckAllowings() error {
// SetVolumeName with sensible default // SetVolumeName with sensible default
func (m *MountPoint) SetVolumeName(vol string) { func (m *MountPoint) SetVolumeName(vol string) {
if vol == "" { if vol == "" {
vol = m.Fs.Name() + ":" + m.Fs.Root() vol = fs.ConfigString(m.Fs)
} }
m.MountOpt.SetVolumeName(vol) m.MountOpt.SetVolumeName(vol)
} }
@ -102,3 +102,11 @@ func (o *Options) SetVolumeName(vol string) {
} }
o.VolumeName = vol o.VolumeName = vol
} }
// SetDeviceName with sensible default
func (m *MountPoint) SetDeviceName(dev string) {
if dev == "" {
dev = fs.ConfigString(m.Fs)
}
m.MountOpt.DeviceName = dev
}