vfs: add remote control for directory cache flushing

This commit is contained in:
Nick Craig-Wood 2018-03-16 20:45:34 +00:00
parent 5bf639048f
commit 2db0c4dd95
4 changed files with 130 additions and 0 deletions

View File

@ -9,6 +9,8 @@ date: "2018-03-05"
If rclone is run with the `--rc` flag then it starts an http server If rclone is run with the `--rc` flag then it starts an http server
which can be used to remote control rclone. which can be used to remote control rclone.
**NB** this is experimental and everything here is subject to change!
## Supported parameters ## Supported parameters
#### --rc #### #### --rc ####
@ -54,6 +56,58 @@ rc` command.
You can use it like this You can use it like this
```
$ rclone rc rc/noop param1=one param2=two
{
"param1": "one",
"param2": "two"
}
```
Run `rclone rc` on its own to see the help for the installed remote
control commands.
## Supported commands
### cache/expire: Purge a remote from cache
Purge a remote from the cache backend. Supports either a directory or a file.
Params:
- remote = path to remote (required)
- withData = true/false to delete cached data (chunks) as well (optional)
### vfs/forget: Forget files or directories in the directory cache.
This forgets the paths in the directory cache causing them to be
re-read from the remote when needed.
If no paths are passed in then it will forget all the paths in the
directory cache.
rclone rc vfs/forget
Otherwise pass files or dirs in as file=path or dir=path. Any
parameter key starting with file will forget that file and any
starting with dir will forget that dir, eg
rclone rc vfs/forget file=hello file2=goodbye dir=home/junk
### rc/noop: Echo the input to the output parameters
This echoes the input parameters to the output parameters for testing
purposes. It can be used to check that rclone is still alive and to
check that parameter passing is working properly.
### rc/error: This returns an error
This returns an error with the input as part of its error string.
Useful for testing error handling.
### rc/list: List all the registered remote control commands
This lists all the registered remote control commands as a JSON map in
the commands response.
## Accessing the remote control via HTTP ## Accessing the remote control via HTTP
Rclone implements a simple HTTP based protocol. Rclone implements a simple HTTP based protocol.

View File

@ -18,6 +18,15 @@ like this:
kill -SIGHUP $(pidof rclone) kill -SIGHUP $(pidof rclone)
If you configure rclone with a [remote control](/rc) then you can use
rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
### File Caching ### File Caching
**NB** File caching is **EXPERIMENTAL** - use with care! **NB** File caching is **EXPERIMENTAL** - use with care!

64
vfs/rc.go Normal file
View File

@ -0,0 +1,64 @@
package vfs
import (
"strings"
"github.com/ncw/rclone/fs"
"github.com/ncw/rclone/fs/rc"
"github.com/pkg/errors"
)
// Add remote control for the VFS
func (vfs *VFS) addRC() {
rc.Add(rc.Call{
Path: "vfs/forget",
Fn: func(in rc.Params) (out rc.Params, err error) {
root, err := vfs.Root()
if err != nil {
return nil, err
}
forgotten := []string{}
if len(in) == 0 {
root.ForgetAll()
} else {
for k, v := range in {
path, ok := v.(string)
if !ok {
return out, errors.Errorf("value must be string %q=%v", k, v)
}
path = strings.Trim(path, "/")
if strings.HasPrefix(k, "file") {
root.ForgetPath(path, fs.EntryObject)
} else if strings.HasPrefix(k, "dir") {
root.ForgetPath(path, fs.EntryDirectory)
} else {
return out, errors.Errorf("unknown key %q", k)
}
forgotten = append(forgotten, path)
}
}
out = rc.Params{
"forgotten": forgotten,
}
return out, nil
},
Title: "Forget files or directories in the directory cache.",
Help: `
This forgets the paths in the directory cache causing them to be
re-read from the remote when needed.
If no paths are passed in then it will forget all the paths in the
directory cache.
rclone rc vfs/forget
Otherwise pass files or dirs in as file=path or dir=path. Any
parameter key starting with file will forget that file and any
starting with dir will forget that dir, eg
rclone rc vfs/forget file=hello file2=goodbye dir=home/junk
`,
})
}

View File

@ -233,6 +233,9 @@ func New(f fs.Fs, opt *Options) *VFS {
panic(fmt.Sprintf("failed to create local cache: %v", err)) panic(fmt.Sprintf("failed to create local cache: %v", err))
} }
vfs.cache = cache vfs.cache = cache
// add the remote control
vfs.addRC()
return vfs return vfs
} }