From 5d06a82c5de301ca102d69bea1c483bf8b19229c Mon Sep 17 00:00:00 2001 From: jaKa Date: Mon, 7 Mar 2022 14:43:29 +0100 Subject: [PATCH] koofr: add digistorage service as a koofr provider. --- README.md | 1 + backend/koofr/koofr.go | 66 ++++++- docs/content/_index.md | 1 + docs/content/docs.md | 1 + docs/content/koofr.md | 302 +++++++++++++++++++++++++++----- docs/layouts/chrome/navbar.html | 1 + fstest/test_all/config.yaml | 3 + 7 files changed, 326 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 270b665dc..afb572f1c 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Rclone *("rsync for cloud storage")* is a command-line program to sync files and * Ceph [:page_facing_up:](https://rclone.org/s3/#ceph) * Citrix ShareFile [:page_facing_up:](https://rclone.org/sharefile/) * DigitalOcean Spaces [:page_facing_up:](https://rclone.org/s3/#digitalocean-spaces) + * Digi Storage România [:page_facing_up:](https://rclone.org/koofr/#digi-storage-românia) * Dreamhost [:page_facing_up:](https://rclone.org/s3/#dreamhost) * Dropbox [:page_facing_up:](https://rclone.org/dropbox/) * Enterprise File Fabric [:page_facing_up:](https://rclone.org/filefabric/) diff --git a/backend/koofr/koofr.go b/backend/koofr/koofr.go index 2602001a7..6b554da69 100644 --- a/backend/koofr/koofr.go +++ b/backend/koofr/koofr.go @@ -28,13 +28,28 @@ import ( func init() { fs.Register(&fs.RegInfo{ Name: "koofr", - Description: "Koofr", + Description: "Koofr, Digi Storage and other Koofr-compatible storage providers", NewFs: NewFs, Options: []fs.Option{{ + Name: fs.ConfigProvider, + Help: "Choose your storage provider.", + // NOTE if you add a new provider here, then add it in the + // setProviderDefaults() function and update options accordingly + Examples: []fs.OptionExample{{ + Value: "koofr", + Help: "Koofr, https://app.koofr.net/", + }, { + Value: "digistoragero", + Help: "Digi Storage Romania, https://storage.rcs-rds.ro/", + }, { + Value: "other", + Help: "Any other Koofr API compatible storage service", + }}, + }, { Name: "endpoint", Help: "The Koofr API endpoint to use.", - Default: "https://app.koofr.net", - Advanced: true, + Provider: "other", + Required: true, }, { Name: "mountid", Help: "Mount ID of the mount to use.\n\nIf omitted, the primary mount is used.", @@ -46,11 +61,24 @@ func init() { Advanced: true, }, { Name: "user", - Help: "Your Koofr user name.", + Help: "Your user name.", Required: true, }, { Name: "password", - Help: "Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password).", + Help: "Your password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password).", + Provider: "koofr", + IsPassword: true, + Required: true, + }, { + Name: "password", + Help: "Your password for rclone (generate one at https://storage.rcs-rds.ro/app/admin/preferences/password).", + Provider: "digistoragero", + IsPassword: true, + Required: true, + }, { + Name: "password", + Help: "Your password for rclone (generate one at your service's settings page).", + Provider: "other", IsPassword: true, Required: true, }, { @@ -67,6 +95,7 @@ func init() { // Options represent the configuration of the Koofr backend type Options struct { + Provider string `config:"provider"` Endpoint string `config:"endpoint"` MountID string `config:"mountid"` User string `config:"user"` @@ -251,13 +280,38 @@ func (f *Fs) fullPath(part string) string { return f.opt.Enc.FromStandardPath(path.Join("/", f.root, part)) } -// NewFs constructs a new filesystem given a root path and configuration options +func setProviderDefaults(opt *Options) { + // handle old, provider-less configs + if opt.Provider == "" { + if opt.Endpoint == "" || strings.HasPrefix(opt.Endpoint, "https://app.koofr.net") { + opt.Provider = "koofr" + } else if strings.HasPrefix(opt.Endpoint, "https://storage.rcs-rds.ro") { + opt.Provider = "digistoragero" + } else { + opt.Provider = "other" + } + } + // now assign an endpoint + if opt.Provider == "koofr" { + opt.Endpoint = "https://app.koofr.net" + } else if opt.Provider == "digistoragero" { + opt.Endpoint = "https://storage.rcs-rds.ro" + } +} + +// NewFs constructs a new filesystem given a root path and rclone configuration options func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (ff fs.Fs, err error) { opt := new(Options) err = configstruct.Set(m, opt) if err != nil { return nil, err } + setProviderDefaults(opt) + return NewFsFromOptions(ctx, name, root, opt) +} + +// NewFsFromOptions constructs a new filesystem given a root path and internal configuration options +func NewFsFromOptions(ctx context.Context, name, root string, opt *Options) (ff fs.Fs, err error) { pass, err := obscure.Reveal(opt.Password) if err != nil { return nil, err diff --git a/docs/content/_index.md b/docs/content/_index.md index fad314e6e..594c8a316 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -114,6 +114,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="Citrix ShareFile" home="http://sharefile.com/" config="/sharefile/" >}} {{< provider name="C14" home="https://www.online.net/en/storage/c14-cold-storage" config="/sftp/#c14" >}} {{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}} +{{< provider name="Digi Storage România" home="https://storage.rcs-rds.ro/" config="/koofr/#digi-storage-românia" >}} {{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}} {{< provider name="Dropbox" home="https://www.dropbox.com/" config="/dropbox/" >}} {{< provider name="Enterprise File Fabric" home="https://storagemadeeasy.com/about/" config="/filefabric/" >}} diff --git a/docs/content/docs.md b/docs/content/docs.md index d73a1236b..ccbc7d1ab 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -38,6 +38,7 @@ See the following for detailed instructions for * [Compress](/compress/) * [Crypt](/crypt/) - to encrypt other remotes * [DigitalOcean Spaces](/s3/#digitalocean-spaces) + * [Digi Storage România](/koofr/#digi-storage-românia) * [Dropbox](/dropbox/) * [Enterprise File Fabric](/filefabric/) * [FTP](/ftp/) diff --git a/docs/content/koofr.md b/docs/content/koofr.md index 767505885..98a33f52c 100644 --- a/docs/content/koofr.md +++ b/docs/content/koofr.md @@ -28,41 +28,52 @@ n) New remote s) Set configuration password q) Quit config n/s/q> n -name> koofr +name> koofr +Option Storage. Type of storage to configure. -Enter a string value. Press Enter for the default (""). -Choose a number from below, or type in your own value +Choose a number from below, or type in your own value. [snip] -XX / Koofr - \ "koofr" +22 / Koofr, Digi Storage and other Koofr-compatible storage providers + \ (koofr) [snip] Storage> koofr -** See help for koofr backend at: https://rclone.org/koofr/ ** - -Your Koofr user name -Enter a string value. Press Enter for the default (""). -user> USER@NAME -Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password) -y) Yes type in my own password +Option provider. +Choose your storage provider. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / Koofr, https://app.koofr.net/ + \ (koofr) + 2 / Digi Storage Romania, https://storage.rcs-rds.ro/ + \ (digistoragero) + 3 / Any other Koofr API compatible storage service + \ (other) +provider> 1 +Option user. +Your user name. +Enter a value. +user> USERNAME +Option password. +Your password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password). +Choose an alternative below. +y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: -Edit advanced config? (y/n) +Edit advanced config? y) Yes -n) No +n) No (default) y/n> n -Remote config -------------------- [koofr] type = koofr -baseurl = https://app.koofr.net -user = USER@NAME +provider = koofr +user = USERNAME password = *** ENCRYPTED *** -------------------- -y) Yes this is OK +y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y @@ -84,7 +95,7 @@ List all the files in your Koofr To copy a local directory to an Koofr directory called backup - rclone copy /home/source remote:backup + rclone copy /home/source koofr:backup ### Restricted filename characters @@ -101,40 +112,94 @@ as they can't be used in XML strings. {{< rem autogenerated options start" - DO NOT EDIT - instead edit fs.RegInfo in backend/koofr/koofr.go then run make backenddocs" >}} ### Standard options -Here are the standard options specific to koofr (Koofr). +Here are the standard options specific to koofr (Koofr, Digi Storage and other Koofr-compatible storage providers). -#### --koofr-user +#### --koofr-provider -Your Koofr user name. +Choose your storage provider. -- Config: user -- Env Var: RCLONE_KOOFR_USER +Properties: + +- Config: provider +- Env Var: RCLONE_KOOFR_PROVIDER - Type: string -- Default: "" - -#### --koofr-password - -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](/commands/rclone_obscure/). - -- Config: password -- Env Var: RCLONE_KOOFR_PASSWORD -- Type: string -- Default: "" - -### Advanced options - -Here are the advanced options specific to koofr (Koofr). +- Required: false +- Examples: + - "koofr" + - Koofr, https://app.koofr.net/ + - "digistoragero" + - Digi Storage Romania, https://storage.rcs-rds.ro/ + - "other" + - Any other Koofr API compatible storage service #### --koofr-endpoint The Koofr API endpoint to use. +Properties: + - Config: endpoint - Env Var: RCLONE_KOOFR_ENDPOINT +- Provider: other - Type: string -- Default: "https://app.koofr.net" +- Required: true + +#### --koofr-user + +Your user name. + +Properties: + +- Config: user +- Env Var: RCLONE_KOOFR_USER +- Type: string +- Required: true + +#### --koofr-password + +Your password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password). + +**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/). + +Properties: + +- Config: password +- Env Var: RCLONE_KOOFR_PASSWORD +- Provider: koofr +- Type: string +- Required: true + +#### --koofr-password + +Your password for rclone (generate one at https://storage.rcs-rds.ro/app/admin/preferences/password). + +**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/). + +Properties: + +- Config: password +- Env Var: RCLONE_KOOFR_PASSWORD +- Provider: digistoragero +- Type: string +- Required: true + +#### --koofr-password + +Your password for rclone (generate one at your service's settings page). + +**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/). + +Properties: + +- Config: password +- Env Var: RCLONE_KOOFR_PASSWORD +- Provider: other +- Type: string +- Required: true + +### Advanced options + +Here are the advanced options specific to koofr (Koofr, Digi Storage and other Koofr-compatible storage providers). #### --koofr-mountid @@ -142,10 +207,12 @@ Mount ID of the mount to use. If omitted, the primary mount is used. +Properties: + - Config: mountid - Env Var: RCLONE_KOOFR_MOUNTID - Type: string -- Default: "" +- Required: false #### --koofr-setmtime @@ -153,6 +220,8 @@ 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. +Properties: + - Config: setmtime - Env Var: RCLONE_KOOFR_SETMTIME - Type: bool @@ -160,10 +229,12 @@ Set this to false if you use a mount ID that points to a Dropbox or Amazon Drive #### --koofr-encoding -This sets the encoding for the backend. +The encoding for the backend. See the [encoding section in the overview](/overview/#encoding) for more info. +Properties: + - Config: encoding - Env Var: RCLONE_KOOFR_ENCODING - Type: MultiEncoder @@ -175,3 +246,148 @@ See the [encoding section in the overview](/overview/#encoding) for more info. Note that Koofr is case insensitive so you can't have a file called "Hello.doc" and one called "hello.doc". + +## Providers + +### Koofr + +This is the original [Koofr](https://koofr.eu) storage provider used as main example and described in the [configuration](#configuration) section above. + +### Digi Storage România + +[Digi Storage România](https://www.digi.ro/servicii/online/digi-storage) is a cloud storage service run by [Digi.ro](https://www.digi.ro/) that +provides a Koofr API. + +Here is an example of how to make a remote called `ds`. First run: + + rclone config + +This will guide you through an interactive setup process: + +``` +No remotes found, make a new one? +n) New remote +s) Set configuration password +q) Quit config +n/s/q> n +name> ds +Option Storage. +Type of storage to configure. +Choose a number from below, or type in your own value. +[snip] +22 / Koofr, Digi Storage and other Koofr-compatible storage providers + \ (koofr) +[snip] +Storage> koofr +Option provider. +Choose your storage provider. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / Koofr, https://app.koofr.net/ + \ (koofr) + 2 / Digi Storage Romania, https://storage.rcs-rds.ro/ + \ (digistoragero) + 3 / Any other Koofr API compatible storage service + \ (other) +provider> 2 +Option user. +Your user name. +Enter a value. +user> USERNAME +Option password. +Your password for rclone (generate one at https://storage.rcs-rds.ro/app/admin/preferences/password). +Choose an alternative below. +y) Yes, type in my own password +g) Generate random password +y/g> y +Enter the password: +password: +Confirm the password: +password: +Edit advanced config? +y) Yes +n) No (default) +y/n> n +-------------------- +[ds] +type = koofr +provider = digistoragero +user = USERNAME +password = *** ENCRYPTED *** +-------------------- +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y +``` +### Other + +You may also want to use another, public or private storage provider that runs a Koofr API compatible service, by simply providing the base URL to connect to. + +Here is an example of how to make a remote called `other`. First run: + + rclone config + +This will guide you through an interactive setup process: + +``` +No remotes found, make a new one? +n) New remote +s) Set configuration password +q) Quit config +n/s/q> n +name> other +Option Storage. +Type of storage to configure. +Choose a number from below, or type in your own value. +[snip] +22 / Koofr, Digi Storage and other Koofr-compatible storage providers + \ (koofr) +[snip] +Storage> koofr +Option provider. +Choose your storage provider. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / Koofr, https://app.koofr.net/ + \ (koofr) + 2 / Digi Storage Romania, https://storage.rcs-rds.ro/ + \ (digistoragero) + 3 / Any other Koofr API compatible storage service + \ (other) +provider> 3 +Option endpoint. +The Koofr API endpoint to use. +Enter a value. +endpoint> https://koofr.other.org +Option user. +Your user name. +Enter a value. +user> USERNAME +Option password. +Your password for rclone (generate one at your service's settings page). +Choose an alternative below. +y) Yes, type in my own password +g) Generate random password +y/g> y +Enter the password: +password: +Confirm the password: +password: +Edit advanced config? +y) Yes +n) No (default) +y/n> n +-------------------- +[other] +type = koofr +provider = other +endpoint = https://koofr.other.org +user = USERNAME +password = *** ENCRYPTED *** +-------------------- +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y +``` diff --git a/docs/layouts/chrome/navbar.html b/docs/layouts/chrome/navbar.html index 90fe4cc1d..774d55fc2 100644 --- a/docs/layouts/chrome/navbar.html +++ b/docs/layouts/chrome/navbar.html @@ -61,6 +61,7 @@ Compress (transparent gzip compression) Citrix ShareFile Crypt (encrypts the others) + Digi Storage România Dropbox Enterprise File Fabric FTP diff --git a/fstest/test_all/config.yaml b/fstest/test_all/config.yaml index 1569012f3..20a9b4db2 100644 --- a/fstest/test_all/config.yaml +++ b/fstest/test_all/config.yaml @@ -304,6 +304,9 @@ backends: - backend: "koofr" remote: "TestKoofr:" fastlist: false + - backend: "koofr" + remote: "TestDigiStorageRo:" + fastlist: false - backend: "premiumizeme" remote: "TestPremiumizeMe:" fastlist: false