forked from TrueCloudLab/rclone
Compare commits
61 commits
tcl/master
...
v1.52-stab
Author | SHA1 | Date | |
---|---|---|---|
|
729799af7c | ||
|
029f817ebc | ||
|
073e996cc2 | ||
|
fb2a4edd6f | ||
|
f949856170 | ||
|
c0e9584403 | ||
|
ace56b6e0f | ||
|
1d45c6eaaa | ||
|
e8222bbc95 | ||
|
815643264b | ||
|
4f8472664f | ||
|
3278b297cf | ||
|
5c0af62d0a | ||
|
6760ab6bb3 | ||
|
a9ffa1178c | ||
|
687865f760 | ||
|
d745bc1baa | ||
|
1f279f0419 | ||
|
d805e63f7d | ||
|
d8144a7e84 | ||
|
21f5b1076f | ||
|
a8cee91929 | ||
|
14edaefaa3 | ||
|
946b73c5fe | ||
|
07f7854a25 | ||
|
dfc7393e9c | ||
|
7f50143805 | ||
|
37308832b1 | ||
|
d5d124c9ee | ||
|
8b1f737271 | ||
|
ed013228ea | ||
|
a9b7974196 | ||
|
38453bd8ff | ||
|
51ba73afe4 | ||
|
b782a15f17 | ||
|
1d2edf0789 | ||
|
8367261a93 | ||
|
31dc78905e | ||
|
f9493ff1db | ||
|
a5cf531b94 | ||
|
04d59fe6bd | ||
|
cbc448039d | ||
|
7a8ade4949 | ||
|
8ab6e2bd1f | ||
|
d5c5811a54 | ||
|
43d21b7e64 | ||
|
0501b12e17 | ||
|
723c1dfdc5 | ||
|
d6894408b9 | ||
|
ac0e831090 | ||
|
b93ed77495 | ||
|
d0a3c40f9a | ||
|
6a9a571d87 | ||
|
6b68d1f79a | ||
|
088756ff8a | ||
|
4c1ffcc36d | ||
|
e5bd3f1c26 | ||
|
e03b4e2ce9 | ||
|
6054476c9c | ||
|
6cd8d3c4a0 | ||
|
78b0329928 |
450 changed files with 24030 additions and 101236 deletions
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
|
@ -227,7 +227,7 @@ jobs:
|
|||
- name: Cross-compile rclone
|
||||
run: |
|
||||
docker pull billziss/xgo-cgofuse
|
||||
go get -v github.com/karalabe/xgo
|
||||
GO111MODULE=off go get -v github.com/karalabe/xgo # don't add to go.mod
|
||||
xgo \
|
||||
-image=billziss/xgo-cgofuse \
|
||||
-targets=darwin/386,darwin/amd64,linux/386,linux/amd64,windows/386,windows/amd64 \
|
||||
|
|
25
.github/workflows/build_publish_docker_image.yml
vendored
Normal file
25
.github/workflows/build_publish_docker_image.yml
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
name: Docker beta build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
name: Build image job
|
||||
steps:
|
||||
- name: Checkout master
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build and publish image
|
||||
uses: ilteoood/docker_buildx@439099796bfc03dd9cedeb72a0c7cb92be5cc92c
|
||||
with:
|
||||
tag: beta
|
||||
imageName: rclone/rclone
|
||||
platform: linux/amd64,linux/386,linux/arm64,linux/arm/v7
|
||||
publish: true
|
||||
dockerHubUser: ${{ secrets.DOCKER_HUB_USER }}
|
||||
dockerHubPassword: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
33
.github/workflows/build_publish_release_docker_image.yml
vendored
Normal file
33
.github/workflows/build_publish_release_docker_image.yml
vendored
Normal file
|
@ -0,0 +1,33 @@
|
|||
name: Docker release build
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
name: Build image job
|
||||
steps:
|
||||
- name: Checkout master
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Get actual patch version
|
||||
id: actual_patch_version
|
||||
run: echo ::set-output name=ACTUAL_PATCH_VERSION::$(echo $GITHUB_REF | cut -d / -f 3 | sed 's/v//g')
|
||||
- name: Get actual minor version
|
||||
id: actual_minor_version
|
||||
run: echo ::set-output name=ACTUAL_MINOR_VERSION::$(echo $GITHUB_REF | cut -d / -f 3 | sed 's/v//g' | cut -d "." -f 1,2)
|
||||
- name: Get actual major version
|
||||
id: actual_major_version
|
||||
run: echo ::set-output name=ACTUAL_MAJOR_VERSION::$(echo $GITHUB_REF | cut -d / -f 3 | sed 's/v//g' | cut -d "." -f 1)
|
||||
- name: Build and publish image
|
||||
uses: ilteoood/docker_buildx@439099796bfc03dd9cedeb72a0c7cb92be5cc92c
|
||||
with:
|
||||
tag: latest,${{ steps.actual_patch_version.outputs.ACTUAL_PATCH_VERSION }},${{ steps.actual_minor_version.outputs.ACTUAL_MINOR_VERSION }},${{ steps.actual_major_version.outputs.ACTUAL_MAJOR_VERSION }}
|
||||
imageName: rclone/rclone
|
||||
platform: linux/amd64,linux/386,linux/arm64,linux/arm/v7
|
||||
publish: true
|
||||
dockerHubUser: ${{ secrets.DOCKER_HUB_USER }}
|
||||
dockerHubPassword: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
|
@ -3,7 +3,6 @@ FROM golang AS builder
|
|||
COPY . /go/src/github.com/rclone/rclone/
|
||||
WORKDIR /go/src/github.com/rclone/rclone/
|
||||
|
||||
RUN make quicktest
|
||||
RUN \
|
||||
CGO_ENABLED=0 \
|
||||
make
|
||||
|
@ -12,7 +11,8 @@ RUN ./rclone version
|
|||
# Begin final image
|
||||
FROM alpine:latest
|
||||
|
||||
RUN apk --no-cache add ca-certificates fuse
|
||||
RUN apk --no-cache add ca-certificates fuse tzdata && \
|
||||
echo "user_allow_other" >> /etc/fuse.conf
|
||||
|
||||
COPY --from=builder /go/src/github.com/rclone/rclone/rclone /usr/local/bin/
|
||||
|
||||
|
|
3877
MANUAL.html
generated
3877
MANUAL.html
generated
File diff suppressed because it is too large
Load diff
246
MANUAL.md
generated
246
MANUAL.md
generated
|
@ -1,15 +1,15 @@
|
|||
% rclone(1) User Manual
|
||||
% Nick Craig-Wood
|
||||
% May 27, 2020
|
||||
% Aug 07, 2020
|
||||
|
||||
# Rclone syncs your files to cloud storage
|
||||
|
||||
<img width="50%" src="https://rclone.org/img/logo_on_light__horizontal_color.svg" alt="rclone logo" style="float:right; padding: 5px;" >
|
||||
|
||||
- [About rclone](#about)
|
||||
- [What can rclone do for you](#what)
|
||||
- [What features does rclone have](#features)
|
||||
- [What providers does rclone support](#providers)
|
||||
- [What can rclone do for you?](#what)
|
||||
- [What features does rclone have?](#features)
|
||||
- [What providers does rclone support?](#providers)
|
||||
- [Download](https://rclone.org/downloads/)
|
||||
- [Install](https://rclone.org/install/)
|
||||
- [Donate.](https://rclone.org/donate/)
|
||||
|
@ -24,20 +24,20 @@ services, as well as standard transfer protocols.
|
|||
|
||||
Rclone has powerful cloud equivalents to the unix commands rsync, cp,
|
||||
mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax
|
||||
includes shell pipeline support, and `--dry-run` protection. It can be
|
||||
includes shell pipeline support, and `--dry-run` protection. It is
|
||||
used at the command line, in scripts or via its [API](/rc).
|
||||
|
||||
Users have called rclone *"The Swiss army knife of cloud storage"* and
|
||||
Users call rclone *"The Swiss army knife of cloud storage"*, and
|
||||
*"Technology indistinguishable from magic"*.
|
||||
|
||||
Rclone really looks after your data. It preserves timestamps and
|
||||
verifies your data at all times. Transfers over limited bandwidth;
|
||||
verifies checksums at all times. Transfers over limited bandwidth;
|
||||
intermittent connections, or subject to quota can be restarted, from
|
||||
the last good file transferred. You can
|
||||
[check](https://rclone.org/commands/rclone_check/) the integrity of your files. Where
|
||||
possible, rclone employs server side transfers to minimise local
|
||||
bandwidth use and transfers from one provider to another without
|
||||
using your local disk.
|
||||
using local disk.
|
||||
|
||||
Virtual backends wrap local and cloud file systems to apply
|
||||
[encryption](https://rclone.org/crypt/),
|
||||
|
@ -45,9 +45,9 @@ Virtual backends wrap local and cloud file systems to apply
|
|||
[chunking](https://rclone.org/chunker/) and
|
||||
[joining](https://rclone.org/union/).
|
||||
|
||||
Rclone can [mount](https://rclone.org/commands/rclone_mount/) any local, cloud or
|
||||
Rclone [mounts](https://rclone.org/commands/rclone_mount/) any local, cloud or
|
||||
virtual filesystem as a disk on Windows,
|
||||
macOS, linux and FreeBSD, and also serve these over
|
||||
macOS, linux and FreeBSD, and also serves these over
|
||||
[SFTP](https://rclone.org/commands/rclone_serve_sftp/),
|
||||
[HTTP](https://rclone.org/commands/rclone_serve_http/),
|
||||
[WebDAV](https://rclone.org/commands/rclone_serve_webdav/),
|
||||
|
@ -61,14 +61,14 @@ Fedora, Brew and Chocolatey repos. include rclone. For the latest
|
|||
version [downloading from rclone.org](https://rclone.org/downloads/) is recommended.
|
||||
|
||||
Rclone is widely used on Linux, Windows and Mac. Third party
|
||||
developers have built innovative backup, restore, GUI and business
|
||||
developers create innovative backup, restore, GUI and business
|
||||
process solutions using the rclone command line or API.
|
||||
|
||||
Let rclone do the heavy lifting of communicating with cloud storage.
|
||||
Rclone does the heavy lifting of communicating with cloud storage.
|
||||
|
||||
## What can rclone do for you {#what}
|
||||
## What can rclone do for you? {#what}
|
||||
|
||||
Rclone can help you:
|
||||
Rclone helps you:
|
||||
|
||||
- Backup (and encrypt) files to cloud storage
|
||||
- Restore (and decrypt) files from cloud storage
|
||||
|
@ -96,7 +96,7 @@ Rclone can help you:
|
|||
|
||||
## Supported providers {#providers}
|
||||
|
||||
(There are many other providers, built on standard protocols such as
|
||||
(There are many others, built on standard protocols such as
|
||||
WebDAV or S3, that work out of the box.)
|
||||
|
||||
|
||||
|
@ -330,7 +330,7 @@ kill %1
|
|||
|
||||
## Install from source ##
|
||||
|
||||
Make sure you have at least [Go](https://golang.org/) 1.7
|
||||
Make sure you have at least [Go](https://golang.org/) 1.10
|
||||
installed. [Download go](https://golang.org/dl/) if necessary. The
|
||||
latest release is recommended. Then
|
||||
|
||||
|
@ -339,16 +339,23 @@ latest release is recommended. Then
|
|||
go build
|
||||
./rclone version
|
||||
|
||||
You can also build and install rclone in the
|
||||
[GOPATH](https://github.com/golang/go/wiki/GOPATH) (which defaults to
|
||||
`~/go`) with:
|
||||
This will leave you a checked out version of rclone you can modify and
|
||||
send pull requests with. If you use `make` instead of `go build` then
|
||||
the rclone build will have the correct version information in it.
|
||||
|
||||
go get -u -v github.com/rclone/rclone
|
||||
You can also build the latest stable rclone with:
|
||||
|
||||
and this will build the binary in `$GOPATH/bin` (`~/go/bin/rclone` by
|
||||
default) after downloading the source to
|
||||
`$GOPATH/src/github.com/rclone/rclone` (`~/go/src/github.com/rclone/rclone`
|
||||
by default).
|
||||
go get github.com/rclone/rclone
|
||||
|
||||
or the latest version (equivalent to the beta) with
|
||||
|
||||
go get github.com/rclone/rclone@master
|
||||
|
||||
These will build the binary in `$(go env GOPATH)/bin`
|
||||
(`~/go/bin/rclone` by default) after downloading the source to the go
|
||||
module cache. Note - do **not** use the `-u` flag here. This causes go
|
||||
to try to update the depencencies that rclone uses and sometimes these
|
||||
don't work with the current version of rclone.
|
||||
|
||||
## Installation with Ansible ##
|
||||
|
||||
|
@ -3126,11 +3133,24 @@ See the [global flags page](https://rclone.org/flags/) for global options not li
|
|||
|
||||
# rclone obscure
|
||||
|
||||
Obscure password for use in the rclone.conf
|
||||
Obscure password for use in the rclone config file
|
||||
|
||||
## Synopsis
|
||||
|
||||
Obscure password for use in the rclone.conf
|
||||
In the rclone config file, human readable passwords are
|
||||
obscured. Obscuring them is done by encrypting them and writing them
|
||||
out in base64. This is **not** a secure way of encrypting these
|
||||
passwords as rclone can decrypt them - it is to prevent "eyedropping"
|
||||
- namely someone seeing a password in the rclone config file by
|
||||
accident.
|
||||
|
||||
Many equally important things (like access tokens) are not obscured in
|
||||
the config file. However it is very hard to shoulder surf a 64
|
||||
character hex token.
|
||||
|
||||
If you want to encrypt the config file then please use config file
|
||||
encryption - see [rclone config](https://rclone.org/commands/rclone_config/) for more
|
||||
info.
|
||||
|
||||
```
|
||||
rclone obscure password [flags]
|
||||
|
@ -9670,7 +9690,7 @@ These flags are available for every command.
|
|||
--use-json-log Use json log format.
|
||||
--use-mmap Use mmap allocator (see docs).
|
||||
--use-server-modtime Use server modified time instead of object metadata
|
||||
--user-agent string Set the user-agent to a specified string. The default is rclone/ version (default "rclone/v1.52.0")
|
||||
--user-agent string Set the user-agent to a specified string. The default is rclone/ version (default "rclone/v1.52.3")
|
||||
-v, --verbose count Print lots more stuff (repeat for more)
|
||||
```
|
||||
|
||||
|
@ -9731,7 +9751,7 @@ and may be set in the config file.
|
|||
--cache-db-wait-time Duration How long to wait for the DB to be available - 0 is unlimited (default 1s)
|
||||
--cache-info-age Duration How long to cache file structure information (directory listings, file size, times etc). (default 6h0m0s)
|
||||
--cache-plex-insecure string Skip all certificate verification when connecting to the Plex server
|
||||
--cache-plex-password string The password of the Plex user
|
||||
--cache-plex-password string The password of the Plex user (obscured)
|
||||
--cache-plex-url string The URL of the Plex server
|
||||
--cache-plex-username string The username of the Plex user
|
||||
--cache-read-retries int How many times to retry a read from a cache storage. (default 10)
|
||||
|
@ -9751,8 +9771,8 @@ and may be set in the config file.
|
|||
-L, --copy-links Follow symlinks and copy the pointed to item.
|
||||
--crypt-directory-name-encryption Option to either encrypt directory names or leave them intact. (default true)
|
||||
--crypt-filename-encryption string How to encrypt the filenames. (default "standard")
|
||||
--crypt-password string Password or pass phrase for encryption.
|
||||
--crypt-password2 string Password or pass phrase for salt. Optional but recommended.
|
||||
--crypt-password string Password or pass phrase for encryption. (obscured)
|
||||
--crypt-password2 string Password or pass phrase for salt. Optional but recommended. (obscured)
|
||||
--crypt-remote string Remote to encrypt/decrypt.
|
||||
--crypt-show-mapping For all files listed show how the names encrypt.
|
||||
--drive-acknowledge-abuse Set to allow files which return cannotDownloadAbusiveFile to be downloaded.
|
||||
|
@ -9803,7 +9823,7 @@ and may be set in the config file.
|
|||
--ftp-encoding MultiEncoder This sets the encoding for the backend. (default Slash,Del,Ctl,RightSpace,Dot)
|
||||
--ftp-host string FTP host to connect to
|
||||
--ftp-no-check-certificate Do not verify the TLS certificate of the server
|
||||
--ftp-pass string FTP password
|
||||
--ftp-pass string FTP password (obscured)
|
||||
--ftp-port string FTP port, leave blank to use default (21)
|
||||
--ftp-tls Use FTP over TLS (Implicit)
|
||||
--ftp-user string FTP username, leave blank for current username, $USER
|
||||
|
@ -9840,7 +9860,7 @@ and may be set in the config file.
|
|||
--koofr-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||
--koofr-endpoint string The Koofr API endpoint to use (default "https://app.koofr.net")
|
||||
--koofr-mountid string Mount ID of the mount to use. If omitted, the primary mount is used.
|
||||
--koofr-password string Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password)
|
||||
--koofr-password string Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password) (obscured)
|
||||
--koofr-setmtime Does the backend support setting modification time. Set this to false if you use a mount ID that points to a Dropbox or Amazon Drive backend. (default true)
|
||||
--koofr-user string Your Koofr user name
|
||||
-l, --links Translate symlinks to/from regular files with a '.rclonelink' extension
|
||||
|
@ -9853,7 +9873,7 @@ and may be set in the config file.
|
|||
--local-nounc string Disable UNC (long path names) conversion on Windows
|
||||
--mailru-check-hash What should copy do if file checksum is mismatched or invalid (default true)
|
||||
--mailru-encoding MultiEncoder This sets the encoding for the backend. (default Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||
--mailru-pass string Password
|
||||
--mailru-pass string Password (obscured)
|
||||
--mailru-speedup-enable Skip full upload if there is another file with same data hash. (default true)
|
||||
--mailru-speedup-file-patterns string Comma separated list of file name patterns eligible for speedup (put by hash). (default "*.mkv,*.avi,*.mp4,*.mp3,*.zip,*.gz,*.rar,*.pdf")
|
||||
--mailru-speedup-max-disk SizeSuffix This option allows you to disable speedup (put by hash) for large files (default 3G)
|
||||
|
@ -9862,7 +9882,7 @@ and may be set in the config file.
|
|||
--mega-debug Output more debug from Mega.
|
||||
--mega-encoding MultiEncoder This sets the encoding for the backend. (default Slash,InvalidUtf8,Dot)
|
||||
--mega-hard-delete Delete files permanently rather than putting them into the trash.
|
||||
--mega-pass string Password.
|
||||
--mega-pass string Password. (obscured)
|
||||
--mega-user string User name
|
||||
-x, --one-file-system Don't cross filesystem boundaries (unix/macOS only).
|
||||
--onedrive-chunk-size SizeSuffix Chunk size to upload files with - must be multiple of 320k (327,680 bytes). (default 10M)
|
||||
|
@ -9875,11 +9895,12 @@ and may be set in the config file.
|
|||
--onedrive-server-side-across-configs Allow server side operations (eg copy) to work across different onedrive configs.
|
||||
--opendrive-chunk-size SizeSuffix Files will be uploaded in chunks this size. (default 10M)
|
||||
--opendrive-encoding MultiEncoder This sets the encoding for the backend. (default Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,LeftSpace,LeftCrLfHtVt,RightSpace,RightCrLfHtVt,InvalidUtf8,Dot)
|
||||
--opendrive-password string Password.
|
||||
--opendrive-password string Password. (obscured)
|
||||
--opendrive-username string Username
|
||||
--pcloud-client-id string Pcloud App Client Id
|
||||
--pcloud-client-secret string Pcloud App Client Secret
|
||||
--pcloud-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||
--pcloud-hostname string Hostname to connect to. (default "api.pcloud.com")
|
||||
--pcloud-root-folder-id string Fill in for rclone to use a non root folder as its starting point. (default "d0")
|
||||
--premiumizeme-encoding MultiEncoder This sets the encoding for the backend. (default Slash,DoubleQuote,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||
--putio-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||
|
@ -9926,19 +9947,19 @@ and may be set in the config file.
|
|||
--seafile-create-library Should rclone create a library if it doesn't exist
|
||||
--seafile-encoding MultiEncoder This sets the encoding for the backend. (default Slash,DoubleQuote,BackSlash,Ctl,InvalidUtf8)
|
||||
--seafile-library string Name of the library. Leave blank to access all non-encrypted libraries.
|
||||
--seafile-library-key string Library password (for encrypted libraries only). Leave blank if you pass it through the command line.
|
||||
--seafile-pass string Password
|
||||
--seafile-library-key string Library password (for encrypted libraries only). Leave blank if you pass it through the command line. (obscured)
|
||||
--seafile-pass string Password (obscured)
|
||||
--seafile-url string URL of seafile host to connect to
|
||||
--seafile-user string User name (usually email address)
|
||||
--sftp-ask-password Allow asking for SFTP password when needed.
|
||||
--sftp-disable-hashcheck Disable the execution of SSH commands to determine if remote file hashing is available.
|
||||
--sftp-host string SSH host to connect to
|
||||
--sftp-key-file string Path to PEM-encoded private key file, leave blank or set key-use-agent to use ssh-agent.
|
||||
--sftp-key-file-pass string The passphrase to decrypt the PEM-encoded private key file.
|
||||
--sftp-key-file-pass string The passphrase to decrypt the PEM-encoded private key file. (obscured)
|
||||
--sftp-key-pem string Raw PEM-encoded private key, If specified, will override key_file parameter.
|
||||
--sftp-key-use-agent When set forces the usage of the ssh-agent.
|
||||
--sftp-md5sum-command string The command used to read md5 hashes. Leave blank for autodetect.
|
||||
--sftp-pass string SSH password, leave blank to use ssh-agent.
|
||||
--sftp-pass string SSH password, leave blank to use ssh-agent. (obscured)
|
||||
--sftp-path-override string Override path used by SSH connection.
|
||||
--sftp-port string SSH port, leave blank to use default (22)
|
||||
--sftp-set-modtime Set the modified time on the remote if set. (default true)
|
||||
|
@ -9996,7 +10017,7 @@ and may be set in the config file.
|
|||
--union-upstreams string List of space separated upstreams.
|
||||
--webdav-bearer-token string Bearer token instead of user/pass (eg a Macaroon)
|
||||
--webdav-bearer-token-command string Command to run to get a bearer token
|
||||
--webdav-pass string Password.
|
||||
--webdav-pass string Password. (obscured)
|
||||
--webdav-url string URL of http host to connect to
|
||||
--webdav-user string User name
|
||||
--webdav-vendor string Name of the Webdav site/service/software you are using
|
||||
|
@ -13622,6 +13643,8 @@ The username of the Plex user
|
|||
|
||||
The password of the Plex user
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: plex_password
|
||||
- Env Var: RCLONE_CACHE_PLEX_PASSWORD
|
||||
- Type: string
|
||||
|
@ -14880,6 +14903,8 @@ NB If filename_encryption is "off" then this option will do nothing.
|
|||
|
||||
Password or pass phrase for encryption.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: password
|
||||
- Env Var: RCLONE_CRYPT_PASSWORD
|
||||
- Type: string
|
||||
|
@ -14890,6 +14915,8 @@ Password or pass phrase for encryption.
|
|||
Password or pass phrase for salt. Optional but recommended.
|
||||
Should be different to the previous password.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: password2
|
||||
- Env Var: RCLONE_CRYPT_PASSWORD2
|
||||
- Type: string
|
||||
|
@ -15318,6 +15345,10 @@ FTP is the File Transfer Protocol. FTP support is provided using the
|
|||
[github.com/jlaffaye/ftp](https://godoc.org/github.com/jlaffaye/ftp)
|
||||
package.
|
||||
|
||||
Paths are specified as `remote:path`. If the path does not begin with
|
||||
a `/` it is relative to the home directory of the user. An empty path
|
||||
`remote:` refers to the user's home directory.
|
||||
|
||||
Here is an example of making an FTP configuration. First run
|
||||
|
||||
rclone config
|
||||
|
@ -15480,6 +15511,8 @@ FTP port, leave blank to use default (21)
|
|||
|
||||
FTP password
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: pass
|
||||
- Env Var: RCLONE_FTP_PASS
|
||||
- Type: string
|
||||
|
@ -16426,7 +16459,7 @@ For shortcuts pointing to folders:
|
|||
- When deleting with `rclone rmdir` or `rclone purge` the shortcut is deleted not the linked folder.
|
||||
- **NB** When deleting with `rclone remove` or `rclone mount` the contents of the linked folder will be deleted.
|
||||
|
||||
It isn't currently possible to create shortcuts with rclone.
|
||||
The [rclone backend](https://rclone.org/commands/rclone_backend/) command can be used to create shortcuts.
|
||||
|
||||
Shortcuts can be completely ignored with the `--drive-skip-shortcuts` flag
|
||||
or the corresponding `skip_shortcuts` configuration setting.
|
||||
|
@ -16603,9 +16636,6 @@ Leave blank normally.
|
|||
Fill in to access "Computers" folders (see docs), or for rclone to use
|
||||
a non root folder as its starting point.
|
||||
|
||||
Note that if this is blank, the first time rclone runs it will fill it
|
||||
in with the ID of the root folder.
|
||||
|
||||
|
||||
- Config: root_folder_id
|
||||
- Env Var: RCLONE_DRIVE_ROOT_FOLDER_ID
|
||||
|
@ -17208,6 +17238,13 @@ the remote configuration, it's not such a big deal).
|
|||
|
||||
(Thanks to @balazer on github for these instructions.)
|
||||
|
||||
Sometimes, creation of an OAuth consent in Google API Console fails due to an error message
|
||||
“The request failed because changes to one of the field of the resource is not supported”.
|
||||
As a convenient workaround, the necessary Google Drive API key can be created on the
|
||||
[Python Quickstart](https://developers.google.com/drive/api/v3/quickstart/python) page.
|
||||
Just push the Enable the Drive API button to receive the Client ID and Secret.
|
||||
Note that it will automatically create a new project in the API Console.
|
||||
|
||||
Google Photos
|
||||
-------------------------------------------------
|
||||
|
||||
|
@ -18312,6 +18349,8 @@ Your Koofr user name
|
|||
|
||||
Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password)
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: password
|
||||
- Env Var: RCLONE_KOOFR_PASSWORD
|
||||
- Type: string
|
||||
|
@ -18544,6 +18583,8 @@ User name (usually email)
|
|||
|
||||
Password
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: pass
|
||||
- Env Var: RCLONE_MAILRU_PASS
|
||||
- Type: string
|
||||
|
@ -18842,6 +18883,8 @@ User name
|
|||
|
||||
Password.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: pass
|
||||
- Env Var: RCLONE_MEGA_PASS
|
||||
- Type: string
|
||||
|
@ -19419,7 +19462,7 @@ requests.
|
|||
If you are having problems with them (E.g., seeing a lot of throttling), you can get your own
|
||||
Client ID and Key by following the steps below:
|
||||
|
||||
1. Open https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade, then click `New registration`.
|
||||
1. Open https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade and then click `New registration`.
|
||||
2. Enter a name for your app, choose account type `Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)`, select `Web` in `Redirect URI` Enter `http://localhost:53682/` and click Register. Copy and keep the `Application (client) ID` under the app name for later use.
|
||||
3. Under `manage` select `Certificates & secrets`, click `New client secret`. Copy and keep that secret for later use.
|
||||
4. Under `manage` select `API permissions`, click `Add a permission` and select `Microsoft Graph` then select `delegated permissions`.
|
||||
|
@ -19818,6 +19861,8 @@ Username
|
|||
|
||||
Password.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: password
|
||||
- Env Var: RCLONE_OPENDRIVE_PASSWORD
|
||||
- Type: string
|
||||
|
@ -20837,6 +20882,17 @@ Fill in for rclone to use a non root folder as its starting point.
|
|||
- Type: string
|
||||
- Default: "d0"
|
||||
|
||||
#### --pcloud-hostname
|
||||
|
||||
Hostname to connect to.
|
||||
|
||||
This is normally set when rclone initially does the oauth connection.
|
||||
|
||||
- Config: hostname
|
||||
- Env Var: RCLONE_PCLOUD_HOSTNAME
|
||||
- Type: string
|
||||
- Default: "api.pcloud.com"
|
||||
|
||||
|
||||
|
||||
premiumize.me
|
||||
|
@ -21394,6 +21450,8 @@ User name (usually email address)
|
|||
|
||||
Password
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: pass
|
||||
- Env Var: RCLONE_SEAFILE_PASS
|
||||
- Type: string
|
||||
|
@ -21421,6 +21479,8 @@ Name of the library. Leave blank to access all non-encrypted libraries.
|
|||
|
||||
Library password (for encrypted libraries only). Leave blank if you pass it through the command line.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: library_key
|
||||
- Env Var: RCLONE_SEAFILE_LIBRARY_KEY
|
||||
- Type: string
|
||||
|
@ -21650,6 +21710,8 @@ SSH port, leave blank to use default (22)
|
|||
|
||||
SSH password, leave blank to use ssh-agent.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: pass
|
||||
- Env Var: RCLONE_SFTP_PASS
|
||||
- Type: string
|
||||
|
@ -21680,6 +21742,8 @@ The passphrase to decrypt the PEM-encoded private key file.
|
|||
Only PEM encrypted key files (old OpenSSH format) are supported. Encrypted keys
|
||||
in the new OpenSSH format can't be used.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: key_file_pass
|
||||
- Env Var: RCLONE_SFTP_KEY_FILE_PASS
|
||||
- Type: string
|
||||
|
@ -22778,6 +22842,8 @@ User name
|
|||
|
||||
Password.
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||
|
||||
- Config: pass
|
||||
- Env Var: RCLONE_WEBDAV_PASS
|
||||
- Type: string
|
||||
|
@ -23596,6 +23662,96 @@ Options:
|
|||
|
||||
# Changelog
|
||||
|
||||
## v1.52.3 - 2020-08-07
|
||||
|
||||
[See commits](https://github.com/rclone/rclone/compare/v1.52.2...v1.52.3)
|
||||
|
||||
* Bug Fixes
|
||||
* docs
|
||||
* Disable smart typography (eg en-dash) in MANUAL.* and man page (Nick Craig-Wood)
|
||||
* Update install.md to reflect minimum Go version (Evan Harris)
|
||||
* Update install from source instructions (Nick Craig-Wood)
|
||||
* make_manual: Support SOURCE_DATE_EPOCH (Morten Linderud)
|
||||
* log: Fix --use-json-log going to stderr not --log-file on Windows (Nick Craig-Wood)
|
||||
* serve dlna: Fix file list on Samsung Series 6+ TVs (Matteo Pietro Dazzi)
|
||||
* sync: Fix deadlock with --track-renames-strategy modtime (Nick Craig-Wood)
|
||||
* Cache
|
||||
* Fix moveto/copyto remote:file remote:file2 (Nick Craig-Wood)
|
||||
* Drive
|
||||
* Stop using root_folder_id as a cache (Nick Craig-Wood)
|
||||
* Make dangling shortcuts appear in listings (Nick Craig-Wood)
|
||||
* Drop "Disabling ListR" messages down to debug (Nick Craig-Wood)
|
||||
* Workaround and policy for Google Drive API (Dmitry Ustalov)
|
||||
* FTP
|
||||
* Add note to docs about home vs root directory selection (Nick Craig-Wood)
|
||||
* Onedrive
|
||||
* Fix reverting to Copy when Move would have worked (Nick Craig-Wood)
|
||||
* Avoid comma rendered in URL in onedrive.md (Kevin)
|
||||
* Pcloud
|
||||
* Fix oauth on European region "eapi.pcloud.com" (Nick Craig-Wood)
|
||||
* S3
|
||||
* Fix bucket Region auto detection when Region unset in config (Nick Craig-Wood)
|
||||
|
||||
## v1.52.2 - 2020-06-24
|
||||
|
||||
[See commits](https://github.com/rclone/rclone/compare/v1.52.1...v1.52.2)
|
||||
|
||||
* Bug Fixes
|
||||
* build
|
||||
* Fix docker release build action (Nick Craig-Wood)
|
||||
* Fix custom timezone in Docker image (NoLooseEnds)
|
||||
* check: Fix misleading message which printed errors instead of differences (Nick Craig-Wood)
|
||||
* errors: Add WSAECONNREFUSED and more to the list of retriable Windows errors (Nick Craig-Wood)
|
||||
* rcd: Fix incorrect prometheus metrics (Gary Kim)
|
||||
* serve restic: Fix flags so they use environment variables (Nick Craig-Wood)
|
||||
* serve webdav: Fix flags so they use environment variables (Nick Craig-Wood)
|
||||
* sync: Fix --track-renames-strategy modtime (Nick Craig-Wood)
|
||||
* Drive
|
||||
* Fix not being able to delete a directory with a trashed shortcut (Nick Craig-Wood)
|
||||
* Fix creating a directory inside a shortcut (Nick Craig-Wood)
|
||||
* Fix --drive-impersonate with cached root_folder_id (Nick Craig-Wood)
|
||||
* SFTP
|
||||
* Fix SSH key PEM loading (Zac Rubin)
|
||||
* Swift
|
||||
* Speed up deletes by not retrying segment container deletes (Nick Craig-Wood)
|
||||
* Tardigrade
|
||||
* Upgrade to uplink v1.1.1 (Caleb Case)
|
||||
* WebDAV
|
||||
* Fix free/used display for rclone about/df for certain backends (Nick Craig-Wood)
|
||||
|
||||
## v1.52.1 - 2020-06-10
|
||||
|
||||
[See commits](https://github.com/rclone/rclone/compare/v1.52.0...v1.52.1)
|
||||
|
||||
* Bug Fixes
|
||||
* lib/file: Fix SetSparse on Windows 7 which fixes downloads of files > 250MB (Nick Craig-Wood)
|
||||
* build
|
||||
* Update go.mod to go1.14 to enable -mod=vendor build (Nick Craig-Wood)
|
||||
* Remove quicktest from Dockerfile (Nick Craig-Wood)
|
||||
* Build Docker images with GitHub actions (Matteo Pietro Dazzi)
|
||||
* Update Docker build workflows (Nick Craig-Wood)
|
||||
* Set user_allow_other in /etc/fuse.conf in the Docker image (Nick Craig-Wood)
|
||||
* Fix xgo build after go1.14 go.mod update (Nick Craig-Wood)
|
||||
* docs
|
||||
* Add link to source and modified time to footer of every page (Nick Craig-Wood)
|
||||
* Remove manually set dates and use git dates instead (Nick Craig-Wood)
|
||||
* Minor tense, punctuation, brevity and positivity changes for the home page (edwardxml)
|
||||
* Remove leading slash in page reference in footer when present (Nick Craig-Wood)
|
||||
* Note commands which need obscured input in the docs (Nick Craig-Wood)
|
||||
* obscure: Write more help as we are referencing it elsewhere (Nick Craig-Wood)
|
||||
* VFS
|
||||
* Fix OS vs Unix path confusion - fixes ChangeNotify on Windows (Nick Craig-Wood)
|
||||
* Drive
|
||||
* Fix missing items when listing using --fast-list / ListR (Nick Craig-Wood)
|
||||
* Putio
|
||||
* Fix panic on Object.Open (Cenk Alti)
|
||||
* S3
|
||||
* Fix upload of single files into buckets without create permission (Nick Craig-Wood)
|
||||
* Fix --header-upload (Nick Craig-Wood)
|
||||
* Tardigrade
|
||||
* Fix listing bug by upgrading to v1.0.7
|
||||
* Set UserAgent to rclone (Caleb Case)
|
||||
|
||||
## v1.52.0 - 2020-05-27
|
||||
|
||||
Special thanks to Martin Michlmayr for proof reading and correcting
|
||||
|
|
4550
MANUAL.txt
generated
4550
MANUAL.txt
generated
File diff suppressed because it is too large
Load diff
6
Makefile
6
Makefile
|
@ -105,16 +105,16 @@ tidy:
|
|||
doc: rclone.1 MANUAL.html MANUAL.txt rcdocs commanddocs
|
||||
|
||||
rclone.1: MANUAL.md
|
||||
pandoc -s --from markdown --to man MANUAL.md -o rclone.1
|
||||
pandoc -s --from markdown-smart --to man MANUAL.md -o rclone.1
|
||||
|
||||
MANUAL.md: bin/make_manual.py docs/content/*.md commanddocs backenddocs
|
||||
./bin/make_manual.py
|
||||
|
||||
MANUAL.html: MANUAL.md
|
||||
pandoc -s --from markdown --to html MANUAL.md -o MANUAL.html
|
||||
pandoc -s --from markdown-smart --to html MANUAL.md -o MANUAL.html
|
||||
|
||||
MANUAL.txt: MANUAL.md
|
||||
pandoc -s --from markdown --to plain MANUAL.md -o MANUAL.txt
|
||||
pandoc -s --from markdown-smart --to plain MANUAL.md -o MANUAL.txt
|
||||
|
||||
commanddocs: rclone
|
||||
XDG_CACHE_HOME="" XDG_CONFIG_HOME="" HOME="\$$HOME" USER="\$$USER" rclone gendocs docs/content/
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
v1.52.0
|
||||
v1.52.3
|
||||
|
|
3
backend/cache/cache_internal_test.go
vendored
3
backend/cache/cache_internal_test.go
vendored
|
@ -33,6 +33,7 @@ import (
|
|||
"github.com/rclone/rclone/fs/object"
|
||||
"github.com/rclone/rclone/fs/rc"
|
||||
"github.com/rclone/rclone/fstest"
|
||||
"github.com/rclone/rclone/fstest/testy"
|
||||
"github.com/rclone/rclone/lib/random"
|
||||
"github.com/rclone/rclone/vfs"
|
||||
"github.com/rclone/rclone/vfs/vfsflags"
|
||||
|
@ -299,6 +300,7 @@ func TestInternalRemoteWrittenFileFoundInMount(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestInternalCachedWrittenContentMatches(t *testing.T) {
|
||||
testy.SkipUnreliable(t)
|
||||
id := fmt.Sprintf("ticwcm%v", time.Now().Unix())
|
||||
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, false, true, nil, nil)
|
||||
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
||||
|
@ -342,6 +344,7 @@ func TestInternalDoubleWrittenContentMatches(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestInternalCachedUpdatedContentMatches(t *testing.T) {
|
||||
testy.SkipUnreliable(t)
|
||||
id := fmt.Sprintf("ticucm%v", time.Now().Unix())
|
||||
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, false, true, nil, nil)
|
||||
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
||||
|
|
|
@ -24,6 +24,7 @@ import (
|
|||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
|
@ -56,6 +57,7 @@ const (
|
|||
rcloneEncryptedClientSecret = "eX8GpZTVx3vxMWVkuuBdDWmAUE6rGhTwVrvG9GhllYccSdj2-mvHVg"
|
||||
driveFolderType = "application/vnd.google-apps.folder"
|
||||
shortcutMimeType = "application/vnd.google-apps.shortcut"
|
||||
shortcutMimeTypeDangling = "application/vnd.google-apps.shortcut.dangling" // synthetic mime type for internal use
|
||||
timeFormatIn = time.RFC3339
|
||||
timeFormatOut = "2006-01-02T15:04:05.000000000Z07:00"
|
||||
defaultMinSleep = fs.Duration(100 * time.Millisecond)
|
||||
|
@ -68,6 +70,8 @@ const (
|
|||
minChunkSize = 256 * fs.KibiByte
|
||||
defaultChunkSize = 8 * fs.MebiByte
|
||||
partialFields = "id,name,size,md5Checksum,trashed,modifiedTime,createdTime,mimeType,parents,webViewLink,shortcutDetails"
|
||||
listRGrouping = 50 // number of IDs to search at once when using ListR
|
||||
listRInputBuffer = 1000 // size of input buffer when using ListR
|
||||
)
|
||||
|
||||
// Globals
|
||||
|
@ -220,9 +224,6 @@ Leave blank normally.
|
|||
|
||||
Fill in to access "Computers" folders (see docs), or for rclone to use
|
||||
a non root folder as its starting point.
|
||||
|
||||
Note that if this is blank, the first time rclone runs it will fill it
|
||||
in with the ID of the root folder.
|
||||
`,
|
||||
}, {
|
||||
Name: "service_account_file",
|
||||
|
@ -348,7 +349,7 @@ date is used.`,
|
|||
}, {
|
||||
Name: "impersonate",
|
||||
Default: "",
|
||||
Help: "Impersonate this user when using a service account.",
|
||||
Help: `Impersonate this user when using a service account.`,
|
||||
Advanced: true,
|
||||
}, {
|
||||
Name: "alternate_export",
|
||||
|
@ -558,6 +559,9 @@ type Fs struct {
|
|||
isTeamDrive bool // true if this is a team drive
|
||||
fileFields googleapi.Field // fields to fetch file info with
|
||||
m configmap.Mapper
|
||||
grouping int32 // number of IDs to search at once in ListR - read with atomic
|
||||
listRmu *sync.Mutex // protects listRempties
|
||||
listRempties map[string]struct{} // IDs of supposedly empty directories which triggered grouping disable
|
||||
}
|
||||
|
||||
type baseObject struct {
|
||||
|
@ -1079,11 +1083,14 @@ func NewFs(name, path string, m configmap.Mapper) (fs.Fs, error) {
|
|||
}
|
||||
|
||||
f := &Fs{
|
||||
name: name,
|
||||
root: root,
|
||||
opt: *opt,
|
||||
pacer: newPacer(opt),
|
||||
m: m,
|
||||
name: name,
|
||||
root: root,
|
||||
opt: *opt,
|
||||
pacer: newPacer(opt),
|
||||
m: m,
|
||||
grouping: listRGrouping,
|
||||
listRmu: new(sync.Mutex),
|
||||
listRempties: make(map[string]struct{}),
|
||||
}
|
||||
f.isTeamDrive = opt.TeamDriveID != ""
|
||||
f.fileFields = f.getFileFields()
|
||||
|
@ -1109,14 +1116,15 @@ func NewFs(name, path string, m configmap.Mapper) (fs.Fs, error) {
|
|||
}
|
||||
}
|
||||
|
||||
// set root folder for a team drive or query the user root folder
|
||||
// Set the root folder ID
|
||||
if opt.RootFolderID != "" {
|
||||
// override root folder if set or cached in the config
|
||||
// use root_folder ID if set
|
||||
f.rootFolderID = opt.RootFolderID
|
||||
} else if f.isTeamDrive {
|
||||
// otherwise use team_drive if set
|
||||
f.rootFolderID = f.opt.TeamDriveID
|
||||
} else {
|
||||
// Look up the root ID and cache it in the config
|
||||
// otherwise look up the actual root ID
|
||||
rootID, err := f.getRootID()
|
||||
if err != nil {
|
||||
if gerr, ok := errors.Cause(err).(*googleapi.Error); ok && gerr.Code == 404 {
|
||||
|
@ -1128,7 +1136,7 @@ func NewFs(name, path string, m configmap.Mapper) (fs.Fs, error) {
|
|||
}
|
||||
}
|
||||
f.rootFolderID = rootID
|
||||
m.Set("root_folder_id", rootID)
|
||||
fs.Debugf(f, "root_folder_id = %q - save this in the config to speed up startup", rootID)
|
||||
}
|
||||
|
||||
f.dirCache = dircache.New(root, f.rootFolderID, f)
|
||||
|
@ -1330,6 +1338,10 @@ func (f *Fs) newObjectWithExportInfo(
|
|||
// and not from a listing. This is unlikely.
|
||||
fs.Debugf(remote, "Ignoring shortcut as skip shortcuts is set")
|
||||
return nil, fs.ErrorObjectNotFound
|
||||
case info.MimeType == shortcutMimeTypeDangling:
|
||||
// Pretend a dangling shortcut is a regular object
|
||||
// It will error if used, but appear in listings so it can be deleted
|
||||
return f.newRegularObject(remote, info), nil
|
||||
case info.Md5Checksum != "" || info.Size > 0:
|
||||
// If item has MD5 sum or a length it is a file stored on drive
|
||||
return f.newRegularObject(remote, info), nil
|
||||
|
@ -1402,6 +1414,7 @@ func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (newID string,
|
|||
leaf = f.opt.Enc.FromStandardName(leaf)
|
||||
// fmt.Println("Making", path)
|
||||
// Define the metadata for the directory we are going to create.
|
||||
pathID = actualID(pathID)
|
||||
createInfo := &drive.File{
|
||||
Name: leaf,
|
||||
Description: leaf,
|
||||
|
@ -1634,15 +1647,17 @@ func (s listRSlices) Less(i, j int) bool {
|
|||
// In each cycle it will read up to grouping entries from the in channel without blocking.
|
||||
// If an error occurs it will be send to the out channel and then return. Once the in channel is closed,
|
||||
// nil is send to the out channel and the function returns.
|
||||
func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan listREntry, out chan<- error, cb func(fs.DirEntry) error, grouping int) {
|
||||
func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in chan listREntry, out chan<- error, cb func(fs.DirEntry) error) {
|
||||
var dirs []string
|
||||
var paths []string
|
||||
var grouping int32
|
||||
|
||||
for dir := range in {
|
||||
dirs = append(dirs[:0], dir.id)
|
||||
paths = append(paths[:0], dir.path)
|
||||
grouping = atomic.LoadInt32(&f.grouping)
|
||||
waitloop:
|
||||
for i := 1; i < grouping; i++ {
|
||||
for i := int32(1); i < grouping; i++ {
|
||||
select {
|
||||
case d, ok := <-in:
|
||||
if !ok {
|
||||
|
@ -1655,6 +1670,7 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||
}
|
||||
listRSlices{dirs, paths}.Sort()
|
||||
var iErr error
|
||||
foundItems := false
|
||||
_, err := f.list(ctx, dirs, "", false, false, false, func(item *drive.File) bool {
|
||||
// shared with me items have no parents when at the root
|
||||
if f.opt.SharedWithMe && len(item.Parents) == 0 && len(paths) == 1 && paths[0] == "" {
|
||||
|
@ -1662,6 +1678,7 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||
}
|
||||
for _, parent := range item.Parents {
|
||||
var i int
|
||||
foundItems = true
|
||||
earlyExit := false
|
||||
// If only one item in paths then no need to search for the ID
|
||||
// assuming google drive is doing its job properly.
|
||||
|
@ -1702,6 +1719,53 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||
}
|
||||
return false
|
||||
})
|
||||
// Found no items in more than one directory. Retry these as
|
||||
// individual directories This is to work around a bug in google
|
||||
// drive where (A in parents) or (B in parents) returns nothing
|
||||
// sometimes. See #3114, #4289 and
|
||||
// https://issuetracker.google.com/issues/149522397
|
||||
if len(dirs) > 1 && !foundItems {
|
||||
if atomic.SwapInt32(&f.grouping, 1) != 1 {
|
||||
fs.Debugf(f, "Disabling ListR to work around bug in drive as multi listing (%d) returned no entries", len(dirs))
|
||||
}
|
||||
var recycled = make([]listREntry, len(dirs))
|
||||
f.listRmu.Lock()
|
||||
for i := range dirs {
|
||||
recycled[i] = listREntry{id: dirs[i], path: paths[i]}
|
||||
// Make a note of these dirs - if they all turn
|
||||
// out to be empty then we can re-enable grouping
|
||||
f.listRempties[dirs[i]] = struct{}{}
|
||||
}
|
||||
f.listRmu.Unlock()
|
||||
// recycle these in the background so we don't deadlock
|
||||
// the listR runners if they all get here
|
||||
wg.Add(len(recycled))
|
||||
go func() {
|
||||
for _, entry := range recycled {
|
||||
in <- entry
|
||||
}
|
||||
fs.Debugf(f, "Recycled %d entries", len(recycled))
|
||||
}()
|
||||
}
|
||||
// If using a grouping of 1 and dir was empty then check to see if it
|
||||
// is part of the group that caused grouping to be disabled.
|
||||
if grouping == 1 && len(dirs) == 1 && !foundItems {
|
||||
f.listRmu.Lock()
|
||||
if _, found := f.listRempties[dirs[0]]; found {
|
||||
// Remove the ID
|
||||
delete(f.listRempties, dirs[0])
|
||||
// If no empties left => all the directories that
|
||||
// triggered the grouping being set to 1 were actually
|
||||
// empty so must have made a mistake
|
||||
if len(f.listRempties) == 0 {
|
||||
if atomic.SwapInt32(&f.grouping, listRGrouping) != listRGrouping {
|
||||
fs.Debugf(f, "Re-enabling ListR as previous detection was in error")
|
||||
}
|
||||
}
|
||||
}
|
||||
f.listRmu.Unlock()
|
||||
}
|
||||
|
||||
for range dirs {
|
||||
wg.Done()
|
||||
}
|
||||
|
@ -1736,11 +1800,6 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||
// Don't implement this unless you have a more efficient way
|
||||
// of listing recursively that doing a directory traversal.
|
||||
func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
|
||||
const (
|
||||
grouping = 50
|
||||
inputBuffer = 1000
|
||||
)
|
||||
|
||||
err = f.dirCache.FindRoot(ctx, false)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -1753,7 +1812,7 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||
|
||||
mu := sync.Mutex{} // protects in and overflow
|
||||
wg := sync.WaitGroup{}
|
||||
in := make(chan listREntry, inputBuffer)
|
||||
in := make(chan listREntry, listRInputBuffer)
|
||||
out := make(chan error, fs.Config.Checkers)
|
||||
list := walk.NewListRHelper(callback)
|
||||
overflow := []listREntry{}
|
||||
|
@ -1766,6 +1825,9 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||
job := listREntry{actualID(d.ID()), d.Remote()}
|
||||
select {
|
||||
case in <- job:
|
||||
// Adding the wg after we've entered the item is
|
||||
// safe here because we know when the callback
|
||||
// is called we are holding a waitgroup.
|
||||
wg.Add(1)
|
||||
default:
|
||||
overflow = append(overflow, job)
|
||||
|
@ -1779,7 +1841,7 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||
in <- listREntry{directoryID, dir}
|
||||
|
||||
for i := 0; i < fs.Config.Checkers; i++ {
|
||||
go f.listRRunner(ctx, &wg, in, out, cb, grouping)
|
||||
go f.listRRunner(ctx, &wg, in, out, cb)
|
||||
}
|
||||
go func() {
|
||||
// wait until the all directories are processed
|
||||
|
@ -1789,8 +1851,8 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||
mu.Lock()
|
||||
l := len(overflow)
|
||||
// only fill half of the channel to prevent entries being put into overflow again
|
||||
if l > inputBuffer/2 {
|
||||
l = inputBuffer / 2
|
||||
if l > listRInputBuffer/2 {
|
||||
l = listRInputBuffer / 2
|
||||
}
|
||||
wg.Add(l)
|
||||
for _, d := range overflow[:l] {
|
||||
|
@ -1912,11 +1974,18 @@ func (f *Fs) resolveShortcut(item *drive.File) (newItem *drive.File, err error)
|
|||
}
|
||||
newItem, err = f.getFile(item.ShortcutDetails.TargetId, f.fileFields)
|
||||
if err != nil {
|
||||
if gerr, ok := errors.Cause(err).(*googleapi.Error); ok && gerr.Code == 404 {
|
||||
// 404 means dangling shortcut, so just return the shortcut with the mime type mangled
|
||||
fs.Logf(nil, "Dangling shortcut %q detected", item.Name)
|
||||
item.MimeType = shortcutMimeTypeDangling
|
||||
return item, nil
|
||||
}
|
||||
return nil, errors.Wrap(err, "failed to resolve shortcut")
|
||||
}
|
||||
// make sure we use the Name and Parents from the original item
|
||||
// make sure we use the Name, Parents and Trashed from the original item
|
||||
newItem.Name = item.Name
|
||||
newItem.Parents = item.Parents
|
||||
newItem.Trashed = item.Trashed
|
||||
// the new ID is a composite ID
|
||||
newItem.Id = joinID(newItem.Id, item.Id)
|
||||
return newItem, nil
|
||||
|
@ -3219,6 +3288,9 @@ func (o *baseObject) open(ctx context.Context, url string, options ...fs.OpenOpt
|
|||
|
||||
// Open an object for read
|
||||
func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.ReadCloser, err error) {
|
||||
if o.mimeType == shortcutMimeTypeDangling {
|
||||
return nil, errors.New("can't read dangling shortcut")
|
||||
}
|
||||
if o.v2Download {
|
||||
var v2File *drive_v2.File
|
||||
err = o.fs.pacer.Call(func() (bool, error) {
|
||||
|
|
|
@ -1121,9 +1121,10 @@ func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object,
|
|||
id, dstDriveID, _ := parseNormalizedID(directoryID)
|
||||
_, srcObjDriveID, _ := parseNormalizedID(srcObj.id)
|
||||
|
||||
if dstDriveID != srcObjDriveID {
|
||||
if f.canonicalDriveID(dstDriveID) != srcObj.fs.canonicalDriveID(srcObjDriveID) {
|
||||
// https://docs.microsoft.com/en-us/graph/api/driveitem-move?view=graph-rest-1.0
|
||||
// "Items cannot be moved between Drives using this request."
|
||||
fs.Debugf(f, "Can't move files between drives (%q != %q)", dstDriveID, srcObjDriveID)
|
||||
return nil, fs.ErrorCantMove
|
||||
}
|
||||
|
||||
|
@ -1219,9 +1220,10 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string
|
|||
}
|
||||
_, srcDriveID, _ := parseNormalizedID(srcID)
|
||||
|
||||
if dstDriveID != srcDriveID {
|
||||
if f.canonicalDriveID(dstDriveID) != srcFs.canonicalDriveID(srcDriveID) {
|
||||
// https://docs.microsoft.com/en-us/graph/api/driveitem-move?view=graph-rest-1.0
|
||||
// "Items cannot be moved between Drives using this request."
|
||||
fs.Debugf(f, "Can't move directories between drives (%q != %q)", dstDriveID, srcDriveID)
|
||||
return fs.ErrorCantDirMove
|
||||
}
|
||||
|
||||
|
@ -1869,6 +1871,17 @@ func parseNormalizedID(ID string) (string, string, string) {
|
|||
return ID, "", ""
|
||||
}
|
||||
|
||||
// Returns the canonical form of the driveID
|
||||
func (f *Fs) canonicalDriveID(driveID string) (canonicalDriveID string) {
|
||||
if driveID == "" {
|
||||
canonicalDriveID = f.opt.DriveID
|
||||
} else {
|
||||
canonicalDriveID = driveID
|
||||
}
|
||||
canonicalDriveID = strings.ToLower(canonicalDriveID)
|
||||
return canonicalDriveID
|
||||
}
|
||||
|
||||
// getRelativePathInsideBase checks if `target` is inside `base`. If so, it
|
||||
// returns a relative path for `target` based on `base` and a boolean `true`.
|
||||
// Otherwise returns "", false.
|
||||
|
|
|
@ -42,7 +42,7 @@ const (
|
|||
minSleep = 10 * time.Millisecond
|
||||
maxSleep = 2 * time.Second
|
||||
decayConstant = 2 // bigger for slower decay, exponential
|
||||
rootURL = "https://api.pcloud.com"
|
||||
defaultHostname = "api.pcloud.com"
|
||||
)
|
||||
|
||||
// Globals
|
||||
|
@ -51,8 +51,8 @@ var (
|
|||
oauthConfig = &oauth2.Config{
|
||||
Scopes: nil,
|
||||
Endpoint: oauth2.Endpoint{
|
||||
AuthURL: "https://my.pcloud.com/oauth2/authorize",
|
||||
TokenURL: "https://api.pcloud.com/oauth2_token",
|
||||
AuthURL: "https://my.pcloud.com/oauth2/authorize",
|
||||
// TokenURL: "https://api.pcloud.com/oauth2_token", set by updateTokenURL
|
||||
},
|
||||
ClientID: rcloneClientID,
|
||||
ClientSecret: obscure.MustReveal(rcloneEncryptedClientSecret),
|
||||
|
@ -60,17 +60,45 @@ var (
|
|||
}
|
||||
)
|
||||
|
||||
// Update the TokenURL with the actual hostname
|
||||
func updateTokenURL(oauthConfig *oauth2.Config, hostname string) {
|
||||
oauthConfig.Endpoint.TokenURL = "https://" + hostname + "/oauth2_token"
|
||||
}
|
||||
|
||||
// Register with Fs
|
||||
func init() {
|
||||
updateTokenURL(oauthConfig, defaultHostname)
|
||||
fs.Register(&fs.RegInfo{
|
||||
Name: "pcloud",
|
||||
Description: "Pcloud",
|
||||
NewFs: NewFs,
|
||||
Config: func(name string, m configmap.Mapper) {
|
||||
optc := new(Options)
|
||||
err := configstruct.Set(m, optc)
|
||||
if err != nil {
|
||||
fs.Errorf(nil, "Failed to read config: %v", err)
|
||||
}
|
||||
updateTokenURL(oauthConfig, optc.Hostname)
|
||||
checkAuth := func(oauthConfig *oauth2.Config, auth *oauthutil.AuthResult) error {
|
||||
if auth == nil || auth.Form == nil {
|
||||
return errors.New("form not found in response")
|
||||
}
|
||||
hostname := auth.Form.Get("hostname")
|
||||
if hostname == "" {
|
||||
hostname = defaultHostname
|
||||
}
|
||||
// Save the hostname in the config
|
||||
m.Set("hostname", hostname)
|
||||
// Update the token URL
|
||||
updateTokenURL(oauthConfig, hostname)
|
||||
fs.Debugf(nil, "pcloud: got hostname %q", hostname)
|
||||
return nil
|
||||
}
|
||||
opt := oauthutil.Options{
|
||||
CheckAuth: checkAuth,
|
||||
StateBlankOK: true, // pCloud seems to drop the state parameter now - see #4210
|
||||
}
|
||||
err := oauthutil.Config("pcloud", name, m, oauthConfig, &opt)
|
||||
err = oauthutil.Config("pcloud", name, m, oauthConfig, &opt)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to configure token: %v", err)
|
||||
}
|
||||
|
@ -96,6 +124,13 @@ func init() {
|
|||
Help: "Fill in for rclone to use a non root folder as its starting point.",
|
||||
Default: "d0",
|
||||
Advanced: true,
|
||||
}, {
|
||||
Name: "hostname",
|
||||
Help: `Hostname to connect to.
|
||||
|
||||
This is normally set when rclone initially does the oauth connection.`,
|
||||
Default: defaultHostname,
|
||||
Advanced: true,
|
||||
}},
|
||||
})
|
||||
}
|
||||
|
@ -104,6 +139,7 @@ func init() {
|
|||
type Options struct {
|
||||
Enc encoder.MultiEncoder `config:"encoding"`
|
||||
RootFolderID string `config:"root_folder_id"`
|
||||
Hostname string `config:"hostname"`
|
||||
}
|
||||
|
||||
// Fs represents a remote pcloud
|
||||
|
@ -253,12 +289,13 @@ func NewFs(name, root string, m configmap.Mapper) (fs.Fs, error) {
|
|||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to configure Pcloud")
|
||||
}
|
||||
updateTokenURL(oauthConfig, opt.Hostname)
|
||||
|
||||
f := &Fs{
|
||||
name: name,
|
||||
root: root,
|
||||
opt: *opt,
|
||||
srv: rest.NewClient(oAuthClient).SetRoot(rootURL),
|
||||
srv: rest.NewClient(oAuthClient).SetRoot("https://" + opt.Hostname),
|
||||
pacer: fs.NewPacer(pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))),
|
||||
}
|
||||
f.features = (&fs.Features{
|
||||
|
|
|
@ -248,7 +248,10 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.Read
|
|||
_ = resp.Body.Close()
|
||||
return nil, fserrors.NoRetryError(err)
|
||||
}
|
||||
return resp.Body, err
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return resp.Body, nil
|
||||
}
|
||||
|
||||
// Update the already existing object
|
||||
|
|
|
@ -59,6 +59,7 @@ import (
|
|||
"github.com/rclone/rclone/lib/pool"
|
||||
"github.com/rclone/rclone/lib/readers"
|
||||
"github.com/rclone/rclone/lib/rest"
|
||||
"github.com/rclone/rclone/lib/structs"
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
|
@ -1126,9 +1127,6 @@ func s3Connection(opt *Options) (*s3.S3, *session.Session, error) {
|
|||
return nil, nil, errors.New("secret_access_key not found")
|
||||
}
|
||||
|
||||
if opt.Region == "" && opt.Endpoint == "" {
|
||||
opt.Endpoint = "https://s3.amazonaws.com/"
|
||||
}
|
||||
if opt.Region == "" {
|
||||
opt.Region = "us-east-1"
|
||||
}
|
||||
|
@ -2033,11 +2031,17 @@ func (o *Object) readMetaData(ctx context.Context) (err error) {
|
|||
if err != nil {
|
||||
if awsErr, ok := err.(awserr.RequestFailure); ok {
|
||||
if awsErr.StatusCode() == http.StatusNotFound {
|
||||
// NotFound indicates bucket was OK
|
||||
// NoSuchBucket would be returned if bucket was bad
|
||||
if awsErr.Code() == "NotFound" {
|
||||
o.fs.cache.MarkOK(bucket)
|
||||
}
|
||||
return fs.ErrorObjectNotFound
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
o.fs.cache.MarkOK(bucket)
|
||||
var size int64
|
||||
// Ignore missing Content-Length assuming it is 0
|
||||
// Some versions of ceph do this due their apache proxies
|
||||
|
@ -2198,19 +2202,12 @@ func (o *Object) uploadMultipart(ctx context.Context, req *s3.PutObjectInput, si
|
|||
|
||||
memPool := f.getMemoryPool(int64(partSize))
|
||||
|
||||
var mReq s3.CreateMultipartUploadInput
|
||||
structs.SetFrom(&mReq, req)
|
||||
var cout *s3.CreateMultipartUploadOutput
|
||||
err = f.pacer.Call(func() (bool, error) {
|
||||
var err error
|
||||
cout, err = f.c.CreateMultipartUploadWithContext(ctx, &s3.CreateMultipartUploadInput{
|
||||
Bucket: req.Bucket,
|
||||
ACL: req.ACL,
|
||||
Key: req.Key,
|
||||
ContentType: req.ContentType,
|
||||
Metadata: req.Metadata,
|
||||
ServerSideEncryption: req.ServerSideEncryption,
|
||||
SSEKMSKeyId: req.SSEKMSKeyId,
|
||||
StorageClass: req.StorageClass,
|
||||
})
|
||||
cout, err = f.c.CreateMultipartUploadWithContext(ctx, &mReq)
|
||||
return f.shouldRetry(err)
|
||||
})
|
||||
if err != nil {
|
||||
|
@ -2423,6 +2420,35 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
|
|||
if o.fs.opt.StorageClass != "" {
|
||||
req.StorageClass = &o.fs.opt.StorageClass
|
||||
}
|
||||
// Apply upload options
|
||||
for _, option := range options {
|
||||
key, value := option.Header()
|
||||
lowerKey := strings.ToLower(key)
|
||||
switch lowerKey {
|
||||
case "":
|
||||
// ignore
|
||||
case "cache-control":
|
||||
req.CacheControl = aws.String(value)
|
||||
case "content-disposition":
|
||||
req.ContentDisposition = aws.String(value)
|
||||
case "content-encoding":
|
||||
req.ContentEncoding = aws.String(value)
|
||||
case "content-language":
|
||||
req.ContentLanguage = aws.String(value)
|
||||
case "content-type":
|
||||
req.ContentType = aws.String(value)
|
||||
case "x-amz-tagging":
|
||||
req.Tagging = aws.String(value)
|
||||
default:
|
||||
const amzMetaPrefix = "x-amz-meta-"
|
||||
if strings.HasPrefix(lowerKey, amzMetaPrefix) {
|
||||
metaKey := lowerKey[len(amzMetaPrefix):]
|
||||
req.Metadata[metaKey] = aws.String(value)
|
||||
} else {
|
||||
fs.Errorf(o, "Don't know how to set key %q on upload", key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if multipart {
|
||||
err = o.uploadMultipart(ctx, &req, size, in)
|
||||
|
@ -2463,18 +2489,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
|
|||
httpReq.Header = headers
|
||||
httpReq.ContentLength = size
|
||||
|
||||
for _, option := range options {
|
||||
switch option.(type) {
|
||||
case *fs.HTTPOption:
|
||||
key, value := option.Header()
|
||||
httpReq.Header.Add(key, value)
|
||||
default:
|
||||
if option.Mandatory() {
|
||||
fs.Logf(o, "Unsupported mandatory option: %v", option)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err = o.fs.pacer.CallNoRetry(func() (bool, error) {
|
||||
resp, err := o.fs.srv.Do(httpReq)
|
||||
if err != nil {
|
||||
|
|
|
@ -395,8 +395,8 @@ func NewFs(name, root string, m configmap.Mapper) (fs.Fs, error) {
|
|||
|
||||
keyFile := env.ShellExpand(opt.KeyFile)
|
||||
//keyPem := env.ShellExpand(opt.KeyPem)
|
||||
// Add ssh agent-auth if no password or file specified
|
||||
if (opt.Pass == "" && keyFile == "" && !opt.AskPassword) || opt.KeyUseAgent {
|
||||
// Add ssh agent-auth if no password or file or key PEM specified
|
||||
if (opt.Pass == "" && keyFile == "" && !opt.AskPassword && opt.KeyPem == "") || opt.KeyUseAgent {
|
||||
sshAgentClient, _, err := sshagent.New()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "couldn't connect to ssh-agent")
|
||||
|
|
|
@ -1124,6 +1124,9 @@ func (o *Object) removeSegments(except string) error {
|
|||
// remove the segments container if empty, ignore errors
|
||||
err = o.fs.pacer.Call(func() (bool, error) {
|
||||
err = o.fs.c.ContainerDelete(segmentsContainer)
|
||||
if err == swift.ContainerNotFound || err == swift.ContainerNotEmpty {
|
||||
return false, err
|
||||
}
|
||||
return shouldRetry(err)
|
||||
})
|
||||
if err == nil {
|
||||
|
|
|
@ -269,7 +269,9 @@ func (f *Fs) connect(ctx context.Context) (project *uplink.Project, err error) {
|
|||
fs.Debugf(f, "connecting...")
|
||||
defer fs.Debugf(f, "connected: %+v", err)
|
||||
|
||||
cfg := uplink.Config{}
|
||||
cfg := uplink.Config{
|
||||
UserAgent: "rclone",
|
||||
}
|
||||
|
||||
project, err = cfg.OpenProject(ctx, f.access)
|
||||
if err != nil {
|
||||
|
|
|
@ -226,6 +226,6 @@ func (t *Time) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|||
// </d:response>
|
||||
// </d:multistatus>
|
||||
type Quota struct {
|
||||
Available int64 `xml:"DAV: response>propstat>prop>quota-available-bytes"`
|
||||
Used int64 `xml:"DAV: response>propstat>prop>quota-used-bytes"`
|
||||
Available string `xml:"DAV: response>propstat>prop>quota-available-bytes"`
|
||||
Used string `xml:"DAV: response>propstat>prop>quota-used-bytes"`
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
"net/url"
|
||||
"os/exec"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -975,10 +976,7 @@ func (f *Fs) About(ctx context.Context) (*fs.Usage, error) {
|
|||
</D:prop>
|
||||
</D:propfind>
|
||||
`))
|
||||
var q = api.Quota{
|
||||
Available: -1,
|
||||
Used: -1,
|
||||
}
|
||||
var q api.Quota
|
||||
var resp *http.Response
|
||||
var err error
|
||||
err = f.pacer.Call(func() (bool, error) {
|
||||
|
@ -989,14 +987,14 @@ func (f *Fs) About(ctx context.Context) (*fs.Usage, error) {
|
|||
return nil, errors.Wrap(err, "about call failed")
|
||||
}
|
||||
usage := &fs.Usage{}
|
||||
if q.Used >= 0 {
|
||||
usage.Used = fs.NewUsageValue(q.Used)
|
||||
if i, err := strconv.ParseInt(q.Used, 10, 64); err == nil && i >= 0 {
|
||||
usage.Used = fs.NewUsageValue(i)
|
||||
}
|
||||
if q.Available >= 0 {
|
||||
usage.Free = fs.NewUsageValue(q.Available)
|
||||
if i, err := strconv.ParseInt(q.Available, 10, 64); err == nil && i >= 0 {
|
||||
usage.Free = fs.NewUsageValue(i)
|
||||
}
|
||||
if q.Available >= 0 && q.Used >= 0 {
|
||||
usage.Total = fs.NewUsageValue(q.Available + q.Used)
|
||||
if usage.Used != nil && usage.Free != nil {
|
||||
usage.Total = fs.NewUsageValue(*usage.Used + *usage.Free)
|
||||
}
|
||||
return usage, nil
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ conversion into man pages etc.
|
|||
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
docpath = "docs/content"
|
||||
|
@ -156,17 +157,19 @@ def read_commands(docpath):
|
|||
if command != "rclone.md":
|
||||
docs.append(read_command(command))
|
||||
return "\n".join(docs)
|
||||
|
||||
|
||||
def main():
|
||||
check_docs(docpath)
|
||||
command_docs = read_commands(docpath).replace("\\", "\\\\") # escape \ so we can use command_docs in re.sub
|
||||
build_date = datetime.utcfromtimestamp(
|
||||
int(os.environ.get('SOURCE_DATE_EPOCH', time.time())))
|
||||
with open(outfile, "w") as out:
|
||||
out.write("""\
|
||||
%% rclone(1) User Manual
|
||||
%% Nick Craig-Wood
|
||||
%% %s
|
||||
|
||||
""" % datetime.now().strftime("%b %d, %Y"))
|
||||
""" % build_date.strftime("%b %d, %Y"))
|
||||
for doc in docs:
|
||||
contents = read_doc(doc)
|
||||
# Substitute the commands into doc.md
|
||||
|
|
|
@ -486,6 +486,9 @@ func AddBackendFlags() {
|
|||
help = help[:nl]
|
||||
}
|
||||
help = strings.TrimSpace(help)
|
||||
if opt.IsPassword {
|
||||
help += " (obscured)"
|
||||
}
|
||||
flag := pflag.CommandLine.VarPF(opt, name, opt.ShortOpt, help)
|
||||
if _, isBool := opt.Default.(bool); isBool {
|
||||
flag.NoOptDefVal = "true"
|
||||
|
|
|
@ -11,9 +11,11 @@ package cmount
|
|||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rclone/rclone/fstest/testy"
|
||||
"github.com/rclone/rclone/vfs/vfstest"
|
||||
)
|
||||
|
||||
func TestMount(t *testing.T) {
|
||||
testy.SkipUnreliable(t)
|
||||
vfstest.RunTests(t, false, mount)
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ type frontmatter struct {
|
|||
}
|
||||
|
||||
var frontmatterTemplate = template.Must(template.New("frontmatter").Parse(`---
|
||||
date: {{ .Date }}
|
||||
title: "{{ .Title }}"
|
||||
description: "{{ .Description }}"
|
||||
slug: {{ .Slug }}
|
||||
|
@ -70,8 +69,7 @@ rclone.org website.`,
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
flagsHelp := strings.Replace(buf.String(), "YYYY-MM-DD", now, -1)
|
||||
err = ioutil.WriteFile(filepath.Join(root, "flags.md"), []byte(flagsHelp), 0777)
|
||||
err = ioutil.WriteFile(filepath.Join(root, "flags.md"), buf.Bytes(), 0777)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -245,7 +245,6 @@ Use "rclone help backends" for a list of supported services.
|
|||
var docFlagsTemplate = `---
|
||||
title: "Global Flags"
|
||||
description: "Rclone Global Flags"
|
||||
date: "YYYY-MM-DD"
|
||||
---
|
||||
|
||||
# Global Flags
|
||||
|
@ -325,6 +324,9 @@ func showBackend(name string) {
|
|||
}
|
||||
fmt.Printf("#### --%s%s\n\n", opt.FlagName(backend.Prefix), shortOpt)
|
||||
fmt.Printf("%s\n\n", opt.Help)
|
||||
if opt.IsPassword {
|
||||
fmt.Printf("**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/).\n\n")
|
||||
}
|
||||
fmt.Printf("- Config: %s\n", opt.Name)
|
||||
fmt.Printf("- Env Var: %s\n", opt.EnvVarName(backend.Prefix))
|
||||
fmt.Printf("- Type: %s\n", opt.Type())
|
||||
|
|
|
@ -5,9 +5,11 @@ package mount2
|
|||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rclone/rclone/fstest/testy"
|
||||
"github.com/rclone/rclone/vfs/vfstest"
|
||||
)
|
||||
|
||||
func TestMount(t *testing.T) {
|
||||
testy.SkipUnreliable(t)
|
||||
vfstest.RunTests(t, false, mount)
|
||||
}
|
||||
|
|
|
@ -78,7 +78,9 @@ func TestRc(t *testing.T) {
|
|||
|
||||
// mount
|
||||
_, err = mount.Fn(ctx, in)
|
||||
require.NoError(t, err)
|
||||
if err != nil {
|
||||
t.Skipf("Mount failed - skipping test: %v", err)
|
||||
}
|
||||
|
||||
// check file.txt is there now
|
||||
fi, err := os.Stat(filePath)
|
||||
|
|
|
@ -14,7 +14,21 @@ func init() {
|
|||
|
||||
var commandDefinition = &cobra.Command{
|
||||
Use: "obscure password",
|
||||
Short: `Obscure password for use in the rclone.conf`,
|
||||
Short: `Obscure password for use in the rclone config file`,
|
||||
Long: `In the rclone config file, human readable passwords are
|
||||
obscured. Obscuring them is done by encrypting them and writing them
|
||||
out in base64. This is **not** a secure way of encrypting these
|
||||
passwords as rclone can decrypt them - it is to prevent "eyedropping"
|
||||
- namely someone seeing a password in the rclone config file by
|
||||
accident.
|
||||
|
||||
Many equally important things (like access tokens) are not obscured in
|
||||
the config file. However it is very hard to shoulder surf a 64
|
||||
character hex token.
|
||||
|
||||
If you want to encrypt the config file then please use config file
|
||||
encryption - see [rclone config](/commands/rclone_config/) for more
|
||||
info.`,
|
||||
Run: func(command *cobra.Command, args []string) {
|
||||
cmd.CheckArgs(1, 1, command, args)
|
||||
cmd.Run(false, false, command, func() error {
|
||||
|
|
|
@ -77,10 +77,12 @@ func (cds *contentDirectoryService) cdsObjectToUpnpavObject(cdsObject object, fi
|
|||
}
|
||||
|
||||
if fileInfo.IsDir() {
|
||||
defaultChildCount := 1
|
||||
obj.Class = "object.container.storageFolder"
|
||||
obj.Title = fileInfo.Name()
|
||||
return upnpav.Container{
|
||||
Object: obj,
|
||||
Object: obj,
|
||||
ChildCount: &defaultChildCount,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
"github.com/rclone/rclone/cmd/serve/httplib/serve"
|
||||
"github.com/rclone/rclone/fs"
|
||||
"github.com/rclone/rclone/fs/accounting"
|
||||
"github.com/rclone/rclone/fs/config/flags"
|
||||
"github.com/rclone/rclone/fs/fserrors"
|
||||
"github.com/rclone/rclone/fs/operations"
|
||||
"github.com/rclone/rclone/fs/walk"
|
||||
|
@ -33,9 +34,10 @@ var (
|
|||
|
||||
func init() {
|
||||
httpflags.AddFlags(Command.Flags())
|
||||
Command.Flags().BoolVar(&stdio, "stdio", false, "run an HTTP2 server on stdin/stdout")
|
||||
Command.Flags().BoolVar(&appendOnly, "append-only", false, "disallow deletion of repository data")
|
||||
Command.Flags().BoolVar(&privateRepos, "private-repos", false, "users can only access their private repo")
|
||||
flagSet := Command.Flags()
|
||||
flags.BoolVarP(flagSet, &stdio, "stdio", "", false, "run an HTTP2 server on stdin/stdout")
|
||||
flags.BoolVarP(flagSet, &appendOnly, "append-only", "", false, "disallow deletion of repository data")
|
||||
flags.BoolVarP(flagSet, &privateRepos, "private-repos", "", false, "users can only access their private repo")
|
||||
}
|
||||
|
||||
// Command definition for cobra
|
||||
|
|
|
@ -15,6 +15,7 @@ import (
|
|||
"github.com/rclone/rclone/cmd/serve/proxy"
|
||||
"github.com/rclone/rclone/cmd/serve/proxy/proxyflags"
|
||||
"github.com/rclone/rclone/fs"
|
||||
"github.com/rclone/rclone/fs/config/flags"
|
||||
"github.com/rclone/rclone/fs/hash"
|
||||
"github.com/rclone/rclone/lib/errors"
|
||||
"github.com/rclone/rclone/vfs"
|
||||
|
@ -30,11 +31,12 @@ var (
|
|||
)
|
||||
|
||||
func init() {
|
||||
httpflags.AddFlags(Command.Flags())
|
||||
vfsflags.AddFlags(Command.Flags())
|
||||
proxyflags.AddFlags(Command.Flags())
|
||||
Command.Flags().StringVar(&hashName, "etag-hash", "", "Which hash to use for the ETag, or auto or blank for off")
|
||||
Command.Flags().BoolVar(&disableGETDir, "disable-dir-list", false, "Disable HTML directory list on GET request for a directory")
|
||||
flagSet := Command.Flags()
|
||||
httpflags.AddFlags(flagSet)
|
||||
vfsflags.AddFlags(flagSet)
|
||||
proxyflags.AddFlags(flagSet)
|
||||
flags.StringVarP(flagSet, &hashName, "etag-hash", "", "", "Which hash to use for the ETag, or auto or blank for off")
|
||||
flags.BoolVarP(flagSet, &disableGETDir, "disable-dir-list", "", false, "Disable HTML directory list on GET request for a directory")
|
||||
}
|
||||
|
||||
// Command definition for cobra
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
"~$",
|
||||
"^\\."
|
||||
],
|
||||
"enableGitInfo": true,
|
||||
"markup": {
|
||||
"goldmark": {
|
||||
"extensions": {
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
title: "Rclone"
|
||||
description: "Rclone syncs your files to cloud storage: Google Drive, S3, Swift, Dropbox, Google Cloud Storage, Azure, Box and many more."
|
||||
type: page
|
||||
date: "2020-05-16"
|
||||
---
|
||||
|
||||
# Rclone syncs your files to cloud storage
|
||||
|
@ -10,9 +9,9 @@ date: "2020-05-16"
|
|||
{{< img width="50%" src="/img/logo_on_light__horizontal_color.svg" alt="rclone logo" style="float:right; padding: 5px;" >}}
|
||||
|
||||
- [About rclone](#about)
|
||||
- [What can rclone do for you](#what)
|
||||
- [What features does rclone have](#features)
|
||||
- [What providers does rclone support](#providers)
|
||||
- [What can rclone do for you?](#what)
|
||||
- [What features does rclone have?](#features)
|
||||
- [What providers does rclone support?](#providers)
|
||||
- [Download](/downloads/)
|
||||
- [Install](/install/)
|
||||
{{< rem MAINPAGELINK >}}
|
||||
|
@ -27,20 +26,20 @@ services, as well as standard transfer protocols.
|
|||
|
||||
Rclone has powerful cloud equivalents to the unix commands rsync, cp,
|
||||
mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax
|
||||
includes shell pipeline support, and `--dry-run` protection. It can be
|
||||
includes shell pipeline support, and `--dry-run` protection. It is
|
||||
used at the command line, in scripts or via its [API](/rc).
|
||||
|
||||
Users have called rclone *"The Swiss army knife of cloud storage"* and
|
||||
Users call rclone *"The Swiss army knife of cloud storage"*, and
|
||||
*"Technology indistinguishable from magic"*.
|
||||
|
||||
Rclone really looks after your data. It preserves timestamps and
|
||||
verifies your data at all times. Transfers over limited bandwidth;
|
||||
verifies checksums at all times. Transfers over limited bandwidth;
|
||||
intermittent connections, or subject to quota can be restarted, from
|
||||
the last good file transferred. You can
|
||||
[check](/commands/rclone_check/) the integrity of your files. Where
|
||||
possible, rclone employs server side transfers to minimise local
|
||||
bandwidth use and transfers from one provider to another without
|
||||
using your local disk.
|
||||
using local disk.
|
||||
|
||||
Virtual backends wrap local and cloud file systems to apply
|
||||
[encryption](/crypt/),
|
||||
|
@ -48,9 +47,9 @@ Virtual backends wrap local and cloud file systems to apply
|
|||
[chunking](/chunker/) and
|
||||
[joining](/union/).
|
||||
|
||||
Rclone can [mount](/commands/rclone_mount/) any local, cloud or
|
||||
Rclone [mounts](/commands/rclone_mount/) any local, cloud or
|
||||
virtual filesystem as a disk on Windows,
|
||||
macOS, linux and FreeBSD, and also serve these over
|
||||
macOS, linux and FreeBSD, and also serves these over
|
||||
[SFTP](/commands/rclone_serve_sftp/),
|
||||
[HTTP](/commands/rclone_serve_http/),
|
||||
[WebDAV](/commands/rclone_serve_webdav/),
|
||||
|
@ -64,14 +63,14 @@ Fedora, Brew and Chocolatey repos. include rclone. For the latest
|
|||
version [downloading from rclone.org](/downloads/) is recommended.
|
||||
|
||||
Rclone is widely used on Linux, Windows and Mac. Third party
|
||||
developers have built innovative backup, restore, GUI and business
|
||||
developers create innovative backup, restore, GUI and business
|
||||
process solutions using the rclone command line or API.
|
||||
|
||||
Let rclone do the heavy lifting of communicating with cloud storage.
|
||||
Rclone does the heavy lifting of communicating with cloud storage.
|
||||
|
||||
## What can rclone do for you {#what}
|
||||
## What can rclone do for you? {#what}
|
||||
|
||||
Rclone can help you:
|
||||
Rclone helps you:
|
||||
|
||||
- Backup (and encrypt) files to cloud storage
|
||||
- Restore (and decrypt) files from cloud storage
|
||||
|
@ -99,7 +98,7 @@ Rclone can help you:
|
|||
|
||||
## Supported providers {#providers}
|
||||
|
||||
(There are many other providers, built on standard protocols such as
|
||||
(There are many others, built on standard protocols such as
|
||||
WebDAV or S3, that work out of the box.)
|
||||
|
||||
{{< provider_list >}}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Alias"
|
||||
description: "Remote Aliases"
|
||||
date: "2018-01-30"
|
||||
---
|
||||
|
||||
{{< icon "fa fa-link" >}} Alias
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Amazon Drive"
|
||||
description: "Rclone docs for Amazon Drive"
|
||||
date: "2017-06-10"
|
||||
---
|
||||
|
||||
{{< icon "fab fa-amazon" >}} Amazon Drive
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Authors"
|
||||
description: "Rclone Authors and Contributors"
|
||||
date: "2016-11-02"
|
||||
---
|
||||
|
||||
Authors
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Microsoft Azure Blob Storage"
|
||||
description: "Rclone docs for Microsoft Azure Blob Storage"
|
||||
date: "2017-07-30"
|
||||
---
|
||||
|
||||
{{< icon "fab fa-windows" >}} Microsoft Azure Blob Storage
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "B2"
|
||||
description: "Backblaze B2"
|
||||
date: "2016-10-25"
|
||||
---
|
||||
|
||||
{{< icon "fa fa-fire" >}} Backblaze B2
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Box"
|
||||
description: "Rclone docs for Box"
|
||||
date: "2015-10-14"
|
||||
---
|
||||
|
||||
{{< icon "fa fa-archive" >}} Box
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Bugs"
|
||||
description: "Rclone Bugs and Limitations"
|
||||
date: "2019-08-04"
|
||||
---
|
||||
|
||||
# Bugs and Limitations
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Cache"
|
||||
description: "Rclone docs for cache remote"
|
||||
date: "2017-09-03"
|
||||
---
|
||||
|
||||
{{< icon "fa fa-archive" >}} Cache (BETA)
|
||||
|
@ -344,6 +343,8 @@ The username of the Plex user
|
|||
|
||||
The password of the Plex user
|
||||
|
||||
**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/).
|
||||
|
||||
- Config: plex_password
|
||||
- Env Var: RCLONE_CACHE_PLEX_PASSWORD
|
||||
- Type: string
|
||||
|
|
|
@ -1,11 +1,100 @@
|
|||
---
|
||||
title: "Documentation"
|
||||
description: "Rclone Changelog"
|
||||
date: "2020-05-27"
|
||||
---
|
||||
|
||||
# Changelog
|
||||
|
||||
## v1.52.3 - 2020-08-07
|
||||
|
||||
[See commits](https://github.com/rclone/rclone/compare/v1.52.2...v1.52.3)
|
||||
|
||||
* Bug Fixes
|
||||
* docs
|
||||
* Disable smart typography (eg en-dash) in MANUAL.* and man page (Nick Craig-Wood)
|
||||
* Update install.md to reflect minimum Go version (Evan Harris)
|
||||
* Update install from source instructions (Nick Craig-Wood)
|
||||
* make_manual: Support SOURCE_DATE_EPOCH (Morten Linderud)
|
||||
* log: Fix --use-json-log going to stderr not --log-file on Windows (Nick Craig-Wood)
|
||||
* serve dlna: Fix file list on Samsung Series 6+ TVs (Matteo Pietro Dazzi)
|
||||
* sync: Fix deadlock with --track-renames-strategy modtime (Nick Craig-Wood)
|
||||
* Cache
|
||||
* Fix moveto/copyto remote:file remote:file2 (Nick Craig-Wood)
|
||||
* Drive
|
||||
* Stop using root_folder_id as a cache (Nick Craig-Wood)
|
||||
* Make dangling shortcuts appear in listings (Nick Craig-Wood)
|
||||
* Drop "Disabling ListR" messages down to debug (Nick Craig-Wood)
|
||||
* Workaround and policy for Google Drive API (Dmitry Ustalov)
|
||||
* FTP
|
||||
* Add note to docs about home vs root directory selection (Nick Craig-Wood)
|
||||
* Onedrive
|
||||
* Fix reverting to Copy when Move would have worked (Nick Craig-Wood)
|
||||
* Avoid comma rendered in URL in onedrive.md (Kevin)
|
||||
* Pcloud
|
||||
* Fix oauth on European region "eapi.pcloud.com" (Nick Craig-Wood)
|
||||
* S3
|
||||
* Fix bucket Region auto detection when Region unset in config (Nick Craig-Wood)
|
||||
|
||||
## v1.52.2 - 2020-06-24
|
||||
|
||||
[See commits](https://github.com/rclone/rclone/compare/v1.52.1...v1.52.2)
|
||||
|
||||
* Bug Fixes
|
||||
* build
|
||||
* Fix docker release build action (Nick Craig-Wood)
|
||||
* Fix custom timezone in Docker image (NoLooseEnds)
|
||||
* check: Fix misleading message which printed errors instead of differences (Nick Craig-Wood)
|
||||
* errors: Add WSAECONNREFUSED and more to the list of retriable Windows errors (Nick Craig-Wood)
|
||||
* rcd: Fix incorrect prometheus metrics (Gary Kim)
|
||||
* serve restic: Fix flags so they use environment variables (Nick Craig-Wood)
|
||||
* serve webdav: Fix flags so they use environment variables (Nick Craig-Wood)
|
||||
* sync: Fix --track-renames-strategy modtime (Nick Craig-Wood)
|
||||
* Drive
|
||||
* Fix not being able to delete a directory with a trashed shortcut (Nick Craig-Wood)
|
||||
* Fix creating a directory inside a shortcut (Nick Craig-Wood)
|
||||
* Fix --drive-impersonate with cached root_folder_id (Nick Craig-Wood)
|
||||
* SFTP
|
||||
* Fix SSH key PEM loading (Zac Rubin)
|
||||
* Swift
|
||||
* Speed up deletes by not retrying segment container deletes (Nick Craig-Wood)
|
||||
* Tardigrade
|
||||
* Upgrade to uplink v1.1.1 (Caleb Case)
|
||||
* WebDAV
|
||||
* Fix free/used display for rclone about/df for certain backends (Nick Craig-Wood)
|
||||
|
||||
## v1.52.1 - 2020-06-10
|
||||
|
||||
[See commits](https://github.com/rclone/rclone/compare/v1.52.0...v1.52.1)
|
||||
|
||||
* Bug Fixes
|
||||
* lib/file: Fix SetSparse on Windows 7 which fixes downloads of files > 250MB (Nick Craig-Wood)
|
||||
* build
|
||||
* Update go.mod to go1.14 to enable -mod=vendor build (Nick Craig-Wood)
|
||||
* Remove quicktest from Dockerfile (Nick Craig-Wood)
|
||||
* Build Docker images with GitHub actions (Matteo Pietro Dazzi)
|
||||
* Update Docker build workflows (Nick Craig-Wood)
|
||||
* Set user_allow_other in /etc/fuse.conf in the Docker image (Nick Craig-Wood)
|
||||
* Fix xgo build after go1.14 go.mod update (Nick Craig-Wood)
|
||||
* docs
|
||||
* Add link to source and modified time to footer of every page (Nick Craig-Wood)
|
||||
* Remove manually set dates and use git dates instead (Nick Craig-Wood)
|
||||
* Minor tense, punctuation, brevity and positivity changes for the home page (edwardxml)
|
||||
* Remove leading slash in page reference in footer when present (Nick Craig-Wood)
|
||||
* Note commands which need obscured input in the docs (Nick Craig-Wood)
|
||||
* obscure: Write more help as we are referencing it elsewhere (Nick Craig-Wood)
|
||||
* VFS
|
||||
* Fix OS vs Unix path confusion - fixes ChangeNotify on Windows (Nick Craig-Wood)
|
||||
* Drive
|
||||
* Fix missing items when listing using --fast-list / ListR (Nick Craig-Wood)
|
||||
* Putio
|
||||
* Fix panic on Object.Open (Cenk Alti)
|
||||
* S3
|
||||
* Fix upload of single files into buckets without create permission (Nick Craig-Wood)
|
||||
* Fix --header-upload (Nick Craig-Wood)
|
||||
* Tardigrade
|
||||
* Fix listing bug by upgrading to v1.0.7
|
||||
* Set UserAgent to rclone (Caleb Case)
|
||||
|
||||
## v1.52.0 - 2020-05-27
|
||||
|
||||
Special thanks to Martin Michlmayr for proof reading and correcting
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
title: "Chunker"
|
||||
description: "Split-chunking overlay remote"
|
||||
date: "2019-08-30"
|
||||
---
|
||||
|
||||
{{< icon "fa fa-cut" >}}Chunker (BETA)
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone"
|
||||
description: "Show help for rclone commands, flags and backends."
|
||||
slug: rclone
|
||||
|
@ -66,7 +65,7 @@ See the [global flags page](/flags/) for global options not listed here.
|
|||
* [rclone move](/commands/rclone_move/) - Move files from source to dest.
|
||||
* [rclone moveto](/commands/rclone_moveto/) - Move file or directory from source to dest.
|
||||
* [rclone ncdu](/commands/rclone_ncdu/) - Explore a remote with a text based user interface.
|
||||
* [rclone obscure](/commands/rclone_obscure/) - Obscure password for use in the rclone.conf
|
||||
* [rclone obscure](/commands/rclone_obscure/) - Obscure password for use in the rclone config file
|
||||
* [rclone purge](/commands/rclone_purge/) - Remove the path and all of its contents.
|
||||
* [rclone rc](/commands/rclone_rc/) - Run a command against a running rclone.
|
||||
* [rclone rcat](/commands/rclone_rcat/) - Copies standard input to file on remote.
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone about"
|
||||
description: "Get quota information from the remote."
|
||||
slug: rclone_about
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone authorize"
|
||||
description: "Remote authorization."
|
||||
slug: rclone_authorize
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone backend"
|
||||
description: "Run a backend specific command."
|
||||
slug: rclone_backend
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone cat"
|
||||
description: "Concatenates any files and sends them to stdout."
|
||||
slug: rclone_cat
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone check"
|
||||
description: "Checks the files in the source and destination match."
|
||||
slug: rclone_check
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone cleanup"
|
||||
description: "Clean up the remote if possible"
|
||||
slug: rclone_cleanup
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config"
|
||||
description: "Enter an interactive configuration session."
|
||||
slug: rclone_config
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config create"
|
||||
description: "Create a new remote with name, type and options."
|
||||
slug: rclone_config_create
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config delete"
|
||||
description: "Delete an existing remote `name`."
|
||||
slug: rclone_config_delete
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config disconnect"
|
||||
description: "Disconnects user from remote"
|
||||
slug: rclone_config_disconnect
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config dump"
|
||||
description: "Dump the config file as JSON."
|
||||
slug: rclone_config_dump
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config edit"
|
||||
description: "Enter an interactive configuration session."
|
||||
slug: rclone_config_edit
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config file"
|
||||
description: "Show path of configuration file in use."
|
||||
slug: rclone_config_file
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config password"
|
||||
description: "Update password in an existing remote."
|
||||
slug: rclone_config_password
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config providers"
|
||||
description: "List in JSON format all the providers and options."
|
||||
slug: rclone_config_providers
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config reconnect"
|
||||
description: "Re-authenticates user with remote."
|
||||
slug: rclone_config_reconnect
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config show"
|
||||
description: "Print (decrypted) config file, or the config for a single remote."
|
||||
slug: rclone_config_show
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config update"
|
||||
description: "Update options in an existing remote."
|
||||
slug: rclone_config_update
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone config userinfo"
|
||||
description: "Prints info about logged in user of remote."
|
||||
slug: rclone_config_userinfo
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone copy"
|
||||
description: "Copy files from source to dest, skipping already copied"
|
||||
slug: rclone_copy
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone copyto"
|
||||
description: "Copy files from source to dest, skipping already copied"
|
||||
slug: rclone_copyto
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone copyurl"
|
||||
description: "Copy url content to dest."
|
||||
slug: rclone_copyurl
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone cryptcheck"
|
||||
description: "Cryptcheck checks the integrity of a crypted remote."
|
||||
slug: rclone_cryptcheck
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone cryptdecode"
|
||||
description: "Cryptdecode returns unencrypted file names."
|
||||
slug: rclone_cryptdecode
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone dedupe"
|
||||
description: "Interactively find duplicate files and delete/rename them."
|
||||
slug: rclone_dedupe
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone delete"
|
||||
description: "Remove the contents of path."
|
||||
slug: rclone_delete
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone deletefile"
|
||||
description: "Remove a single file from remote."
|
||||
slug: rclone_deletefile
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone genautocomplete"
|
||||
description: "Output completion script for a given shell."
|
||||
slug: rclone_genautocomplete
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone genautocomplete bash"
|
||||
description: "Output bash completion script for rclone."
|
||||
slug: rclone_genautocomplete_bash
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone genautocomplete fish"
|
||||
description: "Output fish completion script for rclone."
|
||||
slug: rclone_genautocomplete_fish
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone genautocomplete zsh"
|
||||
description: "Output zsh completion script for rclone."
|
||||
slug: rclone_genautocomplete_zsh
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone gendocs"
|
||||
description: "Output markdown docs for rclone to the directory supplied."
|
||||
slug: rclone_gendocs
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone hashsum"
|
||||
description: "Produces a hashsum file for all the objects in the path."
|
||||
slug: rclone_hashsum
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone link"
|
||||
description: "Generate public link to file/folder."
|
||||
slug: rclone_link
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone listremotes"
|
||||
description: "List all the remotes in the config file."
|
||||
slug: rclone_listremotes
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone ls"
|
||||
description: "List the objects in the path with size and path."
|
||||
slug: rclone_ls
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone lsd"
|
||||
description: "List all directories/containers/buckets in the path."
|
||||
slug: rclone_lsd
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone lsf"
|
||||
description: "List directories and objects in remote:path formatted for parsing"
|
||||
slug: rclone_lsf
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone lsjson"
|
||||
description: "List directories and objects in the path in JSON format."
|
||||
slug: rclone_lsjson
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone lsl"
|
||||
description: "List the objects in path with modification time, size and path."
|
||||
slug: rclone_lsl
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone md5sum"
|
||||
description: "Produces an md5sum file for all the objects in the path."
|
||||
slug: rclone_md5sum
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone mkdir"
|
||||
description: "Make the path if it doesn't already exist."
|
||||
slug: rclone_mkdir
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone mount"
|
||||
description: "Mount the remote as file system on a mountpoint."
|
||||
slug: rclone_mount
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone move"
|
||||
description: "Move files from source to dest."
|
||||
slug: rclone_move
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone moveto"
|
||||
description: "Move file or directory from source to dest."
|
||||
slug: rclone_moveto
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone ncdu"
|
||||
description: "Explore a remote with a text based user interface."
|
||||
slug: rclone_ncdu
|
||||
|
|
|
@ -1,18 +1,30 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone obscure"
|
||||
description: "Obscure password for use in the rclone.conf"
|
||||
description: "Obscure password for use in the rclone config file"
|
||||
slug: rclone_obscure
|
||||
url: /commands/rclone_obscure/
|
||||
# autogenerated - DO NOT EDIT, instead edit the source code in cmd/obscure/ and as part of making a release run "make commanddocs"
|
||||
---
|
||||
# rclone obscure
|
||||
|
||||
Obscure password for use in the rclone.conf
|
||||
Obscure password for use in the rclone config file
|
||||
|
||||
## Synopsis
|
||||
|
||||
Obscure password for use in the rclone.conf
|
||||
In the rclone config file, human readable passwords are
|
||||
obscured. Obscuring them is done by encrypting them and writing them
|
||||
out in base64. This is **not** a secure way of encrypting these
|
||||
passwords as rclone can decrypt them - it is to prevent "eyedropping"
|
||||
- namely someone seeing a password in the rclone config file by
|
||||
accident.
|
||||
|
||||
Many equally important things (like access tokens) are not obscured in
|
||||
the config file. However it is very hard to shoulder surf a 64
|
||||
character hex token.
|
||||
|
||||
If you want to encrypt the config file then please use config file
|
||||
encryption - see [rclone config](/commands/rclone_config/) for more
|
||||
info.
|
||||
|
||||
```
|
||||
rclone obscure password [flags]
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone purge"
|
||||
description: "Remove the path and all of its contents."
|
||||
slug: rclone_purge
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone rc"
|
||||
description: "Run a command against a running rclone."
|
||||
slug: rclone_rc
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone rcat"
|
||||
description: "Copies standard input to file on remote."
|
||||
slug: rclone_rcat
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone rcd"
|
||||
description: "Run rclone listening to remote control commands only."
|
||||
slug: rclone_rcd
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone rmdir"
|
||||
description: "Remove the path if empty."
|
||||
slug: rclone_rmdir
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone rmdirs"
|
||||
description: "Remove empty directories under the path."
|
||||
slug: rclone_rmdirs
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone serve"
|
||||
description: "Serve a remote over a protocol."
|
||||
slug: rclone_serve
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone serve dlna"
|
||||
description: "Serve remote:path over DLNA"
|
||||
slug: rclone_serve_dlna
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
date: 2020-05-27T16:09:49+01:00
|
||||
title: "rclone serve ftp"
|
||||
description: "Serve remote:path over FTP."
|
||||
slug: rclone_serve_ftp
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue