From f588e90e23c4c33f890b86f83ba17efc2d03ad7d Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 26 Apr 2022 15:34:16 +0200 Subject: [PATCH 01/50] reenable parallel deployment tests --- .drone.star | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.drone.star b/.drone.star index 54021c12d7..ed3c540e8c 100644 --- a/.drone.star +++ b/.drone.star @@ -93,9 +93,7 @@ config = { "suites": [ "apiShareManagement", ], - # The tests fail after the storage config changes - # They will be fixed later. - "skip": True, + "skip": False, "earlyFail": True, "cron": "nightly", }, @@ -103,9 +101,7 @@ config = { "suites": [ "apiWebdavOperations", ], - # The tests fail after the storage config changes - # They will be fixed later. - "skip": True, + "skip": False, "earlyFail": True, "cron": "nightly", }, From 47ed302e43de42ef0cddf980b4e9b3038808ab11 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 26 Apr 2022 16:23:28 +0200 Subject: [PATCH 02/50] add config docs for services --- docs/extensions/auth-basic/_index.md | 16 ++++++++++++++++ docs/extensions/auth-basic/configuration.md | 15 +++++++++++++++ docs/extensions/auth-bearer/_index.md | 16 ++++++++++++++++ docs/extensions/auth-bearer/configuration.md | 15 +++++++++++++++ docs/extensions/auth-machine/_index.md | 16 ++++++++++++++++ docs/extensions/auth-machine/configuration.md | 15 +++++++++++++++ docs/extensions/frontend/_index.md | 16 ++++++++++++++++ docs/extensions/frontend/configuration.md | 15 +++++++++++++++ docs/extensions/gateway/_index.md | 16 ++++++++++++++++ docs/extensions/gateway/configuration.md | 15 +++++++++++++++ docs/extensions/group/_index.md | 16 ++++++++++++++++ docs/extensions/group/configuration.md | 15 +++++++++++++++ docs/extensions/ocdav/_index.md | 16 ++++++++++++++++ docs/extensions/ocdav/configuration.md | 15 +++++++++++++++ docs/extensions/storage-metadata/_index.md | 16 ++++++++++++++++ .../extensions/storage-metadata/configuration.md | 15 +++++++++++++++ docs/extensions/storage-publiclink/_index.md | 16 ++++++++++++++++ .../storage-publiclink/configuration.md | 15 +++++++++++++++ docs/extensions/storage-shares/_index.md | 16 ++++++++++++++++ docs/extensions/storage-shares/configuration.md | 15 +++++++++++++++ docs/extensions/storage-users/_index.md | 16 ++++++++++++++++ docs/extensions/storage-users/configuration.md | 15 +++++++++++++++ docs/extensions/user/_index.md | 16 ++++++++++++++++ docs/extensions/user/configuration.md | 15 +++++++++++++++ 24 files changed, 372 insertions(+) create mode 100644 docs/extensions/auth-basic/_index.md create mode 100644 docs/extensions/auth-basic/configuration.md create mode 100644 docs/extensions/auth-bearer/_index.md create mode 100644 docs/extensions/auth-bearer/configuration.md create mode 100644 docs/extensions/auth-machine/_index.md create mode 100644 docs/extensions/auth-machine/configuration.md create mode 100644 docs/extensions/frontend/_index.md create mode 100644 docs/extensions/frontend/configuration.md create mode 100644 docs/extensions/gateway/_index.md create mode 100644 docs/extensions/gateway/configuration.md create mode 100644 docs/extensions/group/_index.md create mode 100644 docs/extensions/group/configuration.md create mode 100644 docs/extensions/ocdav/_index.md create mode 100644 docs/extensions/ocdav/configuration.md create mode 100644 docs/extensions/storage-metadata/_index.md create mode 100644 docs/extensions/storage-metadata/configuration.md create mode 100644 docs/extensions/storage-publiclink/_index.md create mode 100644 docs/extensions/storage-publiclink/configuration.md create mode 100644 docs/extensions/storage-shares/_index.md create mode 100644 docs/extensions/storage-shares/configuration.md create mode 100644 docs/extensions/storage-users/_index.md create mode 100644 docs/extensions/storage-users/configuration.md create mode 100644 docs/extensions/user/_index.md create mode 100644 docs/extensions/user/configuration.md diff --git a/docs/extensions/auth-basic/_index.md b/docs/extensions/auth-basic/_index.md new file mode 100644 index 0000000000..3cae23b145 --- /dev/null +++ b/docs/extensions/auth-basic/_index.md @@ -0,0 +1,16 @@ +--- +title: Auth-Basic +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/auth-baisc +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/auth-basic/configuration.md b/docs/extensions/auth-basic/configuration.md new file mode 100644 index 0000000000..4fdd2f9225 --- /dev/null +++ b/docs/extensions/auth-basic/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/auth-basic +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/auth-basic-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/auth-basic_configvars.md" >}} diff --git a/docs/extensions/auth-bearer/_index.md b/docs/extensions/auth-bearer/_index.md new file mode 100644 index 0000000000..853f8938fa --- /dev/null +++ b/docs/extensions/auth-bearer/_index.md @@ -0,0 +1,16 @@ +--- +title: Auth-Bearer +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/auth-bearer +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/auth-bearer/configuration.md b/docs/extensions/auth-bearer/configuration.md new file mode 100644 index 0000000000..853ef9acc7 --- /dev/null +++ b/docs/extensions/auth-bearer/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/auth-bearer +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/auth-bearer-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/auth-bearer_configvars.md" >}} diff --git a/docs/extensions/auth-machine/_index.md b/docs/extensions/auth-machine/_index.md new file mode 100644 index 0000000000..cba78fad0d --- /dev/null +++ b/docs/extensions/auth-machine/_index.md @@ -0,0 +1,16 @@ +--- +title: Auth-Machine +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/auth-machine +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/auth-machine/configuration.md b/docs/extensions/auth-machine/configuration.md new file mode 100644 index 0000000000..96fb78c4b8 --- /dev/null +++ b/docs/extensions/auth-machine/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/auth-machine +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/auth-machine-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/auth-machine_configvars.md" >}} diff --git a/docs/extensions/frontend/_index.md b/docs/extensions/frontend/_index.md new file mode 100644 index 0000000000..3e6321e9dd --- /dev/null +++ b/docs/extensions/frontend/_index.md @@ -0,0 +1,16 @@ +--- +title: Frontend +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/frontend +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/frontend/configuration.md b/docs/extensions/frontend/configuration.md new file mode 100644 index 0000000000..fb164e6bab --- /dev/null +++ b/docs/extensions/frontend/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/frontend +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/frontend-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/frontend_configvars.md" >}} diff --git a/docs/extensions/gateway/_index.md b/docs/extensions/gateway/_index.md new file mode 100644 index 0000000000..4a89602b6c --- /dev/null +++ b/docs/extensions/gateway/_index.md @@ -0,0 +1,16 @@ +--- +title: Gateway +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/gateway +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/gateway/configuration.md b/docs/extensions/gateway/configuration.md new file mode 100644 index 0000000000..3ff17a8e8f --- /dev/null +++ b/docs/extensions/gateway/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/gateway +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/gateway-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/gateway_configvars.md" >}} diff --git a/docs/extensions/group/_index.md b/docs/extensions/group/_index.md new file mode 100644 index 0000000000..00fabc8b7a --- /dev/null +++ b/docs/extensions/group/_index.md @@ -0,0 +1,16 @@ +--- +title: Group +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/group +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/group/configuration.md b/docs/extensions/group/configuration.md new file mode 100644 index 0000000000..b177bf5a5d --- /dev/null +++ b/docs/extensions/group/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/group +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/group-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/group_configvars.md" >}} diff --git a/docs/extensions/ocdav/_index.md b/docs/extensions/ocdav/_index.md new file mode 100644 index 0000000000..62f55ff1b5 --- /dev/null +++ b/docs/extensions/ocdav/_index.md @@ -0,0 +1,16 @@ +--- +title: ocDAV +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/ocdav +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/ocdav/configuration.md b/docs/extensions/ocdav/configuration.md new file mode 100644 index 0000000000..9ca88c1de0 --- /dev/null +++ b/docs/extensions/ocdav/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/ocdav +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/ocdav-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/ocdav_configvars.md" >}} diff --git a/docs/extensions/storage-metadata/_index.md b/docs/extensions/storage-metadata/_index.md new file mode 100644 index 0000000000..04266f260a --- /dev/null +++ b/docs/extensions/storage-metadata/_index.md @@ -0,0 +1,16 @@ +--- +title: Metadata Storage +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-metadata +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/storage-metadata/configuration.md b/docs/extensions/storage-metadata/configuration.md new file mode 100644 index 0000000000..a53ad63b93 --- /dev/null +++ b/docs/extensions/storage-metadata/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-metadata +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/storage-metadata-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/storage-metadata_configvars.md" >}} diff --git a/docs/extensions/storage-publiclink/_index.md b/docs/extensions/storage-publiclink/_index.md new file mode 100644 index 0000000000..cbe0f2a248 --- /dev/null +++ b/docs/extensions/storage-publiclink/_index.md @@ -0,0 +1,16 @@ +--- +title: Publiclink Storage +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-publiclink +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/storage-publiclink/configuration.md b/docs/extensions/storage-publiclink/configuration.md new file mode 100644 index 0000000000..6b741c9c15 --- /dev/null +++ b/docs/extensions/storage-publiclink/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-publiclink +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/storage-publiclink-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/storage-publiclink_configvars.md" >}} diff --git a/docs/extensions/storage-shares/_index.md b/docs/extensions/storage-shares/_index.md new file mode 100644 index 0000000000..e878e42b8d --- /dev/null +++ b/docs/extensions/storage-shares/_index.md @@ -0,0 +1,16 @@ +--- +title: Shares Storage +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-shares +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/storage-shares/configuration.md b/docs/extensions/storage-shares/configuration.md new file mode 100644 index 0000000000..5a63a77c45 --- /dev/null +++ b/docs/extensions/storage-shares/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-shares +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/storage-shares-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/storage-shares_configvars.md" >}} diff --git a/docs/extensions/storage-users/_index.md b/docs/extensions/storage-users/_index.md new file mode 100644 index 0000000000..e66f413d45 --- /dev/null +++ b/docs/extensions/storage-users/_index.md @@ -0,0 +1,16 @@ +--- +title: Users Storage +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-users +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/storage-users/configuration.md b/docs/extensions/storage-users/configuration.md new file mode 100644 index 0000000000..0b121cfdcd --- /dev/null +++ b/docs/extensions/storage-users/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/storage-users +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/storage-users-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/storage-users_configvars.md" >}} diff --git a/docs/extensions/user/_index.md b/docs/extensions/user/_index.md new file mode 100644 index 0000000000..8c4078068f --- /dev/null +++ b/docs/extensions/user/_index.md @@ -0,0 +1,16 @@ +--- +title: User +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/user +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/user/configuration.md b/docs/extensions/user/configuration.md new file mode 100644 index 0000000000..683e05b24e --- /dev/null +++ b/docs/extensions/user/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/user +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/user-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/user_configvars.md" >}} From 061808ca72e4943caaa7106fd3c6db8c69614939 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 13:36:15 +0200 Subject: [PATCH 03/50] remove unsupported drivers from the documentation --- extensions/auth-basic/pkg/config/config.go | 2 +- extensions/group/pkg/config/config.go | 4 ++-- extensions/storage-users/pkg/config/config.go | 6 ++--- .../pkg/config/defaults/defaultconfig.go | 23 ------------------- extensions/user/pkg/config/config.go | 4 ++-- 5 files changed, 8 insertions(+), 31 deletions(-) diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index 2632ac9b16..162903407a 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -50,7 +50,7 @@ type GRPCConfig struct { } type AuthProviders struct { - JSON JSONProvider `yaml:"json"` + JSON JSONProvider `yaml:"json"` // not supported by the oCIS product, therefore not part of docs LDAP LDAPProvider `yaml:"ldap"` OwnCloudSQL OwnCloudSQLProvider `yaml:"owncloud_sql"` } diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index 415db0255e..ceece55452 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -51,10 +51,10 @@ type GRPCConfig struct { } type Drivers struct { - JSON JSONDriver + JSON JSONDriver // not supported by the oCIS product, therefore not part of docs LDAP LDAPDriver OwnCloudSQL OwnCloudSQLDriver - REST RESTProvider + REST RESTProvider // not supported by the oCIS product, therefore not part of docs } type JSONDriver struct { diff --git a/extensions/storage-users/pkg/config/config.go b/extensions/storage-users/pkg/config/config.go index 7cb2888148..e47bd01794 100644 --- a/extensions/storage-users/pkg/config/config.go +++ b/extensions/storage-users/pkg/config/config.go @@ -70,10 +70,10 @@ type HTTPConfig struct { } type Drivers struct { - EOS EOSDriver - Local LocalDriver + EOS EOSDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs + Local LocalDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs OCIS OCISDriver - S3 S3Driver + S3 S3Driver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs S3NG S3NGDriver OwnCloudSQL OwnCloudSQLDriver } diff --git a/extensions/storage-users/pkg/config/defaults/defaultconfig.go b/extensions/storage-users/pkg/config/defaults/defaultconfig.go index b29e9daa98..87c0bb4cd8 100644 --- a/extensions/storage-users/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-users/pkg/config/defaults/defaultconfig.go @@ -1,7 +1,6 @@ package defaults import ( - "os" "path/filepath" "github.com/owncloud/ocis/extensions/storage-users/pkg/config" @@ -43,25 +42,6 @@ func DefaultConfig() *config.Config { MountID: "1284d238-aa92-42ce-bdc4-0b0000009157", Driver: "ocis", Drivers: config.Drivers{ - EOS: config.EOSDriver{ - Root: "/eos/dockertest/reva", - ShareFolder: "/Shares", - UserLayout: "{{substr 0 1 .Username}}/{{.Username}}", - ShadowNamespace: "", - UploadsNamespace: "", - EosBinary: "/usr/bin/eos", - XrdcopyBinary: "/usr/bin/xrdcopy", - MasterURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - GRPCURI: "", - SlaveURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - CacheDirectory: os.TempDir(), - GatewaySVC: "127.0.0.1:9142", - }, - Local: config.LocalDriver{ - Root: filepath.Join(defaults.BaseDataPath(), "storage", "local", "users"), - ShareFolder: "/Shares", - UserLayout: "{{.Username}}", - }, OwnCloudSQL: config.OwnCloudSQLDriver{ Root: filepath.Join(defaults.BaseDataPath(), "storage", "owncloud"), ShareFolder: "/Shares", @@ -73,9 +53,6 @@ func DefaultConfig() *config.Config { DBPort: 3306, DBName: "owncloud", }, - S3: config.S3Driver{ - Region: "default", - }, S3NG: config.S3NGDriver{ Root: filepath.Join(defaults.BaseDataPath(), "storage", "users"), ShareFolder: "/Shares", diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index 41cc0ab6e6..8a22724384 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -51,10 +51,10 @@ type GRPCConfig struct { } type Drivers struct { - JSON JSONDriver + JSON JSONDriver // not supported by the oCIS product, therefore not part of docs LDAP LDAPDriver OwnCloudSQL OwnCloudSQLDriver - REST RESTProvider + REST RESTProvider // not supported by the oCIS product, therefore not part of docs } type JSONDriver struct { From ef6d32a12a89c5496f7efea5614580d286ddda3d Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 14:04:28 +0200 Subject: [PATCH 04/50] remove `extensions/storage` leftovers --- extensions/appprovider/pkg/command/command.go | 8 +- .../appprovider/pkg/server/debug/option.go | 50 + .../appprovider/pkg/server/debug/server.go | 63 + extensions/auth-basic/pkg/command/command.go | 8 +- .../auth-basic/pkg/server/debug/option.go | 50 + .../auth-basic/pkg/server/debug/server.go | 63 + extensions/auth-bearer/pkg/command/command.go | 8 +- .../auth-bearer/pkg/server/debug/option.go | 50 + .../auth-bearer/pkg/server/debug/server.go | 63 + .../auth-machine/pkg/command/command.go | 8 +- .../auth-machine/pkg/server/debug/option.go | 50 + .../auth-machine/pkg/server/debug/server.go | 63 + extensions/frontend/pkg/command/command.go | 8 +- .../frontend/pkg/server/debug/option.go | 50 + .../frontend/pkg/server/debug/server.go | 63 + extensions/gateway/pkg/command/command.go | 10 +- extensions/gateway/pkg/server/debug/option.go | 50 + extensions/gateway/pkg/server/debug/server.go | 63 + extensions/group/pkg/command/command.go | 8 +- extensions/group/pkg/server/debug/option.go | 50 + extensions/group/pkg/server/debug/server.go | 63 + extensions/ocdav/pkg/command/ocdav.go | 8 +- extensions/ocdav/pkg/server/debug/option.go | 50 + extensions/ocdav/pkg/server/debug/server.go | 63 + extensions/sharing/pkg/command/command.go | 8 +- extensions/sharing/pkg/server/debug/option.go | 50 + extensions/sharing/pkg/server/debug/server.go | 63 + .../storage-metadata/pkg/command/command.go | 10 +- .../pkg/server/debug/option.go | 50 + .../pkg/server/debug/server.go | 63 + .../pkg/command/storagepubliclink.go | 8 +- .../pkg/server/debug/option.go | 50 + .../pkg/server/debug/server.go | 63 + .../storage-shares/pkg/command/command.go | 8 +- .../pkg/server/debug/option.go | 42 +- .../storage-shares/pkg/server/debug/server.go | 63 + .../storage-users/pkg/command/command.go | 8 +- .../storage-users/pkg/server/debug/option.go | 50 + .../storage-users/pkg/server/debug/server.go | 63 + extensions/storage/.dockerignore | 2 - extensions/storage/Makefile | 37 - extensions/storage/cmd/storage/main.go | 14 - .../storage/docker/Dockerfile.linux.amd64 | 19 - .../storage/docker/Dockerfile.linux.arm | 19 - .../storage/docker/Dockerfile.linux.arm64 | 19 - extensions/storage/docker/manifest.tmpl | 22 - extensions/storage/pkg/command/health.go | 48 - extensions/storage/pkg/command/root.go | 45 - extensions/storage/pkg/config/config.go | 1848 ----------------- .../pkg/config/defaults/defaultconfig.go | 459 ---- extensions/storage/pkg/config/parser/parse.go | 37 - extensions/storage/pkg/tracing/tracing.go | 38 - extensions/storage/reflex.conf | 5 - extensions/user/pkg/command/command.go | 8 +- extensions/user/pkg/server/debug/option.go | 50 + .../pkg/server/debug/server.go | 16 +- .../service/external/external.go | 0 .../service/external/external_test.go | 0 58 files changed, 1510 insertions(+), 2745 deletions(-) create mode 100644 extensions/appprovider/pkg/server/debug/option.go create mode 100644 extensions/appprovider/pkg/server/debug/server.go create mode 100644 extensions/auth-basic/pkg/server/debug/option.go create mode 100644 extensions/auth-basic/pkg/server/debug/server.go create mode 100644 extensions/auth-bearer/pkg/server/debug/option.go create mode 100644 extensions/auth-bearer/pkg/server/debug/server.go create mode 100644 extensions/auth-machine/pkg/server/debug/option.go create mode 100644 extensions/auth-machine/pkg/server/debug/server.go create mode 100644 extensions/frontend/pkg/server/debug/option.go create mode 100644 extensions/frontend/pkg/server/debug/server.go create mode 100644 extensions/gateway/pkg/server/debug/option.go create mode 100644 extensions/gateway/pkg/server/debug/server.go create mode 100644 extensions/group/pkg/server/debug/option.go create mode 100644 extensions/group/pkg/server/debug/server.go create mode 100644 extensions/ocdav/pkg/server/debug/option.go create mode 100644 extensions/ocdav/pkg/server/debug/server.go create mode 100644 extensions/sharing/pkg/server/debug/option.go create mode 100644 extensions/sharing/pkg/server/debug/server.go create mode 100644 extensions/storage-metadata/pkg/server/debug/option.go create mode 100644 extensions/storage-metadata/pkg/server/debug/server.go create mode 100644 extensions/storage-publiclink/pkg/server/debug/option.go create mode 100644 extensions/storage-publiclink/pkg/server/debug/server.go rename extensions/{storage => storage-shares}/pkg/server/debug/option.go (53%) create mode 100644 extensions/storage-shares/pkg/server/debug/server.go create mode 100644 extensions/storage-users/pkg/server/debug/option.go create mode 100644 extensions/storage-users/pkg/server/debug/server.go delete mode 100644 extensions/storage/.dockerignore delete mode 100644 extensions/storage/Makefile delete mode 100644 extensions/storage/cmd/storage/main.go delete mode 100644 extensions/storage/docker/Dockerfile.linux.amd64 delete mode 100644 extensions/storage/docker/Dockerfile.linux.arm delete mode 100644 extensions/storage/docker/Dockerfile.linux.arm64 delete mode 100644 extensions/storage/docker/manifest.tmpl delete mode 100644 extensions/storage/pkg/command/health.go delete mode 100644 extensions/storage/pkg/command/root.go delete mode 100644 extensions/storage/pkg/config/config.go delete mode 100644 extensions/storage/pkg/config/defaults/defaultconfig.go delete mode 100644 extensions/storage/pkg/config/parser/parse.go delete mode 100644 extensions/storage/pkg/tracing/tracing.go delete mode 100644 extensions/storage/reflex.conf create mode 100644 extensions/user/pkg/server/debug/option.go rename extensions/{storage => user}/pkg/server/debug/server.go (71%) rename {extensions/storage/pkg => ocis-pkg}/service/external/external.go (100%) rename {extensions/storage/pkg => ocis-pkg}/service/external/external_test.go (100%) diff --git a/extensions/appprovider/pkg/command/command.go b/extensions/appprovider/pkg/command/command.go index f638e3c98c..e2cbfd42c2 100644 --- a/extensions/appprovider/pkg/command/command.go +++ b/extensions/appprovider/pkg/command/command.go @@ -12,7 +12,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/appprovider/pkg/config" "github.com/owncloud/ocis/extensions/appprovider/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/appprovider/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -63,13 +63,9 @@ func AppProvider(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/appprovider/pkg/server/debug/option.go b/extensions/appprovider/pkg/server/debug/option.go new file mode 100644 index 0000000000..d072eb56e8 --- /dev/null +++ b/extensions/appprovider/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/appprovider/pkg/server/debug/server.go b/extensions/appprovider/pkg/server/debug/server.go new file mode 100644 index 0000000000..e2ef65074a --- /dev/null +++ b/extensions/appprovider/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/auth-basic/pkg/command/command.go b/extensions/auth-basic/pkg/command/command.go index cd08691a56..ce77c11685 100644 --- a/extensions/auth-basic/pkg/command/command.go +++ b/extensions/auth-basic/pkg/command/command.go @@ -13,7 +13,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" "github.com/owncloud/ocis/extensions/auth-basic/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/ldap" "github.com/owncloud/ocis/ocis-pkg/log" @@ -85,13 +85,9 @@ func AuthBasic(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/auth-basic/pkg/server/debug/option.go b/extensions/auth-basic/pkg/server/debug/option.go new file mode 100644 index 0000000000..ed1658963c --- /dev/null +++ b/extensions/auth-basic/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/auth-basic/pkg/server/debug/server.go b/extensions/auth-basic/pkg/server/debug/server.go new file mode 100644 index 0000000000..e6f813ac97 --- /dev/null +++ b/extensions/auth-basic/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/auth-bearer/pkg/command/command.go b/extensions/auth-bearer/pkg/command/command.go index ea41172d27..4274fb4e7f 100644 --- a/extensions/auth-bearer/pkg/command/command.go +++ b/extensions/auth-bearer/pkg/command/command.go @@ -12,7 +12,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -66,13 +66,9 @@ func AuthBearer(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/auth-bearer/pkg/server/debug/option.go b/extensions/auth-bearer/pkg/server/debug/option.go new file mode 100644 index 0000000000..8ed17ad269 --- /dev/null +++ b/extensions/auth-bearer/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/auth-bearer/pkg/server/debug/server.go b/extensions/auth-bearer/pkg/server/debug/server.go new file mode 100644 index 0000000000..f125a12870 --- /dev/null +++ b/extensions/auth-bearer/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/auth-machine/pkg/command/command.go b/extensions/auth-machine/pkg/command/command.go index 1ab91220af..674c7b220f 100644 --- a/extensions/auth-machine/pkg/command/command.go +++ b/extensions/auth-machine/pkg/command/command.go @@ -12,7 +12,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" "github.com/owncloud/ocis/extensions/auth-machine/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -66,13 +66,9 @@ func AuthMachine(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/auth-machine/pkg/server/debug/option.go b/extensions/auth-machine/pkg/server/debug/option.go new file mode 100644 index 0000000000..5666e1b3cc --- /dev/null +++ b/extensions/auth-machine/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/auth-machine/pkg/server/debug/server.go b/extensions/auth-machine/pkg/server/debug/server.go new file mode 100644 index 0000000000..b523773ce9 --- /dev/null +++ b/extensions/auth-machine/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/frontend/pkg/command/command.go b/extensions/frontend/pkg/command/command.go index d14917d1c6..ff2d2e636c 100644 --- a/extensions/frontend/pkg/command/command.go +++ b/extensions/frontend/pkg/command/command.go @@ -13,7 +13,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/frontend/pkg/config" "github.com/owncloud/ocis/extensions/frontend/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/frontend/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -107,13 +107,9 @@ func Frontend(cfg *config.Config) *cli.Command { { server, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/frontend/pkg/server/debug/option.go b/extensions/frontend/pkg/server/debug/option.go new file mode 100644 index 0000000000..a46ead603a --- /dev/null +++ b/extensions/frontend/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/frontend/pkg/server/debug/server.go b/extensions/frontend/pkg/server/debug/server.go new file mode 100644 index 0000000000..202c9c3058 --- /dev/null +++ b/extensions/frontend/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/gateway/pkg/command/command.go b/extensions/gateway/pkg/command/command.go index 60440c2279..262f818858 100644 --- a/extensions/gateway/pkg/command/command.go +++ b/extensions/gateway/pkg/command/command.go @@ -17,10 +17,10 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/gateway/pkg/config" "github.com/owncloud/ocis/extensions/gateway/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" - "github.com/owncloud/ocis/extensions/storage/pkg/service/external" + "github.com/owncloud/ocis/extensions/gateway/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/service/external" "github.com/owncloud/ocis/ocis-pkg/sync" "github.com/owncloud/ocis/ocis-pkg/tracing" "github.com/owncloud/ocis/ocis-pkg/version" @@ -90,13 +90,9 @@ func Gateway(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/gateway/pkg/server/debug/option.go b/extensions/gateway/pkg/server/debug/option.go new file mode 100644 index 0000000000..9bdf55de12 --- /dev/null +++ b/extensions/gateway/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/gateway/pkg/server/debug/server.go b/extensions/gateway/pkg/server/debug/server.go new file mode 100644 index 0000000000..a1470d904c --- /dev/null +++ b/extensions/gateway/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/group/pkg/command/command.go b/extensions/group/pkg/command/command.go index 9f5d45dfe6..f1f7da429c 100644 --- a/extensions/group/pkg/command/command.go +++ b/extensions/group/pkg/command/command.go @@ -13,7 +13,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/group/pkg/config" "github.com/owncloud/ocis/extensions/group/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/group/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/ldap" "github.com/owncloud/ocis/ocis-pkg/log" @@ -83,13 +83,9 @@ func Groups(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/group/pkg/server/debug/option.go b/extensions/group/pkg/server/debug/option.go new file mode 100644 index 0000000000..6b1c347dd4 --- /dev/null +++ b/extensions/group/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/group/pkg/server/debug/server.go b/extensions/group/pkg/server/debug/server.go new file mode 100644 index 0000000000..e323840cae --- /dev/null +++ b/extensions/group/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/ocdav/pkg/command/ocdav.go b/extensions/ocdav/pkg/command/ocdav.go index 20bb8a29b6..3426e38957 100644 --- a/extensions/ocdav/pkg/command/ocdav.go +++ b/extensions/ocdav/pkg/command/ocdav.go @@ -9,7 +9,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/ocdav/pkg/config" "github.com/owncloud/ocis/extensions/ocdav/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/ocdav/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -77,13 +77,9 @@ func OCDav(cfg *config.Config) *cli.Command { { server, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/ocdav/pkg/server/debug/option.go b/extensions/ocdav/pkg/server/debug/option.go new file mode 100644 index 0000000000..01bda4d86c --- /dev/null +++ b/extensions/ocdav/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/ocdav/pkg/server/debug/server.go b/extensions/ocdav/pkg/server/debug/server.go new file mode 100644 index 0000000000..6a7838accd --- /dev/null +++ b/extensions/ocdav/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/sharing/pkg/command/command.go b/extensions/sharing/pkg/command/command.go index 29cde19357..2e0eca8d14 100644 --- a/extensions/sharing/pkg/command/command.go +++ b/extensions/sharing/pkg/command/command.go @@ -17,7 +17,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/sharing/pkg/config" "github.com/owncloud/ocis/extensions/sharing/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/sharing/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/thejerf/suture/v4" "github.com/urfave/cli/v2" @@ -81,13 +81,9 @@ func Sharing(cfg *config.Config) *cli.Command { }) debug, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/sharing/pkg/server/debug/option.go b/extensions/sharing/pkg/server/debug/option.go new file mode 100644 index 0000000000..9667bca9e4 --- /dev/null +++ b/extensions/sharing/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/sharing/pkg/server/debug/server.go b/extensions/sharing/pkg/server/debug/server.go new file mode 100644 index 0000000000..d7ce79028f --- /dev/null +++ b/extensions/sharing/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/storage-metadata/pkg/command/command.go b/extensions/storage-metadata/pkg/command/command.go index 54eff79d45..5d9f4d760b 100644 --- a/extensions/storage-metadata/pkg/command/command.go +++ b/extensions/storage-metadata/pkg/command/command.go @@ -13,10 +13,10 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" - "github.com/owncloud/ocis/extensions/storage/pkg/service/external" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/service/external" "github.com/owncloud/ocis/ocis-pkg/sync" "github.com/owncloud/ocis/ocis-pkg/tracing" "github.com/owncloud/ocis/ocis-pkg/version" @@ -78,13 +78,9 @@ func StorageMetadata(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/storage-metadata/pkg/server/debug/option.go b/extensions/storage-metadata/pkg/server/debug/option.go new file mode 100644 index 0000000000..b138e2e70a --- /dev/null +++ b/extensions/storage-metadata/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/storage-metadata/pkg/server/debug/server.go b/extensions/storage-metadata/pkg/server/debug/server.go new file mode 100644 index 0000000000..1ce0a803a8 --- /dev/null +++ b/extensions/storage-metadata/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/storage-publiclink/pkg/command/storagepubliclink.go b/extensions/storage-publiclink/pkg/command/storagepubliclink.go index 06fe7ada8a..78996e6597 100644 --- a/extensions/storage-publiclink/pkg/command/storagepubliclink.go +++ b/extensions/storage-publiclink/pkg/command/storagepubliclink.go @@ -12,7 +12,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -66,13 +66,9 @@ func StoragePublicLink(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/storage-publiclink/pkg/server/debug/option.go b/extensions/storage-publiclink/pkg/server/debug/option.go new file mode 100644 index 0000000000..d2cccd3437 --- /dev/null +++ b/extensions/storage-publiclink/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/storage-publiclink/pkg/server/debug/server.go b/extensions/storage-publiclink/pkg/server/debug/server.go new file mode 100644 index 0000000000..fe2896014f --- /dev/null +++ b/extensions/storage-publiclink/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/storage-shares/pkg/command/command.go b/extensions/storage-shares/pkg/command/command.go index 6964706456..ba9efc6457 100644 --- a/extensions/storage-shares/pkg/command/command.go +++ b/extensions/storage-shares/pkg/command/command.go @@ -16,7 +16,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" "github.com/owncloud/ocis/extensions/storage-shares/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/thejerf/suture/v4" "github.com/urfave/cli/v2" @@ -68,13 +68,9 @@ func StorageShares(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/storage/pkg/server/debug/option.go b/extensions/storage-shares/pkg/server/debug/option.go similarity index 53% rename from extensions/storage/pkg/server/debug/option.go rename to extensions/storage-shares/pkg/server/debug/option.go index 8e84764913..a671b3ec76 100644 --- a/extensions/storage/pkg/server/debug/option.go +++ b/extensions/storage-shares/pkg/server/debug/option.go @@ -3,7 +3,7 @@ package debug import ( "context" - "github.com/owncloud/ocis/extensions/storage/pkg/config" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" ) @@ -12,14 +12,9 @@ type Option func(o *Options) // Options defines the available options for this package. type Options struct { - Name string - Addr string Logger log.Logger Context context.Context Config *config.Config - Pprof bool - Zpages bool - Token string } // newOptions initializes the available default options. @@ -33,20 +28,6 @@ func newOptions(opts ...Option) Options { return opt } -// Name provides a function to set the name option. -func Name(val string) Option { - return func(o *Options) { - o.Name = val - } -} - -// Addr provides a function to set the addr option. -func Addr(val string) Option { - return func(o *Options) { - o.Addr = val - } -} - // Logger provides a function to set the logger option. func Logger(val log.Logger) Option { return func(o *Options) { @@ -67,24 +48,3 @@ func Config(val *config.Config) Option { o.Config = val } } - -// Pprof provides a function to set the pprof option. -func Pprof(val bool) Option { - return func(o *Options) { - o.Pprof = val - } -} - -// Zpages provides a function to set the zpages option. -func Zpages(val bool) Option { - return func(o *Options) { - o.Zpages = val - } -} - -// Token provides a function to set the token option. -func Token(val string) Option { - return func(o *Options) { - o.Token = val - } -} diff --git a/extensions/storage-shares/pkg/server/debug/server.go b/extensions/storage-shares/pkg/server/debug/server.go new file mode 100644 index 0000000000..666c3b3b14 --- /dev/null +++ b/extensions/storage-shares/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/storage-users/pkg/command/command.go b/extensions/storage-users/pkg/command/command.go index 5e48a2db03..766631f6a5 100644 --- a/extensions/storage-users/pkg/command/command.go +++ b/extensions/storage-users/pkg/command/command.go @@ -12,7 +12,7 @@ import ( "github.com/oklog/run" "github.com/owncloud/ocis/extensions/storage-users/pkg/config" "github.com/owncloud/ocis/extensions/storage-users/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-users/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/sync" @@ -67,13 +67,9 @@ func StorageUsers(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/storage-users/pkg/server/debug/option.go b/extensions/storage-users/pkg/server/debug/option.go new file mode 100644 index 0000000000..7493b21c48 --- /dev/null +++ b/extensions/storage-users/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/storage-users/pkg/server/debug/server.go b/extensions/storage-users/pkg/server/debug/server.go new file mode 100644 index 0000000000..65c9fdc7a8 --- /dev/null +++ b/extensions/storage-users/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/storage/.dockerignore b/extensions/storage/.dockerignore deleted file mode 100644 index 4ec85b5e4f..0000000000 --- a/extensions/storage/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!bin/ diff --git a/extensions/storage/Makefile b/extensions/storage/Makefile deleted file mode 100644 index bb9471219d..0000000000 --- a/extensions/storage/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := storage - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ######### -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/storage/cmd/storage/main.go b/extensions/storage/cmd/storage/main.go deleted file mode 100644 index 2941f76e77..0000000000 --- a/extensions/storage/cmd/storage/main.go +++ /dev/null @@ -1,14 +0,0 @@ -package main - -import ( - "os" - - "github.com/owncloud/ocis/extensions/storage/pkg/command" - "github.com/owncloud/ocis/extensions/storage/pkg/config/defaults" -) - -func main() { - if err := command.Execute(defaults.DefaultConfig()); err != nil { - os.Exit(1) - } -} diff --git a/extensions/storage/docker/Dockerfile.linux.amd64 b/extensions/storage/docker/Dockerfile.linux.amd64 deleted file mode 100644 index 231e033f2e..0000000000 --- a/extensions/storage/docker/Dockerfile.linux.amd64 +++ /dev/null @@ -1,19 +0,0 @@ -FROM amd64/alpine:latest - -RUN apk update && \ - apk upgrade && \ - apk add ca-certificates mailcap && \ - rm -rf /var/cache/apk/* && \ - echo 'hosts: files dns' >| /etc/nsswitch.conf - -LABEL maintainer="ownCloud GmbH " \ - org.label-schema.name="oCIS Reva" \ - org.label-schema.vendor="ownCloud GmbH" \ - org.label-schema.schema-version="1.0" - -EXPOSE 9140 9141 9142 9143 - -ENTRYPOINT ["/usr/bin/ocis-reva"] -CMD ["server"] - -COPY bin/ocis-reva /usr/bin/ocis-reva diff --git a/extensions/storage/docker/Dockerfile.linux.arm b/extensions/storage/docker/Dockerfile.linux.arm deleted file mode 100644 index af07021030..0000000000 --- a/extensions/storage/docker/Dockerfile.linux.arm +++ /dev/null @@ -1,19 +0,0 @@ -FROM arm32v6/alpine:latest - -RUN apk update && \ - apk upgrade && \ - apk add ca-certificates mailcap && \ - rm -rf /var/cache/apk/* && \ - echo 'hosts: files dns' >| /etc/nsswitch.conf - -LABEL maintainer="ownCloud GmbH " \ - org.label-schema.name="oCIS Reva" \ - org.label-schema.vendor="ownCloud GmbH" \ - org.label-schema.schema-version="1.0" - -EXPOSE 9140 9141 9142 9143 - -ENTRYPOINT ["/usr/bin/ocis-reva"] -CMD ["server"] - -COPY bin/ocis-reva /usr/bin/ocis-reva diff --git a/extensions/storage/docker/Dockerfile.linux.arm64 b/extensions/storage/docker/Dockerfile.linux.arm64 deleted file mode 100644 index e8f5ac3626..0000000000 --- a/extensions/storage/docker/Dockerfile.linux.arm64 +++ /dev/null @@ -1,19 +0,0 @@ -FROM arm64v8/alpine:latest - -RUN apk update && \ - apk upgrade && \ - apk add ca-certificates mailcap && \ - rm -rf /var/cache/apk/* && \ - echo 'hosts: files dns' >| /etc/nsswitch.conf - -LABEL maintainer="ownCloud GmbH " \ - org.label-schema.name="oCIS Reva" \ - org.label-schema.vendor="ownCloud GmbH" \ - org.label-schema.schema-version="1.0" - -EXPOSE 9140 9141 9142 9143 - -ENTRYPOINT ["/usr/bin/ocis-reva"] -CMD ["server"] - -COPY bin/ocis-reva /usr/bin/ocis-reva diff --git a/extensions/storage/docker/manifest.tmpl b/extensions/storage/docker/manifest.tmpl deleted file mode 100644 index ac5ae8e046..0000000000 --- a/extensions/storage/docker/manifest.tmpl +++ /dev/null @@ -1,22 +0,0 @@ -image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} -{{#if build.tags}} -tags: -{{#each build.tags}} - - {{this}} -{{/each}} -{{/if}} -manifests: - - image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 - platform: - architecture: amd64 - os: linux - - image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 - platform: - architecture: arm64 - variant: v8 - os: linux - - image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm - platform: - architecture: arm - variant: v6 - os: linux diff --git a/extensions/storage/pkg/command/health.go b/extensions/storage/pkg/command/health.go deleted file mode 100644 index 1d8882e37d..0000000000 --- a/extensions/storage/pkg/command/health.go +++ /dev/null @@ -1,48 +0,0 @@ -package command - -import ( - "fmt" - "net/http" - - "github.com/owncloud/ocis/extensions/storage/pkg/config" - "github.com/urfave/cli/v2" -) - -// Health is the entrypoint for the health command. -func Health(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "health", - Usage: "check health status", - Category: "info", - Action: func(c *cli.Context) error { - logger := NewLogger(cfg) - - resp, err := http.Get( - fmt.Sprintf( - "http://%s/healthz", - cfg.Debug.Addr, - ), - ) - - if err != nil { - logger.Fatal(). - Err(err). - Msg("Failed to request health check") - } - - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - logger.Fatal(). - Int("code", resp.StatusCode). - Msg("Health seems to be in bad state") - } - - logger.Debug(). - Int("code", resp.StatusCode). - Msg("Health got a good state") - - return nil - }, - } -} diff --git a/extensions/storage/pkg/command/root.go b/extensions/storage/pkg/command/root.go deleted file mode 100644 index 864c281f52..0000000000 --- a/extensions/storage/pkg/command/root.go +++ /dev/null @@ -1,45 +0,0 @@ -package command - -import ( - "os" - - "github.com/owncloud/ocis/extensions/storage/pkg/config" - "github.com/owncloud/ocis/ocis-pkg/clihelper" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/urfave/cli/v2" -) - -// GetCommands provides all commands for this service -func GetCommands(cfg *config.Config) cli.Commands { - return []*cli.Command{ - Health(cfg), - } -} - -// Execute is the entry point for the storage command. -func Execute(cfg *config.Config) error { - app := clihelper.DefaultApp(&cli.App{ - Name: "storage", - Usage: "Storage service for oCIS", - - Commands: GetCommands(cfg), - }) - - cli.HelpFlag = &cli.BoolFlag{ - Name: "help,h", - Usage: "Show the help", - } - - return app.Run(os.Args) -} - -// NewLogger initializes a service-specific logger instance. -func NewLogger(cfg *config.Config) log.Logger { - return log.NewLogger( - log.Name("storage"), - log.Level(cfg.Log.Level), - log.Pretty(cfg.Log.Pretty), - log.Color(cfg.Log.Color), - log.File(cfg.Log.File), - ) -} diff --git a/extensions/storage/pkg/config/config.go b/extensions/storage/pkg/config/config.go deleted file mode 100644 index c3a626e40f..0000000000 --- a/extensions/storage/pkg/config/config.go +++ /dev/null @@ -1,1848 +0,0 @@ -package config - -import ( - "context" - - "github.com/owncloud/ocis/ocis-pkg/shared" -) - -// Log defines the available logging configuration. -type Log struct { - Level string `yaml:"level"` - Pretty bool `yaml:"pretty"` - Color bool `yaml:"color"` - File string `yaml:"file"` -} - -// Debug defines the available debug configuration. -type Debug struct { - Addr string `yaml:"addr"` - Token string `yaml:"token"` - Pprof bool `yaml:"pprof"` - Zpages bool `yaml:"zpages"` -} - -// Gateway defines the available gateway configuration. -type Gateway struct { - Port - CommitShareToStorageGrant bool `yaml:"commit_share_to_storage_grant"` - CommitShareToStorageRef bool `yaml:"commit_share_to_storage_ref"` - DisableHomeCreationOnLogin bool `yaml:"disable_home_creation_on_login"` - ShareFolder string `yaml:"share_folder"` - LinkGrants string `yaml:"link_grants"` - HomeMapping string `yaml:"home_mapping"` - EtagCacheTTL int `yaml:"etag_cache_ttl"` -} - -// StorageRegistry defines the available storage registry configuration -type StorageRegistry struct { - Driver string `yaml:"driver"` - // HomeProvider is the path in the global namespace that the static storage registry uses to determine the home storage - HomeProvider string `yaml:"home_provider"` - Rules []string `yaml:"rules"` - JSON string `yaml:"json"` -} - -// AppRegistry defines the available app registry configuration -type AppRegistry struct { - Driver string `yaml:"driver"` - MimetypesJSON string `yaml:"mime_types_json"` -} - -// AppProvider defines the available app provider configuration -type AppProvider struct { - Port - ExternalAddr string `yaml:"external_addr"` - Driver string `yaml:"driver"` - WopiDriver WopiDriver `yaml:"wopi_driver"` - AppsURL string `yaml:"apps_url"` - OpenURL string `yaml:"open_url"` - NewURL string `yaml:"new_url"` -} - -type WopiDriver struct { - AppAPIKey string `yaml:"app_api_key"` - AppDesktopOnly bool `yaml:"app_desktop_only"` - AppIconURI string `yaml:"app_icon_uri"` - AppInternalURL string `yaml:"app_internal_url"` - AppName string `yaml:"app_name"` - AppURL string `yaml:"app_url"` - Insecure bool `yaml:"insecure"` - IopSecret string `yaml:"ipo_secret"` - JWTSecret string `yaml:"jwt_secret"` - WopiURL string `yaml:"wopi_url"` -} - -// Sharing defines the available sharing configuration. -type Sharing struct { - Port - UserDriver string `yaml:"user_driver"` - UserJSONFile string `yaml:"user_json_file"` - CS3ProviderAddr string `yaml:"provider_addr"` - CS3ServiceUser string `yaml:"service_user_id"` - CS3ServiceUserIdp string `yaml:"service_user_idp"` - UserSQLUsername string `yaml:"user_sql_username"` - UserSQLPassword string `yaml:"user_sql_password"` - UserSQLHost string `yaml:"user_sql_host"` - UserSQLPort int `yaml:"user_sql_port"` - UserSQLName string `yaml:"user_sql_name"` - PublicDriver string `yaml:"public_driver"` - PublicJSONFile string `yaml:"public_json_file"` - PublicPasswordHashCost int `yaml:"public_password_hash_cost"` - PublicEnableExpiredSharesCleanup bool `yaml:"public_enable_expired_shares_cleanup"` - PublicJanitorRunInterval int `yaml:"public_janitor_run_interval"` - UserStorageMountID string `yaml:"user_storage_mount_id"` - Events Events `yaml:"events"` -} - -type Events struct { - Address string `yaml:"address"` - ClusterID string `yaml:"cluster_id"` -} - -// Port defines the available port configuration. -type Port struct { - // MaxCPUs can be a number or a percentage - MaxCPUs string `yaml:"max_cpus"` - LogLevel string `yaml:"log_level"` - // GRPCNetwork can be tcp, udp or unix - GRPCNetwork string `yaml:"grpc_network"` - // GRPCAddr to listen on, hostname:port (0.0.0.0:9999 for all interfaces) or socket (/var/run/reva/sock) - GRPCAddr string `yaml:"grpc_addr"` - // Protocol can be grpc or http - // HTTPNetwork can be tcp, udp or unix - HTTPNetwork string `yaml:"http_network"` - // HTTPAddr to listen on, hostname:port (0.0.0.0:9100 for all interfaces) or socket (/var/run/reva/sock) - HTTPAddr string `yaml:"http_addr"` - // Protocol can be grpc or http - Protocol string `yaml:"protocol"` - // Endpoint is used by the gateway and registries (eg localhost:9100 or cloud.example.com) - Endpoint string `yaml:"endpoint"` - // DebugAddr for the debug endpoint to bind to - DebugAddr string `yaml:"debug_addr"` - // Services can be used to give a list of services that should be started on this port - Services []string `yaml:"services"` - // Config can be used to configure the reva instance. - // Services and Protocol will be ignored if this is used - Config map[string]interface{} `yaml:"config"` - - // Context allows for context cancellation and propagation - Context context.Context - - // Supervised is used when running under an oCIS runtime supervision tree - Supervised bool // deprecated // TODO: delete me -} - -// Users defines the available users configuration. -type Users struct { - Port - Driver string `yaml:"driver"` - JSON string `yaml:"json"` - UserGroupsCacheExpiration int `yaml:"user_groups_cache_expiration"` -} - -// AuthMachineConfig defines the available configuration for the machine auth driver. -type AuthMachineConfig struct { - MachineAuthAPIKey string `yaml:"machine_auth_api_key"` -} - -// Groups defines the available groups configuration. -type Groups struct { - Port - Driver string `yaml:"driver"` - JSON string `yaml:"json"` - GroupMembersCacheExpiration int `yaml:"group_members_cache_expiration"` -} - -// FrontendPort defines the available frontend configuration. -type FrontendPort struct { - Port - - AppProviderInsecure bool `yaml:"app_provider_insecure"` - AppProviderPrefix string `yaml:"app_provider_prefix"` - ArchiverInsecure bool `yaml:"archiver_insecure"` - ArchiverPrefix string `yaml:"archiver_prefix"` - DatagatewayPrefix string `yaml:"data_gateway_prefix"` - Favorites bool `yaml:"favorites"` - ProjectSpaces bool `yaml:"project_spaces"` - OCSPrefix string `yaml:"ocs_prefix"` - OCSSharePrefix string `yaml:"ocs_share_prefix"` - OCSHomeNamespace string `yaml:"ocs_home_namespace"` - PublicURL string `yaml:"public_url"` - OCSCacheWarmupDriver string `yaml:"ocs_cache_warmup_driver"` - OCSAdditionalInfoAttribute string `yaml:"ocs_additional_info_attribute"` - OCSResourceInfoCacheTTL int `yaml:"ocs_resource_info_cache_ttl"` - Middleware Middleware `yaml:"middleware"` -} - -// Middleware configures reva middlewares. -type Middleware struct { - Auth Auth `yaml:"auth"` -} - -// Auth configures reva http auth middleware. -type Auth struct { - CredentialsByUserAgent map[string]string `yaml:"credentials_by_user_agenr"` -} - -// DataGatewayPort has a public url -type DataGatewayPort struct { - Port - PublicURL string -} - -type DataProvider struct { - Insecure bool `yaml:"insecure"` -} - -// StoragePort defines the available storage configuration. -type StoragePort struct { - Port - Driver string `yaml:"driver"` - MountID string `yaml:"mount_id"` - AlternativeID string `yaml:"alternative_id"` - ExposeDataServer bool `yaml:"expose_data_server"` - // url the data gateway will use to route requests - DataServerURL string `yaml:"data_server_url"` - - // for HTTP ports with only one http service - HTTPPrefix string `yaml:"http_prefix"` - TempFolder string `yaml:"temp_folder"` - ReadOnly bool `yaml:"read_only"` - DataProvider DataProvider `yaml:"data_provider"` - GatewayEndpoint string `yaml:"gateway_endpoint"` -} - -// PublicStorage configures a public storage provider -type PublicStorage struct { - StoragePort - - PublicShareProviderAddr string `yaml:"public_share_provider_addr"` - UserProviderAddr string `yaml:"user_provider_addr"` -} - -// StorageConfig combines all available storage driver configuration parts. -type StorageConfig struct { - EOS DriverEOS `yaml:"eos"` - Local DriverCommon `yaml:"local"` - OwnCloudSQL DriverOwnCloudSQL `yaml:"owncloud_sql"` - S3 DriverS3 `yaml:"s3"` - S3NG DriverS3NG `yaml:"s3ng"` - OCIS DriverOCIS `yaml:"ocis"` -} - -// DriverCommon defines common driver configuration options. -type DriverCommon struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root"` - //ShareFolder defines the name of the folder jailing all shares - ShareFolder string `yaml:"share_folder"` - // UserLayout contains the template used to construct - // the internal path, eg: `{{substr 0 1 .Username}}/{{.Username}}` - UserLayout string `yaml:"user_layout"` - // EnableHome enables the creation of home directories. - EnableHome bool `yaml:"enable_home"` - // PersonalSpaceAliasTemplate contains the template used to construct - // the personal space alias, eg: `"{{.SpaceType}}/{{.User.Username | lower}}"` - PersonalSpaceAliasTemplate string `yaml:"personalspacealias_template"` - // GeneralSpaceAliasTemplate contains the template used to construct - // the general space alias, eg: `{{.SpaceType}}/{{.SpaceName | replace " " "-" | lower}}` - GeneralSpaceAliasTemplate string `yaml:"generalspacealias_template"` -} - -// DriverEOS defines the available EOS driver configuration. -type DriverEOS struct { - DriverCommon - - // ShadowNamespace for storing shadow data - ShadowNamespace string `yaml:"shadow_namespace"` - - // UploadsNamespace for storing upload data - UploadsNamespace string `yaml:"uploads_namespace"` - - // Location of the eos binary. - // Default is /usr/bin/eos. - EosBinary string `yaml:"eos_binary"` - - // Location of the xrdcopy binary. - // Default is /usr/bin/xrdcopy. - XrdcopyBinary string `yaml:"xrd_copy_binary"` - - // URL of the Master EOS MGM. - // Default is root://eos-example.org - MasterURL string `yaml:"master_url"` - - // URI of the EOS MGM grpc server - // Default is empty - GrpcURI string `yaml:"grpc_uri"` - - // URL of the Slave EOS MGM. - // Default is root://eos-example.org - SlaveURL string `yaml:"slave_url"` - - // Location on the local fs where to store reads. - // Defaults to os.TempDir() - CacheDirectory string `yaml:"cache_directory"` - - // Enables logging of the commands executed - // Defaults to false - EnableLogging bool `yaml:"enable_logging"` - - // ShowHiddenSysFiles shows internal EOS files like - // .sys.v# and .sys.a# files. - ShowHiddenSysFiles bool `yaml:"shadow_hidden_files"` - - // ForceSingleUserMode will force connections to EOS to use SingleUsername - ForceSingleUserMode bool `yaml:"force_single_user_mode"` - - // UseKeyTabAuth changes will authenticate requests by using an EOS keytab. - UseKeytab bool `yaml:"user_keytab"` - - // SecProtocol specifies the xrootd security protocol to use between the server and EOS. - SecProtocol string `yaml:"sec_protocol"` - - // Keytab specifies the location of the keytab to use to authenticate to EOS. - Keytab string `yaml:"keytab"` - - // SingleUsername is the username to use when SingleUserMode is enabled - SingleUsername string `yaml:"single_username"` - - // gateway service to use for uid lookups - GatewaySVC string `yaml:"gateway_svc"` -} - -// DriverOCIS defines the available oCIS storage driver configuration. -type DriverOCIS struct { - DriverCommon -} - -// DriverOwnCloudSQL defines the available ownCloudSQL storage driver configuration. -type DriverOwnCloudSQL struct { - DriverCommon - - UploadInfoDir string `yaml:"upload_info_dir"` - DBUsername string `yaml:"db_username"` - DBPassword string `yaml:"db_password"` - DBHost string `yaml:"db_host"` - DBPort int `yaml:"db_port"` - DBName string `yaml:"db_name"` -} - -// DriverS3 defines the available S3 storage driver configuration. -type DriverS3 struct { - DriverCommon - - Region string `yaml:"region"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` - Endpoint string `yaml:"endpoint"` - Bucket string `yaml:"bucket"` -} - -// DriverS3NG defines the available s3ng storage driver configuration. -type DriverS3NG struct { - DriverCommon - - Region string `yaml:"region"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` - Endpoint string `yaml:"endpoint"` - Bucket string `yaml:"bucket"` -} - -// OIDC defines the available OpenID Connect configuration. -type OIDC struct { - Issuer string `yaml:"issuer"` - Insecure bool `yaml:"insecure"` - IDClaim string `yaml:"id_claim"` - UIDClaim string `yaml:"uid_claim"` - GIDClaim string `yaml:"gid_claim"` -} - -// LDAP defines the available ldap configuration. -type LDAP struct { - URI string `yaml:"uri"` - CACert string `yaml:"ca_cert"` - Insecure bool `yaml:"insecure"` - UserBaseDN string `yaml:"user_base_dn"` - GroupBaseDN string `yaml:"group_base_dn"` - UserScope string `yaml:"user_scope"` - GroupScope string `yaml:"group_scope"` - UserObjectClass string `yaml:"user_objectclass"` - GroupObjectClass string `yaml:"group_objectclass"` - UserFilter string `yaml:"user_filter"` - GroupFilter string `yaml:"group_filter"` - LoginAttributes []string `yaml:"login_attributes"` - BindDN string `yaml:"bind_dn"` - BindPassword string `yaml:"bind_password"` - IDP string `yaml:"idp"` - UserSchema LDAPUserSchema `yaml:"user_schema"` - GroupSchema LDAPGroupSchema `yaml:"group_schema"` -} - -// UserGroupRest defines the REST driver specification for user and group resolution. -type UserGroupRest struct { - ClientID string `yaml:"client_id"` - ClientSecret string `yaml:"client_secret"` - RedisAddress string `yaml:"redis_address"` - RedisUsername string `yaml:"redis_username"` - RedisPassword string `yaml:"redis_password"` - IDProvider string `yaml:"idp_provider"` - APIBaseURL string `yaml:"api_base_url"` - OIDCTokenEndpoint string `yaml:"oidc_token_endpoint"` - TargetAPI string `yaml:"target_api"` -} - -// UserOwnCloudSQL defines the available ownCloudSQL user provider configuration. -type UserOwnCloudSQL struct { - DBUsername string `yaml:"db_username"` - DBPassword string `yaml:"db_password"` - DBHost string `yaml:"db_host"` - DBPort int `yaml:"db_port"` - DBName string `yaml:"db_name"` - Idp string `yaml:"idp"` - Nobody int64 `yaml:"nobody"` - JoinUsername bool `yaml:"join_username"` - JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid"` - EnableMedialSearch bool `yaml:"enable_medial_search"` -} - -// LDAPUserSchema defines the available ldap user schema configuration. -type LDAPUserSchema struct { - ID string `yaml:"id"` - IDIsOctetString bool `yaml:"id_is_octet_string"` - Mail string `yaml:"mail"` - DisplayName string `yaml:"display_name"` - Username string `yaml:"user_name"` - UIDNumber string `yaml:"uid_number"` - GIDNumber string `yaml:"gid_number"` -} - -// LDAPGroupSchema defines the available ldap group schema configuration. -type LDAPGroupSchema struct { - ID string `yaml:"id"` - IDIsOctetString bool `yaml:"id_is_octet_string"` - Mail string `yaml:"mail"` - DisplayName string `yaml:"display_name"` - Groupname string `yaml:"group_name"` - Member string `yaml:"member"` - GIDNumber string `yaml:"gid_number"` -} - -// OCDav defines the available ocdav configuration. -type OCDav struct { - // Addr to listen to with the http server for the ocdav service - Addr string `yaml:"addr"` - Prefix string `yaml:"prefix"` - WebdavNamespace string `yaml:"webdav_namespace"` - FilesNamespace string `yaml:"files_namespace"` - SharesNamespace string `yaml:"shares_namespace"` - // PublicURL used to redirect /s/{token} URLs to - PublicURL string `yaml:"public_url"` - - // Addr to listen to with the debug http server - DebugAddr string `yaml:"debug_addr"` - - // GatewaySVC to forward CS3 requests to TODO use registry - GatewaySVC string `yaml:"gateway_svc"` - // JWTSecret used to verify reva access token - JWTSecret string `yaml:"jwt_secret"` - // Insecure certificates allowed when making requests to the gateway - Insecure bool `yaml:"insecure"` - // Timeout in seconds when making requests to the gateway - Timeout int64 `yaml:"timeout"` -} - -// Archiver defines the available archiver configuration. -type Archiver struct { - MaxNumFiles int64 `yaml:"max_num_files"` - MaxSize int64 `yaml:"max_size"` - ArchiverURL string `yaml:"archiver_url"` -} - -// Reva defines the available reva configuration. -type Reva struct { - // JWTSecret used to sign jwt tokens between services - JWTSecret string `yaml:"jwt_secret"` - SkipUserGroupsInToken bool `yaml:"skip_user_grooups_in_token"` - TransferSecret string `yaml:"transfer_secret"` - TransferExpires int `yaml:"transfer_expires"` - OIDC OIDC `yaml:"oidc"` - LDAP LDAP `yaml:"ldap"` - UserGroupRest UserGroupRest `yaml:"user_group_rest"` - UserOwnCloudSQL UserOwnCloudSQL `yaml:"user_owncloud_sql"` - Archiver Archiver `yaml:"archiver"` - UserStorage StorageConfig `yaml:"user_storage"` - MetadataStorage StorageConfig `yaml:"metadata_storage"` - // Ports are used to configure which services to start on which port - Frontend FrontendPort `yaml:"frontend"` - DataGateway DataGatewayPort `yaml:"data_gateway"` - Gateway Gateway `yaml:"gateway"` - StorageRegistry StorageRegistry `yaml:"storage_registry"` - AppRegistry AppRegistry `yaml:"app_registry"` - Users Users `yaml:"users"` - Groups Groups `yaml:"groups"` - AuthProvider Users `yaml:"auth_provider"` - AuthBasic Port `yaml:"auth_basic"` - AuthBearer Port `yaml:"auth_bearer"` - AuthMachine Port `yaml:"auth_machine"` - AuthMachineConfig AuthMachineConfig `yaml:"auth_machine_config"` - Sharing Sharing `yaml:"sharing"` - StorageShares StoragePort `yaml:"storage_shares"` - StorageUsers StoragePort `yaml:"storage_users"` - StoragePublicLink PublicStorage `yaml:"storage_public_link"` - StorageMetadata StoragePort `yaml:"storage_metadata"` - AppProvider AppProvider `yaml:"app_provider"` - Permissions Port `yaml:"permissions"` - // Configs can be used to configure the reva instance. - // Services and Ports will be ignored if this is used - Configs map[string]interface{} `yaml:"configs"` - // chunking and resumable upload config (TUS) - UploadMaxChunkSize int `yaml:"upload_max_chunk_size"` - UploadHTTPMethodOverride string `yaml:"upload_http_method_override"` - // checksumming capabilities - ChecksumSupportedTypes []string `yaml:"checksum_supported_types"` - ChecksumPreferredUploadType string `yaml:"checksum_preferred_upload_type"` - DefaultUploadProtocol string `yaml:"default_upload_protocol"` -} - -// Tracing defines the available tracing configuration. -type Tracing struct { - Enabled bool `yaml:"enabled"` - Type string `yaml:"type"` - Endpoint string `yaml:"endpoint"` - Collector string `yaml:"collector"` - Service string `yaml:"service"` -} - -// Asset defines the available asset configuration. -type Asset struct { - Path string `yaml:"path"` -} - -// Config combines all available configuration parts. -type Config struct { - *shared.Commons - - File string `yaml:"file"` - Log *shared.Log `yaml:"log"` - Debug Debug `yaml:"debug"` - OCDav OCDav `yaml:"ocdav"` - Reva Reva `yaml:"reva"` - Tracing Tracing `yaml:"tracing"` - Asset Asset `yaml:"asset"` -} - -// New initializes a new configuration with or without defaults. -func New() *Config { - return &Config{} -} - -// StructMappings binds a set of environment variables to a destination on cfg. Iterating over this set and editing the -// Destination value of a binding will alter the original value, as it is a pointer to its memory address. This lets -// us propagate changes easier. -func StructMappings(cfg *Config) []shared.EnvBinding { - return structMappings(cfg) -} - -// GetEnv fetches a list of known env variables for this extension. It is to be used by gookit, as it provides a list -// with all the environment variables an extension supports. -func GetEnv(cfg *Config) []string { - var r = make([]string, len(structMappings(cfg))) - for i := range structMappings(cfg) { - r = append(r, structMappings(cfg)[i].EnvVars...) - } - - return r -} - -func structMappings(cfg *Config) []shared.EnvBinding { - return []shared.EnvBinding{ - // Shared - { - EnvVars: []string{"OCIS_LOG_LEVEL", "STORAGE_FRONTEND_LOG_LEVEL"}, - Destination: &cfg.Log.Level, - }, - { - EnvVars: []string{"OCIS_LOG_PRETTY", "STORAGE_FRONTEND_LOG_PRETTY"}, - Destination: &cfg.Log.Pretty, - }, - { - EnvVars: []string{"OCIS_LOG_COLOR", "STORAGE_FRONTEND_LOG_COLOR"}, - Destination: &cfg.Log.Color, - }, - { - EnvVars: []string{"OCIS_INSECURE", "STORAGE_METADATA_DATAPROVIDER_INSECURE"}, - Destination: &cfg.Reva.StorageMetadata.DataProvider.Insecure, - }, - { - EnvVars: []string{"OCIS_INSECURE", "STORAGE_FRONTEND_APPPROVIDER_INSECURE"}, - Destination: &cfg.Reva.Frontend.AppProviderInsecure, - }, - { - EnvVars: []string{"OCIS_INSECURE", "STORAGE_FRONTEND_ARCHIVER_INSECURE"}, - Destination: &cfg.Reva.Frontend.ArchiverInsecure, - }, - { - EnvVars: []string{"OCIS_INSECURE", "STORAGE_OIDC_INSECURE"}, - Destination: &cfg.Reva.OIDC.Insecure, - }, - { - EnvVars: []string{"OCIS_INSECURE", "STORAGE_USERS_DATAPROVIDER_INSECURE"}, - Destination: &cfg.Reva.StorageUsers.DataProvider.Insecure, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_LOCAL_ROOT"}, - Destination: &cfg.Reva.UserStorage.Local.Root, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER"}, - Destination: &cfg.Reva.StorageUsers.Driver, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OCIS_ROOT"}, - Destination: &cfg.Reva.UserStorage.OCIS.Root, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_OCIS_ROOT"}, - Destination: &cfg.Reva.MetadataStorage.OCIS.Root, - }, - { - EnvVars: []string{"STORAGE_SHARING_USER_JSON_FILE"}, - Destination: &cfg.Reva.Sharing.UserJSONFile, - }, - { - EnvVars: []string{"OCIS_URL", "STORAGE_FRONTEND_PUBLIC_URL"}, - Destination: &cfg.Reva.Frontend.PublicURL, - }, - { - EnvVars: []string{"OCIS_URL", "STORAGE_OIDC_ISSUER"}, - Destination: &cfg.Reva.OIDC.Issuer, - }, - { - EnvVars: []string{"OCIS_URL", "STORAGE_LDAP_IDP"}, - Destination: &cfg.Reva.LDAP.IDP, - }, - { - EnvVars: []string{"OCIS_URL", "STORAGE_USERPROVIDER_OWNCLOUDSQL_IDP"}, - Destination: &cfg.Reva.UserOwnCloudSQL.Idp, - }, - { - EnvVars: []string{"STORAGE_DEBUG_ADDR"}, - Destination: &cfg.Debug.Addr, - }, - - // debug - - { - EnvVars: []string{"STORAGE_DEBUG_TOKEN"}, - Destination: &cfg.Debug.Token, - }, - { - EnvVars: []string{"STORAGE_DEBUG_PPROF"}, - Destination: &cfg.Debug.Pprof, - }, - { - EnvVars: []string{"STORAGE_DEBUG_ZPAGES"}, - Destination: &cfg.Debug.Zpages, - }, - - // app provider - - { - EnvVars: []string{"APP_PROVIDER_DEBUG_ADDR"}, - Destination: &cfg.Reva.AppProvider.DebugAddr, - }, - { - EnvVars: []string{"APP_PROVIDER_GRPC_NETWORK"}, - Destination: &cfg.Reva.AppProvider.GRPCNetwork, - }, - { - EnvVars: []string{"APP_PROVIDER_GRPC_ADDR"}, - Destination: &cfg.Reva.AppProvider.GRPCAddr, - }, - { - EnvVars: []string{"APP_PROVIDER_EXTERNAL_ADDR"}, - Destination: &cfg.Reva.AppProvider.ExternalAddr, - }, - { - EnvVars: []string{"APP_PROVIDER_DRIVER"}, - Destination: &cfg.Reva.AppProvider.Driver, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_APP_API_KEY"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.AppAPIKey, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_APP_DESKTOP_ONLY"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.AppDesktopOnly, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_APP_ICON_URI"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.AppIconURI, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_APP_INTERNAL_URL"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.AppInternalURL, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_APP_NAME"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.AppName, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_APP_URL"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.AppURL, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_INSECURE"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.Insecure, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_IOP_SECRET"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.IopSecret, - }, - { - EnvVars: []string{"APP_PROVIDER_WOPI_DRIVER_WOPI_URL"}, - Destination: &cfg.Reva.AppProvider.WopiDriver.WopiURL, - }, - - // authbasic - { - EnvVars: []string{"STORAGE_AUTH_BASIC_DEBUG_ADDR"}, - Destination: &cfg.Reva.AuthBasic.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_AUTH_DRIVER"}, - Destination: &cfg.Reva.AuthProvider.Driver, - }, - { - EnvVars: []string{"STORAGE_AUTH_JSON"}, - Destination: &cfg.Reva.AuthProvider.JSON, - }, - { - EnvVars: []string{"STORAGE_AUTH_BASIC_GRPC_NETWORK"}, - Destination: &cfg.Reva.AuthBasic.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_AUTH_BASIC_GRPC_ADDR"}, - Destination: &cfg.Reva.AuthBasic.GRPCAddr, - }, - { - EnvVars: []string{"REVA_GATEWAY"}, - Destination: &cfg.Reva.Gateway.Endpoint, - }, - - // authbearer - { - EnvVars: []string{"STORAGE_AUTH_BEARER_DEBUG_ADDR"}, - Destination: &cfg.Reva.AuthBearer.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_OIDC_ID_CLAIM"}, - Destination: &cfg.Reva.OIDC.IDClaim, - }, - { - EnvVars: []string{"STORAGE_OIDC_UID_CLAIM"}, - Destination: &cfg.Reva.OIDC.UIDClaim, - }, - { - EnvVars: []string{"STORAGE_OIDC_GID_CLAIM"}, - Destination: &cfg.Reva.OIDC.GIDClaim, - }, - { - EnvVars: []string{"STORAGE_AUTH_BEARER_GRPC_NETWORK"}, - Destination: &cfg.Reva.AuthBearer.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_AUTH_BEARER_GRPC_ADDR"}, - Destination: &cfg.Reva.AuthBearer.GRPCAddr, - }, - - // auth-machine - { - EnvVars: []string{"STORAGE_AUTH_MACHINE_DEBUG_ADDR"}, - Destination: &cfg.Reva.AuthMachine.DebugAddr, - }, - { - EnvVars: []string{"OCIS_MACHINE_AUTH_API_KEY", "STORAGE_AUTH_MACHINE_AUTH_API_KEY"}, - Destination: &cfg.Reva.AuthMachineConfig.MachineAuthAPIKey, - }, - { - EnvVars: []string{"STORAGE_AUTH_MACHINE_GRPC_NETWORK"}, - Destination: &cfg.Reva.AuthMachine.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_AUTH_MACHINE_GRPC_ADDR"}, - Destination: &cfg.Reva.AuthMachine.GRPCAddr, - }, - - // frontend - { - EnvVars: []string{"STORAGE_FRONTEND_DEBUG_ADDR"}, - Destination: &cfg.Reva.Frontend.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_TRANSFER_SECRET"}, - Destination: &cfg.Reva.TransferSecret, - }, - { - EnvVars: []string{"STORAGE_ARCHIVER_MAX_NUM_FILES"}, - Destination: &cfg.Reva.Archiver.MaxNumFiles, - }, - { - EnvVars: []string{"STORAGE_ARCHIVER_MAX_SIZE"}, - Destination: &cfg.Reva.Archiver.MaxSize, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_HTTP_NETWORK"}, - Destination: &cfg.Reva.Frontend.HTTPNetwork, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_HTTP_ADDR"}, - Destination: &cfg.Reva.Frontend.HTTPAddr, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_APPPROVIDER_PREFIX"}, - Destination: &cfg.Reva.Frontend.AppProviderPrefix, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_ARCHIVER_PREFIX"}, - Destination: &cfg.Reva.Frontend.ArchiverPrefix, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_DATAGATEWAY_PREFIX"}, - Destination: &cfg.Reva.Frontend.DatagatewayPrefix, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_FAVORITES"}, - Destination: &cfg.Reva.Frontend.Favorites, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_PROJECT_SPACES"}, - Destination: &cfg.Reva.Frontend.ProjectSpaces, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_OCS_PREFIX"}, - Destination: &cfg.Reva.Frontend.OCSPrefix, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_OCS_SHARE_PREFIX"}, - Destination: &cfg.Reva.Frontend.OCSSharePrefix, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_OCS_HOME_NAMESPACE"}, - Destination: &cfg.Reva.Frontend.OCSHomeNamespace, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_OCS_RESOURCE_INFO_CACHE_TTL"}, - Destination: &cfg.Reva.Frontend.OCSResourceInfoCacheTTL, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_OCS_CACHE_WARMUP_DRIVER"}, - Destination: &cfg.Reva.Frontend.OCSCacheWarmupDriver, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_OCS_ADDITIONAL_INFO_ATTRIBUTE"}, - Destination: &cfg.Reva.Frontend.OCSAdditionalInfoAttribute, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_DEFAULT_UPLOAD_PROTOCOL"}, - Destination: &cfg.Reva.DefaultUploadProtocol, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_UPLOAD_MAX_CHUNK_SIZE"}, - Destination: &cfg.Reva.UploadMaxChunkSize, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE"}, - Destination: &cfg.Reva.UploadHTTPMethodOverride, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_CHECKSUM_PREFERRED_UPLOAD_TYPE"}, - Destination: &cfg.Reva.ChecksumPreferredUploadType, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_ARCHIVER_URL"}, - Destination: &cfg.Reva.Archiver.ArchiverURL, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_APP_PROVIDER_APPS_URL"}, - Destination: &cfg.Reva.AppProvider.AppsURL, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_APP_PROVIDER_OPEN_URL"}, - Destination: &cfg.Reva.AppProvider.OpenURL, - }, - { - EnvVars: []string{"STORAGE_FRONTEND_APP_PROVIDER_NEW_URL"}, - Destination: &cfg.Reva.AppProvider.NewURL, - }, - - // gateway - { - EnvVars: []string{"STORAGE_GATEWAY_DEBUG_ADDR"}, - Destination: &cfg.Reva.Gateway.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_TRANSFER_EXPIRES"}, - Destination: &cfg.Reva.TransferExpires, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_GRPC_NETWORK"}, - Destination: &cfg.Reva.Gateway.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_GRPC_ADDR"}, - Destination: &cfg.Reva.Gateway.GRPCAddr, - }, - - { - EnvVars: []string{"STORAGE_GATEWAY_COMMIT_SHARE_TO_STORAGE_GRANT"}, - Destination: &cfg.Reva.Gateway.CommitShareToStorageGrant, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_COMMIT_SHARE_TO_STORAGE_REF"}, - Destination: &cfg.Reva.Gateway.CommitShareToStorageRef, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_SHARE_FOLDER"}, - Destination: &cfg.Reva.Gateway.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_DISABLE_HOME_CREATION_ON_LOGIN"}, - Destination: &cfg.Reva.Gateway.DisableHomeCreationOnLogin, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_HOME_MAPPING"}, - Destination: &cfg.Reva.Gateway.HomeMapping, - }, - { - EnvVars: []string{"STORAGE_GATEWAY_ETAG_CACHE_TTL"}, - Destination: &cfg.Reva.Gateway.EtagCacheTTL, - }, - { - EnvVars: []string{"STORAGE_AUTH_BASIC_ENDPOINT"}, - Destination: &cfg.Reva.AuthBasic.Endpoint, - }, - { - EnvVars: []string{"STORAGE_AUTH_BEARER_ENDPOINT"}, - Destination: &cfg.Reva.AuthBearer.Endpoint, - }, - { - EnvVars: []string{"STORAGE_AUTH_MACHINE_ENDPOINT"}, - Destination: &cfg.Reva.AuthMachine.Endpoint, - }, - { - EnvVars: []string{"STORAGE_STORAGE_REGISTRY_DRIVER"}, - Destination: &cfg.Reva.StorageRegistry.Driver, - }, - { - EnvVars: []string{"STORAGE_STORAGE_REGISTRY_HOME_PROVIDER"}, - Destination: &cfg.Reva.StorageRegistry.HomeProvider, - }, - { - EnvVars: []string{"STORAGE_STORAGE_REGISTRY_JSON"}, - Destination: &cfg.Reva.StorageRegistry.JSON, - }, - { - EnvVars: []string{"STORAGE_APP_REGISTRY_DRIVER"}, - Destination: &cfg.Reva.AppRegistry.Driver, - }, - { - EnvVars: []string{"STORAGE_APP_REGISTRY_MIMETYPES_JSON"}, - Destination: &cfg.Reva.AppRegistry.MimetypesJSON, - }, - { - EnvVars: []string{"STORAGE_DATAGATEWAY_PUBLIC_URL"}, - Destination: &cfg.Reva.DataGateway.PublicURL, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_ENDPOINT"}, - Destination: &cfg.Reva.Users.Endpoint, - }, - { - EnvVars: []string{"STORAGE_GROUPPROVIDER_ENDPOINT"}, - Destination: &cfg.Reva.Groups.Endpoint, - }, - { - EnvVars: []string{"STORAGE_SHARING_ENDPOINT"}, - Destination: &cfg.Reva.Sharing.Endpoint, - }, - { - EnvVars: []string{"STORAGE_APPPROVIDER_ENDPOINT"}, - Destination: &cfg.Reva.AppProvider.Endpoint, - }, - { - EnvVars: []string{"STORAGE_USERS_ENDPOINT"}, - Destination: &cfg.Reva.StorageUsers.Endpoint, - }, - { - EnvVars: []string{"STORAGE_USERS_MOUNT_ID"}, - Destination: &cfg.Reva.StorageUsers.MountID, - }, - { - EnvVars: []string{"STORAGE_SHARES_ENDPOINT"}, - Destination: &cfg.Reva.StorageShares.Endpoint, - }, - { - EnvVars: []string{"STORAGE_PUBLIC_LINK_ENDPOINT"}, - Destination: &cfg.Reva.StoragePublicLink.Endpoint, - }, - - // groups - { - EnvVars: []string{"STORAGE_GROUPPROVIDER_DEBUG_ADDR"}, - Destination: &cfg.Reva.Groups.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_GROUPPROVIDER_NETWORK"}, - Destination: &cfg.Reva.Groups.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_GROUPPROVIDER_ADDR"}, - Destination: &cfg.Reva.Groups.GRPCAddr, - }, - { - EnvVars: []string{"STORAGE_GROUPPROVIDER_DRIVER"}, - Destination: &cfg.Reva.Groups.Driver, - }, - { - EnvVars: []string{"STORAGE_GROUPPROVIDER_JSON"}, - Destination: &cfg.Reva.Groups.JSON, - }, - { - EnvVars: []string{"STORAGE_GROUP_CACHE_EXPIRATION"}, - Destination: &cfg.Reva.Groups.GroupMembersCacheExpiration, - }, - - // ldap - { - EnvVars: []string{"LDAP_URI", "STORAGE_LDAP_URI"}, - Destination: &cfg.Reva.LDAP.URI, - }, - { - EnvVars: []string{"LDAP_CACERT", "STORAGE_LDAP_CACERT"}, - Destination: &cfg.Reva.LDAP.CACert, - }, - { - EnvVars: []string{"LDAP_INSECURE", "STORAGE_LDAP_INSECURE"}, - Destination: &cfg.Reva.LDAP.Insecure, - }, - { - EnvVars: []string{"LDAP_USER_BASE_DN", "STORAGE_LDAP_USER_BASE_DN"}, - Destination: &cfg.Reva.LDAP.UserBaseDN, - }, - { - EnvVars: []string{"LDAP_GROUP_BASE_DN", "STORAGE_LDAP_GROUP_BASE_DN"}, - Destination: &cfg.Reva.LDAP.GroupBaseDN, - }, - { - EnvVars: []string{"LDAP_USER_SCOPE", "STORAGE_LDAP_USER_SCOPE"}, - Destination: &cfg.Reva.LDAP.UserScope, - }, - { - EnvVars: []string{"LDAP_GROUP_SCOPE", "STORAGE_LDAP_GROUP_SCOPE"}, - Destination: &cfg.Reva.LDAP.GroupScope, - }, - { - EnvVars: []string{"LDAP_USER_OBJECTCLASS", "STORAGE_LDAP_USER_OBJECTCLASS"}, - Destination: &cfg.Reva.LDAP.UserObjectClass, - }, - { - EnvVars: []string{"LDAP_GROUP_OBJECTCLASS", "STORAGE_LDAP_GROUP_OBJECTCLASS"}, - Destination: &cfg.Reva.LDAP.GroupObjectClass, - }, - { - EnvVars: []string{"LDAP_LOGIN_ATTRIBUTES", "STORAGE_LDAP_LOGIN_ATTRIBUTES"}, - Destination: &cfg.Reva.LDAP.LoginAttributes, - }, - { - EnvVars: []string{"LDAP_USERFILTER", "STORAGE_LDAP_USERFILTER"}, - Destination: &cfg.Reva.LDAP.UserFilter, - }, - { - EnvVars: []string{"LDAP_GROUPFILTER", "STORAGE_LDAP_GROUPFILTER"}, - Destination: &cfg.Reva.LDAP.GroupFilter, - }, - { - EnvVars: []string{"LDAP_BIND_DN", "STORAGE_LDAP_BIND_DN"}, - Destination: &cfg.Reva.LDAP.BindDN, - }, - { - EnvVars: []string{"LDAP_BIND_PASSWORD", "STORAGE_LDAP_BIND_PASSWORD"}, - Destination: &cfg.Reva.LDAP.BindPassword, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_ID", "STORAGE_LDAP_USER_SCHEMA_ID"}, - Destination: &cfg.Reva.LDAP.UserSchema.ID, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING", "STORAGE_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"}, - Destination: &cfg.Reva.LDAP.UserSchema.IDIsOctetString, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_MAIL", "STORAGE_LDAP_USER_SCHEMA_MAIL"}, - Destination: &cfg.Reva.LDAP.UserSchema.Mail, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_DISPLAYNAME", "STORAGE_LDAP_USER_SCHEMA_DISPLAYNAME"}, - Destination: &cfg.Reva.LDAP.UserSchema.DisplayName, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_USERNAME", "STORAGE_LDAP_USER_SCHEMA_USERNAME"}, - Destination: &cfg.Reva.LDAP.UserSchema.Username, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_UID_NUMBER", "STORAGE_LDAP_USER_SCHEMA_UID_NUMBER"}, - Destination: &cfg.Reva.LDAP.UserSchema.UIDNumber, - }, - { - EnvVars: []string{"LDAP_USER_SCHEMA_GID_NUMBER", "STORAGE_LDAP_USER_SCHEMA_GID_NUMBER"}, - Destination: &cfg.Reva.LDAP.UserSchema.GIDNumber, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_ID", "STORAGE_LDAP_GROUP_SCHEMA_ID"}, - Destination: &cfg.Reva.LDAP.GroupSchema.ID, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING", "STORAGE_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"}, - Destination: &cfg.Reva.LDAP.GroupSchema.IDIsOctetString, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_MAIL", "STORAGE_LDAP_GROUP_SCHEMA_MAIL"}, - Destination: &cfg.Reva.LDAP.GroupSchema.Mail, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_DISPLAYNAME", "STORAGE_LDAP_GROUP_SCHEMA_DISPLAYNAME"}, - Destination: &cfg.Reva.LDAP.GroupSchema.DisplayName, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_GROUPNAME", "STORAGE_LDAP_GROUP_SCHEMA_GROUPNAME"}, - Destination: &cfg.Reva.LDAP.GroupSchema.Groupname, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_MEMBER", "STORAGE_LDAP_GROUP_SCHEMA_MEMBER"}, - Destination: &cfg.Reva.LDAP.GroupSchema.Member, - }, - { - EnvVars: []string{"LDAP_GROUP_SCHEMA_GID_NUMBER", "STORAGE_LDAP_GROUP_SCHEMA_GID_NUMBER"}, - Destination: &cfg.Reva.LDAP.GroupSchema.GIDNumber, - }, - - // rest - { - EnvVars: []string{"STORAGE_REST_CLIENT_ID"}, - Destination: &cfg.Reva.UserGroupRest.ClientID, - }, - { - EnvVars: []string{"STORAGE_REST_CLIENT_SECRET"}, - Destination: &cfg.Reva.UserGroupRest.ClientSecret, - }, - { - EnvVars: []string{"STORAGE_REST_REDIS_ADDRESS"}, - Destination: &cfg.Reva.UserGroupRest.RedisAddress, - }, - { - EnvVars: []string{"STORAGE_REST_REDIS_USERNAME"}, - Destination: &cfg.Reva.UserGroupRest.RedisUsername, - }, - { - EnvVars: []string{"STORAGE_REST_REDIS_PASSWORD"}, - Destination: &cfg.Reva.UserGroupRest.RedisPassword, - }, - { - EnvVars: []string{"STORAGE_REST_ID_PROVIDER"}, - Destination: &cfg.Reva.UserGroupRest.IDProvider, - }, - { - EnvVars: []string{"STORAGE_REST_API_BASE_URL"}, - Destination: &cfg.Reva.UserGroupRest.APIBaseURL, - }, - { - EnvVars: []string{"STORAGE_REST_OIDC_TOKEN_ENDPOINT"}, - Destination: &cfg.Reva.UserGroupRest.OIDCTokenEndpoint, - }, - { - EnvVars: []string{"STORAGE_REST_TARGET_API"}, - Destination: &cfg.Reva.UserGroupRest.TargetAPI, - }, - - // secret - { - EnvVars: []string{"OCIS_JWT_SECRET", "STORAGE_JWT_SECRET"}, - Destination: &cfg.Reva.JWTSecret, - }, - { - EnvVars: []string{"STORAGE_SKIP_USER_GROUPS_IN_TOKEN"}, - Destination: &cfg.Reva.SkipUserGroupsInToken, - }, - - // sharing - { - EnvVars: []string{"STORAGE_SHARING_DEBUG_ADDR"}, - Destination: &cfg.Reva.Sharing.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_SHARING_GRPC_NETWORK"}, - Destination: &cfg.Reva.Sharing.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_SHARING_GRPC_ADDR"}, - Destination: &cfg.Reva.Sharing.GRPCAddr, - }, - { - EnvVars: []string{"STORAGE_SHARING_USER_DRIVER"}, - Destination: &cfg.Reva.Sharing.UserDriver, - }, - { - EnvVars: []string{"STORAGE_SHARING_PUBLIC_DRIVER"}, - Destination: &cfg.Reva.Sharing.PublicDriver, - }, - { - EnvVars: []string{"STORAGE_SHARING_PUBLIC_JSON_FILE"}, - Destination: &cfg.Reva.Sharing.PublicJSONFile, - }, - { - EnvVars: []string{"STORAGE_SHARING_PUBLIC_PASSWORD_HASH_COST"}, - Destination: &cfg.Reva.Sharing.PublicPasswordHashCost, - }, - { - EnvVars: []string{"STORAGE_SHARING_PUBLIC_ENABLE_EXPIRED_SHARES_CLEANUP"}, - Destination: &cfg.Reva.Sharing.PublicEnableExpiredSharesCleanup, - }, - { - EnvVars: []string{"STORAGE_SHARING_PUBLIC_JANITOR_RUN_INTERVAL"}, - Destination: &cfg.Reva.Sharing.PublicJanitorRunInterval, - }, - - // sharing cs3 - - { - EnvVars: []string{"STORAGE_SHARING_CS3_PROVIDER_ADDR"}, - Destination: &cfg.Reva.Sharing.CS3ProviderAddr, - }, - { - EnvVars: []string{"STORAGE_SHARING_CS3_SERVICE_USER"}, - Destination: &cfg.Reva.Sharing.CS3ServiceUser, - }, - { - EnvVars: []string{"OCIS_URL", "STORAGE_SHARING_CS3_SERVICE_USER_IDP"}, - Destination: &cfg.Reva.Sharing.CS3ServiceUserIdp, - }, - - // sharingsql - { - EnvVars: []string{"STORAGE_SHARING_USER_SQL_USERNAME"}, - Destination: &cfg.Reva.Sharing.UserSQLUsername, - }, - { - EnvVars: []string{"STORAGE_SHARING_USER_SQL_PASSWORD"}, - Destination: &cfg.Reva.Sharing.UserSQLPassword, - }, - { - EnvVars: []string{"STORAGE_SHARING_USER_SQL_HOST"}, - Destination: &cfg.Reva.Sharing.UserSQLHost, - }, - { - EnvVars: []string{"STORAGE_SHARING_USER_SQL_PORT"}, - Destination: &cfg.Reva.Sharing.UserSQLPort, - }, - { - EnvVars: []string{"STORAGE_SHARING_USER_SQL_NAME"}, - Destination: &cfg.Reva.Sharing.UserSQLName, - }, - { - EnvVars: []string{"STORAGE_SHARING_EVENTS_ADDRESS"}, - Destination: &cfg.Reva.Sharing.Events.Address, - }, - { - EnvVars: []string{"STORAGE_SHARING_EVENTS_CLUSTER_ID"}, - Destination: &cfg.Reva.Sharing.Events.ClusterID, - }, - - // storage metadata - { - EnvVars: []string{"STORAGE_METADATA_DEBUG_ADDR"}, - Destination: &cfg.Reva.StorageMetadata.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_METADATA_GRPC_NETWORK"}, - Destination: &cfg.Reva.StorageMetadata.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_METADATA_GRPC_ADDR"}, - Destination: &cfg.Reva.StorageMetadata.GRPCAddr, - }, - { - EnvVars: []string{"STORAGE_METADATA_DATA_SERVER_URL"}, - Destination: &cfg.Reva.StorageMetadata.DataServerURL, - }, - { - EnvVars: []string{"STORAGE_METADATA_HTTP_NETWORK"}, - Destination: &cfg.Reva.StorageMetadata.HTTPNetwork, - }, - { - EnvVars: []string{"STORAGE_METADATA_HTTP_ADDR"}, - Destination: &cfg.Reva.StorageMetadata.HTTPAddr, - }, - { - EnvVars: []string{"STORAGE_METADATA_TMP_FOLDER"}, - Destination: &cfg.Reva.StorageMetadata.TempFolder, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER"}, - Destination: &cfg.Reva.StorageMetadata.Driver, - }, - - // storage public link - { - EnvVars: []string{"STORAGE_PUBLIC_LINK_DEBUG_ADDR"}, - Destination: &cfg.Reva.StoragePublicLink.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_PUBLIC_LINK_GRPC_NETWORK"}, - Destination: &cfg.Reva.StoragePublicLink.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_PUBLIC_LINK_GRPC_ADDR"}, - Destination: &cfg.Reva.StoragePublicLink.GRPCAddr, - }, - - // storage users - { - EnvVars: []string{"STORAGE_USERS_DEBUG_ADDR"}, - Destination: &cfg.Reva.StorageUsers.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_USERS_GRPC_NETWORK"}, - Destination: &cfg.Reva.StorageUsers.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_USERS_GRPC_ADDR"}, - Destination: &cfg.Reva.StorageUsers.GRPCAddr, - }, - { - EnvVars: []string{"STORAGE_USERS_HTTP_NETWORK"}, - Destination: &cfg.Reva.StorageUsers.HTTPNetwork, - }, - { - EnvVars: []string{"STORAGE_USERS_HTTP_ADDR"}, - Destination: &cfg.Reva.StorageUsers.HTTPAddr, - }, - { - EnvVars: []string{"OCIS_STORAGE_READ_ONLY", "STORAGE_USERS_READ_ONLY"}, - Destination: &cfg.Reva.StorageUsers.ReadOnly, - }, - { - EnvVars: []string{"STORAGE_USERS_EXPOSE_DATA_SERVER"}, - Destination: &cfg.Reva.StorageUsers.ExposeDataServer, - }, - { - EnvVars: []string{"STORAGE_USERS_DATA_SERVER_URL"}, - Destination: &cfg.Reva.StorageUsers.DataServerURL, - }, - { - EnvVars: []string{"STORAGE_USERS_HTTP_PREFIX"}, - Destination: &cfg.Reva.StorageUsers.HTTPPrefix, - }, - { - EnvVars: []string{"STORAGE_USERS_TMP_FOLDER"}, - Destination: &cfg.Reva.StorageUsers.TempFolder, - }, - - // storage shares - { - EnvVars: []string{"STORAGE_SHARES_DEBUG_ADDR"}, - Destination: &cfg.Reva.StorageShares.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_SHARES_GRPC_NETWORK"}, - Destination: &cfg.Reva.StorageShares.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_SHARES_GRPC_ADDR"}, - Destination: &cfg.Reva.StorageShares.GRPCAddr, - }, - { - EnvVars: []string{"STORAGE_SHARES_HTTP_NETWORK"}, - Destination: &cfg.Reva.StorageShares.HTTPNetwork, - }, - { - EnvVars: []string{"STORAGE_SHARES_HTTP_ADDR"}, - Destination: &cfg.Reva.StorageShares.HTTPAddr, - }, - { - EnvVars: []string{"OCIS_STORAGE_READ_ONLY", "STORAGE_SHARES_READ_ONLY"}, - Destination: &cfg.Reva.StorageShares.ReadOnly, - }, - - // tracing - { - EnvVars: []string{"OCIS_TRACING_ENABLED", "STORAGE_TRACING_ENABLED"}, - Destination: &cfg.Tracing.Enabled, - }, - { - EnvVars: []string{"OCIS_TRACING_TYPE", "STORAGE_TRACING_TYPE"}, - Destination: &cfg.Tracing.Type, - }, - { - EnvVars: []string{"OCIS_TRACING_ENDPOINT", "STORAGE_TRACING_ENDPOINT"}, - Destination: &cfg.Tracing.Endpoint, - }, - { - EnvVars: []string{"OCIS_TRACING_COLLECTOR", "STORAGE_TRACING_COLLECTOR"}, - Destination: &cfg.Tracing.Collector, - }, - { - EnvVars: []string{"STORAGE_TRACING_SERVICE"}, - Destination: &cfg.Tracing.Service, - }, - - // users - { - EnvVars: []string{"STORAGE_USERPROVIDER_DEBUG_ADDR"}, - Destination: &cfg.Reva.Users.DebugAddr, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_NETWORK"}, - Destination: &cfg.Reva.Users.GRPCNetwork, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_ADDR"}, - Destination: &cfg.Reva.Users.GRPCAddr, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_DRIVER"}, - Destination: &cfg.Reva.Users.Driver, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_JSON"}, - Destination: &cfg.Reva.Users.JSON, - }, - { - EnvVars: []string{"STORAGE_USER_CACHE_EXPIRATION"}, - Destination: &cfg.Reva.Users.UserGroupsCacheExpiration, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBHOST"}, - Destination: &cfg.Reva.UserOwnCloudSQL.DBHost, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBPORT"}, - Destination: &cfg.Reva.UserOwnCloudSQL.DBPort, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBNAME"}, - Destination: &cfg.Reva.UserOwnCloudSQL.DBName, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBUSER"}, - Destination: &cfg.Reva.UserOwnCloudSQL.DBUsername, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_DBPASS"}, - Destination: &cfg.Reva.UserOwnCloudSQL.DBPassword, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_NOBODY"}, - Destination: &cfg.Reva.UserOwnCloudSQL.Nobody, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_JOIN_USERNAME"}, - Destination: &cfg.Reva.UserOwnCloudSQL.JoinUsername, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_JOIN_OWNCLOUDUUID"}, - Destination: &cfg.Reva.UserOwnCloudSQL.JoinOwnCloudUUID, - }, - { - EnvVars: []string{"STORAGE_USERPROVIDER_OWNCLOUDSQL_ENABLE_MEDIAL_SEARCH"}, - Destination: &cfg.Reva.UserOwnCloudSQL.EnableMedialSearch, - }, - - // driver eos - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_NAMESPACE"}, - Destination: &cfg.Reva.UserStorage.EOS.Root, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_SHADOW_NAMESPACE"}, - Destination: &cfg.Reva.UserStorage.EOS.ShadowNamespace, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_UPLOADS_NAMESPACE"}, - Destination: &cfg.Reva.UserStorage.EOS.UploadsNamespace, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_SHARE_FOLDER"}, - Destination: &cfg.Reva.UserStorage.EOS.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_BINARY"}, - Destination: &cfg.Reva.UserStorage.EOS.EosBinary, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_XRDCOPY_BINARY"}, - Destination: &cfg.Reva.UserStorage.EOS.XrdcopyBinary, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_MASTER_URL"}, - Destination: &cfg.Reva.UserStorage.EOS.MasterURL, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_SLAVE_URL"}, - Destination: &cfg.Reva.UserStorage.EOS.SlaveURL, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_CACHE_DIRECTORY"}, - Destination: &cfg.Reva.UserStorage.EOS.CacheDirectory, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_ENABLE_LOGGING"}, - Destination: &cfg.Reva.UserStorage.EOS.EnableLogging, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_SHOW_HIDDEN_SYSFILES"}, - Destination: &cfg.Reva.UserStorage.EOS.ShowHiddenSysFiles, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_FORCE_SINGLEUSER_MODE"}, - Destination: &cfg.Reva.UserStorage.EOS.ForceSingleUserMode, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_USE_KEYTAB"}, - Destination: &cfg.Reva.UserStorage.EOS.UseKeytab, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_SEC_PROTOCOL"}, - Destination: &cfg.Reva.UserStorage.EOS.SecProtocol, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_KEYTAB"}, - Destination: &cfg.Reva.UserStorage.EOS.Keytab, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_SINGLE_USERNAME"}, - Destination: &cfg.Reva.UserStorage.EOS.SingleUsername, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_EOS_LAYOUT"}, - Destination: &cfg.Reva.UserStorage.EOS.UserLayout, - }, - { - EnvVars: []string{"REVA_GATEWAY"}, - Destination: &cfg.Reva.UserStorage.EOS.GatewaySVC, - }, - - // driver local - { - EnvVars: []string{"STORAGE_USERS_DRIVER_LOCAL_SHARE_FOLDER"}, - Destination: &cfg.Reva.UserStorage.Local.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_LOCAL_USER_LAYOUT"}, - Destination: &cfg.Reva.UserStorage.Local.UserLayout, - }, - - // driver ocis - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OCIS_LAYOUT"}, - Destination: &cfg.Reva.UserStorage.OCIS.UserLayout, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OCIS_SHARE_FOLDER"}, - Destination: &cfg.Reva.UserStorage.OCIS.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OCIS_PERSONAL_SPACE_ALIAS_TEMPLATE"}, - Destination: &cfg.Reva.UserStorage.OCIS.PersonalSpaceAliasTemplate, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OCIS_GENERAL_SPACE_ALIAS_TEMPLATE"}, - Destination: &cfg.Reva.UserStorage.OCIS.GeneralSpaceAliasTemplate, - }, - // driver owncloud sql - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DATADIR"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.Root, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_UPLOADINFO_DIR"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.UploadInfoDir, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_SHARE_FOLDER"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_LAYOUT"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.UserLayout, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBUSERNAME"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.DBUsername, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBPASSWORD"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.DBPassword, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBHOST"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.DBHost, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBPORT"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.DBPort, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBNAME"}, - Destination: &cfg.Reva.UserStorage.OwnCloudSQL.DBName, - }, - - // driver s3 - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3_REGION"}, - Destination: &cfg.Reva.UserStorage.S3.Region, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3_ACCESS_KEY"}, - Destination: &cfg.Reva.UserStorage.S3.AccessKey, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3_SECRET_KEY"}, - Destination: &cfg.Reva.UserStorage.S3.SecretKey, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3_ENDPOINT"}, - Destination: &cfg.Reva.UserStorage.S3.Endpoint, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3_BUCKET"}, - Destination: &cfg.Reva.UserStorage.S3.Bucket, - }, - - // driver s3ng - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_ROOT"}, - Destination: &cfg.Reva.UserStorage.S3NG.Root, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_LAYOUT"}, - Destination: &cfg.Reva.UserStorage.S3NG.UserLayout, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_SHARE_FOLDER"}, - Destination: &cfg.Reva.UserStorage.S3NG.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_PERSONAL_SPACE_ALIAS_TEMPLATE"}, - Destination: &cfg.Reva.UserStorage.S3NG.PersonalSpaceAliasTemplate, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_GENERAL_SPACE_ALIAS_TEMPLATE"}, - Destination: &cfg.Reva.UserStorage.S3NG.GeneralSpaceAliasTemplate, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_REGION"}, - Destination: &cfg.Reva.UserStorage.S3NG.Region, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_ACCESS_KEY"}, - Destination: &cfg.Reva.UserStorage.S3NG.AccessKey, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_SECRET_KEY"}, - Destination: &cfg.Reva.UserStorage.S3NG.SecretKey, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_ENDPOINT"}, - Destination: &cfg.Reva.UserStorage.S3NG.Endpoint, - }, - { - EnvVars: []string{"STORAGE_USERS_DRIVER_S3NG_BUCKET"}, - Destination: &cfg.Reva.UserStorage.S3NG.Bucket, - }, - - // metadata driver eos - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_NAMESPACE"}, - Destination: &cfg.Reva.MetadataStorage.EOS.Root, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_SHADOW_NAMESPACE"}, - Destination: &cfg.Reva.MetadataStorage.EOS.ShadowNamespace, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_UPLOADS_NAMESPACE"}, - Destination: &cfg.Reva.MetadataStorage.EOS.UploadsNamespace, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_SHARE_FOLDER"}, - Destination: &cfg.Reva.MetadataStorage.EOS.ShareFolder, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_BINARY"}, - Destination: &cfg.Reva.MetadataStorage.EOS.EosBinary, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_XRDCOPY_BINARY"}, - Destination: &cfg.Reva.MetadataStorage.EOS.XrdcopyBinary, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_MASTER_URL"}, - Destination: &cfg.Reva.MetadataStorage.EOS.MasterURL, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_SLAVE_URL"}, - Destination: &cfg.Reva.MetadataStorage.EOS.SlaveURL, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_CACHE_DIRECTORY"}, - Destination: &cfg.Reva.MetadataStorage.EOS.CacheDirectory, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_ENABLE_LOGGING"}, - Destination: &cfg.Reva.MetadataStorage.EOS.EnableLogging, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_SHOW_HIDDEN_SYSFILES"}, - Destination: &cfg.Reva.MetadataStorage.EOS.ShowHiddenSysFiles, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_FORCE_SINGLEUSER_MODE"}, - Destination: &cfg.Reva.MetadataStorage.EOS.ForceSingleUserMode, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_USE_KEYTAB"}, - Destination: &cfg.Reva.MetadataStorage.EOS.UseKeytab, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_SEC_PROTOCOL"}, - Destination: &cfg.Reva.MetadataStorage.EOS.SecProtocol, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_KEYTAB"}, - Destination: &cfg.Reva.MetadataStorage.EOS.Keytab, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_SINGLE_USERNAME"}, - Destination: &cfg.Reva.MetadataStorage.EOS.SingleUsername, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_EOS_LAYOUT"}, - Destination: &cfg.Reva.MetadataStorage.EOS.UserLayout, - }, - { - EnvVars: []string{"REVA_GATEWAY"}, - Destination: &cfg.Reva.MetadataStorage.EOS.GatewaySVC, - }, - - // metadata local driver - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_LOCAL_ROOT"}, - Destination: &cfg.Reva.MetadataStorage.Local.Root, - }, - - // metadata ocis driver - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_OCIS_LAYOUT"}, - Destination: &cfg.Reva.MetadataStorage.OCIS.UserLayout, - }, - - // metadata driver s3 - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3_REGION"}, - Destination: &cfg.Reva.MetadataStorage.S3.Region, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3_ACCESS_KEY"}, - Destination: &cfg.Reva.MetadataStorage.S3.AccessKey, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3_SECRET_KEY"}, - Destination: &cfg.Reva.MetadataStorage.S3.SecretKey, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3_ENDPOINT"}, - Destination: &cfg.Reva.MetadataStorage.S3.Endpoint, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3_BUCKET"}, - Destination: &cfg.Reva.MetadataStorage.S3.Bucket, - }, - - // driver s3ng - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_ROOT"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.Root, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_LAYOUT"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.UserLayout, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_REGION"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.Region, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_ACCESS_KEY"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.AccessKey, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_SECRET_KEY"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.SecretKey, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_ENDPOINT"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.Endpoint, - }, - { - EnvVars: []string{"STORAGE_METADATA_DRIVER_S3NG_BUCKET"}, - Destination: &cfg.Reva.MetadataStorage.S3NG.Bucket, - }, - - // permissions - { - EnvVars: []string{"STORAGE_PERMISSIONS_ENDPOINT"}, - Destination: &cfg.Reva.Permissions.Endpoint, - }, - - // ocdav - { - EnvVars: []string{"OCDAV_ADDR"}, - Destination: &cfg.OCDav.Addr, - }, - { - EnvVars: []string{"OCDAV_DEBUG_ADDR"}, - Destination: &cfg.OCDav.DebugAddr, - }, - { - EnvVars: []string{"OCDAV_PREFIX"}, - Destination: &cfg.OCDav.Prefix, - }, - { - EnvVars: []string{"OCDAV_WEBDAV_NAMESPACE"}, - Destination: &cfg.OCDav.WebdavNamespace, - }, - { - EnvVars: []string{"OCDAV_FILES_NAMESPACE"}, - Destination: &cfg.OCDav.FilesNamespace, - }, - { - EnvVars: []string{"OCDAV_SHARES_NAMESPACE"}, - Destination: &cfg.OCDav.SharesNamespace, - }, - { - EnvVars: []string{"OCIS_URL", "OCDAV_PUBLIC_URL"}, - Destination: &cfg.OCDav.PublicURL, - }, - { - EnvVars: []string{"OCIS_INSECURE", "OCDAV_INSECURE"}, - Destination: &cfg.OCDav.Insecure, - }, - { - EnvVars: []string{"OCIS_JWT_SECRET", "OCDAV_JWT_SECRET"}, - Destination: &cfg.OCDav.JWTSecret, - }, - } -} diff --git a/extensions/storage/pkg/config/defaults/defaultconfig.go b/extensions/storage/pkg/config/defaults/defaultconfig.go deleted file mode 100644 index 0e2faf43df..0000000000 --- a/extensions/storage/pkg/config/defaults/defaultconfig.go +++ /dev/null @@ -1,459 +0,0 @@ -package defaults - -import ( - "os" - "path" - - "github.com/owncloud/ocis/extensions/storage/pkg/config" - "github.com/owncloud/ocis/ocis-pkg/config/defaults" -) - -const ( - defaultPublicURL = "https://localhost:9200" - defaultShareFolder = "/Shares" - defaultStorageNamespace = "/users/{{.Id.OpaqueId}}" - defaultGatewayAddr = "127.0.0.1:9142" - defaultUserLayout = "{{.Id.OpaqueId}}" - defaultPersonalSpaceAliasTemplate = "{{.SpaceType}}/{{.User.Username | lower}}" - defaultGeneralSpaceAliasTemplate = "{{.SpaceType}}/{{.SpaceName | replace \" \" \"-\" | lower}}" -) - -func FullDefaultConfig() *config.Config { - cfg := DefaultConfig() - EnsureDefaults(cfg) - Sanitize(cfg) - return cfg -} - -func DefaultConfig() *config.Config { - return &config.Config{ - // log is inherited - Debug: config.Debug{ - Addr: "127.0.0.1:9109", - }, - Reva: config.Reva{ - SkipUserGroupsInToken: false, - TransferExpires: 24 * 60 * 60, - OIDC: config.OIDC{ - Issuer: defaultPublicURL, - Insecure: false, - IDClaim: "preferred_username", - }, - LDAP: config.LDAP{ - URI: "ldaps://localhost:9235", - CACert: path.Join(defaults.BaseDataPath(), "idm", "ldap.crt"), - Insecure: false, - UserBaseDN: "ou=users,o=libregraph-idm", - GroupBaseDN: "ou=groups,o=libregraph-idm", - UserScope: "sub", - GroupScope: "sub", - LoginAttributes: []string{"uid", "mail"}, - UserFilter: "", - GroupFilter: "", - UserObjectClass: "inetOrgPerson", - GroupObjectClass: "groupOfNames", - BindDN: "uid=reva,ou=sysusers,o=libregraph-idm", - IDP: defaultPublicURL, - UserSchema: config.LDAPUserSchema{ - ID: "ownclouduuid", - Mail: "mail", - DisplayName: "displayname", - Username: "uid", - UIDNumber: "uidnumber", - GIDNumber: "gidnumber", - }, - GroupSchema: config.LDAPGroupSchema{ - ID: "ownclouduuid", - Mail: "mail", - DisplayName: "cn", - Groupname: "cn", - Member: "member", - GIDNumber: "gidnumber", - }, - }, - UserGroupRest: config.UserGroupRest{ - RedisAddress: "localhost:6379", - }, - UserOwnCloudSQL: config.UserOwnCloudSQL{ - DBUsername: "owncloud", - DBHost: "mysql", - DBPort: 3306, - DBName: "owncloud", - Idp: defaultPublicURL, - Nobody: 90, - JoinUsername: false, - JoinOwnCloudUUID: false, - EnableMedialSearch: false, - }, - Archiver: config.Archiver{ - MaxNumFiles: 10000, - MaxSize: 1073741824, - ArchiverURL: "/archiver", - }, - UserStorage: config.StorageConfig{ - EOS: config.DriverEOS{ - DriverCommon: config.DriverCommon{ - Root: "/eos/dockertest/reva", - ShareFolder: defaultShareFolder, - UserLayout: "{{substr 0 1 .Username}}/{{.Username}}", - }, - ShadowNamespace: "", // Defaults to path.Join(c.Namespace, ".shadow") - UploadsNamespace: "", // Defaults to path.Join(c.Namespace, ".uploads") - EosBinary: "/usr/bin/eos", - XrdcopyBinary: "/usr/bin/xrdcopy", - MasterURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - SlaveURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - CacheDirectory: os.TempDir(), - GatewaySVC: defaultGatewayAddr, - }, - Local: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "local", "users"), - ShareFolder: defaultShareFolder, - UserLayout: "{{.Username}}", - EnableHome: false, - }, - OwnCloudSQL: config.DriverOwnCloudSQL{ - DriverCommon: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "owncloud"), - ShareFolder: defaultShareFolder, - UserLayout: "{{.Username}}", - EnableHome: false, - }, - UploadInfoDir: path.Join(defaults.BaseDataPath(), "storage", "uploadinfo"), - DBUsername: "owncloud", - DBPassword: "owncloud", - DBHost: "", - DBPort: 3306, - DBName: "owncloud", - }, - S3: config.DriverS3{ - DriverCommon: config.DriverCommon{}, - Region: "default", - AccessKey: "", - SecretKey: "", - Endpoint: "", - Bucket: "", - }, - S3NG: config.DriverS3NG{ - DriverCommon: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "users"), - ShareFolder: defaultShareFolder, - UserLayout: defaultUserLayout, - PersonalSpaceAliasTemplate: defaultPersonalSpaceAliasTemplate, - GeneralSpaceAliasTemplate: defaultGeneralSpaceAliasTemplate, - EnableHome: false, - }, - Region: "default", - AccessKey: "", - SecretKey: "", - Endpoint: "", - Bucket: "", - }, - OCIS: config.DriverOCIS{ - DriverCommon: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "users"), - ShareFolder: defaultShareFolder, - UserLayout: defaultUserLayout, - PersonalSpaceAliasTemplate: defaultPersonalSpaceAliasTemplate, - GeneralSpaceAliasTemplate: defaultGeneralSpaceAliasTemplate, - }, - }, - }, - MetadataStorage: config.StorageConfig{ - EOS: config.DriverEOS{ - DriverCommon: config.DriverCommon{ - Root: "/eos/dockertest/reva", - ShareFolder: defaultShareFolder, - UserLayout: "{{substr 0 1 .Username}}/{{.Username}}", - EnableHome: false, - }, - ShadowNamespace: "", - UploadsNamespace: "", - EosBinary: "/usr/bin/eos", - XrdcopyBinary: "/usr/bin/xrdcopy", - MasterURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - GrpcURI: "", - SlaveURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - CacheDirectory: os.TempDir(), - EnableLogging: false, - ShowHiddenSysFiles: false, - ForceSingleUserMode: false, - UseKeytab: false, - SecProtocol: "", - Keytab: "", - SingleUsername: "", - GatewaySVC: defaultGatewayAddr, - }, - Local: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "local", "metadata"), - }, - OwnCloudSQL: config.DriverOwnCloudSQL{}, - S3: config.DriverS3{ - DriverCommon: config.DriverCommon{}, - Region: "default", - }, - S3NG: config.DriverS3NG{ - DriverCommon: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "metadata"), - ShareFolder: "", - UserLayout: defaultUserLayout, - EnableHome: false, - }, - Region: "default", - AccessKey: "", - SecretKey: "", - Endpoint: "", - Bucket: "", - }, - OCIS: config.DriverOCIS{ - DriverCommon: config.DriverCommon{ - Root: path.Join(defaults.BaseDataPath(), "storage", "metadata"), - ShareFolder: "", - UserLayout: defaultUserLayout, - EnableHome: false, - }, - }, - }, - Frontend: config.FrontendPort{ - Port: config.Port{ - MaxCPUs: "", - LogLevel: "", - GRPCNetwork: "", - GRPCAddr: "", - HTTPNetwork: "tcp", - HTTPAddr: "127.0.0.1:9140", - Protocol: "", - Endpoint: "", - DebugAddr: "127.0.0.1:9141", - Services: []string{"datagateway", "ocs", "appprovider"}, - Config: nil, - Context: nil, - Supervised: false, - }, - AppProviderInsecure: false, - AppProviderPrefix: "", - ArchiverInsecure: false, - ArchiverPrefix: "archiver", - DatagatewayPrefix: "data", - Favorites: false, - ProjectSpaces: true, - OCSPrefix: "ocs", - OCSSharePrefix: defaultShareFolder, - OCSHomeNamespace: defaultStorageNamespace, - PublicURL: defaultPublicURL, - OCSCacheWarmupDriver: "", - OCSAdditionalInfoAttribute: "{{.Mail}}", - OCSResourceInfoCacheTTL: 0, - Middleware: config.Middleware{}, - }, - DataGateway: config.DataGatewayPort{ - Port: config.Port{}, - PublicURL: "", - }, - Gateway: config.Gateway{ - Port: config.Port{ - Endpoint: defaultGatewayAddr, - DebugAddr: "127.0.0.1:9143", - GRPCNetwork: "tcp", - GRPCAddr: defaultGatewayAddr, - }, - CommitShareToStorageGrant: true, - CommitShareToStorageRef: true, - DisableHomeCreationOnLogin: true, - ShareFolder: "Shares", - LinkGrants: "", - HomeMapping: "", - EtagCacheTTL: 0, - }, - StorageRegistry: config.StorageRegistry{ - Driver: "spaces", - HomeProvider: "/home", // unused for spaces, static currently not supported - JSON: "", - }, - AppRegistry: config.AppRegistry{ - Driver: "static", - MimetypesJSON: "", - }, - Users: config.Users{ - Port: config.Port{ - Endpoint: "localhost:9144", - DebugAddr: "127.0.0.1:9145", - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9144", - Services: []string{"userprovider"}, - }, - Driver: "ldap", - UserGroupsCacheExpiration: 5, - }, - Groups: config.Groups{ - Port: config.Port{ - Endpoint: "localhost:9160", - DebugAddr: "127.0.0.1:9161", - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9160", - Services: []string{"groupprovider"}, - }, - Driver: "ldap", - GroupMembersCacheExpiration: 5, - }, - AuthProvider: config.Users{ - Port: config.Port{}, - Driver: "ldap", - UserGroupsCacheExpiration: 0, - }, - AuthBasic: config.Port{ - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9146", - DebugAddr: "127.0.0.1:9147", - Services: []string{"authprovider"}, - Endpoint: "localhost:9146", - }, - AuthBearer: config.Port{ - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9148", - DebugAddr: "127.0.0.1:9149", - Services: []string{"authprovider"}, - Endpoint: "localhost:9148", - }, - AuthMachine: config.Port{ - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9166", - DebugAddr: "127.0.0.1:9167", - Services: []string{"authprovider"}, - Endpoint: "localhost:9166", - }, - AuthMachineConfig: config.AuthMachineConfig{}, - Sharing: config.Sharing{ - Port: config.Port{ - Endpoint: "localhost:9150", - DebugAddr: "127.0.0.1:9151", - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9150", - Services: []string{"usershareprovider", "publicshareprovider"}, - }, - CS3ProviderAddr: "127.0.0.1:9215", // metadata storage - CS3ServiceUser: "95cb8724-03b2-11eb-a0a6-c33ef8ef53ad", - CS3ServiceUserIdp: "internal", - UserDriver: "json", - UserJSONFile: path.Join(defaults.BaseDataPath(), "storage", "shares.json"), - UserSQLUsername: "", - UserSQLPassword: "", - UserSQLHost: "", - UserSQLPort: 1433, - UserSQLName: "", - PublicDriver: "json", - PublicJSONFile: path.Join(defaults.BaseDataPath(), "storage", "publicshares.json"), - PublicPasswordHashCost: 11, - PublicEnableExpiredSharesCleanup: true, - PublicJanitorRunInterval: 60, - UserStorageMountID: "", - Events: config.Events{ - Address: "127.0.0.1:9233", - ClusterID: "ocis-cluster", - }, - }, - StorageShares: config.StoragePort{ - Port: config.Port{ - Endpoint: "localhost:9154", - DebugAddr: "127.0.0.1:9156", - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9154", - HTTPNetwork: "tcp", - HTTPAddr: "127.0.0.1:9155", - }, - ReadOnly: false, - AlternativeID: "1284d238-aa92-42ce-bdc4-0b0000009154", - MountID: "1284d238-aa92-42ce-bdc4-0b0000009157", - }, - StorageUsers: config.StoragePort{ - Port: config.Port{ - Endpoint: "localhost:9157", - DebugAddr: "127.0.0.1:9159", - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9157", - HTTPNetwork: "tcp", - HTTPAddr: "127.0.0.1:9158", - }, - MountID: "1284d238-aa92-42ce-bdc4-0b0000009157", - Driver: "ocis", - DataServerURL: "http://localhost:9158/data", - HTTPPrefix: "data", - TempFolder: path.Join(defaults.BaseDataPath(), "tmp", "users"), - }, - StoragePublicLink: config.PublicStorage{ - StoragePort: config.StoragePort{ - Port: config.Port{ - Endpoint: "localhost:9178", - DebugAddr: "127.0.0.1:9179", - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9178", - }, - MountID: "7993447f-687f-490d-875c-ac95e89a62a4", - }, - PublicShareProviderAddr: "", - UserProviderAddr: "", - }, - StorageMetadata: config.StoragePort{ - Port: config.Port{ - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9215", - HTTPNetwork: "tcp", - HTTPAddr: "127.0.0.1:9216", - DebugAddr: "127.0.0.1:9217", - }, - Driver: "ocis", - ExposeDataServer: false, - DataServerURL: "http://localhost:9216/data", - TempFolder: path.Join(defaults.BaseDataPath(), "tmp", "metadata"), - DataProvider: config.DataProvider{}, - }, - AppProvider: config.AppProvider{ - Port: config.Port{ - GRPCNetwork: "tcp", - GRPCAddr: "127.0.0.1:9164", - DebugAddr: "127.0.0.1:9165", - Endpoint: "localhost:9164", - Services: []string{"appprovider"}, - }, - ExternalAddr: "127.0.0.1:9164", - WopiDriver: config.WopiDriver{}, - AppsURL: "/app/list", - OpenURL: "/app/open", - NewURL: "/app/new", - }, - Permissions: config.Port{ - Endpoint: "localhost:9191", - }, - Configs: nil, - UploadMaxChunkSize: 1e+8, - UploadHTTPMethodOverride: "", - ChecksumSupportedTypes: []string{"sha1", "md5", "adler32"}, - ChecksumPreferredUploadType: "", - DefaultUploadProtocol: "tus", - }, - // TODO move ocdav config to a separate service - OCDav: config.OCDav{ - Addr: "127.0.0.1:0", // :0 to pick any local free port - DebugAddr: "127.0.0.1:9163", - WebdavNamespace: defaultStorageNamespace, - FilesNamespace: defaultStorageNamespace, - SharesNamespace: defaultShareFolder, - PublicURL: defaultPublicURL, - Prefix: "", - GatewaySVC: defaultGatewayAddr, - Insecure: false, // true? - Timeout: 84300, - }, - Tracing: config.Tracing{ - Service: "storage", - Type: "jaeger", - }, - Asset: config.Asset{}, - } -} - -func EnsureDefaults(cfg *config.Config) { -} - -func Sanitize(cfg *config.Config) { -} diff --git a/extensions/storage/pkg/config/parser/parse.go b/extensions/storage/pkg/config/parser/parse.go deleted file mode 100644 index d486f6dad4..0000000000 --- a/extensions/storage/pkg/config/parser/parse.go +++ /dev/null @@ -1,37 +0,0 @@ -package parser - -import ( - "errors" - - "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" - "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config/defaults" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - - "github.com/owncloud/ocis/ocis-pkg/config/envdecode" -) - -// ParseConfig loads configuration from known paths. -func ParseConfig(cfg *config.Config) error { - _, err := ociscfg.BindSourcesToStructs(cfg.Service.Name, cfg) - if err != nil { - return err - } - - defaults.EnsureDefaults(cfg) - - // load all env variables relevant to the config in the current context. - if err := envdecode.Decode(cfg); err != nil { - // no environment variable set for this config is an expected "error" - if !errors.Is(err, envdecode.ErrNoTargetFieldsAreSet) { - return err - } - } - - defaults.Sanitize(cfg) - - return Validate(cfg) -} - -func Validate(cfg *config.Config) error { - return nil -} diff --git a/extensions/storage/pkg/tracing/tracing.go b/extensions/storage/pkg/tracing/tracing.go deleted file mode 100644 index acb788e21c..0000000000 --- a/extensions/storage/pkg/tracing/tracing.go +++ /dev/null @@ -1,38 +0,0 @@ -package tracing - -import ( - "github.com/owncloud/ocis/extensions/storage/pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" -) - -// Configure for Reva serves only as informational / instructive log messages. Tracing config will be delegated directly -// to Reva services. -func Configure(cfg *config.Config, logger log.Logger) { - if cfg.Tracing.Enabled { - switch cfg.Tracing.Type { - case "agent": - logger.Error(). - Str("type", cfg.Tracing.Type). - Msg("Reva only supports the jaeger tracing backend") - - case "jaeger": - logger.Info(). - Str("type", cfg.Tracing.Type). - Msg("configuring storage to use the jaeger tracing backend") - - case "zipkin": - logger.Error(). - Str("type", cfg.Tracing.Type). - Msg("Reva only supports the jaeger tracing backend") - - default: - logger.Warn(). - Str("type", cfg.Tracing.Type). - Msg("Unknown tracing backend") - } - - } else { - logger.Debug(). - Msg("Tracing is not enabled") - } -} diff --git a/extensions/storage/reflex.conf b/extensions/storage/reflex.conf deleted file mode 100644 index 1035f881c5..0000000000 --- a/extensions/storage/reflex.conf +++ /dev/null @@ -1,5 +0,0 @@ -# backend --r '^(cmd|pkg)/.*\.go$' -R '^node_modules/' -s -- sh -c 'make bin/ocis-reva-debug && bin/ocis-reva-debug --log-level debug server --debug-pprof --debug-zpages --asset-path assets/' - -# frontend --r '^ui/.*\.(vue|js)$' -R '^node_modules/' -- sh -c 'yarn build' diff --git a/extensions/user/pkg/command/command.go b/extensions/user/pkg/command/command.go index 27e7cabfab..7214e12e21 100644 --- a/extensions/user/pkg/command/command.go +++ b/extensions/user/pkg/command/command.go @@ -11,9 +11,9 @@ import ( "github.com/cs3org/reva/v2/cmd/revad/runtime" "github.com/gofrs/uuid" "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" "github.com/owncloud/ocis/extensions/user/pkg/config" "github.com/owncloud/ocis/extensions/user/pkg/config/parser" + "github.com/owncloud/ocis/extensions/user/pkg/server/debug" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/ldap" "github.com/owncloud/ocis/ocis-pkg/log" @@ -88,13 +88,9 @@ func User(cfg *config.Config) *cli.Command { }) debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Debug.Addr), debug.Logger(logger), debug.Context(ctx), - debug.Pprof(cfg.Debug.Pprof), - debug.Zpages(cfg.Debug.Zpages), - debug.Token(cfg.Debug.Token), + debug.Config(cfg), ) if err != nil { diff --git a/extensions/user/pkg/server/debug/option.go b/extensions/user/pkg/server/debug/option.go new file mode 100644 index 0000000000..31bbf15052 --- /dev/null +++ b/extensions/user/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/storage/pkg/server/debug/server.go b/extensions/user/pkg/server/debug/server.go similarity index 71% rename from extensions/storage/pkg/server/debug/server.go rename to extensions/user/pkg/server/debug/server.go index 0038e858e8..27adbcdc64 100644 --- a/extensions/storage/pkg/server/debug/server.go +++ b/extensions/user/pkg/server/debug/server.go @@ -4,7 +4,7 @@ import ( "io" "net/http" - "github.com/owncloud/ocis/extensions/storage/pkg/config" + "github.com/owncloud/ocis/extensions/user/pkg/config" "github.com/owncloud/ocis/ocis-pkg/service/debug" "github.com/owncloud/ocis/ocis-pkg/version" ) @@ -15,14 +15,18 @@ func Server(opts ...Option) (*http.Server, error) { return debug.NewService( debug.Logger(options.Logger), - debug.Name(options.Name), + debug.Name(options.Config.Service.Name), debug.Version(version.String), - debug.Address(options.Addr), - debug.Token(options.Token), - debug.Pprof(options.Pprof), - debug.Zpages(options.Zpages), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), debug.Health(health(options.Config)), debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), ), nil } diff --git a/extensions/storage/pkg/service/external/external.go b/ocis-pkg/service/external/external.go similarity index 100% rename from extensions/storage/pkg/service/external/external.go rename to ocis-pkg/service/external/external.go diff --git a/extensions/storage/pkg/service/external/external_test.go b/ocis-pkg/service/external/external_test.go similarity index 100% rename from extensions/storage/pkg/service/external/external_test.go rename to ocis-pkg/service/external/external_test.go From 5e48b30dd08352af856d182204e8b1d3d172f844 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 14:36:37 +0200 Subject: [PATCH 05/50] add all extensions to extensions list and ensure the Makefile --- .drone.star | 17 ++++++++++ Makefile | 20 ++++++++++-- extensions/appprovider/Makefile | 37 ++++++++++++++++++++++ extensions/auth-basic/Makefile | 37 ++++++++++++++++++++++ extensions/auth-bearer/Makefile | 37 ++++++++++++++++++++++ extensions/auth-bearer/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/auth-machine/Makefile | 37 ++++++++++++++++++++++ extensions/auth-machine/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/frontend/Makefile | 37 ++++++++++++++++++++++ extensions/frontend/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/gateway/Makefile | 37 ++++++++++++++++++++++ extensions/gateway/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/group/Makefile | 37 ++++++++++++++++++++++ extensions/group/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/nats/Makefile | 37 ++++++++++++++++++++++ extensions/notifications/Makefile | 37 ++++++++++++++++++++++ extensions/ocdav/Makefile | 37 ++++++++++++++++++++++ extensions/ocdav/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/sharing/Makefile | 37 ++++++++++++++++++++++ extensions/sharing/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/storage-metadata/Makefile | 37 ++++++++++++++++++++++ extensions/storage-metadata/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/storage-publiclink/Makefile | 37 ++++++++++++++++++++++ extensions/storage-publiclink/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/storage-shares/Makefile | 37 ++++++++++++++++++++++ extensions/storage-shares/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/storage-users/Makefile | 37 ++++++++++++++++++++++ extensions/storage-users/pkg/Makefile | 37 ++++++++++++++++++++++ extensions/user/Makefile | 37 ++++++++++++++++++++++ extensions/user/pkg/Makefile | 37 ++++++++++++++++++++++ 30 files changed, 1071 insertions(+), 2 deletions(-) create mode 100644 extensions/appprovider/Makefile create mode 100644 extensions/auth-basic/Makefile create mode 100644 extensions/auth-bearer/Makefile create mode 100644 extensions/auth-bearer/pkg/Makefile create mode 100644 extensions/auth-machine/Makefile create mode 100644 extensions/auth-machine/pkg/Makefile create mode 100644 extensions/frontend/Makefile create mode 100644 extensions/frontend/pkg/Makefile create mode 100644 extensions/gateway/Makefile create mode 100644 extensions/gateway/pkg/Makefile create mode 100644 extensions/group/Makefile create mode 100644 extensions/group/pkg/Makefile create mode 100644 extensions/nats/Makefile create mode 100644 extensions/notifications/Makefile create mode 100644 extensions/ocdav/Makefile create mode 100644 extensions/ocdav/pkg/Makefile create mode 100644 extensions/sharing/Makefile create mode 100644 extensions/sharing/pkg/Makefile create mode 100644 extensions/storage-metadata/Makefile create mode 100644 extensions/storage-metadata/pkg/Makefile create mode 100644 extensions/storage-publiclink/Makefile create mode 100644 extensions/storage-publiclink/pkg/Makefile create mode 100644 extensions/storage-shares/Makefile create mode 100644 extensions/storage-shares/pkg/Makefile create mode 100644 extensions/storage-users/Makefile create mode 100644 extensions/storage-users/pkg/Makefile create mode 100644 extensions/user/Makefile create mode 100644 extensions/user/pkg/Makefile diff --git a/.drone.star b/.drone.star index ed3c540e8c..ce4ef53550 100644 --- a/.drone.star +++ b/.drone.star @@ -44,17 +44,34 @@ config = { "modules": [ # if you add a module here please also add it to the root level Makefile "extensions/accounts", + "extensions/appprovider", "extensions/audit", + "extensions/auth-basic", + "extensions/auth-bearer", + "extensions/auth-machine", + "extensions/frontend", + "extensions/gateway", "extensions/glauth", "extensions/graph-explorer", + "extensions/group", + "extensions/idm", "extensions/graph", "extensions/idp", + "extensions/nats", + "extensions/notifications", + "extensions/ocdav", "extensions/ocs", "extensions/proxy", "extensions/settings", + "extensions/sharing", + "extensions/storage-metadata", + "extensions/storage-publiclink", + "extensions/storage-shares", + "extensions/storage-users", "extensions/storage", "extensions/store", "extensions/thumbnails", + "extensions/user", "extensions/web", "extensions/webdav", "ocis-pkg", diff --git a/Makefile b/Makefile index 287c567d43..c3c7197bdb 100644 --- a/Makefile +++ b/Makefile @@ -17,17 +17,33 @@ L10N_MODULES := $(shell find . -path '*.tx*' -name 'config' | sed 's|/[^/]*$$||' # if you add a module here please also add it to the .drone.star file OCIS_MODULES = \ extensions/accounts \ + extensions/appprovider \ extensions/audit \ + extensions/auth-basic \ + extensions/auth-bearer \ + extensions/auth-machine \ + extensions/frontend \ + extensions/gateway \ extensions/glauth \ extensions/graph \ extensions/graph-explorer \ + extensions/group \ + extensions/idm \ extensions/idp \ + extensions/nats \ + extensions/notifications \ + extensions/ocdav \ extensions/ocs \ extensions/proxy \ extensions/settings \ - extensions/storage \ + extensions/sharing \ + extensions/storage-metadata \ + extensions/storage-publiclink \ + extensions/storage-shares \ + extensions/storage-users \ extensions/store \ extensions/thumbnails \ + extensions/user \ extensions/web \ extensions/webdav\ ocis \ @@ -111,7 +127,7 @@ composer.lock: composer.json .PHONY: generate generate: @for mod in $(OCIS_MODULES); do \ - $(MAKE) --no-print-directory -C $$mod generate || exit 1; \ + $(MAKE) -C $$mod generate || exit 1; \ done .PHONY: vet diff --git a/extensions/appprovider/Makefile b/extensions/appprovider/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/appprovider/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/auth-basic/Makefile b/extensions/auth-basic/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/auth-basic/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/auth-bearer/Makefile b/extensions/auth-bearer/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/auth-bearer/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/auth-bearer/pkg/Makefile b/extensions/auth-bearer/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/auth-bearer/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/auth-machine/Makefile b/extensions/auth-machine/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/auth-machine/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/auth-machine/pkg/Makefile b/extensions/auth-machine/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/auth-machine/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/frontend/Makefile b/extensions/frontend/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/frontend/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/frontend/pkg/Makefile b/extensions/frontend/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/frontend/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/gateway/Makefile b/extensions/gateway/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/gateway/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/gateway/pkg/Makefile b/extensions/gateway/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/gateway/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/group/Makefile b/extensions/group/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/group/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/group/pkg/Makefile b/extensions/group/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/group/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/nats/Makefile b/extensions/nats/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/nats/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/notifications/Makefile b/extensions/notifications/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/notifications/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/ocdav/Makefile b/extensions/ocdav/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/ocdav/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/ocdav/pkg/Makefile b/extensions/ocdav/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/ocdav/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/sharing/Makefile b/extensions/sharing/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/sharing/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/sharing/pkg/Makefile b/extensions/sharing/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/sharing/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-metadata/Makefile b/extensions/storage-metadata/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-metadata/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-metadata/pkg/Makefile b/extensions/storage-metadata/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-metadata/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-publiclink/Makefile b/extensions/storage-publiclink/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-publiclink/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-publiclink/pkg/Makefile b/extensions/storage-publiclink/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-publiclink/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-shares/Makefile b/extensions/storage-shares/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-shares/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-shares/pkg/Makefile b/extensions/storage-shares/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-shares/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-users/Makefile b/extensions/storage-users/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-users/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/storage-users/pkg/Makefile b/extensions/storage-users/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/storage-users/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/user/Makefile b/extensions/user/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/user/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/user/pkg/Makefile b/extensions/user/pkg/Makefile new file mode 100644 index 0000000000..51243d83fc --- /dev/null +++ b/extensions/user/pkg/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := ocs + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: From eb82c646c0b8e06366413b8228519d12ebc89357 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 15:14:43 +0200 Subject: [PATCH 06/50] app provider config docs --- docs/extensions/appprovider/_index.md | 16 +++++++++++ .../{storage => appprovider}/apps.md | 2 +- docs/extensions/appprovider/configuration.md | 15 +++++++++++ docs/extensions/auth-basic/_index.md | 2 +- docs/helpers/configenvextractor.go | 4 +-- ...vironment-variable-docs-generator.go.tmpl} | 0 extensions/appprovider/pkg/command/command.go | 5 ++-- extensions/appprovider/pkg/config/config.go | 27 +++++++++---------- 8 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 docs/extensions/appprovider/_index.md rename docs/extensions/{storage => appprovider}/apps.md (99%) create mode 100644 docs/extensions/appprovider/configuration.md rename docs/helpers/{extractor.go.tmpl => environment-variable-docs-generator.go.tmpl} (100%) diff --git a/docs/extensions/appprovider/_index.md b/docs/extensions/appprovider/_index.md new file mode 100644 index 0000000000..6f1ff50f05 --- /dev/null +++ b/docs/extensions/appprovider/_index.md @@ -0,0 +1,16 @@ +--- +title: App Provider +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/appprovider +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/storage/apps.md b/docs/extensions/appprovider/apps.md similarity index 99% rename from docs/extensions/storage/apps.md rename to docs/extensions/appprovider/apps.md index 93d7b19e77..32a18287b5 100644 --- a/docs/extensions/storage/apps.md +++ b/docs/extensions/appprovider/apps.md @@ -3,7 +3,7 @@ title: "Apps" date: 2018-05-02T00:00:00+00:00 weight: 10 geekdocRepo: https://github.com/owncloud/ocis -geekdocEditPath: edit/master/docs/extensions/storage +geekdocEditPath: edit/master/docs/extensions/appprovider geekdocFilePath: apps.md --- diff --git a/docs/extensions/appprovider/configuration.md b/docs/extensions/appprovider/configuration.md new file mode 100644 index 0000000000..1f828107d9 --- /dev/null +++ b/docs/extensions/appprovider/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/appprovider +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/appprovider-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/appprovider_configvars.md" >}} diff --git a/docs/extensions/auth-basic/_index.md b/docs/extensions/auth-basic/_index.md index 3cae23b145..0f47e22979 100644 --- a/docs/extensions/auth-basic/_index.md +++ b/docs/extensions/auth-basic/_index.md @@ -3,7 +3,7 @@ title: Auth-Basic date: 2022-03-02T00:00:00+00:00 weight: 20 geekdocRepo: https://github.com/owncloud/ocis -geekdocEditPath: edit/master/docs/extensions/auth-baisc +geekdocEditPath: edit/master/docs/extensions/auth-basic geekdocFilePath: _index.md geekdocCollapseSection: true --- diff --git a/docs/helpers/configenvextractor.go b/docs/helpers/configenvextractor.go index d7afd52955..f78d1671be 100644 --- a/docs/helpers/configenvextractor.go +++ b/docs/helpers/configenvextractor.go @@ -13,8 +13,8 @@ import ( ) var targets = map[string]string{ - "example-config-generator.go.tmpl": "output/exampleconfig/example-config-generator.go", - "extractor.go.tmpl": "output/env/runner.go", + "example-config-generator.go.tmpl": "output/exampleconfig/example-config-generator.go", + "environment-variable-docs-generator.go.tmpl": "output/env/environment-variable-docs-generator.go", } func main() { diff --git a/docs/helpers/extractor.go.tmpl b/docs/helpers/environment-variable-docs-generator.go.tmpl similarity index 100% rename from docs/helpers/extractor.go.tmpl rename to docs/helpers/environment-variable-docs-generator.go.tmpl diff --git a/extensions/appprovider/pkg/command/command.go b/extensions/appprovider/pkg/command/command.go index e2cbfd42c2..a3abd22074 100644 --- a/extensions/appprovider/pkg/command/command.go +++ b/extensions/appprovider/pkg/command/command.go @@ -97,9 +97,8 @@ func appProviderConfigFromStruct(c *cli.Context, cfg *config.Config) map[string] "tracing_service_name": c.Command.Name, }, "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, }, "grpc": map[string]interface{}{ "network": cfg.GRPC.Protocol, diff --git a/extensions/appprovider/pkg/config/config.go b/extensions/appprovider/pkg/config/config.go index 9f0c0e9c55..c8be7463a1 100644 --- a/extensions/appprovider/pkg/config/config.go +++ b/extensions/appprovider/pkg/config/config.go @@ -15,10 +15,9 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - ExternalAddr string `yaml:"external_addr"` - Driver string `yaml:"driver"` - Drivers Drivers `yaml:"drivers"` + ExternalAddr string `yaml:"external_addr"` + Driver string `yaml:"driver"` + Drivers Drivers `yaml:"drivers"` } type Tracing struct { @@ -52,17 +51,17 @@ type GRPCConfig struct { } type Drivers struct { - WOPI WOPIDriver + WOPI WOPIDriver `yaml:"wopi" desc:"driver for the CS3org WOPI server"` } type WOPIDriver struct { - AppAPIKey string `yaml:"app_api_key"` - AppDesktopOnly bool `yaml:"app_desktop_only"` - AppIconURI string `yaml:"app_icon_uri"` - AppInternalURL string `yaml:"app_internal_url"` - AppName string `yaml:"app_name"` - AppURL string `yaml:"app_url"` - Insecure bool `yaml:"insecure"` - IopSecret string `yaml:"ipo_secret"` - WopiURL string `yaml:"wopi_url"` + AppAPIKey string `yaml:"app_api_key" env:"APP_PROVIDER_WOPI_APP_API_KEY" desc:"api key for the wopi app"` + AppDesktopOnly bool `yaml:"app_desktop_only" env:"APP_PROVIDER_WOPI_APP_DESKTOP_ONLY" desc:"offer this app only on desktop"` + AppIconURI string `yaml:"app_icon_uri" env:"APP_PROVIDER_WOPI_APP_ICON_URI" desc:"uri to an app icon to be used by clients"` + AppInternalURL string `yaml:"app_internal_url" env:"APP_PROVIDER_WOPI_APP_INTERNAL_URL" desc:"internal url to the app, eg in your DMZ"` + AppName string `yaml:"app_name" env:"APP_PROVIDER_WOPI_APP_NAME" desc:"human readable app name"` + AppURL string `yaml:"app_url" env:"APP_PROVIDER_WOPI_APP_URL" desc:"url for end users to access the app"` + Insecure bool `yaml:"insecure" env:"APP_PROVIDER_WOPI_INSECURE" desc:"allow insecure connections to the app"` + IopSecret string `yaml:"wopi_server_iop_secret" env:"APP_PROVIDER_WOPI_WOPI_SERVER_IOP_SECRET" desc:"shared secret of the CS3org WOPI server"` + WopiURL string `yaml:"wopi_server_external_url" env:"APP_PROVIDER_WOPI_WOPI_SERVER_EXTERNAL_URL" desc:"external url of the CS3org WOPI server"` } From 18296ceea7478cf05fa7bce3389f4ccca4b5063f Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 15:48:06 +0200 Subject: [PATCH 07/50] auth basic config docs --- extensions/auth-basic/pkg/config/config.go | 79 +++++++++++----------- extensions/group/pkg/config/config.go | 20 +++--- extensions/user/pkg/config/config.go | 25 ++++--- 3 files changed, 61 insertions(+), 63 deletions(-) diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index 162903407a..8229ec1894 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -50,61 +50,60 @@ type GRPCConfig struct { } type AuthProviders struct { - JSON JSONProvider `yaml:"json"` // not supported by the oCIS product, therefore not part of docs + JSON JSONProvider `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs LDAP LDAPProvider `yaml:"ldap"` OwnCloudSQL OwnCloudSQLProvider `yaml:"owncloud_sql"` } type JSONProvider struct { - File string `yaml:"file" env:"AUTH_BASIC_JSON_PROVIDER_FILE" desc:"The file to which the json provider writes the data."` + File string `yaml:"file,omitempty"` } type LDAPProvider struct { - URI string `env:"LDAP_URI;AUTH_BASIC_LDAP_URI"` - CACert string `env:"LDAP_CACERT;AUTH_BASIC_LDAP_CACERT"` - Insecure bool `env:"LDAP_INSECURE;AUTH_BASIC_LDAP_INSECURE"` - BindDN string `env:"LDAP_BIND_DN;AUTH_BASIC_LDAP_BIND_DN"` - BindPassword string `yaml:"bind_password" env:"LDAP_BIND_PASSWORD;AUTH_BASIC_LDAP_BIND_PASSWORD"` - UserBaseDN string `env:"LDAP_USER_BASE_DN;AUTH_BASIC_LDAP_USER_BASE_DN"` - GroupBaseDN string `env:"LDAP_GROUP_BASE_DN;AUTH_BASIC_LDAP_GROUP_BASE_DN"` - UserScope string `env:"LDAP_USER_SCOPE;AUTH_BASIC_LDAP_USER_SCOPE"` - GroupScope string `env:"LDAP_GROUP_SCOPE;AUTH_BASIC_LDAP_GROUP_SCOPE"` - UserFilter string `env:"LDAP_USERFILTER;AUTH_BASIC_LDAP_USERFILTER"` - GroupFilter string `env:"LDAP_GROUPFILTER;AUTH_BASIC_LDAP_USERFILTER"` - UserObjectClass string `env:"LDAP_USER_OBJECTCLASS;AUTH_BASIC_LDAP_USER_OBJECTCLASS"` - GroupObjectClass string `env:"LDAP_GROUP_OBJECTCLASS;AUTH_BASIC_LDAP_GROUP_OBJECTCLASS"` - LoginAttributes []string `env:"LDAP_LOGIN_ATTRIBUTES;AUTH_BASIC_LDAP_LOGIN_ATTRIBUTES"` - IDP string `env:"OCIS_URL;AUTH_BASIC_IDP_URL"` // TODO what is this for? - GatewayEndpoint string // TODO do we need this here? - UserSchema LDAPUserSchema - GroupSchema LDAPGroupSchema + URI string `yaml:"uri" env:"LDAP_URI;AUTH_BASIC_LDAP_URI"` + CACert string `yaml:"ca_cert" env:"LDAP_CACERT;AUTH_BASIC_LDAP_CACERT"` + Insecure bool `yaml:"insecure" env:"LDAP_INSECURE;AUTH_BASIC_LDAP_INSECURE"` + BindDN string `yaml:"bind_dn" env:"LDAP_BIND_DN;AUTH_BASIC_LDAP_BIND_DN"` + BindPassword string `yaml:"bind_password" env:"LDAP_BIND_PASSWORD;AUTH_BASIC_LDAP_BIND_PASSWORD"` + UserBaseDN string `yaml:"user_base_dn" env:"LDAP_USER_BASE_DN;AUTH_BASIC_LDAP_USER_BASE_DN"` + GroupBaseDN string `yaml:"group_base_dn" env:"LDAP_GROUP_BASE_DN;AUTH_BASIC_LDAP_GROUP_BASE_DN"` + UserScope string `yaml:"user_scope" env:"LDAP_USER_SCOPE;AUTH_BASIC_LDAP_USER_SCOPE"` + GroupScope string `yaml:"group_scope" env:"LDAP_GROUP_SCOPE;AUTH_BASIC_LDAP_GROUP_SCOPE"` + UserFilter string `yaml:"user_filter" env:"LDAP_USERFILTER;AUTH_BASIC_LDAP_USERFILTER"` + GroupFilter string `yaml:"group_filter" env:"LDAP_GROUPFILTER;AUTH_BASIC_LDAP_USERFILTER"` + UserObjectClass string `yaml:"user_object_filter" env:"LDAP_USER_OBJECTCLASS;AUTH_BASIC_LDAP_USER_OBJECTCLASS"` + GroupObjectClass string `yaml:"group_object_class" env:"LDAP_GROUP_OBJECTCLASS;AUTH_BASIC_LDAP_GROUP_OBJECTCLASS"` + LoginAttributes []string `yaml:"login_attributes" env:"LDAP_LOGIN_ATTRIBUTES;AUTH_BASIC_LDAP_LOGIN_ATTRIBUTES"` + IDP string `yaml:"idp" env:"OCIS_URL;AUTH_BASIC_IDP_URL"` // TODO what is this for? + UserSchema LDAPUserSchema `yaml:"user_schema"` + GroupSchema LDAPGroupSchema `yaml:"group_schema"` } type LDAPUserSchema struct { - ID string `env:"LDAP_USER_SCHEMA_ID;AUTH_BASIC_LDAP_USER_SCHEMA_ID"` - IDIsOctetString bool `env:"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING;AUTH_BASIC_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"` - Mail string `env:"LDAP_USER_SCHEMA_MAIL;AUTH_BASIC_LDAP_USER_SCHEMA_MAIL"` - DisplayName string `env:"LDAP_USER_SCHEMA_DISPLAYNAME;AUTH_BASIC_LDAP_USER_SCHEMA_DISPLAYNAME"` - Username string `env:"LDAP_USER_SCHEMA_USERNAME;AUTH_BASIC_LDAP_USER_SCHEMA_USERNAME"` + ID string `yaml:"id" env:"LDAP_USER_SCHEMA_ID;AUTH_BASIC_LDAP_USER_SCHEMA_ID"` + IDIsOctetString bool `yaml:"id_is_octet_string" env:"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING;AUTH_BASIC_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"` + Mail string `yaml:"mail" env:"LDAP_USER_SCHEMA_MAIL;AUTH_BASIC_LDAP_USER_SCHEMA_MAIL"` + DisplayName string `yaml:"display_name" env:"LDAP_USER_SCHEMA_DISPLAYNAME;AUTH_BASIC_LDAP_USER_SCHEMA_DISPLAYNAME"` + Username string `yaml:"user_name" env:"LDAP_USER_SCHEMA_USERNAME;AUTH_BASIC_LDAP_USER_SCHEMA_USERNAME"` } type LDAPGroupSchema struct { - ID string `env:"LDAP_GROUP_SCHEMA_ID;AUTH_BASIC_LDAP_GROUP_SCHEMA_ID"` - IDIsOctetString bool `env:"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING;AUTH_BASIC_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"` - Mail string `env:"LDAP_GROUP_SCHEMA_MAIL;AUTH_BASIC_LDAP_GROUP_SCHEMA_MAIL"` - DisplayName string `env:"LDAP_GROUP_SCHEMA_DISPLAYNAME;AUTH_BASIC_LDAP_GROUP_SCHEMA_DISPLAYNAME"` - Groupname string `env:"LDAP_GROUP_SCHEMA_GROUPNAME;AUTH_BASIC_LDAP_GROUP_SCHEMA_GROUPNAME"` - Member string `env:"LDAP_GROUP_SCHEMA_MEMBER;AUTH_BASIC_LDAP_GROUP_SCHEMA_MEMBER"` + ID string `yaml:"id" env:"LDAP_GROUP_SCHEMA_ID;AUTH_BASIC_LDAP_GROUP_SCHEMA_ID"` + IDIsOctetString bool `yaml:"id_is_octet_string" env:"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING;AUTH_BASIC_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"` + Mail string `yaml:"mail" env:"LDAP_GROUP_SCHEMA_MAIL;AUTH_BASIC_LDAP_GROUP_SCHEMA_MAIL"` + DisplayName string `yaml:"display_name" env:"LDAP_GROUP_SCHEMA_DISPLAYNAME;AUTH_BASIC_LDAP_GROUP_SCHEMA_DISPLAYNAME"` + Groupname string `yaml:"group_name" env:"LDAP_GROUP_SCHEMA_GROUPNAME;AUTH_BASIC_LDAP_GROUP_SCHEMA_GROUPNAME"` + Member string `yaml:"member" env:"LDAP_GROUP_SCHEMA_MEMBER;AUTH_BASIC_LDAP_GROUP_SCHEMA_MEMBER"` } type OwnCloudSQLProvider struct { - DBUsername string - DBPassword string - DBHost string - DBPort int - DBName string - IDP string // TODO do we need this? - Nobody int64 // TODO what is this? - JoinUsername bool - JoinOwnCloudUUID bool + DBUsername string `yaml:"db_username" env:"AUTH_BASIC_OWNCLOUDSQL_DB_USERNAME"` + DBPassword string `yaml:"db_password" env:"AUTH_BASIC_OWNCLOUDSQL_DB_PASSWORD"` + DBHost string `yaml:"db_host" env:"AUTH_BASIC_OWNCLOUDSQL_DB_HOST"` + DBPort int `yaml:"db_port" env:"AUTH_BASIC_OWNCLOUDSQL_DB_PORT"` + DBName string `yaml:"db_name" env:"AUTH_BASIC_OWNCLOUDSQL_DB_NAME"` + IDP string `yaml:"idp" env:"AUTH_BASIC_OWNCLOUDSQL_IDP"` // TODO do we need this? + Nobody int64 `yaml:"nobody" env:"AUTH_BASIC_OWNCLOUDSQL_NOBODY"` // TODO what is this? + JoinUsername bool `yaml:"join_username" env:"AUTH_BASIC_OWNCLOUDSQL_JOIN_USERNAME"` + JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid" env:"AUTH_BASIC_OWNCLOUDSQL_JOIN_OWNCLOUD_UUID"` } diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index ceece55452..5d485df52e 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -99,16 +99,16 @@ type LDAPGroupSchema struct { } type OwnCloudSQLDriver struct { - DBUsername string - DBPassword string - DBHost string - DBPort int - DBName string - IDP string // TODO do we need this? - Nobody int64 // TODO what is this? - JoinUsername bool - JoinOwnCloudUUID bool - EnableMedialSearch bool + DBUsername string `yaml:"db_username" env:"GROUPS_OWNCLOUDSQL_DB_USERNAME"` + DBPassword string `yaml:"db_password" env:"GROUPS_OWNCLOUDSQL_DB_PASSWORD"` + DBHost string `yaml:"db_host" env:"GROUPS_OWNCLOUDSQL_DB_HOST"` + DBPort int `yaml:"db_port" env:"GROUPS_OWNCLOUDSQL_DB_PORT"` + DBName string `yaml:"db_name" env:"GROUPS_OWNCLOUDSQL_DB_NAME"` + IDP string `yaml:"idp" env:"GROUPS_OWNCLOUDSQL_IDP"` // TODO do we need this? + Nobody int64 `yaml:"nobody" env:"GROUPS_OWNCLOUDSQL_NOBODY"` // TODO what is this? + JoinUsername bool `yaml:"join_username" env:"GROUPS_OWNCLOUDSQL_JOIN_USERNAME"` + JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid" env:"GROUPS_OWNCLOUDSQL_JOIN_OWNCLOUD_UUID"` + EnableMedialSearch bool `yaml:"enable_medial_search" env:"GROUPS_OWNCLOUDSQL_ENABLE_MEDIAL_SEARCH"` } type RESTProvider struct { diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index 8a22724384..15c0bcd121 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -51,10 +51,10 @@ type GRPCConfig struct { } type Drivers struct { - JSON JSONDriver // not supported by the oCIS product, therefore not part of docs LDAP LDAPDriver OwnCloudSQL OwnCloudSQLDriver - REST RESTProvider // not supported by the oCIS product, therefore not part of docs + JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs + REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs } type JSONDriver struct { @@ -76,7 +76,6 @@ type LDAPDriver struct { GroupObjectClass string `env:"LDAP_GROUP_OBJECTCLASS;USERS_LDAP_GROUP_OBJECTCLASS"` LoginAttributes []string `env:"LDAP_LOGIN_ATTRIBUTES;USERS_LDAP_LOGIN_ATTRIBUTES"` IDP string `env:"OCIS_URL;USERS_IDP_URL"` // TODO what is this for? - GatewayEndpoint string // TODO do we need this here? UserSchema LDAPUserSchema GroupSchema LDAPGroupSchema } @@ -99,16 +98,16 @@ type LDAPGroupSchema struct { } type OwnCloudSQLDriver struct { - DBUsername string - DBPassword string - DBHost string - DBPort int - DBName string - IDP string // TODO do we need this? - Nobody int64 // TODO what is this? - JoinUsername bool - JoinOwnCloudUUID bool - EnableMedialSearch bool + DBUsername string `yaml:"db_username" env:"USERS_OWNCLOUDSQL_DB_USERNAME"` + DBPassword string `yaml:"db_password" env:"USERS_OWNCLOUDSQL_DB_PASSWORD"` + DBHost string `yaml:"db_host" env:"USERS_OWNCLOUDSQL_DB_HOST"` + DBPort int `yaml:"db_port" env:"USERS_OWNCLOUDSQL_DB_PORT"` + DBName string `yaml:"db_name" env:"USERS_OWNCLOUDSQL_DB_NAME"` + IDP string `yaml:"idp" env:"USERS_OWNCLOUDSQL_IDP"` // TODO do we need this? + Nobody int64 `yaml:"nobody" env:"USERS_OWNCLOUDSQL_NOBODY"` // TODO what is this? + JoinUsername bool `yaml:"join_username" env:"USERS_OWNCLOUDSQL_JOIN_USERNAME"` + JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid" env:"USERS_OWNCLOUDSQL_JOIN_OWNCLOUD_UUID"` + EnableMedialSearch bool `yaml:"enable_medial_search" env:"USERS_OWNCLOUDSQL_ENABLE_MEDIAL_SEARCH"` } type RESTProvider struct { From b35178584b0903ea47df9a743043546ebc85486e Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 16:25:55 +0200 Subject: [PATCH 08/50] auth bearer config docs --- extensions/auth-bearer/pkg/command/command.go | 13 ++++++------- extensions/auth-bearer/pkg/config/config.go | 17 ++++++----------- .../pkg/config/defaults/defaultconfig.go | 11 ++++------- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/extensions/auth-bearer/pkg/command/command.go b/extensions/auth-bearer/pkg/command/command.go index 4274fb4e7f..c5204321bb 100644 --- a/extensions/auth-bearer/pkg/command/command.go +++ b/extensions/auth-bearer/pkg/command/command.go @@ -106,17 +106,16 @@ func authBearerConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]i "grpc": map[string]interface{}{ "network": cfg.GRPC.Protocol, "address": cfg.GRPC.Addr, - // TODO build services dynamically "services": map[string]interface{}{ "authprovider": map[string]interface{}{ - "auth_manager": cfg.AuthProvider, + "auth_manager": "oidc", "auth_managers": map[string]interface{}{ "oidc": map[string]interface{}{ - "issuer": cfg.AuthProviders.OIDC.Issuer, - "insecure": cfg.AuthProviders.OIDC.Insecure, - "id_claim": cfg.AuthProviders.OIDC.IDClaim, - "uid_claim": cfg.AuthProviders.OIDC.UIDClaim, - "gid_claim": cfg.AuthProviders.OIDC.GIDClaim, + "issuer": cfg.OIDC.Issuer, + "insecure": cfg.OIDC.Insecure, + "id_claim": cfg.OIDC.IDClaim, + "uid_claim": cfg.OIDC.UIDClaim, + "gid_claim": cfg.OIDC.GIDClaim, }, }, }, diff --git a/extensions/auth-bearer/pkg/config/config.go b/extensions/auth-bearer/pkg/config/config.go index 984ac37984..8af579f5c0 100644 --- a/extensions/auth-bearer/pkg/config/config.go +++ b/extensions/auth-bearer/pkg/config/config.go @@ -15,9 +15,8 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - AuthProvider string `yaml:"auth_provider" env:"AUTH_BEARER_AUTH_PROVIDER" desc:"The auth provider which should be used by the service"` - AuthProviders AuthProviders `yaml:"auth_providers"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + OIDC OIDC `yaml:"oidc"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;AUTH_BEARER_TRACING_ENABLED" desc:"Activates tracing."` @@ -49,14 +48,10 @@ type GRPCConfig struct { Protocol string `yaml:"protocol" env:"AUTH_BEARER_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } -type AuthProviders struct { - OIDC OIDCProvider `yaml:"oidc"` -} - -type OIDCProvider struct { +type OIDC struct { Issuer string `yaml:"issuer" env:"OCIS_URL;AUTH_BEARER_OIDC_ISSUER"` Insecure bool `yaml:"insecure" env:"OCIS_INSECURE;AUTH_BEARER_OIDC_INSECURE"` - IDClaim string `yaml:"id_claim"` - UIDClaim string `yaml:"uid_claim"` - GIDClaim string `yaml:"gid_claim"` + IDClaim string `yaml:"id_claim" env:"AUTH_BEARER_OIDC_ID_CLAIM"` + UIDClaim string `yaml:"uid_claim" env:"AUTH_BEARER_OIDC_UID_CLAIM"` + GIDClaim string `yaml:"gid_claim" env:"AUTH_BEARER_OIDC_GID_CLAIM"` } diff --git a/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go b/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go index 59d0acd706..1e3d500cb5 100644 --- a/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go +++ b/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go @@ -29,13 +29,10 @@ func DefaultConfig() *config.Config { Reva: &config.Reva{ Address: "127.0.0.1:9142", }, - AuthProvider: "ldap", - AuthProviders: config.AuthProviders{ - OIDC: config.OIDCProvider{ - Issuer: "https://localhost:9200", - Insecure: false, - IDClaim: "preferred_username", - }, + OIDC: config.OIDC{ + Issuer: "https://localhost:9200", + Insecure: false, + IDClaim: "preferred_username", }, } } From f643de22c4289b69b22871091d4e155f5ff72a25 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Mon, 2 May 2022 16:35:48 +0200 Subject: [PATCH 09/50] machine auth config docs --- extensions/auth-machine/pkg/command/command.go | 3 +-- extensions/auth-machine/pkg/config/config.go | 13 ++----------- .../pkg/config/defaults/defaultconfig.go | 5 ++--- extensions/auth-machine/pkg/config/parser/parse.go | 2 +- 4 files changed, 6 insertions(+), 17 deletions(-) diff --git a/extensions/auth-machine/pkg/command/command.go b/extensions/auth-machine/pkg/command/command.go index 674c7b220f..1e79ac6689 100644 --- a/extensions/auth-machine/pkg/command/command.go +++ b/extensions/auth-machine/pkg/command/command.go @@ -106,13 +106,12 @@ func authMachineConfigFromStruct(c *cli.Context, cfg *config.Config) map[string] "grpc": map[string]interface{}{ "network": cfg.GRPC.Protocol, "address": cfg.GRPC.Addr, - // TODO build services dynamically "services": map[string]interface{}{ "authprovider": map[string]interface{}{ "auth_manager": "machine", "auth_managers": map[string]interface{}{ "machine": map[string]interface{}{ - "api_key": cfg.AuthProviders.Machine.APIKey, + "api_key": cfg.MachineAuthAPIKey, "gateway_addr": cfg.Reva.Address, }, }, diff --git a/extensions/auth-machine/pkg/config/config.go b/extensions/auth-machine/pkg/config/config.go index 19ff424c9b..4d145eed03 100644 --- a/extensions/auth-machine/pkg/config/config.go +++ b/extensions/auth-machine/pkg/config/config.go @@ -15,9 +15,8 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - AuthProvider string `yaml:"auth_provider" env:"AUTH_MACHINE_AUTH_PROVIDER" desc:"The auth provider which should be used by the service"` - AuthProviders AuthProviders `yaml:"auth_providers"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;AUTH_MACHINE_API_KEY"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;AUTH_MACHINE_TRACING_ENABLED" desc:"Activates tracing."` @@ -48,11 +47,3 @@ type GRPCConfig struct { Addr string `yaml:"addr" env:"AUTH_MACHINE_GRPC_ADDR" desc:"The address of the grpc service."` Protocol string `yaml:"protocol" env:"AUTH_MACHINE_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } - -type AuthProviders struct { - Machine MachineProvider `yaml:"machine"` -} - -type MachineProvider struct { - APIKey string `yaml:"api_key" env:"OCIS_MACHINE_AUTH_API_KEY;AUTH_MACHINE_PROVIDER_API_KEY" desc:"The api key for the machine auth provider."` -} diff --git a/extensions/auth-machine/pkg/config/defaults/defaultconfig.go b/extensions/auth-machine/pkg/config/defaults/defaultconfig.go index 47b0f1a16a..7a102f4d26 100644 --- a/extensions/auth-machine/pkg/config/defaults/defaultconfig.go +++ b/extensions/auth-machine/pkg/config/defaults/defaultconfig.go @@ -29,7 +29,6 @@ func DefaultConfig() *config.Config { Reva: &config.Reva{ Address: "127.0.0.1:9142", }, - AuthProvider: "ldap", } } @@ -73,8 +72,8 @@ func EnsureDefaults(cfg *config.Config) { cfg.TokenManager = &config.TokenManager{} } - if cfg.AuthProviders.Machine.APIKey == "" && cfg.Commons != nil && cfg.Commons.MachineAuthAPIKey != "" { - cfg.AuthProviders.Machine.APIKey = cfg.Commons.MachineAuthAPIKey + if cfg.MachineAuthAPIKey == "" && cfg.Commons != nil && cfg.Commons.MachineAuthAPIKey != "" { + cfg.MachineAuthAPIKey = cfg.Commons.MachineAuthAPIKey } } diff --git a/extensions/auth-machine/pkg/config/parser/parse.go b/extensions/auth-machine/pkg/config/parser/parse.go index 2eb535806b..00a46b8469 100644 --- a/extensions/auth-machine/pkg/config/parser/parse.go +++ b/extensions/auth-machine/pkg/config/parser/parse.go @@ -38,7 +38,7 @@ func Validate(cfg *config.Config) error { return shared.MissingJWTTokenError(cfg.Service.Name) } - if cfg.AuthProviders.Machine.APIKey == "" { + if cfg.MachineAuthAPIKey == "" { return shared.MissingMachineAuthApiKeyError(cfg.Service.Name) } return nil From 977c4fd9e99488cd07ebdfb4aec682b3e216d4c8 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 10:59:52 +0200 Subject: [PATCH 10/50] ensure commands for all services --- .../appprovider/cmd/appprovider/main.go | 14 + extensions/appprovider/pkg/command/command.go | 165 ----------- extensions/appprovider/pkg/command/health.go | 57 ++++ extensions/appprovider/pkg/command/root.go | 64 +++++ extensions/appprovider/pkg/command/server.go | 107 +++++++ extensions/appprovider/pkg/command/version.go | 50 ++++ extensions/appprovider/pkg/config/config.go | 19 +- .../pkg/config/defaults/defaultconfig.go | 13 +- extensions/appprovider/pkg/logging/logging.go | 17 ++ .../appprovider/pkg/revaconfig/config.go | 47 +++ extensions/appprovider/pkg/tracing/tracing.go | 18 ++ extensions/audit/pkg/command/root.go | 2 +- extensions/auth-basic/cmd/auth-basic/main.go | 14 + extensions/auth-basic/pkg/command/command.go | 223 --------------- extensions/auth-basic/pkg/command/health.go | 57 ++++ extensions/auth-basic/pkg/command/root.go | 64 +++++ extensions/auth-basic/pkg/command/server.go | 120 ++++++++ extensions/auth-basic/pkg/command/version.go | 50 ++++ extensions/auth-basic/pkg/config/config.go | 19 +- .../pkg/config/defaults/defaultconfig.go | 9 +- extensions/auth-basic/pkg/logging/logging.go | 17 ++ .../auth-basic/pkg/revaconfig/config.go | 83 ++++++ extensions/auth-basic/pkg/tracing/tracing.go | 18 ++ .../auth-bearer/cmd/auth-bearer/main.go | 14 + extensions/auth-bearer/pkg/Makefile | 37 --- extensions/auth-bearer/pkg/command/command.go | 160 ----------- extensions/auth-bearer/pkg/command/health.go | 57 ++++ extensions/auth-bearer/pkg/command/root.go | 64 +++++ extensions/auth-bearer/pkg/command/server.go | 107 +++++++ extensions/auth-bearer/pkg/command/version.go | 50 ++++ extensions/auth-bearer/pkg/config/config.go | 19 +- .../pkg/config/defaults/defaultconfig.go | 13 +- extensions/auth-bearer/pkg/logging/logging.go | 17 ++ .../auth-bearer/pkg/revaconfig/config.go | 38 +++ extensions/auth-bearer/pkg/tracing/tracing.go | 18 ++ .../auth-machine/cmd/auth-machine/main.go | 14 + extensions/auth-machine/pkg/Makefile | 37 --- .../auth-machine/pkg/command/command.go | 158 ----------- extensions/auth-machine/pkg/command/health.go | 57 ++++ extensions/auth-machine/pkg/command/root.go | 64 +++++ extensions/auth-machine/pkg/command/server.go | 107 +++++++ .../auth-machine/pkg/command/version.go | 50 ++++ extensions/auth-machine/pkg/config/config.go | 19 +- .../pkg/config/defaults/defaultconfig.go | 13 +- .../auth-machine/pkg/logging/logging.go | 17 ++ .../auth-machine/pkg/revaconfig/config.go | 37 +++ .../auth-machine/pkg/tracing/tracing.go | 18 ++ extensions/frontend/cmd/frontend/main.go | 14 + extensions/frontend/pkg/Makefile | 37 --- extensions/frontend/pkg/command/health.go | 57 ++++ extensions/frontend/pkg/command/root.go | 64 +++++ extensions/frontend/pkg/command/server.go | 107 +++++++ extensions/frontend/pkg/command/version.go | 50 ++++ extensions/frontend/pkg/config/config.go | 12 +- .../pkg/config/defaults/defaultconfig.go | 15 +- extensions/frontend/pkg/logging/logging.go | 17 ++ .../command.go => revaconfig/config.go} | 214 +++----------- extensions/frontend/pkg/tracing/tracing.go | 18 ++ extensions/gateway/cmd/gateway/main.go | 14 + extensions/gateway/pkg/Makefile | 37 --- extensions/gateway/pkg/command/health.go | 57 ++++ extensions/gateway/pkg/command/root.go | 64 +++++ extensions/gateway/pkg/command/server.go | 102 +++++++ extensions/gateway/pkg/command/version.go | 50 ++++ extensions/gateway/pkg/config/config.go | 25 +- .../pkg/config/defaults/defaultconfig.go | 13 +- extensions/gateway/pkg/logging/logging.go | 17 ++ .../command.go => revaconfig/config.go} | 152 +--------- extensions/gateway/pkg/tracing/tracing.go | 18 ++ extensions/group/cmd/group/main.go | 14 + extensions/group/pkg/Makefile | 37 --- extensions/group/pkg/command/command.go | 222 --------------- extensions/group/pkg/command/health.go | 57 ++++ extensions/group/pkg/command/root.go | 64 +++++ extensions/group/pkg/command/server.go | 120 ++++++++ extensions/group/pkg/command/version.go | 50 ++++ extensions/group/pkg/config/config.go | 19 +- .../pkg/config/defaults/defaultconfig.go | 13 +- extensions/group/pkg/logging/logging.go | 17 ++ extensions/group/pkg/revaconfig/config.go | 85 ++++++ extensions/group/pkg/tracing/tracing.go | 18 ++ extensions/nats/pkg/command/root.go | 2 +- extensions/ocdav/cmd/ocdav/main.go | 14 + extensions/ocdav/pkg/Makefile | 37 --- extensions/ocdav/pkg/command/health.go | 57 ++++ extensions/ocdav/pkg/command/ocdav.go | 142 ---------- extensions/ocdav/pkg/command/root.go | 64 +++++ extensions/ocdav/pkg/command/server.go | 98 +++++++ extensions/ocdav/pkg/command/version.go | 50 ++++ extensions/ocdav/pkg/config/config.go | 20 +- .../pkg/config/defaults/defaultconfig.go | 15 +- extensions/ocdav/pkg/logging/logging.go | 17 ++ extensions/ocdav/pkg/tracing/tracing.go | 18 ++ extensions/sharing/cmd/sharing/main.go | 14 + extensions/sharing/pkg/Makefile | 37 --- extensions/sharing/pkg/command/health.go | 57 ++++ extensions/sharing/pkg/command/root.go | 64 +++++ extensions/sharing/pkg/command/server.go | 107 +++++++ extensions/sharing/pkg/command/version.go | 50 ++++ extensions/sharing/pkg/config/config.go | 19 +- .../pkg/config/defaults/defaultconfig.go | 13 +- extensions/sharing/pkg/logging/logging.go | 17 ++ .../command.go => revaconfig/config.go} | 144 +--------- extensions/sharing/pkg/tracing/tracing.go | 18 ++ .../cmd/storage-metadata/main.go | 14 + extensions/storage-metadata/pkg/Makefile | 37 --- .../storage-metadata/pkg/command/command.go | 267 ------------------ .../storage-metadata/pkg/command/health.go | 57 ++++ .../storage-metadata/pkg/command/root.go | 64 +++++ .../storage-metadata/pkg/command/server.go | 118 ++++++++ .../storage-metadata/pkg/command/version.go | 50 ++++ .../storage-metadata/pkg/config/config.go | 20 +- .../pkg/config/defaults/defaultconfig.go | 18 +- .../storage-metadata/pkg/logging/logging.go | 17 ++ .../storage-metadata/pkg/revaconfig/config.go | 118 ++++++++ .../storage-metadata/pkg/tracing/tracing.go | 18 ++ .../cmd/storage-publiclink/main.go | 14 + extensions/storage-publiclink/pkg/Makefile | 37 --- .../storage-publiclink/pkg/command/health.go | 57 ++++ .../storage-publiclink/pkg/command/root.go | 64 +++++ .../storage-publiclink/pkg/command/server.go | 107 +++++++ .../pkg/command/storagepubliclink.go | 165 ----------- .../storage-publiclink/pkg/command/version.go | 50 ++++ .../storage-publiclink/pkg/config/config.go | 15 +- .../pkg/config/defaults/defaultconfig.go | 13 +- .../storage-publiclink/pkg/logging/logging.go | 17 ++ .../pkg/revaconfig/config.go | 44 +++ .../storage-publiclink/pkg/tracing/tracing.go | 18 ++ .../storage-shares/cmd/storage-shares/main.go | 14 + extensions/storage-shares/pkg/Makefile | 37 --- .../storage-shares/pkg/command/command.go | 161 ----------- .../storage-shares/pkg/command/health.go | 57 ++++ extensions/storage-shares/pkg/command/root.go | 64 +++++ .../storage-shares/pkg/command/server.go | 107 +++++++ .../storage-shares/pkg/command/version.go | 50 ++++ .../storage-shares/pkg/config/config.go | 26 +- .../pkg/config/defaults/defaultconfig.go | 17 +- .../storage-shares/pkg/logging/logging.go | 17 ++ .../storage-shares/pkg/revaconfig/config.go | 38 +++ .../storage-shares/pkg/tracing/tracing.go | 18 ++ .../storage-users/cmd/storage-users/main.go | 14 + extensions/storage-users/pkg/Makefile | 37 --- .../storage-users/pkg/command/command.go | 189 ------------- .../storage-users/pkg/command/health.go | 57 ++++ extensions/storage-users/pkg/command/root.go | 64 +++++ .../storage-users/pkg/command/server.go | 107 +++++++ .../storage-users/pkg/command/version.go | 50 ++++ extensions/storage-users/pkg/config/config.go | 22 +- .../pkg/config/defaults/defaultconfig.go | 20 +- .../storage-users/pkg/logging/logging.go | 17 ++ .../storage-users/pkg/revaconfig/config.go | 67 +++++ .../pkg/{config => revaconfig}/user.go | 6 +- .../storage-users/pkg/tracing/tracing.go | 18 ++ extensions/user/cmd/user/main.go | 14 + extensions/user/pkg/Makefile | 37 --- extensions/user/pkg/command/health.go | 57 ++++ extensions/user/pkg/command/root.go | 64 +++++ extensions/user/pkg/command/server.go | 120 ++++++++ extensions/user/pkg/command/version.go | 50 ++++ extensions/user/pkg/config/config.go | 19 +- .../user/pkg/config/defaults/defaultconfig.go | 13 +- extensions/user/pkg/logging/logging.go | 17 ++ .../command.go => revaconfig/config.go} | 151 +--------- extensions/user/pkg/tracing/tracing.go | 18 ++ extensions/webdav/pkg/command/root.go | 2 +- ocis-pkg/service/external/external.go | 57 +++- .../{storageappprovider.go => appprovider.go} | 15 +- .../{storageauthbasic.go => auth-basic.go} | 15 +- .../{storageauthbearer.go => auth-bearer.go} | 15 +- ...{storageauthmachine.go => auth-machine.go} | 15 +- ocis/pkg/command/common.go | 13 - .../{storagefrontend.go => frontend.go} | 15 +- .../command/{storagegateway.go => gateway.go} | 15 +- .../{storagegroupprovider.go => group.go} | 15 +- ocis/pkg/command/ocdav.go | 11 +- .../command/{storagesharing.go => sharing.go} | 15 +- ...storagemetadata.go => storage-metadata.go} | 11 +- ...agepubliclink.go => storage-publiclink.go} | 11 +- .../{storageshares.go => storage-shares.go} | 11 +- ocis/pkg/command/storage-users.go | 33 +++ ocis/pkg/command/storageusers.go | 25 -- .../{storageuserprovider.go => user.go} | 17 +- ocis/pkg/init/init.go | 6 +- ocis/pkg/runtime/service/service.go | 32 +-- 184 files changed, 5690 insertions(+), 3268 deletions(-) create mode 100644 extensions/appprovider/cmd/appprovider/main.go delete mode 100644 extensions/appprovider/pkg/command/command.go create mode 100644 extensions/appprovider/pkg/command/health.go create mode 100644 extensions/appprovider/pkg/command/root.go create mode 100644 extensions/appprovider/pkg/command/server.go create mode 100644 extensions/appprovider/pkg/command/version.go create mode 100644 extensions/appprovider/pkg/logging/logging.go create mode 100644 extensions/appprovider/pkg/revaconfig/config.go create mode 100644 extensions/appprovider/pkg/tracing/tracing.go create mode 100644 extensions/auth-basic/cmd/auth-basic/main.go delete mode 100644 extensions/auth-basic/pkg/command/command.go create mode 100644 extensions/auth-basic/pkg/command/health.go create mode 100644 extensions/auth-basic/pkg/command/root.go create mode 100644 extensions/auth-basic/pkg/command/server.go create mode 100644 extensions/auth-basic/pkg/command/version.go create mode 100644 extensions/auth-basic/pkg/logging/logging.go create mode 100644 extensions/auth-basic/pkg/revaconfig/config.go create mode 100644 extensions/auth-basic/pkg/tracing/tracing.go create mode 100644 extensions/auth-bearer/cmd/auth-bearer/main.go delete mode 100644 extensions/auth-bearer/pkg/Makefile delete mode 100644 extensions/auth-bearer/pkg/command/command.go create mode 100644 extensions/auth-bearer/pkg/command/health.go create mode 100644 extensions/auth-bearer/pkg/command/root.go create mode 100644 extensions/auth-bearer/pkg/command/server.go create mode 100644 extensions/auth-bearer/pkg/command/version.go create mode 100644 extensions/auth-bearer/pkg/logging/logging.go create mode 100644 extensions/auth-bearer/pkg/revaconfig/config.go create mode 100644 extensions/auth-bearer/pkg/tracing/tracing.go create mode 100644 extensions/auth-machine/cmd/auth-machine/main.go delete mode 100644 extensions/auth-machine/pkg/Makefile delete mode 100644 extensions/auth-machine/pkg/command/command.go create mode 100644 extensions/auth-machine/pkg/command/health.go create mode 100644 extensions/auth-machine/pkg/command/root.go create mode 100644 extensions/auth-machine/pkg/command/server.go create mode 100644 extensions/auth-machine/pkg/command/version.go create mode 100644 extensions/auth-machine/pkg/logging/logging.go create mode 100644 extensions/auth-machine/pkg/revaconfig/config.go create mode 100644 extensions/auth-machine/pkg/tracing/tracing.go create mode 100644 extensions/frontend/cmd/frontend/main.go delete mode 100644 extensions/frontend/pkg/Makefile create mode 100644 extensions/frontend/pkg/command/health.go create mode 100644 extensions/frontend/pkg/command/root.go create mode 100644 extensions/frontend/pkg/command/server.go create mode 100644 extensions/frontend/pkg/command/version.go create mode 100644 extensions/frontend/pkg/logging/logging.go rename extensions/frontend/pkg/{command/command.go => revaconfig/config.go} (55%) create mode 100644 extensions/frontend/pkg/tracing/tracing.go create mode 100644 extensions/gateway/cmd/gateway/main.go delete mode 100644 extensions/gateway/pkg/Makefile create mode 100644 extensions/gateway/pkg/command/health.go create mode 100644 extensions/gateway/pkg/command/root.go create mode 100644 extensions/gateway/pkg/command/server.go create mode 100644 extensions/gateway/pkg/command/version.go create mode 100644 extensions/gateway/pkg/logging/logging.go rename extensions/gateway/pkg/{command/command.go => revaconfig/config.go} (73%) create mode 100644 extensions/gateway/pkg/tracing/tracing.go create mode 100644 extensions/group/cmd/group/main.go delete mode 100644 extensions/group/pkg/Makefile delete mode 100644 extensions/group/pkg/command/command.go create mode 100644 extensions/group/pkg/command/health.go create mode 100644 extensions/group/pkg/command/root.go create mode 100644 extensions/group/pkg/command/server.go create mode 100644 extensions/group/pkg/command/version.go create mode 100644 extensions/group/pkg/logging/logging.go create mode 100644 extensions/group/pkg/revaconfig/config.go create mode 100644 extensions/group/pkg/tracing/tracing.go create mode 100644 extensions/ocdav/cmd/ocdav/main.go delete mode 100644 extensions/ocdav/pkg/Makefile create mode 100644 extensions/ocdav/pkg/command/health.go delete mode 100644 extensions/ocdav/pkg/command/ocdav.go create mode 100644 extensions/ocdav/pkg/command/root.go create mode 100644 extensions/ocdav/pkg/command/server.go create mode 100644 extensions/ocdav/pkg/command/version.go create mode 100644 extensions/ocdav/pkg/logging/logging.go create mode 100644 extensions/ocdav/pkg/tracing/tracing.go create mode 100644 extensions/sharing/cmd/sharing/main.go delete mode 100644 extensions/sharing/pkg/Makefile create mode 100644 extensions/sharing/pkg/command/health.go create mode 100644 extensions/sharing/pkg/command/root.go create mode 100644 extensions/sharing/pkg/command/server.go create mode 100644 extensions/sharing/pkg/command/version.go create mode 100644 extensions/sharing/pkg/logging/logging.go rename extensions/sharing/pkg/{command/command.go => revaconfig/config.go} (57%) create mode 100644 extensions/sharing/pkg/tracing/tracing.go create mode 100644 extensions/storage-metadata/cmd/storage-metadata/main.go delete mode 100644 extensions/storage-metadata/pkg/Makefile delete mode 100644 extensions/storage-metadata/pkg/command/command.go create mode 100644 extensions/storage-metadata/pkg/command/health.go create mode 100644 extensions/storage-metadata/pkg/command/root.go create mode 100644 extensions/storage-metadata/pkg/command/server.go create mode 100644 extensions/storage-metadata/pkg/command/version.go create mode 100644 extensions/storage-metadata/pkg/logging/logging.go create mode 100644 extensions/storage-metadata/pkg/revaconfig/config.go create mode 100644 extensions/storage-metadata/pkg/tracing/tracing.go create mode 100644 extensions/storage-publiclink/cmd/storage-publiclink/main.go delete mode 100644 extensions/storage-publiclink/pkg/Makefile create mode 100644 extensions/storage-publiclink/pkg/command/health.go create mode 100644 extensions/storage-publiclink/pkg/command/root.go create mode 100644 extensions/storage-publiclink/pkg/command/server.go delete mode 100644 extensions/storage-publiclink/pkg/command/storagepubliclink.go create mode 100644 extensions/storage-publiclink/pkg/command/version.go create mode 100644 extensions/storage-publiclink/pkg/logging/logging.go create mode 100644 extensions/storage-publiclink/pkg/revaconfig/config.go create mode 100644 extensions/storage-publiclink/pkg/tracing/tracing.go create mode 100644 extensions/storage-shares/cmd/storage-shares/main.go delete mode 100644 extensions/storage-shares/pkg/Makefile delete mode 100644 extensions/storage-shares/pkg/command/command.go create mode 100644 extensions/storage-shares/pkg/command/health.go create mode 100644 extensions/storage-shares/pkg/command/root.go create mode 100644 extensions/storage-shares/pkg/command/server.go create mode 100644 extensions/storage-shares/pkg/command/version.go create mode 100644 extensions/storage-shares/pkg/logging/logging.go create mode 100644 extensions/storage-shares/pkg/revaconfig/config.go create mode 100644 extensions/storage-shares/pkg/tracing/tracing.go create mode 100644 extensions/storage-users/cmd/storage-users/main.go delete mode 100644 extensions/storage-users/pkg/Makefile delete mode 100644 extensions/storage-users/pkg/command/command.go create mode 100644 extensions/storage-users/pkg/command/health.go create mode 100644 extensions/storage-users/pkg/command/root.go create mode 100644 extensions/storage-users/pkg/command/server.go create mode 100644 extensions/storage-users/pkg/command/version.go create mode 100644 extensions/storage-users/pkg/logging/logging.go create mode 100644 extensions/storage-users/pkg/revaconfig/config.go rename extensions/storage-users/pkg/{config => revaconfig}/user.go (97%) create mode 100644 extensions/storage-users/pkg/tracing/tracing.go create mode 100644 extensions/user/cmd/user/main.go delete mode 100644 extensions/user/pkg/Makefile create mode 100644 extensions/user/pkg/command/health.go create mode 100644 extensions/user/pkg/command/root.go create mode 100644 extensions/user/pkg/command/server.go create mode 100644 extensions/user/pkg/command/version.go create mode 100644 extensions/user/pkg/logging/logging.go rename extensions/user/pkg/{command/command.go => revaconfig/config.go} (50%) create mode 100644 extensions/user/pkg/tracing/tracing.go rename ocis/pkg/command/{storageappprovider.go => appprovider.go} (56%) rename ocis/pkg/command/{storageauthbasic.go => auth-basic.go} (56%) rename ocis/pkg/command/{storageauthbearer.go => auth-bearer.go} (56%) rename ocis/pkg/command/{storageauthmachine.go => auth-machine.go} (56%) rename ocis/pkg/command/{storagefrontend.go => frontend.go} (57%) rename ocis/pkg/command/{storagegateway.go => gateway.go} (58%) rename ocis/pkg/command/{storagegroupprovider.go => group.go} (55%) rename ocis/pkg/command/{storagesharing.go => sharing.go} (57%) rename ocis/pkg/command/{storagemetadata.go => storage-metadata.go} (67%) rename ocis/pkg/command/{storagepubliclink.go => storage-publiclink.go} (67%) rename ocis/pkg/command/{storageshares.go => storage-shares.go} (67%) create mode 100644 ocis/pkg/command/storage-users.go delete mode 100644 ocis/pkg/command/storageusers.go rename ocis/pkg/command/{storageuserprovider.go => user.go} (51%) diff --git a/extensions/appprovider/cmd/appprovider/main.go b/extensions/appprovider/cmd/appprovider/main.go new file mode 100644 index 0000000000..decb2d8f3e --- /dev/null +++ b/extensions/appprovider/cmd/appprovider/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/appprovider/pkg/command" + "github.com/owncloud/ocis/extensions/appprovider/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/appprovider/pkg/command/command.go b/extensions/appprovider/pkg/command/command.go deleted file mode 100644 index a3abd22074..0000000000 --- a/extensions/appprovider/pkg/command/command.go +++ /dev/null @@ -1,165 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/appprovider/pkg/config" - "github.com/owncloud/ocis/extensions/appprovider/pkg/config/parser" - "github.com/owncloud/ocis/extensions/appprovider/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// AppProvider is the entrypoint for the app provider command. -func AppProvider(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "app-provider", - Usage: "start appprovider for providing apps", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := appProviderConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// appProviderConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func appProviderConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - // TODO build services dynamically - "services": map[string]interface{}{ - "appprovider": map[string]interface{}{ - "app_provider_url": cfg.ExternalAddr, - "driver": cfg.Driver, - "drivers": map[string]interface{}{ - "wopi": map[string]interface{}{ - "app_api_key": cfg.Drivers.WOPI.AppAPIKey, - "app_desktop_only": cfg.Drivers.WOPI.AppDesktopOnly, - "app_icon_uri": cfg.Drivers.WOPI.AppIconURI, - "app_int_url": cfg.Drivers.WOPI.AppInternalURL, - "app_name": cfg.Drivers.WOPI.AppName, - "app_url": cfg.Drivers.WOPI.AppURL, - "insecure_connections": cfg.Drivers.WOPI.Insecure, - "iop_secret": cfg.Drivers.WOPI.IopSecret, - "jwt_secret": cfg.TokenManager.JWTSecret, - "wopi_url": cfg.Drivers.WOPI.WopiURL, - }, - }, - }, - }, - }, - } - return rcfg -} - -// AppProviderSutureService allows for the app-provider command to be embedded and supervised by a suture supervisor tree. -type AppProviderSutureService struct { - cfg *config.Config -} - -// NewAppProvider creates a new store.AppProviderSutureService -func NewAppProvider(cfg *ociscfg.Config) suture.Service { - cfg.AppProvider.Commons = cfg.Commons - return AppProviderSutureService{ - cfg: cfg.AppProvider, - } -} - -func (s AppProviderSutureService) Serve(ctx context.Context) error { - cmd := AppProvider(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/appprovider/pkg/command/health.go b/extensions/appprovider/pkg/command/health.go new file mode 100644 index 0000000000..4306bbf926 --- /dev/null +++ b/extensions/appprovider/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/extensions/appprovider/pkg/config/parser" + "github.com/owncloud/ocis/extensions/appprovider/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/appprovider/pkg/command/root.go b/extensions/appprovider/pkg/command/root.go new file mode 100644 index 0000000000..6cede536d0 --- /dev/null +++ b/extensions/appprovider/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-accounts command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-appprovider", + Usage: "Provide apps for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the accounts command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new accounts.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.AppProvider.Commons = cfg.Commons + return SutureService{ + cfg: cfg.AppProvider, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/appprovider/pkg/command/server.go b/extensions/appprovider/pkg/command/server.go new file mode 100644 index 0000000000..282ee46cbc --- /dev/null +++ b/extensions/appprovider/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/extensions/appprovider/pkg/config/parser" + "github.com/owncloud/ocis/extensions/appprovider/pkg/logging" + "github.com/owncloud/ocis/extensions/appprovider/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/appprovider/pkg/server/debug" + "github.com/owncloud/ocis/extensions/appprovider/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.AppProviderConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/appprovider/pkg/command/version.go b/extensions/appprovider/pkg/command/version.go new file mode 100644 index 0000000000..3558839521 --- /dev/null +++ b/extensions/appprovider/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/appprovider/pkg/config/config.go b/extensions/appprovider/pkg/config/config.go index c8be7463a1..84e77c4d42 100644 --- a/extensions/appprovider/pkg/config/config.go +++ b/extensions/appprovider/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -18,6 +21,9 @@ type Config struct { ExternalAddr string `yaml:"external_addr"` Driver string `yaml:"driver"` Drivers Drivers `yaml:"drivers"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { @@ -27,7 +33,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;APP_PROVIDER_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;APP_PROVIDER_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;APP_PROVIDER_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;APP_PROVIDER_LOG_COLOR" desc:"Activates colorized log output."` @@ -46,8 +52,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"APP_PROVIDER_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"APP_PROVIDER_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"APP_PROVIDER_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"APP_PROVIDER_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type Drivers struct { diff --git a/extensions/appprovider/pkg/config/defaults/defaultconfig.go b/extensions/appprovider/pkg/config/defaults/defaultconfig.go index 978c6d2edb..c42611f739 100644 --- a/extensions/appprovider/pkg/config/defaults/defaultconfig.go +++ b/extensions/appprovider/pkg/config/defaults/defaultconfig.go @@ -21,8 +21,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9164", - Protocol: "tcp", + Addr: "127.0.0.1:9164", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "appprovider", @@ -39,15 +40,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/appprovider/pkg/logging/logging.go b/extensions/appprovider/pkg/logging/logging.go new file mode 100644 index 0000000000..91ed77da75 --- /dev/null +++ b/extensions/appprovider/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/appprovider/pkg/revaconfig/config.go b/extensions/appprovider/pkg/revaconfig/config.go new file mode 100644 index 0000000000..9d1ebf814f --- /dev/null +++ b/extensions/appprovider/pkg/revaconfig/config.go @@ -0,0 +1,47 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" +) + +// AppProviderConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func AppProviderConfigFromStruct(cfg *config.Config) map[string]interface{} { + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "services": map[string]interface{}{ + "appprovider": map[string]interface{}{ + "app_provider_url": cfg.ExternalAddr, + "driver": cfg.Driver, + "drivers": map[string]interface{}{ + "wopi": map[string]interface{}{ + "app_api_key": cfg.Drivers.WOPI.AppAPIKey, + "app_desktop_only": cfg.Drivers.WOPI.AppDesktopOnly, + "app_icon_uri": cfg.Drivers.WOPI.AppIconURI, + "app_int_url": cfg.Drivers.WOPI.AppInternalURL, + "app_name": cfg.Drivers.WOPI.AppName, + "app_url": cfg.Drivers.WOPI.AppURL, + "insecure_connections": cfg.Drivers.WOPI.Insecure, + "iop_secret": cfg.Drivers.WOPI.IopSecret, + "jwt_secret": cfg.TokenManager.JWTSecret, + "wopi_url": cfg.Drivers.WOPI.WopiURL, + }, + }, + }, + }, + }, + } + return rcfg +} diff --git a/extensions/appprovider/pkg/tracing/tracing.go b/extensions/appprovider/pkg/tracing/tracing.go new file mode 100644 index 0000000000..a2f1e636e8 --- /dev/null +++ b/extensions/appprovider/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/appprovider/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/audit/pkg/command/root.go b/extensions/audit/pkg/command/root.go index d3cd62ee46..0920b22629 100644 --- a/extensions/audit/pkg/command/root.go +++ b/extensions/audit/pkg/command/root.go @@ -48,7 +48,7 @@ type SutureService struct { // NewSutureService creates a new audit.SutureService func NewSutureService(cfg *ociscfg.Config) suture.Service { - cfg.Settings.Commons = cfg.Commons + cfg.Audit.Commons = cfg.Commons return SutureService{ cfg: cfg.Audit, } diff --git a/extensions/auth-basic/cmd/auth-basic/main.go b/extensions/auth-basic/cmd/auth-basic/main.go new file mode 100644 index 0000000000..de391e6c67 --- /dev/null +++ b/extensions/auth-basic/cmd/auth-basic/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/auth-basic/pkg/command" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/auth-basic/pkg/command/command.go b/extensions/auth-basic/pkg/command/command.go deleted file mode 100644 index ce77c11685..0000000000 --- a/extensions/auth-basic/pkg/command/command.go +++ /dev/null @@ -1,223 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - "path/filepath" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" - "github.com/owncloud/ocis/extensions/auth-basic/pkg/config/parser" - "github.com/owncloud/ocis/extensions/auth-basic/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/ldap" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// Command is the entrypoint for the auth-basic command. -func AuthBasic(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "auth-basic", - Usage: "start authprovider for basic auth", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // pre-create folders - if cfg.AuthProvider == "json" && cfg.AuthProviders.JSON.File != "" { - if err := os.MkdirAll(filepath.Dir(cfg.AuthProviders.JSON.File), os.FileMode(0700)); err != nil { - return err - } - } - - uuid := uuid.Must(uuid.NewV4()) - - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := authBasicConfigFromStruct(c, cfg) - logger.Debug(). - Str("server", "authbasic"). - Interface("reva-config", rcfg). - Msg("config") - - if cfg.AuthProvider == "ldap" { - ldapCfg := cfg.AuthProviders.LDAP - if err := ldap.WaitForCA(logger, ldapCfg.Insecure, ldapCfg.CACert); err != nil { - logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") - return err - } - } - - gr.Add(func() error { - runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// authBasicConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func authBasicConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - // TODO build services dynamically - "services": map[string]interface{}{ - "authprovider": map[string]interface{}{ - "auth_manager": cfg.AuthProvider, - "auth_managers": map[string]interface{}{ - "json": map[string]interface{}{ - "users": cfg.AuthProviders.JSON.File, - }, - "ldap": ldapConfigFromString(cfg.AuthProviders.LDAP), - "owncloudsql": map[string]interface{}{ - "dbusername": cfg.AuthProviders.OwnCloudSQL.DBUsername, - "dbpassword": cfg.AuthProviders.OwnCloudSQL.DBPassword, - "dbhost": cfg.AuthProviders.OwnCloudSQL.DBHost, - "dbport": cfg.AuthProviders.OwnCloudSQL.DBPort, - "dbname": cfg.AuthProviders.OwnCloudSQL.DBName, - "idp": cfg.AuthProviders.OwnCloudSQL.IDP, - "nobody": cfg.AuthProviders.OwnCloudSQL.Nobody, - "join_username": cfg.AuthProviders.OwnCloudSQL.JoinUsername, - "join_ownclouduuid": cfg.AuthProviders.OwnCloudSQL.JoinOwnCloudUUID, - }, - }, - }, - }, - }, - } - return rcfg -} - -// AuthBasicSutureService allows for the storage-authbasic command to be embedded and supervised by a suture supervisor tree. -type AuthBasicSutureService struct { - cfg *config.Config -} - -// NewAuthBasicSutureService creates a new store.AuthBasicSutureService -func NewAuthBasic(cfg *ociscfg.Config) suture.Service { - cfg.AuthBasic.Commons = cfg.Commons - return AuthBasicSutureService{ - cfg: cfg.AuthBasic, - } -} - -func (s AuthBasicSutureService) Serve(ctx context.Context) error { - f := &flag.FlagSet{} - cmdFlags := AuthBasic(s.cfg).Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if AuthBasic(s.cfg).Before != nil { - if err := AuthBasic(s.cfg).Before(cliCtx); err != nil { - return err - } - } - if err := AuthBasic(s.cfg).Action(cliCtx); err != nil { - return err - } - - return nil -} - -func ldapConfigFromString(cfg config.LDAPProvider) map[string]interface{} { - return map[string]interface{}{ - "uri": cfg.URI, - "cacert": cfg.CACert, - "insecure": cfg.Insecure, - "bind_username": cfg.BindDN, - "bind_password": cfg.BindPassword, - "user_base_dn": cfg.UserBaseDN, - "group_base_dn": cfg.GroupBaseDN, - "user_filter": cfg.UserFilter, - "group_filter": cfg.GroupFilter, - "user_scope": cfg.UserScope, - "group_scope": cfg.GroupScope, - "user_objectclass": cfg.UserObjectClass, - "group_objectclass": cfg.GroupObjectClass, - "login_attributes": cfg.LoginAttributes, - "idp": cfg.IDP, - "user_schema": map[string]interface{}{ - "id": cfg.UserSchema.ID, - "idIsOctetString": cfg.UserSchema.IDIsOctetString, - "mail": cfg.UserSchema.Mail, - "displayName": cfg.UserSchema.DisplayName, - "userName": cfg.UserSchema.Username, - }, - "group_schema": map[string]interface{}{ - "id": cfg.GroupSchema.ID, - "idIsOctetString": cfg.GroupSchema.IDIsOctetString, - "mail": cfg.GroupSchema.Mail, - "displayName": cfg.GroupSchema.DisplayName, - "groupName": cfg.GroupSchema.Groupname, - "member": cfg.GroupSchema.Member, - }, - } -} diff --git a/extensions/auth-basic/pkg/command/health.go b/extensions/auth-basic/pkg/command/health.go new file mode 100644 index 0000000000..877e1d0c1b --- /dev/null +++ b/extensions/auth-basic/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config/parser" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/auth-basic/pkg/command/root.go b/extensions/auth-basic/pkg/command/root.go new file mode 100644 index 0000000000..3dff2f589d --- /dev/null +++ b/extensions/auth-basic/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-auth-basic command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-auth-basic", + Usage: "Provide basic authentication for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the auth-basic command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new auth-basic.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.AuthBasic.Commons = cfg.Commons + return SutureService{ + cfg: cfg.AuthBasic, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/auth-basic/pkg/command/server.go b/extensions/auth-basic/pkg/command/server.go new file mode 100644 index 0000000000..642bb75903 --- /dev/null +++ b/extensions/auth-basic/pkg/command/server.go @@ -0,0 +1,120 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config/parser" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/logging" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/server/debug" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/ldap" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.AuthBasicConfigFromStruct(cfg) + + // the reva runtime calls os.Exit in the case of a failure and there is no way for the oCIS + // runtime to catch it and restart a reva service. Therefore we need to ensure the service has + // everything it needs, before starting the service. + // In this case: CA certificates + if cfg.AuthProvider == "ldap" { + ldapCfg := cfg.AuthProviders.LDAP + if err := ldap.WaitForCA(logger, ldapCfg.Insecure, ldapCfg.CACert); err != nil { + logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") + return err + } + } + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/auth-basic/pkg/command/version.go b/extensions/auth-basic/pkg/command/version.go new file mode 100644 index 0000000000..f6c6415e74 --- /dev/null +++ b/extensions/auth-basic/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index 8229ec1894..ad70ebbd78 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -18,6 +21,9 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` AuthProvider string `yaml:"auth_provider" env:"AUTH_BASIC_AUTH_PROVIDER" desc:"The auth provider which should be used by the service"` AuthProviders AuthProviders `yaml:"auth_providers"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;AUTH_BASIC_TRACING_ENABLED" desc:"Activates tracing."` @@ -26,7 +32,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;AUTH_BASIC_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;AUTH_BASIC_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;AUTH_BASIC_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;AUTH_BASIC_LOG_COLOR" desc:"Activates colorized log output."` @@ -45,8 +51,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"AUTH_BASIC_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"AUTH_BASIC_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"AUTH_BASIC_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"AUTH_BASIC_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type AuthProviders struct { diff --git a/extensions/auth-basic/pkg/config/defaults/defaultconfig.go b/extensions/auth-basic/pkg/config/defaults/defaultconfig.go index 3bfbaf800f..66e3d4d93a 100644 --- a/extensions/auth-basic/pkg/config/defaults/defaultconfig.go +++ b/extensions/auth-basic/pkg/config/defaults/defaultconfig.go @@ -24,6 +24,7 @@ func DefaultConfig() *config.Config { }, GRPC: config.GRPCConfig{ Addr: "127.0.0.1:9146", + Namespace: "com.owncloud.api", Protocol: "tcp", }, Service: config.Service{ @@ -80,15 +81,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/auth-basic/pkg/logging/logging.go b/extensions/auth-basic/pkg/logging/logging.go new file mode 100644 index 0000000000..3f997d8502 --- /dev/null +++ b/extensions/auth-basic/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/auth-basic/pkg/revaconfig/config.go b/extensions/auth-basic/pkg/revaconfig/config.go new file mode 100644 index 0000000000..59ea585f76 --- /dev/null +++ b/extensions/auth-basic/pkg/revaconfig/config.go @@ -0,0 +1,83 @@ +package revaconfig + +import "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + +// AuthBasicConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func AuthBasicConfigFromStruct(cfg *config.Config) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "authprovider": map[string]interface{}{ + "auth_manager": cfg.AuthProvider, + "auth_managers": map[string]interface{}{ + "json": map[string]interface{}{ + "users": cfg.AuthProviders.JSON.File, + }, + "ldap": ldapConfigFromString(cfg.AuthProviders.LDAP), + "owncloudsql": map[string]interface{}{ + "dbusername": cfg.AuthProviders.OwnCloudSQL.DBUsername, + "dbpassword": cfg.AuthProviders.OwnCloudSQL.DBPassword, + "dbhost": cfg.AuthProviders.OwnCloudSQL.DBHost, + "dbport": cfg.AuthProviders.OwnCloudSQL.DBPort, + "dbname": cfg.AuthProviders.OwnCloudSQL.DBName, + "idp": cfg.AuthProviders.OwnCloudSQL.IDP, + "nobody": cfg.AuthProviders.OwnCloudSQL.Nobody, + "join_username": cfg.AuthProviders.OwnCloudSQL.JoinUsername, + "join_ownclouduuid": cfg.AuthProviders.OwnCloudSQL.JoinOwnCloudUUID, + }, + }, + }, + }, + }, + } + return rcfg +} + +func ldapConfigFromString(cfg config.LDAPProvider) map[string]interface{} { + return map[string]interface{}{ + "uri": cfg.URI, + "cacert": cfg.CACert, + "insecure": cfg.Insecure, + "bind_username": cfg.BindDN, + "bind_password": cfg.BindPassword, + "user_base_dn": cfg.UserBaseDN, + "group_base_dn": cfg.GroupBaseDN, + "user_filter": cfg.UserFilter, + "group_filter": cfg.GroupFilter, + "user_scope": cfg.UserScope, + "group_scope": cfg.GroupScope, + "user_objectclass": cfg.UserObjectClass, + "group_objectclass": cfg.GroupObjectClass, + "login_attributes": cfg.LoginAttributes, + "idp": cfg.IDP, + "user_schema": map[string]interface{}{ + "id": cfg.UserSchema.ID, + "idIsOctetString": cfg.UserSchema.IDIsOctetString, + "mail": cfg.UserSchema.Mail, + "displayName": cfg.UserSchema.DisplayName, + "userName": cfg.UserSchema.Username, + }, + "group_schema": map[string]interface{}{ + "id": cfg.GroupSchema.ID, + "idIsOctetString": cfg.GroupSchema.IDIsOctetString, + "mail": cfg.GroupSchema.Mail, + "displayName": cfg.GroupSchema.DisplayName, + "groupName": cfg.GroupSchema.Groupname, + "member": cfg.GroupSchema.Member, + }, + } +} diff --git a/extensions/auth-basic/pkg/tracing/tracing.go b/extensions/auth-basic/pkg/tracing/tracing.go new file mode 100644 index 0000000000..7f7180555e --- /dev/null +++ b/extensions/auth-basic/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/auth-bearer/cmd/auth-bearer/main.go b/extensions/auth-bearer/cmd/auth-bearer/main.go new file mode 100644 index 0000000000..024879e452 --- /dev/null +++ b/extensions/auth-bearer/cmd/auth-bearer/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/command" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/auth-bearer/pkg/Makefile b/extensions/auth-bearer/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/auth-bearer/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/auth-bearer/pkg/command/command.go b/extensions/auth-bearer/pkg/command/command.go deleted file mode 100644 index c5204321bb..0000000000 --- a/extensions/auth-bearer/pkg/command/command.go +++ /dev/null @@ -1,160 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" - "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config/parser" - "github.com/owncloud/ocis/extensions/auth-bearer/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// AuthBearer is the entrypoint for the auth-bearer command. -func AuthBearer(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "auth-bearer", - Usage: "start authprovider for bearer auth", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - rcfg := authBearerConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", "debug").Msg("failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// authBearerConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func authBearerConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - return map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - "services": map[string]interface{}{ - "authprovider": map[string]interface{}{ - "auth_manager": "oidc", - "auth_managers": map[string]interface{}{ - "oidc": map[string]interface{}{ - "issuer": cfg.OIDC.Issuer, - "insecure": cfg.OIDC.Insecure, - "id_claim": cfg.OIDC.IDClaim, - "uid_claim": cfg.OIDC.UIDClaim, - "gid_claim": cfg.OIDC.GIDClaim, - }, - }, - }, - }, - }, - } -} - -// AuthBearerSutureService allows for the storage-gateway command to be embedded and supervised by a suture supervisor tree. -type AuthBearerSutureService struct { - cfg *config.Config -} - -// NewAuthBearerSutureService creates a new gateway.AuthBearerSutureService -func NewAuthBearer(cfg *ociscfg.Config) suture.Service { - cfg.AuthBearer.Commons = cfg.Commons - return AuthBearerSutureService{ - cfg: cfg.AuthBearer, - } -} - -func (s AuthBearerSutureService) Serve(ctx context.Context) error { - cmd := AuthBearer(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/auth-bearer/pkg/command/health.go b/extensions/auth-bearer/pkg/command/health.go new file mode 100644 index 0000000000..c38aefdc71 --- /dev/null +++ b/extensions/auth-bearer/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config/parser" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/auth-bearer/pkg/command/root.go b/extensions/auth-bearer/pkg/command/root.go new file mode 100644 index 0000000000..4589c17c30 --- /dev/null +++ b/extensions/auth-bearer/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-auth-bearer command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-auth-bearer", + Usage: "Provide apps for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the accounts command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new auth-bearer.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.AuthBearer.Commons = cfg.Commons + return SutureService{ + cfg: cfg.AuthBearer, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/auth-bearer/pkg/command/server.go b/extensions/auth-bearer/pkg/command/server.go new file mode 100644 index 0000000000..c4d5211180 --- /dev/null +++ b/extensions/auth-bearer/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config/parser" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/logging" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/server/debug" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.AuthBearerConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/auth-bearer/pkg/command/version.go b/extensions/auth-bearer/pkg/command/version.go new file mode 100644 index 0000000000..c90f60e08f --- /dev/null +++ b/extensions/auth-bearer/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/auth-bearer/pkg/config/config.go b/extensions/auth-bearer/pkg/config/config.go index 8af579f5c0..eb769e8be6 100644 --- a/extensions/auth-bearer/pkg/config/config.go +++ b/extensions/auth-bearer/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -17,6 +20,9 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` OIDC OIDC `yaml:"oidc"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;AUTH_BEARER_TRACING_ENABLED" desc:"Activates tracing."` @@ -25,7 +31,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;AUTH_BEARER_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;AUTH_BEARER_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;AUTH_BEARER_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;AUTH_BEARER_LOG_COLOR" desc:"Activates colorized log output."` @@ -44,8 +50,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"AUTH_BEARER_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"AUTH_BEARER_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"AUTH_BEARER_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"AUTH_BEARER_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type OIDC struct { diff --git a/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go b/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go index 1e3d500cb5..6c37acaf77 100644 --- a/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go +++ b/extensions/auth-bearer/pkg/config/defaults/defaultconfig.go @@ -20,8 +20,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9148", - Protocol: "tcp", + Addr: "127.0.0.1:9148", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "auth-bearer", @@ -39,15 +40,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/auth-bearer/pkg/logging/logging.go b/extensions/auth-bearer/pkg/logging/logging.go new file mode 100644 index 0000000000..c92d63022c --- /dev/null +++ b/extensions/auth-bearer/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/auth-bearer/pkg/revaconfig/config.go b/extensions/auth-bearer/pkg/revaconfig/config.go new file mode 100644 index 0000000000..bb88e4b088 --- /dev/null +++ b/extensions/auth-bearer/pkg/revaconfig/config.go @@ -0,0 +1,38 @@ +package revaconfig + +import "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + +// AuthBearerConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func AuthBearerConfigFromStruct(cfg *config.Config) map[string]interface{} { + return map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "services": map[string]interface{}{ + "authprovider": map[string]interface{}{ + "auth_manager": "oidc", + "auth_managers": map[string]interface{}{ + "oidc": map[string]interface{}{ + "issuer": cfg.OIDC.Issuer, + "insecure": cfg.OIDC.Insecure, + "id_claim": cfg.OIDC.IDClaim, + "uid_claim": cfg.OIDC.UIDClaim, + "gid_claim": cfg.OIDC.GIDClaim, + }, + }, + }, + }, + }, + } +} diff --git a/extensions/auth-bearer/pkg/tracing/tracing.go b/extensions/auth-bearer/pkg/tracing/tracing.go new file mode 100644 index 0000000000..74ff9ceca4 --- /dev/null +++ b/extensions/auth-bearer/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/auth-bearer/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/auth-machine/cmd/auth-machine/main.go b/extensions/auth-machine/cmd/auth-machine/main.go new file mode 100644 index 0000000000..2a29a75e6e --- /dev/null +++ b/extensions/auth-machine/cmd/auth-machine/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/auth-machine/pkg/command" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/auth-machine/pkg/Makefile b/extensions/auth-machine/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/auth-machine/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/auth-machine/pkg/command/command.go b/extensions/auth-machine/pkg/command/command.go deleted file mode 100644 index 1e79ac6689..0000000000 --- a/extensions/auth-machine/pkg/command/command.go +++ /dev/null @@ -1,158 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" - "github.com/owncloud/ocis/extensions/auth-machine/pkg/config/parser" - "github.com/owncloud/ocis/extensions/auth-machine/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// AuthMachine is the entrypoint for the auth-machine command. -func AuthMachine(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "auth-machine", - Usage: "start authprovider for machine auth", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - rcfg := authMachineConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", "debug").Msg("failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// authMachineConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func authMachineConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - return map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - "services": map[string]interface{}{ - "authprovider": map[string]interface{}{ - "auth_manager": "machine", - "auth_managers": map[string]interface{}{ - "machine": map[string]interface{}{ - "api_key": cfg.MachineAuthAPIKey, - "gateway_addr": cfg.Reva.Address, - }, - }, - }, - }, - }, - } -} - -// AuthMachineSutureService allows for the storage-gateway command to be embedded and supervised by a suture supervisor tree. -type AuthMachineSutureService struct { - cfg *config.Config -} - -// NewAuthMachineSutureService creates a new gateway.AuthMachineSutureService -func NewAuthMachine(cfg *ociscfg.Config) suture.Service { - cfg.AuthMachine.Commons = cfg.Commons - return AuthMachineSutureService{ - cfg: cfg.AuthMachine, - } -} - -func (s AuthMachineSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.AuthMachine.Context = ctx - cmd := AuthMachine(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/auth-machine/pkg/command/health.go b/extensions/auth-machine/pkg/command/health.go new file mode 100644 index 0000000000..ad86b25787 --- /dev/null +++ b/extensions/auth-machine/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config/parser" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/auth-machine/pkg/command/root.go b/extensions/auth-machine/pkg/command/root.go new file mode 100644 index 0000000000..9c675862fa --- /dev/null +++ b/extensions/auth-machine/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-auth-machine command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-auth-machine", + Usage: "Provide apps for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the auth-machine command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new auth-machine.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.AuthMachine.Commons = cfg.Commons + return SutureService{ + cfg: cfg.AuthMachine, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/auth-machine/pkg/command/server.go b/extensions/auth-machine/pkg/command/server.go new file mode 100644 index 0000000000..e65fc00041 --- /dev/null +++ b/extensions/auth-machine/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config/parser" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/logging" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/server/debug" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.AuthMachineConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/auth-machine/pkg/command/version.go b/extensions/auth-machine/pkg/command/version.go new file mode 100644 index 0000000000..b2977c0953 --- /dev/null +++ b/extensions/auth-machine/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/auth-machine/pkg/config/config.go b/extensions/auth-machine/pkg/config/config.go index 4d145eed03..2479227df0 100644 --- a/extensions/auth-machine/pkg/config/config.go +++ b/extensions/auth-machine/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -17,6 +20,9 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;AUTH_MACHINE_API_KEY"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;AUTH_MACHINE_TRACING_ENABLED" desc:"Activates tracing."` @@ -25,7 +31,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;AUTH_MACHINE_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;AUTH_MACHINE_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;AUTH_MACHINE_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;AUTH_MACHINE_LOG_COLOR" desc:"Activates colorized log output."` @@ -44,6 +50,7 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"AUTH_MACHINE_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"AUTH_MACHINE_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"AUTH_MACHINE_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"AUTH_MACHINE_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } diff --git a/extensions/auth-machine/pkg/config/defaults/defaultconfig.go b/extensions/auth-machine/pkg/config/defaults/defaultconfig.go index 7a102f4d26..6f156446b4 100644 --- a/extensions/auth-machine/pkg/config/defaults/defaultconfig.go +++ b/extensions/auth-machine/pkg/config/defaults/defaultconfig.go @@ -20,8 +20,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9166", - Protocol: "tcp", + Addr: "127.0.0.1:9166", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "auth-machine", @@ -34,15 +35,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/auth-machine/pkg/logging/logging.go b/extensions/auth-machine/pkg/logging/logging.go new file mode 100644 index 0000000000..0d89a6f4b9 --- /dev/null +++ b/extensions/auth-machine/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/auth-machine/pkg/revaconfig/config.go b/extensions/auth-machine/pkg/revaconfig/config.go new file mode 100644 index 0000000000..c4a1514ec1 --- /dev/null +++ b/extensions/auth-machine/pkg/revaconfig/config.go @@ -0,0 +1,37 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" +) + +// AuthMachineConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func AuthMachineConfigFromStruct(cfg *config.Config) map[string]interface{} { + return map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "services": map[string]interface{}{ + "authprovider": map[string]interface{}{ + "auth_manager": "machine", + "auth_managers": map[string]interface{}{ + "machine": map[string]interface{}{ + "api_key": cfg.MachineAuthAPIKey, + "gateway_addr": cfg.Reva.Address, + }, + }, + }, + }, + }, + } +} diff --git a/extensions/auth-machine/pkg/tracing/tracing.go b/extensions/auth-machine/pkg/tracing/tracing.go new file mode 100644 index 0000000000..87da6d0892 --- /dev/null +++ b/extensions/auth-machine/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/auth-machine/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/frontend/cmd/frontend/main.go b/extensions/frontend/cmd/frontend/main.go new file mode 100644 index 0000000000..a6135fa78a --- /dev/null +++ b/extensions/frontend/cmd/frontend/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/frontend/pkg/command" + "github.com/owncloud/ocis/extensions/frontend/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/frontend/pkg/Makefile b/extensions/frontend/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/frontend/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/frontend/pkg/command/health.go b/extensions/frontend/pkg/command/health.go new file mode 100644 index 0000000000..a4cedd367f --- /dev/null +++ b/extensions/frontend/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/extensions/frontend/pkg/config/parser" + "github.com/owncloud/ocis/extensions/frontend/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/frontend/pkg/command/root.go b/extensions/frontend/pkg/command/root.go new file mode 100644 index 0000000000..afe7fa3ef3 --- /dev/null +++ b/extensions/frontend/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-frontend command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-frontend", + Usage: "Provide various ownCloud apis for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the frontend command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new frontend.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.Frontend.Commons = cfg.Commons + return SutureService{ + cfg: cfg.Frontend, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/frontend/pkg/command/server.go b/extensions/frontend/pkg/command/server.go new file mode 100644 index 0000000000..88631228a2 --- /dev/null +++ b/extensions/frontend/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/extensions/frontend/pkg/config/parser" + "github.com/owncloud/ocis/extensions/frontend/pkg/logging" + "github.com/owncloud/ocis/extensions/frontend/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/frontend/pkg/server/debug" + "github.com/owncloud/ocis/extensions/frontend/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.FrontendConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterHTTPEndpoint( + ctx, + cfg.HTTP.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.HTTP.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the http endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/frontend/pkg/command/version.go b/extensions/frontend/pkg/command/version.go new file mode 100644 index 0000000000..d721db1236 --- /dev/null +++ b/extensions/frontend/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.HTTP.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/frontend/pkg/config/config.go b/extensions/frontend/pkg/config/config.go index a82e1fd42d..68bfe4cb18 100644 --- a/extensions/frontend/pkg/config/config.go +++ b/extensions/frontend/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` HTTP HTTPConfig `yaml:"http"` @@ -38,6 +41,9 @@ type Config struct { Checksums Checksums `yaml:"checksums"` Middleware Middleware `yaml:"middleware"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;FRONTEND_TRACING_ENABLED" desc:"Activates tracing."` diff --git a/extensions/frontend/pkg/config/defaults/defaultconfig.go b/extensions/frontend/pkg/config/defaults/defaultconfig.go index a1067f1eb5..d9b05083c0 100644 --- a/extensions/frontend/pkg/config/defaults/defaultconfig.go +++ b/extensions/frontend/pkg/config/defaults/defaultconfig.go @@ -20,9 +20,10 @@ func DefaultConfig() *config.Config { Zpages: false, }, HTTP: config.HTTPConfig{ - Addr: "127.0.0.1:9140", - Protocol: "tcp", - Prefix: "", + Addr: "127.0.0.1:9140", + Namespace: "com.owncloud.web", + Protocol: "tcp", + Prefix: "", }, Service: config.Service{ Name: "frontend", @@ -72,15 +73,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/frontend/pkg/logging/logging.go b/extensions/frontend/pkg/logging/logging.go new file mode 100644 index 0000000000..19c43464d9 --- /dev/null +++ b/extensions/frontend/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/frontend/pkg/command/command.go b/extensions/frontend/pkg/revaconfig/config.go similarity index 55% rename from extensions/frontend/pkg/command/command.go rename to extensions/frontend/pkg/revaconfig/config.go index ff2d2e636c..5fbb40c2ef 100644 --- a/extensions/frontend/pkg/command/command.go +++ b/extensions/frontend/pkg/revaconfig/config.go @@ -1,148 +1,62 @@ -package command +package revaconfig import ( - "context" - "flag" - "fmt" - "os" "path" "strconv" - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" "github.com/owncloud/ocis/extensions/frontend/pkg/config" - "github.com/owncloud/ocis/extensions/frontend/pkg/config/parser" - "github.com/owncloud/ocis/extensions/frontend/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" ) -// Frontend is the entrypoint for the frontend command. -func Frontend(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "frontend", - Usage: "start frontend service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - //metrics = metrics.New() - - defer cancel() - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - archivers := []map[string]interface{}{ - { - "enabled": true, - "version": "2.0.0", - "formats": []string{"tar", "zip"}, - "archiver_url": path.Join("/", cfg.Archiver.Prefix), - "max_num_files": strconv.FormatInt(cfg.Archiver.MaxNumFiles, 10), - "max_size": strconv.FormatInt(cfg.Archiver.MaxSize, 10), - }, - } - - appProviders := []map[string]interface{}{ - { - "enabled": true, - "version": "1.0.0", - "apps_url": cfg.AppProvider.AppsURL, - "open_url": cfg.AppProvider.OpenURL, - "new_url": cfg.AppProvider.NewURL, - }, - } - - filesCfg := map[string]interface{}{ - "private_links": false, - "bigfilechunking": false, - "blacklisted_files": []string{}, - "undelete": true, - "versioning": true, - "archivers": archivers, - "app_providers": appProviders, - "favorites": cfg.EnableFavorites, - } - - if cfg.DefaultUploadProtocol == "tus" { - filesCfg["tus_support"] = map[string]interface{}{ - "version": "1.0.0", - "resumable": "1.0.0", - "extension": "creation,creation-with-upload", - "http_method_override": cfg.UploadHTTPMethodOverride, - "max_chunk_size": cfg.UploadMaxChunkSize, - } - } - - revaCfg := frontendConfigFromStruct(c, cfg, filesCfg) - - gr.Add(func() error { - runtime.RunWithOptions(revaCfg, pidFile, runtime.WithLogger(&logger.Logger)) - return nil - }, func(_ error) { - logger.Info().Str("server", c.Command.Name).Msg("Shutting down server") - cancel() - }) - - { - server, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info(). - Err(err). - Str("server", "debug"). - Msg("Failed to initialize server") - - return err - } - - gr.Add(server.ListenAndServe, func(_ error) { - cancel() - }) - } - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() +// FrontendConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func FrontendConfigFromStruct(cfg *config.Config) map[string]interface{} { + archivers := []map[string]interface{}{ + { + "enabled": true, + "version": "2.0.0", + "formats": []string{"tar", "zip"}, + "archiver_url": path.Join("/", cfg.Archiver.Prefix), + "max_num_files": strconv.FormatInt(cfg.Archiver.MaxNumFiles, 10), + "max_size": strconv.FormatInt(cfg.Archiver.MaxSize, 10), }, } -} -// frontendConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func frontendConfigFromStruct(c *cli.Context, cfg *config.Config, filesCfg map[string]interface{}) map[string]interface{} { + appProviders := []map[string]interface{}{ + { + "enabled": true, + "version": "1.0.0", + "apps_url": "/app/list", + "open_url": "/app/open", + "new_url": "/app/new", + }, + } + + filesCfg := map[string]interface{}{ + "private_links": false, + "bigfilechunking": false, + "blacklisted_files": []string{}, + "undelete": true, + "versioning": true, + "archivers": archivers, + "app_providers": appProviders, + "favorites": cfg.EnableFavorites, + } + + if cfg.DefaultUploadProtocol == "tus" { + filesCfg["tus_support"] = map[string]interface{}{ + "version": "1.0.0", + "resumable": "1.0.0", + "extension": "creation,creation-with-upload", + "http_method_override": cfg.UploadHTTPMethodOverride, + "max_chunk_size": cfg.UploadMaxChunkSize, + } + } + return map[string]interface{}{ "core": map[string]interface{}{ "tracing_enabled": cfg.Tracing.Enabled, "tracing_endpoint": cfg.Tracing.Endpoint, "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, + "tracing_service_name": cfg.Service.Name, }, "shared": map[string]interface{}{ "jwt_secret": cfg.TokenManager.JWTSecret, @@ -163,12 +77,6 @@ func frontendConfigFromStruct(c *cli.Context, cfg *config.Config, filesCfg map[s }, // TODO build services dynamically "services": map[string]interface{}{ - "appprovider": map[string]interface{}{ - "prefix": cfg.AppProvider.Prefix, - "transfer_shared_secret": cfg.TransferSecret, - "timeout": 86400, - "insecure": cfg.AppProvider.Insecure, - }, "archiver": map[string]interface{}{ "prefix": cfg.Archiver.Prefix, "timeout": 86400, @@ -303,39 +211,3 @@ func frontendConfigFromStruct(c *cli.Context, cfg *config.Config, filesCfg map[s }, } } - -// FrontendSutureService allows for the storage-frontend command to be embedded and supervised by a suture supervisor tree. -type FrontendSutureService struct { - cfg *config.Config -} - -// NewFrontend creates a new frontend.FrontendSutureService -func NewFrontend(cfg *ociscfg.Config) suture.Service { - cfg.Frontend.Commons = cfg.Commons - return FrontendSutureService{ - cfg: cfg.Frontend, - } -} - -func (s FrontendSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.Frontend.Context = ctx - cmd := Frontend(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/frontend/pkg/tracing/tracing.go b/extensions/frontend/pkg/tracing/tracing.go new file mode 100644 index 0000000000..c6490616bf --- /dev/null +++ b/extensions/frontend/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/frontend/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/gateway/cmd/gateway/main.go b/extensions/gateway/cmd/gateway/main.go new file mode 100644 index 0000000000..adcc697111 --- /dev/null +++ b/extensions/gateway/cmd/gateway/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/gateway/pkg/command" + "github.com/owncloud/ocis/extensions/gateway/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/gateway/pkg/Makefile b/extensions/gateway/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/gateway/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/gateway/pkg/command/health.go b/extensions/gateway/pkg/command/health.go new file mode 100644 index 0000000000..b9bda87a55 --- /dev/null +++ b/extensions/gateway/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/extensions/gateway/pkg/config/parser" + "github.com/owncloud/ocis/extensions/gateway/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/gateway/pkg/command/root.go b/extensions/gateway/pkg/command/root.go new file mode 100644 index 0000000000..d064ab4713 --- /dev/null +++ b/extensions/gateway/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-gateway command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-gateway", + Usage: "Provide a CS3api gateway for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the gateway command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new gateway.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.Gateway.Commons = cfg.Commons + return SutureService{ + cfg: cfg.Gateway, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/gateway/pkg/command/server.go b/extensions/gateway/pkg/command/server.go new file mode 100644 index 0000000000..7caccfbb3a --- /dev/null +++ b/extensions/gateway/pkg/command/server.go @@ -0,0 +1,102 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/extensions/gateway/pkg/config/parser" + "github.com/owncloud/ocis/extensions/gateway/pkg/logging" + "github.com/owncloud/ocis/extensions/gateway/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/gateway/pkg/server/debug" + "github.com/owncloud/ocis/extensions/gateway/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.GatewayConfigFromStruct(cfg, logger) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/gateway/pkg/command/version.go b/extensions/gateway/pkg/command/version.go new file mode 100644 index 0000000000..efe2adaf7d --- /dev/null +++ b/extensions/gateway/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/gateway/pkg/config/config.go b/extensions/gateway/pkg/config/config.go index ca3555e721..285c9793c1 100644 --- a/extensions/gateway/pkg/config/config.go +++ b/extensions/gateway/pkg/config/config.go @@ -1,15 +1,18 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` - Service Service `yaml:"-"` - Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` - Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` + Service Service `yaml:"-"` + Tracing *Tracing `yaml:"tracing"` + Log *Log `yaml:"log"` + Debug Debug `yaml:"debug"` GRPC GRPCConfig `yaml:"grpc"` @@ -41,6 +44,9 @@ type Config struct { StorageRegistry StorageRegistry `yaml:"storage_registry"` AppRegistry AppRegistry `yaml:"app_registry"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;GATEWAY_TRACING_ENABLED" desc:"Activates tracing."` @@ -49,7 +55,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;GATEWAY_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;GATEWAY_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;GATEWAY_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;GATEWAY_LOG_COLOR" desc:"Activates colorized log output."` @@ -68,8 +74,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"GATEWAY_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"GATEWAY_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"GATEWAY_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"GATEWAY_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type StorageRegistry struct { diff --git a/extensions/gateway/pkg/config/defaults/defaultconfig.go b/extensions/gateway/pkg/config/defaults/defaultconfig.go index 21e3cc1862..56b07c1858 100644 --- a/extensions/gateway/pkg/config/defaults/defaultconfig.go +++ b/extensions/gateway/pkg/config/defaults/defaultconfig.go @@ -20,8 +20,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9142", - Protocol: "tcp", + Addr: "127.0.0.1:9142", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "gateway", @@ -62,15 +63,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/gateway/pkg/logging/logging.go b/extensions/gateway/pkg/logging/logging.go new file mode 100644 index 0000000000..4623c743c5 --- /dev/null +++ b/extensions/gateway/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/gateway/pkg/command/command.go b/extensions/gateway/pkg/revaconfig/config.go similarity index 73% rename from extensions/gateway/pkg/command/command.go rename to extensions/gateway/pkg/revaconfig/config.go index 262f818858..5ff200644c 100644 --- a/extensions/gateway/pkg/command/command.go +++ b/extensions/gateway/pkg/revaconfig/config.go @@ -1,126 +1,25 @@ -package command +package revaconfig import ( - "context" "encoding/json" - "flag" - "fmt" "io/ioutil" - "os" - "path" "strings" - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/cs3org/reva/v2/pkg/utils" - "github.com/gofrs/uuid" - "github.com/mitchellh/mapstructure" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/gateway/pkg/config" - "github.com/owncloud/ocis/extensions/gateway/pkg/config/parser" - "github.com/owncloud/ocis/extensions/gateway/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/service/external" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/owncloud/ocis/ocis-pkg/version" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" + + "github.com/cs3org/reva/v2/pkg/utils" + "github.com/mitchellh/mapstructure" + "github.com/owncloud/ocis/extensions/gateway/pkg/config" ) -// Gateway is the entrypoint for the gateway command. -func Gateway(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "gateway", - Usage: "start gateway", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - rcfg := gatewayConfigFromStruct(c, cfg, logger) - logger.Debug(). - Str("server", "gateway"). - Interface("reva-config", rcfg). - Msg("config") - - defer cancel() - - gr.Add(func() error { - err := external.RegisterGRPCEndpoint( - ctx, - "com.owncloud.storage", - uuid.String(), - cfg.GRPC.Addr, - version.String, - logger, - ) - - if err != nil { - return err - } - - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// gatewayConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func gatewayConfigFromStruct(c *cli.Context, cfg *config.Config, logger log.Logger) map[string]interface{} { +// GatewayConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]interface{} { rcfg := map[string]interface{}{ "core": map[string]interface{}{ "tracing_enabled": cfg.Tracing.Enabled, "tracing_endpoint": cfg.Tracing.Endpoint, "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, + "tracing_service_name": cfg.Service.Name, }, "shared": map[string]interface{}{ "jwt_secret": cfg.TokenManager.JWTSecret, @@ -381,38 +280,3 @@ func mimetypes(cfg *config.Config, logger log.Logger) []map[string]interface{} { return m } - -// GatewaySutureService allows for the storage-gateway command to be embedded and supervised by a suture supervisor tree. -type GatewaySutureService struct { - cfg *config.Config -} - -// NewGatewaySutureService creates a new gateway.GatewaySutureService -func NewGateway(cfg *ociscfg.Config) suture.Service { - cfg.Gateway.Commons = cfg.Commons - return GatewaySutureService{ - cfg: cfg.Gateway, - } -} - -func (s GatewaySutureService) Serve(ctx context.Context) error { - cmd := Gateway(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/gateway/pkg/tracing/tracing.go b/extensions/gateway/pkg/tracing/tracing.go new file mode 100644 index 0000000000..5f1af28563 --- /dev/null +++ b/extensions/gateway/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/gateway/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/group/cmd/group/main.go b/extensions/group/cmd/group/main.go new file mode 100644 index 0000000000..d459fa3291 --- /dev/null +++ b/extensions/group/cmd/group/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/group/pkg/command" + "github.com/owncloud/ocis/extensions/group/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/group/pkg/Makefile b/extensions/group/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/group/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/group/pkg/command/command.go b/extensions/group/pkg/command/command.go deleted file mode 100644 index f1f7da429c..0000000000 --- a/extensions/group/pkg/command/command.go +++ /dev/null @@ -1,222 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - "path/filepath" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/group/pkg/config" - "github.com/owncloud/ocis/extensions/group/pkg/config/parser" - "github.com/owncloud/ocis/extensions/group/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/ldap" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// Groups is the entrypoint for the sharing command. -func Groups(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "groups", - Usage: "start groups service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // pre-create folders - if cfg.Driver == "json" && cfg.Drivers.JSON.File != "" { - if err := os.MkdirAll(filepath.Dir(cfg.Drivers.JSON.File), os.FileMode(0700)); err != nil { - return err - } - } - - cuuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+cuuid.String()+".pid") - - rcfg := groupsConfigFromStruct(c, cfg) - - if cfg.Driver == "ldap" { - if err := ldap.WaitForCA(logger, cfg.Drivers.LDAP.Insecure, cfg.Drivers.LDAP.CACert); err != nil { - logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") - return err - } - } - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// groupsConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func groupsConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - return map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - // TODO build services dynamically - "services": map[string]interface{}{ - "groupprovider": map[string]interface{}{ - "driver": cfg.Driver, - "drivers": map[string]interface{}{ - "json": map[string]interface{}{ - "groups": cfg.Drivers.JSON.File, - }, - "ldap": ldapConfigFromString(cfg.Drivers.LDAP), - "rest": map[string]interface{}{ - "client_id": cfg.Drivers.REST.ClientID, - "client_secret": cfg.Drivers.REST.ClientSecret, - "redis_address": cfg.Drivers.REST.RedisAddr, - "redis_username": cfg.Drivers.REST.RedisUsername, - "redis_password": cfg.Drivers.REST.RedisPassword, - "group_members_cache_expiration": cfg.GroupMembersCacheExpiration, - "id_provider": cfg.Drivers.REST.IDProvider, - "api_base_url": cfg.Drivers.REST.APIBaseURL, - "oidc_token_endpoint": cfg.Drivers.REST.OIDCTokenEndpoint, - "target_api": cfg.Drivers.REST.TargetAPI, - }, - }, - }, - }, - }, - } -} - -// GroupSutureService allows for the storage-groupprovider command to be embedded and supervised by a suture supervisor tree. -type GroupSutureService struct { - cfg *config.Config -} - -// NewGroupProviderSutureService creates a new storage.GroupProvider -func NewGroupProvider(cfg *ociscfg.Config) suture.Service { - cfg.Group.Commons = cfg.Commons - return GroupSutureService{ - cfg: cfg.Group, - } -} - -func (s GroupSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.Groups.Context = ctx - f := &flag.FlagSet{} - cmdFlags := Groups(s.cfg).Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if Groups(s.cfg).Before != nil { - if err := Groups(s.cfg).Before(cliCtx); err != nil { - return err - } - } - if err := Groups(s.cfg).Action(cliCtx); err != nil { - return err - } - - return nil -} - -func ldapConfigFromString(cfg config.LDAPDriver) map[string]interface{} { - return map[string]interface{}{ - "uri": cfg.URI, - "cacert": cfg.CACert, - "insecure": cfg.Insecure, - "bind_username": cfg.BindDN, - "bind_password": cfg.BindPassword, - "user_base_dn": cfg.UserBaseDN, - "group_base_dn": cfg.GroupBaseDN, - "user_scope": cfg.UserScope, - "group_scope": cfg.GroupScope, - "user_filter": cfg.UserFilter, - "group_filter": cfg.GroupFilter, - "user_objectclass": cfg.UserObjectClass, - "group_objectclass": cfg.GroupObjectClass, - "login_attributes": cfg.LoginAttributes, - "idp": cfg.IDP, - "user_schema": map[string]interface{}{ - "id": cfg.UserSchema.ID, - "idIsOctetString": cfg.UserSchema.IDIsOctetString, - "mail": cfg.UserSchema.Mail, - "displayName": cfg.UserSchema.DisplayName, - "userName": cfg.UserSchema.Username, - }, - "group_schema": map[string]interface{}{ - "id": cfg.GroupSchema.ID, - "idIsOctetString": cfg.GroupSchema.IDIsOctetString, - "mail": cfg.GroupSchema.Mail, - "displayName": cfg.GroupSchema.DisplayName, - "groupName": cfg.GroupSchema.Groupname, - "member": cfg.GroupSchema.Member, - }, - } -} diff --git a/extensions/group/pkg/command/health.go b/extensions/group/pkg/command/health.go new file mode 100644 index 0000000000..6e6a01e7eb --- /dev/null +++ b/extensions/group/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/extensions/group/pkg/config/parser" + "github.com/owncloud/ocis/extensions/group/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/group/pkg/command/root.go b/extensions/group/pkg/command/root.go new file mode 100644 index 0000000000..a4a3feaf37 --- /dev/null +++ b/extensions/group/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-group command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-group", + Usage: "Provide apps for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the group command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new group.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.Group.Commons = cfg.Commons + return SutureService{ + cfg: cfg.Group, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/group/pkg/command/server.go b/extensions/group/pkg/command/server.go new file mode 100644 index 0000000000..2bf18e4748 --- /dev/null +++ b/extensions/group/pkg/command/server.go @@ -0,0 +1,120 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/extensions/group/pkg/config/parser" + "github.com/owncloud/ocis/extensions/group/pkg/logging" + "github.com/owncloud/ocis/extensions/group/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/group/pkg/server/debug" + "github.com/owncloud/ocis/extensions/group/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/ldap" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.GroupsConfigFromStruct(cfg) + + // the reva runtime calls os.Exit in the case of a failure and there is no way for the oCIS + // runtime to catch it and restart a reva service. Therefore we need to ensure the service has + // everything it needs, before starting the service. + // In this case: CA certificates + if cfg.Driver == "ldap" { + ldapCfg := cfg.Drivers.LDAP + if err := ldap.WaitForCA(logger, ldapCfg.Insecure, ldapCfg.CACert); err != nil { + logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") + return err + } + } + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/group/pkg/command/version.go b/extensions/group/pkg/command/version.go new file mode 100644 index 0000000000..e3f5303faa --- /dev/null +++ b/extensions/group/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index 5d485df52e..fc718d6540 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -19,6 +22,9 @@ type Config struct { GroupMembersCacheExpiration int `yaml:"group_members_cache_expiration"` Driver string `yaml:"driver"` Drivers Drivers `yaml:"drivers"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;GROUPS_TRACING_ENABLED" desc:"Activates tracing."` @@ -27,7 +33,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;GROUPS_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;GROUPS_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;GROUPS_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;GROUPS_LOG_COLOR" desc:"Activates colorized log output."` @@ -46,8 +52,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"GROUPS_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"GROUPS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"GROUPS_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"GROUPS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type Drivers struct { diff --git a/extensions/group/pkg/config/defaults/defaultconfig.go b/extensions/group/pkg/config/defaults/defaultconfig.go index 47c10b9f79..123b5e04d8 100644 --- a/extensions/group/pkg/config/defaults/defaultconfig.go +++ b/extensions/group/pkg/config/defaults/defaultconfig.go @@ -23,8 +23,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9160", - Protocol: "tcp", + Addr: "127.0.0.1:9160", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "group", @@ -86,15 +87,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/group/pkg/logging/logging.go b/extensions/group/pkg/logging/logging.go new file mode 100644 index 0000000000..9aa3b08150 --- /dev/null +++ b/extensions/group/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/group/pkg/revaconfig/config.go b/extensions/group/pkg/revaconfig/config.go new file mode 100644 index 0000000000..736956060e --- /dev/null +++ b/extensions/group/pkg/revaconfig/config.go @@ -0,0 +1,85 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/extensions/group/pkg/config" +) + +// GroupsConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func GroupsConfigFromStruct(cfg *config.Config) map[string]interface{} { + return map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "groupprovider": map[string]interface{}{ + "driver": cfg.Driver, + "drivers": map[string]interface{}{ + "json": map[string]interface{}{ + "groups": cfg.Drivers.JSON.File, + }, + "ldap": ldapConfigFromString(cfg.Drivers.LDAP), + "rest": map[string]interface{}{ + "client_id": cfg.Drivers.REST.ClientID, + "client_secret": cfg.Drivers.REST.ClientSecret, + "redis_address": cfg.Drivers.REST.RedisAddr, + "redis_username": cfg.Drivers.REST.RedisUsername, + "redis_password": cfg.Drivers.REST.RedisPassword, + "group_members_cache_expiration": cfg.GroupMembersCacheExpiration, + "id_provider": cfg.Drivers.REST.IDProvider, + "api_base_url": cfg.Drivers.REST.APIBaseURL, + "oidc_token_endpoint": cfg.Drivers.REST.OIDCTokenEndpoint, + "target_api": cfg.Drivers.REST.TargetAPI, + }, + }, + }, + }, + }, + } +} + +func ldapConfigFromString(cfg config.LDAPDriver) map[string]interface{} { + return map[string]interface{}{ + "uri": cfg.URI, + "cacert": cfg.CACert, + "insecure": cfg.Insecure, + "bind_username": cfg.BindDN, + "bind_password": cfg.BindPassword, + "user_base_dn": cfg.UserBaseDN, + "group_base_dn": cfg.GroupBaseDN, + "user_scope": cfg.UserScope, + "group_scope": cfg.GroupScope, + "user_filter": cfg.UserFilter, + "group_filter": cfg.GroupFilter, + "user_objectclass": cfg.UserObjectClass, + "group_objectclass": cfg.GroupObjectClass, + "login_attributes": cfg.LoginAttributes, + "idp": cfg.IDP, + "user_schema": map[string]interface{}{ + "id": cfg.UserSchema.ID, + "idIsOctetString": cfg.UserSchema.IDIsOctetString, + "mail": cfg.UserSchema.Mail, + "displayName": cfg.UserSchema.DisplayName, + "userName": cfg.UserSchema.Username, + }, + "group_schema": map[string]interface{}{ + "id": cfg.GroupSchema.ID, + "idIsOctetString": cfg.GroupSchema.IDIsOctetString, + "mail": cfg.GroupSchema.Mail, + "displayName": cfg.GroupSchema.DisplayName, + "groupName": cfg.GroupSchema.Groupname, + "member": cfg.GroupSchema.Member, + }, + } +} diff --git a/extensions/group/pkg/tracing/tracing.go b/extensions/group/pkg/tracing/tracing.go new file mode 100644 index 0000000000..1dcb178061 --- /dev/null +++ b/extensions/group/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/group/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/nats/pkg/command/root.go b/extensions/nats/pkg/command/root.go index 44e27d1673..2a2bdffd6e 100644 --- a/extensions/nats/pkg/command/root.go +++ b/extensions/nats/pkg/command/root.go @@ -48,7 +48,7 @@ type SutureService struct { // NewSutureService creates a new nats.SutureService func NewSutureService(cfg *ociscfg.Config) suture.Service { - cfg.Settings.Commons = cfg.Commons + cfg.Nats.Commons = cfg.Commons return SutureService{ cfg: cfg.Nats, } diff --git a/extensions/ocdav/cmd/ocdav/main.go b/extensions/ocdav/cmd/ocdav/main.go new file mode 100644 index 0000000000..0b1035acc6 --- /dev/null +++ b/extensions/ocdav/cmd/ocdav/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/ocdav/pkg/command" + "github.com/owncloud/ocis/extensions/ocdav/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/ocdav/pkg/Makefile b/extensions/ocdav/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/ocdav/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/ocdav/pkg/command/health.go b/extensions/ocdav/pkg/command/health.go new file mode 100644 index 0000000000..ec3391a168 --- /dev/null +++ b/extensions/ocdav/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/extensions/ocdav/pkg/config/parser" + "github.com/owncloud/ocis/extensions/ocdav/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/ocdav/pkg/command/ocdav.go b/extensions/ocdav/pkg/command/ocdav.go deleted file mode 100644 index 3426e38957..0000000000 --- a/extensions/ocdav/pkg/command/ocdav.go +++ /dev/null @@ -1,142 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - - "github.com/cs3org/reva/v2/pkg/micro/ocdav" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/ocdav/pkg/config" - "github.com/owncloud/ocis/extensions/ocdav/pkg/config/parser" - "github.com/owncloud/ocis/extensions/ocdav/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// OCDav is the entrypoint for the ocdav command. -// TODO move ocdav cmd to a separate service -func OCDav(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "ocdav", - Usage: "start ocdav service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - //metrics = metrics.New() - - defer cancel() - - gr.Add(func() error { - s, err := ocdav.Service( - ocdav.Context(ctx), - ocdav.Logger(logger.Logger), - ocdav.Address(cfg.HTTP.Addr), - ocdav.FilesNamespace(cfg.FilesNamespace), - ocdav.WebdavNamespace(cfg.WebdavNamespace), - ocdav.SharesNamespace(cfg.SharesNamespace), - ocdav.Timeout(cfg.Timeout), - ocdav.Insecure(cfg.Insecure), - ocdav.PublicURL(cfg.PublicURL), - ocdav.Prefix(cfg.HTTP.Prefix), - ocdav.GatewaySvc(cfg.Reva.Address), - ocdav.JWTSecret(cfg.TokenManager.JWTSecret), - // ocdav.FavoriteManager() // FIXME needs a proper persistence implementation - // ocdav.LockSystem(), // will default to the CS3 lock system - // ocdav.TLSConfig() // tls config for the http server - ) - if err != nil { - return err - } - - return s.Run() - }, func(err error) { - logger.Info().Err(err).Str("server", c.Command.Name).Msg("Shutting down server") - cancel() - }) - - { - server, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info(). - Err(err). - Str("server", "debug"). - Msg("Failed to initialize server") - - return err - } - - gr.Add(server.ListenAndServe, func(_ error) { - cancel() - }) - } - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// OCDavSutureService allows for the ocdav command to be embedded and supervised by a suture supervisor tree. -type OCDavSutureService struct { - cfg *config.Config -} - -// NewOCDav creates a new ocdav.OCDavSutureService -func NewOCDav(cfg *ociscfg.Config) suture.Service { - cfg.OCDav.Commons = cfg.Commons - return OCDavSutureService{ - cfg: cfg.OCDav, - } -} - -func (s OCDavSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.Frontend.Context = ctx - cmd := OCDav(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/ocdav/pkg/command/root.go b/extensions/ocdav/pkg/command/root.go new file mode 100644 index 0000000000..e022dd0fec --- /dev/null +++ b/extensions/ocdav/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-ocdav command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-ocdav", + Usage: "Provide a WebDav API for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the ocdav command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new ocdav.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.OCDav.Commons = cfg.Commons + return SutureService{ + cfg: cfg.OCDav, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/ocdav/pkg/command/server.go b/extensions/ocdav/pkg/command/server.go new file mode 100644 index 0000000000..55f8a48e48 --- /dev/null +++ b/extensions/ocdav/pkg/command/server.go @@ -0,0 +1,98 @@ +package command + +import ( + "context" + "fmt" + + "github.com/cs3org/reva/v2/pkg/micro/ocdav" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/extensions/ocdav/pkg/config/parser" + "github.com/owncloud/ocis/extensions/ocdav/pkg/logging" + "github.com/owncloud/ocis/extensions/ocdav/pkg/server/debug" + "github.com/owncloud/ocis/extensions/ocdav/pkg/tracing" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + gr.Add(func() error { + s, err := ocdav.Service( + ocdav.Context(ctx), + ocdav.Logger(logger.Logger), + ocdav.Address(cfg.HTTP.Addr), + ocdav.FilesNamespace(cfg.FilesNamespace), + ocdav.WebdavNamespace(cfg.WebdavNamespace), + ocdav.SharesNamespace(cfg.SharesNamespace), + ocdav.Timeout(cfg.Timeout), + ocdav.Insecure(cfg.Insecure), + ocdav.PublicURL(cfg.PublicURL), + ocdav.Prefix(cfg.HTTP.Prefix), + ocdav.GatewaySvc(cfg.Reva.Address), + ocdav.JWTSecret(cfg.TokenManager.JWTSecret), + // ocdav.FavoriteManager() // FIXME needs a proper persistence implementation + // ocdav.LockSystem(), // will default to the CS3 lock system + // ocdav.TLSConfig() // tls config for the http server + ) + if err != nil { + return err + } + + return s.Run() + }, func(err error) { + logger.Info().Err(err).Str("server", c.Command.Name).Msg("Shutting down server") + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/ocdav/pkg/command/version.go b/extensions/ocdav/pkg/command/version.go new file mode 100644 index 0000000000..05bf397226 --- /dev/null +++ b/extensions/ocdav/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.HTTP.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/ocdav/pkg/config/config.go b/extensions/ocdav/pkg/config/config.go index da510a3eff..2ed551fe6c 100644 --- a/extensions/ocdav/pkg/config/config.go +++ b/extensions/ocdav/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` HTTP HTTPConfig `yaml:"http"` @@ -28,6 +31,8 @@ type Config struct { // Timeout in seconds when making requests to the gateway Timeout int64 `yaml:"timeout"` Middleware Middleware `yaml:"middleware"` + + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;OCDAV_TRACING_ENABLED" desc:"Activates tracing."` @@ -36,7 +41,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;OCDAV_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;OCDAV_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;OCDAV_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;OCDAV_LOG_COLOR" desc:"Activates colorized log output."` @@ -55,9 +60,10 @@ type Debug struct { } type HTTPConfig struct { - Addr string `yaml:"addr" env:"OCDAV_HTTP_ADDR" desc:"The address of the http service."` - Protocol string `yaml:"protocol" env:"OCDAV_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` - Prefix string `yaml:"prefix"` + Addr string `yaml:"addr" env:"OCDAV_HTTP_ADDR" desc:"The address of the http service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"OCDAV_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` + Prefix string `yaml:"prefix"` } // Middleware configures reva middlewares. diff --git a/extensions/ocdav/pkg/config/defaults/defaultconfig.go b/extensions/ocdav/pkg/config/defaults/defaultconfig.go index b55f9e6513..8567bbdb71 100644 --- a/extensions/ocdav/pkg/config/defaults/defaultconfig.go +++ b/extensions/ocdav/pkg/config/defaults/defaultconfig.go @@ -20,9 +20,10 @@ func DefaultConfig() *config.Config { Zpages: false, }, HTTP: config.HTTPConfig{ - Addr: "127.0.0.1:0", // :0 to pick any free local port - Protocol: "tcp", - Prefix: "", + Addr: "127.0.0.1:0", // :0 to pick any free local port + Namespace: "", //TODO: make this configurable for the reva micro service + Protocol: "tcp", + Prefix: "", }, Service: config.Service{ Name: "ocdav", @@ -46,15 +47,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/ocdav/pkg/logging/logging.go b/extensions/ocdav/pkg/logging/logging.go new file mode 100644 index 0000000000..37a48c877e --- /dev/null +++ b/extensions/ocdav/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/ocdav/pkg/tracing/tracing.go b/extensions/ocdav/pkg/tracing/tracing.go new file mode 100644 index 0000000000..45fc03ba67 --- /dev/null +++ b/extensions/ocdav/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/ocdav/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/sharing/cmd/sharing/main.go b/extensions/sharing/cmd/sharing/main.go new file mode 100644 index 0000000000..8f1936f293 --- /dev/null +++ b/extensions/sharing/cmd/sharing/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/sharing/pkg/command" + "github.com/owncloud/ocis/extensions/sharing/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/sharing/pkg/Makefile b/extensions/sharing/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/sharing/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/sharing/pkg/command/health.go b/extensions/sharing/pkg/command/health.go new file mode 100644 index 0000000000..a159314c37 --- /dev/null +++ b/extensions/sharing/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/extensions/sharing/pkg/config/parser" + "github.com/owncloud/ocis/extensions/sharing/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/sharing/pkg/command/root.go b/extensions/sharing/pkg/command/root.go new file mode 100644 index 0000000000..30e24793fa --- /dev/null +++ b/extensions/sharing/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-sharing command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-sharing", + Usage: "Provide sharing for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the sharing command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new sharing.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.Sharing.Commons = cfg.Commons + return SutureService{ + cfg: cfg.Sharing, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/sharing/pkg/command/server.go b/extensions/sharing/pkg/command/server.go new file mode 100644 index 0000000000..26c085082c --- /dev/null +++ b/extensions/sharing/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/extensions/sharing/pkg/config/parser" + "github.com/owncloud/ocis/extensions/sharing/pkg/logging" + "github.com/owncloud/ocis/extensions/sharing/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/sharing/pkg/server/debug" + "github.com/owncloud/ocis/extensions/sharing/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.SharingConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/sharing/pkg/command/version.go b/extensions/sharing/pkg/command/version.go new file mode 100644 index 0000000000..e54734d0ff --- /dev/null +++ b/extensions/sharing/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/sharing/pkg/config/config.go b/extensions/sharing/pkg/config/config.go index f81d37faa1..24dc40c980 100644 --- a/extensions/sharing/pkg/config/config.go +++ b/extensions/sharing/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -21,6 +24,9 @@ type Config struct { PublicSharingDriver string `yaml:"public_sharing_driver"` PublicSharingDrivers PublicSharingDrivers `yaml:"public_sharing_drivers"` Events Events `yaml:"events"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;SHARING_TRACING_ENABLED" desc:"Activates tracing."` @@ -29,7 +35,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;SHARING_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;SHARING_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;SHARING_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;SHARING_LOG_COLOR" desc:"Activates colorized log output."` @@ -48,8 +54,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"SHARING_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"SHARING_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"SHARING_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"SHARING_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type UserSharingDrivers struct { diff --git a/extensions/sharing/pkg/config/defaults/defaultconfig.go b/extensions/sharing/pkg/config/defaults/defaultconfig.go index 924e432288..47f4f2e15a 100644 --- a/extensions/sharing/pkg/config/defaults/defaultconfig.go +++ b/extensions/sharing/pkg/config/defaults/defaultconfig.go @@ -23,8 +23,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9150", - Protocol: "tcp", + Addr: "127.0.0.1:9150", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "sharing", @@ -81,15 +82,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/sharing/pkg/logging/logging.go b/extensions/sharing/pkg/logging/logging.go new file mode 100644 index 0000000000..364f2a76de --- /dev/null +++ b/extensions/sharing/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/sharing/pkg/command/command.go b/extensions/sharing/pkg/revaconfig/config.go similarity index 57% rename from extensions/sharing/pkg/command/command.go rename to extensions/sharing/pkg/revaconfig/config.go index 2e0eca8d14..a7c8710e78 100644 --- a/extensions/sharing/pkg/command/command.go +++ b/extensions/sharing/pkg/revaconfig/config.go @@ -1,117 +1,17 @@ -package command +package revaconfig import ( - "context" - "flag" - "fmt" - "os" - "path" - "path/filepath" - - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" "github.com/owncloud/ocis/extensions/sharing/pkg/config" - "github.com/owncloud/ocis/extensions/sharing/pkg/config/parser" - "github.com/owncloud/ocis/extensions/sharing/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" ) -// Sharing is the entrypoint for the sharing command. -func Sharing(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "sharing", - Usage: "start sharing service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // precreate folders - if cfg.UserSharingDriver == "json" && cfg.UserSharingDrivers.JSON.File != "" { - if err := os.MkdirAll(filepath.Dir(cfg.UserSharingDrivers.JSON.File), os.FileMode(0700)); err != nil { - return err - } - } - if cfg.PublicSharingDriver == "json" && cfg.PublicSharingDrivers.JSON.File != "" { - if err := os.MkdirAll(filepath.Dir(cfg.PublicSharingDrivers.JSON.File), os.FileMode(0700)); err != nil { - return err - } - } - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := sharingConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debug, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debug.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// sharingConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func sharingConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { +// SharingConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func SharingConfigFromStruct(cfg *config.Config) map[string]interface{} { rcfg := map[string]interface{}{ "core": map[string]interface{}{ "tracing_enabled": cfg.Tracing.Enabled, "tracing_endpoint": cfg.Tracing.Endpoint, "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, + "tracing_service_name": cfg.Service.Name, }, "shared": map[string]interface{}{ "jwt_secret": cfg.TokenManager.JWTSecret, @@ -205,39 +105,3 @@ func sharingConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]inte } return rcfg } - -// SharingSutureService allows for the storage-sharing command to be embedded and supervised by a suture supervisor tree. -type SharingSutureService struct { - cfg *config.Config -} - -// NewSharingSutureService creates a new store.SharingSutureService -func NewSharing(cfg *ociscfg.Config) suture.Service { - cfg.Sharing.Commons = cfg.Commons - return SharingSutureService{ - cfg: cfg.Sharing, - } -} - -func (s SharingSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.Sharing.Context = ctx - cmd := Sharing(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/sharing/pkg/tracing/tracing.go b/extensions/sharing/pkg/tracing/tracing.go new file mode 100644 index 0000000000..443fbc88c6 --- /dev/null +++ b/extensions/sharing/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/sharing/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/storage-metadata/cmd/storage-metadata/main.go b/extensions/storage-metadata/cmd/storage-metadata/main.go new file mode 100644 index 0000000000..e52ef1a27b --- /dev/null +++ b/extensions/storage-metadata/cmd/storage-metadata/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/command" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/storage-metadata/pkg/Makefile b/extensions/storage-metadata/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/storage-metadata/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/storage-metadata/pkg/command/command.go b/extensions/storage-metadata/pkg/command/command.go deleted file mode 100644 index 5d9f4d760b..0000000000 --- a/extensions/storage-metadata/pkg/command/command.go +++ /dev/null @@ -1,267 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" - "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage-metadata/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/service/external" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/owncloud/ocis/ocis-pkg/version" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// StorageMetadata the entrypoint for the storage-storage-metadata command. -// -// It provides a ocis-specific storage store metadata (shares,account,settings...) -func StorageMetadata(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "storage-metadata", - Usage: "start storage-metadata service", - Category: "extensions", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - - gr := run.Group{} - ctx, cancel := func() (context.Context, context.CancelFunc) { - if cfg.Context == nil { - return context.WithCancel(context.Background()) - } - return context.WithCancel(cfg.Context) - }() - - defer cancel() - - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") - rcfg := storageMetadataFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info(). - Err(err). - Str("server", c.Command.Name+"-debug"). - Msg("Failed to initialize server") - - return err - } - - gr.Add(func() error { - return debugServer.ListenAndServe() - }, func(_ error) { - _ = debugServer.Shutdown(ctx) - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - if err := external.RegisterGRPCEndpoint( - ctx, - "com.owncloud.storage.metadata", - uuid.Must(uuid.NewV4()).String(), - cfg.GRPC.Addr, - version.String, - logger, - ); err != nil { - logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") - } - - return gr.Run() - }, - } -} - -// storageMetadataFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func storageMetadataFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - "services": map[string]interface{}{ - "gateway": map[string]interface{}{ - // registries are located on the gateway - "authregistrysvc": cfg.GRPC.Addr, - "storageregistrysvc": cfg.GRPC.Addr, - // user metadata is located on the users services - "userprovidersvc": cfg.GRPC.Addr, - "groupprovidersvc": cfg.GRPC.Addr, - "permissionssvc": cfg.GRPC.Addr, - // other - "disable_home_creation_on_login": true, // metadata manually creates a space - // metadata always uses the simple upload, so no transfer secret or datagateway needed - }, - "userprovider": map[string]interface{}{ - "driver": "memory", - "drivers": map[string]interface{}{ - "memory": map[string]interface{}{ - "users": map[string]interface{}{ - "serviceuser": map[string]interface{}{ - "id": map[string]interface{}{ - "opaqueId": cfg.MetadataUserID, - "idp": "internal", - "type": userpb.UserType_USER_TYPE_PRIMARY, - }, - "username": "serviceuser", - "display_name": "System User", - }, - }, - }, - }, - }, - "authregistry": map[string]interface{}{ - "driver": "static", - "drivers": map[string]interface{}{ - "static": map[string]interface{}{ - "rules": map[string]interface{}{ - "machine": cfg.GRPC.Addr, - }, - }, - }, - }, - "authprovider": map[string]interface{}{ - "auth_manager": "machine", - "auth_managers": map[string]interface{}{ - "machine": map[string]interface{}{ - "api_key": cfg.MachineAuthAPIKey, - "gateway_addr": cfg.GRPC.Addr, - }, - }, - }, - "permissions": map[string]interface{}{ - "driver": "demo", - "drivers": map[string]interface{}{ - "demo": map[string]interface{}{}, - }, - }, - "storageregistry": map[string]interface{}{ - "driver": "static", - "drivers": map[string]interface{}{ - "static": map[string]interface{}{ - "rules": map[string]interface{}{ - "/": map[string]interface{}{ - "address": cfg.GRPC.Addr, - }, - }, - }, - }, - }, - "storageprovider": map[string]interface{}{ - "driver": cfg.Driver, - "drivers": config.MetadataDrivers(cfg), - "data_server_url": cfg.DataServerURL, - "tmp_folder": cfg.TempFolder, - }, - }, - }, - "http": map[string]interface{}{ - "network": cfg.HTTP.Protocol, - "address": cfg.HTTP.Addr, - // no datagateway needed as the metadata clients directly talk to the dataprovider with the simple protocol - "services": map[string]interface{}{ - "dataprovider": map[string]interface{}{ - "prefix": "data", - "driver": cfg.Driver, - "drivers": config.MetadataDrivers(cfg), - "timeout": 86400, - "insecure": cfg.DataProviderInsecure, - "disable_tus": true, - }, - }, - }, - } - return rcfg -} - -// SutureService allows for the storage-metadata command to be embedded and supervised by a suture supervisor tree. -type MetadataSutureService struct { - cfg *config.Config -} - -// NewSutureService creates a new storagemetadata.SutureService -func NewStorageMetadata(cfg *ociscfg.Config) suture.Service { - cfg.StorageMetadata.Commons = cfg.Commons - return MetadataSutureService{ - cfg: cfg.StorageMetadata, - } -} - -func (s MetadataSutureService) Serve(ctx context.Context) error { - s.cfg.Context = ctx - f := &flag.FlagSet{} - cmdFlags := StorageMetadata(s.cfg).Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if StorageMetadata(s.cfg).Before != nil { - if err := StorageMetadata(s.cfg).Before(cliCtx); err != nil { - return err - } - } - if err := StorageMetadata(s.cfg).Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/storage-metadata/pkg/command/health.go b/extensions/storage-metadata/pkg/command/health.go new file mode 100644 index 0000000000..66274f9e72 --- /dev/null +++ b/extensions/storage-metadata/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/storage-metadata/pkg/command/root.go b/extensions/storage-metadata/pkg/command/root.go new file mode 100644 index 0000000000..8515d544ee --- /dev/null +++ b/extensions/storage-metadata/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-storage-metadata command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-storage-metadata", + Usage: "Provide apps for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the storage-metadata command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new storage-metadata.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.StorageMetadata.Commons = cfg.Commons + return SutureService{ + cfg: cfg.StorageMetadata, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/storage-metadata/pkg/command/server.go b/extensions/storage-metadata/pkg/command/server.go new file mode 100644 index 0000000000..43b720eb29 --- /dev/null +++ b/extensions/storage-metadata/pkg/command/server.go @@ -0,0 +1,118 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/logging" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.StorageMetadataFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + if err := external.RegisterHTTPEndpoint( + ctx, + cfg.HTTP.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.HTTP.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the http endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/storage-metadata/pkg/command/version.go b/extensions/storage-metadata/pkg/command/version.go new file mode 100644 index 0000000000..0f58c54990 --- /dev/null +++ b/extensions/storage-metadata/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/storage-metadata/pkg/config/config.go b/extensions/storage-metadata/pkg/config/config.go index 8c4475600f..8f90172995 100644 --- a/extensions/storage-metadata/pkg/config/config.go +++ b/extensions/storage-metadata/pkg/config/config.go @@ -10,15 +10,12 @@ type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` HTTP HTTPConfig `yaml:"http"` - Context context.Context `yaml:"context"` - TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"STORAGE_METADATA_MACHINE_AUTH_API_KEY"` @@ -30,6 +27,9 @@ type Config struct { DataServerURL string `yaml:"data_server_url"` TempFolder string `yaml:"temp_folder"` DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_METADATA_DATAPROVIDER_INSECURE"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;STORAGE_METADATA_TRACING_ENABLED" desc:"Activates tracing."` @@ -38,7 +38,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;STORAGE_METADATA_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;STORAGE_METADATA_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;STORAGE_METADATA_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;STORAGE_METADATA_LOG_COLOR" desc:"Activates colorized log output."` @@ -57,13 +57,15 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"STORAGE_METADATA_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"STORAGE_METADATA_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"STORAGE_METADATA_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"STORAGE_METADATA_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type HTTPConfig struct { - Addr string `yaml:"addr" env:"STORAGE_METADATA_HTTP_ADDR" desc:"The address of the http service."` - Protocol string `yaml:"protocol" env:"STORAGE_METADATA_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` + Addr string `yaml:"addr" env:"STORAGE_METADATA_HTTP_ADDR" desc:"The address of the http service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"STORAGE_METADATA_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` } type Drivers struct { diff --git a/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go b/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go index 4f274aa0ca..715ad43932 100644 --- a/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go @@ -24,12 +24,14 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9215", - Protocol: "tcp", + Addr: "127.0.0.1:9215", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, HTTP: config.HTTPConfig{ - Addr: "127.0.0.1:9216", - Protocol: "tcp", + Addr: "127.0.0.1:9216", + Namespace: "com.owncloud.web", + Protocol: "tcp", }, Service: config.Service{ Name: "storage-metadata", @@ -84,15 +86,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/storage-metadata/pkg/logging/logging.go b/extensions/storage-metadata/pkg/logging/logging.go new file mode 100644 index 0000000000..feef4ad399 --- /dev/null +++ b/extensions/storage-metadata/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/storage-metadata/pkg/revaconfig/config.go b/extensions/storage-metadata/pkg/revaconfig/config.go new file mode 100644 index 0000000000..be7706efd0 --- /dev/null +++ b/extensions/storage-metadata/pkg/revaconfig/config.go @@ -0,0 +1,118 @@ +package revaconfig + +import ( + userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" +) + +// StorageMetadataFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func StorageMetadataFromStruct(cfg *config.Config) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "services": map[string]interface{}{ + "gateway": map[string]interface{}{ + // registries are located on the gateway + "authregistrysvc": cfg.GRPC.Addr, + "storageregistrysvc": cfg.GRPC.Addr, + // user metadata is located on the users services + "userprovidersvc": cfg.GRPC.Addr, + "groupprovidersvc": cfg.GRPC.Addr, + "permissionssvc": cfg.GRPC.Addr, + // other + "disable_home_creation_on_login": true, // metadata manually creates a space + // metadata always uses the simple upload, so no transfer secret or datagateway needed + }, + "userprovider": map[string]interface{}{ + "driver": "memory", + "drivers": map[string]interface{}{ + "memory": map[string]interface{}{ + "users": map[string]interface{}{ + "serviceuser": map[string]interface{}{ + "id": map[string]interface{}{ + "opaqueId": cfg.MetadataUserID, + "idp": "internal", + "type": userpb.UserType_USER_TYPE_PRIMARY, + }, + "username": "serviceuser", + "display_name": "System User", + }, + }, + }, + }, + }, + "authregistry": map[string]interface{}{ + "driver": "static", + "drivers": map[string]interface{}{ + "static": map[string]interface{}{ + "rules": map[string]interface{}{ + "machine": cfg.GRPC.Addr, + }, + }, + }, + }, + "authprovider": map[string]interface{}{ + "auth_manager": "machine", + "auth_managers": map[string]interface{}{ + "machine": map[string]interface{}{ + "api_key": cfg.MachineAuthAPIKey, + "gateway_addr": cfg.GRPC.Addr, + }, + }, + }, + "permissions": map[string]interface{}{ + "driver": "demo", + "drivers": map[string]interface{}{ + "demo": map[string]interface{}{}, + }, + }, + "storageregistry": map[string]interface{}{ + "driver": "static", + "drivers": map[string]interface{}{ + "static": map[string]interface{}{ + "rules": map[string]interface{}{ + "/": map[string]interface{}{ + "address": cfg.GRPC.Addr, + }, + }, + }, + }, + }, + "storageprovider": map[string]interface{}{ + "driver": cfg.Driver, + "drivers": config.MetadataDrivers(cfg), + "data_server_url": cfg.DataServerURL, + "tmp_folder": cfg.TempFolder, + }, + }, + }, + "http": map[string]interface{}{ + "network": cfg.HTTP.Protocol, + "address": cfg.HTTP.Addr, + // no datagateway needed as the metadata clients directly talk to the dataprovider with the simple protocol + "services": map[string]interface{}{ + "dataprovider": map[string]interface{}{ + "prefix": "data", + "driver": cfg.Driver, + "drivers": config.MetadataDrivers(cfg), + "timeout": 86400, + "insecure": cfg.DataProviderInsecure, + "disable_tus": true, + }, + }, + }, + } + return rcfg +} diff --git a/extensions/storage-metadata/pkg/tracing/tracing.go b/extensions/storage-metadata/pkg/tracing/tracing.go new file mode 100644 index 0000000000..49a96c8451 --- /dev/null +++ b/extensions/storage-metadata/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/storage-publiclink/cmd/storage-publiclink/main.go b/extensions/storage-publiclink/cmd/storage-publiclink/main.go new file mode 100644 index 0000000000..55e9f26f95 --- /dev/null +++ b/extensions/storage-publiclink/cmd/storage-publiclink/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/command" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/storage-publiclink/pkg/Makefile b/extensions/storage-publiclink/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/storage-publiclink/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/storage-publiclink/pkg/command/health.go b/extensions/storage-publiclink/pkg/command/health.go new file mode 100644 index 0000000000..f406daeb5f --- /dev/null +++ b/extensions/storage-publiclink/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/storage-publiclink/pkg/command/root.go b/extensions/storage-publiclink/pkg/command/root.go new file mode 100644 index 0000000000..1b89e3d262 --- /dev/null +++ b/extensions/storage-publiclink/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-accounts command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-appprovider", + Usage: "Provide apps for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the accounts command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new accounts.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.StoragePublicLink.Commons = cfg.Commons + return SutureService{ + cfg: cfg.StoragePublicLink, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/storage-publiclink/pkg/command/server.go b/extensions/storage-publiclink/pkg/command/server.go new file mode 100644 index 0000000000..eb0a938e63 --- /dev/null +++ b/extensions/storage-publiclink/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/logging" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.StoragePublicLinkConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/storage-publiclink/pkg/command/storagepubliclink.go b/extensions/storage-publiclink/pkg/command/storagepubliclink.go deleted file mode 100644 index 78996e6597..0000000000 --- a/extensions/storage-publiclink/pkg/command/storagepubliclink.go +++ /dev/null @@ -1,165 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" - "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// StoragePublicLink is the entrypoint for the reva-storage-public-link command. -func StoragePublicLink(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "storage-public-link", - Usage: "start storage-public-link service", - Category: "extensions", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") - rcfg := storagePublicLinkConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// storagePublicLinkConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func storagePublicLinkConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - "interceptors": map[string]interface{}{ - "log": map[string]interface{}{}, - }, - "services": map[string]interface{}{ - "publicstorageprovider": map[string]interface{}{ - "mount_id": cfg.StorageProvider.MountID, - "gateway_addr": cfg.StorageProvider.GatewayEndpoint, - }, - "authprovider": map[string]interface{}{ - "auth_manager": "publicshares", - "auth_managers": map[string]interface{}{ - "publicshares": map[string]interface{}{ - "gateway_addr": cfg.AuthProvider.GatewayEndpoint, - }, - }, - }, - }, - }, - } - return rcfg -} - -// StoragePublicLinkSutureService allows for the storage-public-link command to be embedded and supervised by a suture supervisor tree. -type StoragePublicLinkSutureService struct { - cfg *config.Config -} - -// NewStoragePublicLinkSutureService creates a new storage.StoragePublicLinkSutureService -func NewStoragePublicLink(cfg *ociscfg.Config) suture.Service { - cfg.StoragePublicLink.Commons = cfg.Commons - return StoragePublicLinkSutureService{ - cfg: cfg.StoragePublicLink, - } -} - -func (s StoragePublicLinkSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.StoragePublicLink.Context = ctx - cmd := StoragePublicLink(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/storage-publiclink/pkg/command/version.go b/extensions/storage-publiclink/pkg/command/version.go new file mode 100644 index 0000000000..f16c6dca20 --- /dev/null +++ b/extensions/storage-publiclink/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/storage-publiclink/pkg/config/config.go b/extensions/storage-publiclink/pkg/config/config.go index 92d412a690..e3cf134ab3 100644 --- a/extensions/storage-publiclink/pkg/config/config.go +++ b/extensions/storage-publiclink/pkg/config/config.go @@ -10,20 +10,20 @@ type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` - Context context.Context `yaml:"context"` - TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` AuthProvider AuthProvider `yaml:"auth_provider"` StorageProvider StorageProvider `yaml:"storage_provider"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;STORAGE_PUBLICLINK_TRACING_ENABLED" desc:"Activates tracing."` @@ -32,7 +32,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;STORAGE_PUBLICLINK_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;STORAGE_PUBLICLINK_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;STORAGE_PUBLICLINK_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;STORAGE_PUBLICLINK_LOG_COLOR" desc:"Activates colorized log output."` @@ -51,8 +51,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"STORAGE_PUBLICLINK_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"STORAGE_PUBLICLINK_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"STORAGE_PUBLICLINK_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"STORAGE_PUBLICLINK_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type AuthProvider struct { diff --git a/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go b/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go index 47b729c05a..67dfbcedc6 100644 --- a/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go @@ -20,8 +20,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9178", - Protocol: "tcp", + Addr: "127.0.0.1:9178", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "storage-publiclink", @@ -41,15 +42,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/storage-publiclink/pkg/logging/logging.go b/extensions/storage-publiclink/pkg/logging/logging.go new file mode 100644 index 0000000000..a3dc14fdeb --- /dev/null +++ b/extensions/storage-publiclink/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/storage-publiclink/pkg/revaconfig/config.go b/extensions/storage-publiclink/pkg/revaconfig/config.go new file mode 100644 index 0000000000..fcab22c09d --- /dev/null +++ b/extensions/storage-publiclink/pkg/revaconfig/config.go @@ -0,0 +1,44 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" +) + +// StoragePublicLinkConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func StoragePublicLinkConfigFromStruct(cfg *config.Config) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "interceptors": map[string]interface{}{ + "log": map[string]interface{}{}, + }, + "services": map[string]interface{}{ + "publicstorageprovider": map[string]interface{}{ + "mount_id": cfg.StorageProvider.MountID, + "gateway_addr": cfg.StorageProvider.GatewayEndpoint, + }, + "authprovider": map[string]interface{}{ + "auth_manager": "publicshares", + "auth_managers": map[string]interface{}{ + "publicshares": map[string]interface{}{ + "gateway_addr": cfg.AuthProvider.GatewayEndpoint, + }, + }, + }, + }, + }, + } + return rcfg +} diff --git a/extensions/storage-publiclink/pkg/tracing/tracing.go b/extensions/storage-publiclink/pkg/tracing/tracing.go new file mode 100644 index 0000000000..753c732c60 --- /dev/null +++ b/extensions/storage-publiclink/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/storage-publiclink/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/storage-shares/cmd/storage-shares/main.go b/extensions/storage-shares/cmd/storage-shares/main.go new file mode 100644 index 0000000000..6fea0b0df3 --- /dev/null +++ b/extensions/storage-shares/cmd/storage-shares/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/storage-shares/pkg/command" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/storage-shares/pkg/Makefile b/extensions/storage-shares/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/storage-shares/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/storage-shares/pkg/command/command.go b/extensions/storage-shares/pkg/command/command.go deleted file mode 100644 index ba9efc6457..0000000000 --- a/extensions/storage-shares/pkg/command/command.go +++ /dev/null @@ -1,161 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" - "github.com/owncloud/ocis/extensions/storage-shares/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage-shares/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// StorageShares is the entrypoint for the storage-shares command. -func StorageShares(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "storage-shares", - Usage: "start storage-shares service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := storageSharesConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// storageSharesConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func storageSharesConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - "services": map[string]interface{}{ - "sharesstorageprovider": map[string]interface{}{ - "usershareprovidersvc": cfg.SharesProviderEndpoint, - }, - }, - }, - } - if cfg.ReadOnly { - gcfg := rcfg["grpc"].(map[string]interface{}) - gcfg["interceptors"] = map[string]interface{}{ - "readonly": map[string]interface{}{}, - } - } - return rcfg -} - -// StorageSharesSutureService allows for the storage-shares command to be embedded and supervised by a suture supervisor tree. -type StorageSharesSutureService struct { - cfg *config.Config -} - -// NewStorageShares creates a new storage.StorageSharesSutureService -func NewStorageShares(cfg *ociscfg.Config) suture.Service { - cfg.StorageShares.Commons = cfg.Commons - return StorageSharesSutureService{ - cfg: cfg.StorageShares, - } -} - -func (s StorageSharesSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.StorageShares.Context = ctx - cmd := StorageShares(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/storage-shares/pkg/command/health.go b/extensions/storage-shares/pkg/command/health.go new file mode 100644 index 0000000000..8b5505e738 --- /dev/null +++ b/extensions/storage-shares/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/storage-shares/pkg/command/root.go b/extensions/storage-shares/pkg/command/root.go new file mode 100644 index 0000000000..f055516f66 --- /dev/null +++ b/extensions/storage-shares/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the storage-shares command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-storage-shares", + Usage: "Provide a virtual storage for shares in oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the accounts command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new storage-shares.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.StorageShares.Commons = cfg.Commons + return SutureService{ + cfg: cfg.StorageShares, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/storage-shares/pkg/command/server.go b/extensions/storage-shares/pkg/command/server.go new file mode 100644 index 0000000000..16560c6e94 --- /dev/null +++ b/extensions/storage-shares/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/logging" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.StorageSharesConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/storage-shares/pkg/command/version.go b/extensions/storage-shares/pkg/command/version.go new file mode 100644 index 0000000000..3687778691 --- /dev/null +++ b/extensions/storage-shares/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/storage-shares/pkg/config/config.go b/extensions/storage-shares/pkg/config/config.go index 4677edef2e..ac68d6e9ed 100644 --- a/extensions/storage-shares/pkg/config/config.go +++ b/extensions/storage-shares/pkg/config/config.go @@ -10,20 +10,20 @@ type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` - HTTP HTTPConfig `yaml:"http"` TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - Context context.Context `yaml:"context"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - ReadOnly bool `yaml:"readonly"` - SharesProviderEndpoint string `yaml:"shares_provider_endpoint"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + ReadOnly bool `yaml:"readonly"` + SharesProviderEndpoint string `yaml:"shares_provider_endpoint"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;STORAGE_SHARES_TRACING_ENABLED" desc:"Activates tracing."` @@ -32,7 +32,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;STORAGE_SHARES_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;STORAGE_SHARES_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;STORAGE_SHARES_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;STORAGE_SHARES_LOG_COLOR" desc:"Activates colorized log output."` @@ -51,11 +51,7 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"STORAGE_SHARES_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"STORAGE_SHARES_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` -} - -type HTTPConfig struct { - Addr string `yaml:"addr" env:"STORAGE_SHARES_HTTP_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"STORAGE_SHARES_HTTP_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"STORAGE_SHARES_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"STORAGE_SHARES_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } diff --git a/extensions/storage-shares/pkg/config/defaults/defaultconfig.go b/extensions/storage-shares/pkg/config/defaults/defaultconfig.go index 40aba54cfd..5b1ad7faa2 100644 --- a/extensions/storage-shares/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-shares/pkg/config/defaults/defaultconfig.go @@ -20,12 +20,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9154", - Protocol: "tcp", - }, - HTTP: config.HTTPConfig{ - Addr: "127.0.0.1:9155", - Protocol: "tcp", + Addr: "127.0.0.1:9154", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "storage-shares", @@ -40,15 +37,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/storage-shares/pkg/logging/logging.go b/extensions/storage-shares/pkg/logging/logging.go new file mode 100644 index 0000000000..7769e10fe7 --- /dev/null +++ b/extensions/storage-shares/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/storage-shares/pkg/revaconfig/config.go b/extensions/storage-shares/pkg/revaconfig/config.go new file mode 100644 index 0000000000..be281c0553 --- /dev/null +++ b/extensions/storage-shares/pkg/revaconfig/config.go @@ -0,0 +1,38 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" +) + +// StorageSharesConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func StorageSharesConfigFromStruct(cfg *config.Config) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "services": map[string]interface{}{ + "sharesstorageprovider": map[string]interface{}{ + "usershareprovidersvc": cfg.SharesProviderEndpoint, + }, + }, + }, + } + if cfg.ReadOnly { + gcfg := rcfg["grpc"].(map[string]interface{}) + gcfg["interceptors"] = map[string]interface{}{ + "readonly": map[string]interface{}{}, + } + } + return rcfg +} diff --git a/extensions/storage-shares/pkg/tracing/tracing.go b/extensions/storage-shares/pkg/tracing/tracing.go new file mode 100644 index 0000000000..16a443b084 --- /dev/null +++ b/extensions/storage-shares/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/storage-shares/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/storage-users/cmd/storage-users/main.go b/extensions/storage-users/cmd/storage-users/main.go new file mode 100644 index 0000000000..4e99f59377 --- /dev/null +++ b/extensions/storage-users/cmd/storage-users/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/storage-users/pkg/command" + "github.com/owncloud/ocis/extensions/storage-users/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/storage-users/pkg/Makefile b/extensions/storage-users/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/storage-users/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/storage-users/pkg/command/command.go b/extensions/storage-users/pkg/command/command.go deleted file mode 100644 index 766631f6a5..0000000000 --- a/extensions/storage-users/pkg/command/command.go +++ /dev/null @@ -1,189 +0,0 @@ -package command - -import ( - "context" - "flag" - "fmt" - "os" - "path" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/storage-users/pkg/config" - "github.com/owncloud/ocis/extensions/storage-users/pkg/config/parser" - "github.com/owncloud/ocis/extensions/storage-users/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// StorageUsers is the entrypoint for the storage-users command. -func StorageUsers(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "storage-users", - Usage: "start storage-users service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := storageUsersConfigFromStruct(c, cfg) - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// storageUsersConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func storageUsersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.TokenManager.JWTSecret, - "gatewaysvc": cfg.Reva.Address, - "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.GRPC.Protocol, - "address": cfg.GRPC.Addr, - // TODO build services dynamically - "services": map[string]interface{}{ - "storageprovider": map[string]interface{}{ - "driver": cfg.Driver, - "drivers": config.UserDrivers(cfg), - "mount_id": cfg.MountID, - "expose_data_server": cfg.ExposeDataServer, - "data_server_url": cfg.DataServerURL, - "tmp_folder": cfg.TempFolder, - }, - }, - "interceptors": map[string]interface{}{ - "eventsmiddleware": map[string]interface{}{ - "group": "sharing", - "type": "nats", - "address": cfg.Events.Addr, - "clusterID": cfg.Events.ClusterID, - }, - }, - }, - "http": map[string]interface{}{ - "network": cfg.HTTP.Protocol, - "address": cfg.HTTP.Addr, - // TODO build services dynamically - "services": map[string]interface{}{ - "dataprovider": map[string]interface{}{ - "prefix": cfg.HTTP.Prefix, - "driver": cfg.Driver, - "drivers": config.UserDrivers(cfg), - "timeout": 86400, - "insecure": cfg.DataProviderInsecure, - "disable_tus": false, - }, - }, - }, - } - if cfg.ReadOnly { - gcfg := rcfg["grpc"].(map[string]interface{}) - gcfg["interceptors"] = map[string]interface{}{ - "readonly": map[string]interface{}{}, - } - } - return rcfg -} - -// StorageUsersSutureService allows for the storage-home command to be embedded and supervised by a suture supervisor tree. -type StorageUsersSutureService struct { - cfg *config.Config -} - -// NewStorageUsersSutureService creates a new storage.StorageUsersSutureService -func NewStorageUsers(cfg *ociscfg.Config) suture.Service { - cfg.StorageUsers.Commons = cfg.Commons - return StorageUsersSutureService{ - cfg: cfg.StorageUsers, - } -} - -func (s StorageUsersSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.StorageUsers.Context = ctx - cmd := StorageUsers(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/storage-users/pkg/command/health.go b/extensions/storage-users/pkg/command/health.go new file mode 100644 index 0000000000..baa4d1a8de --- /dev/null +++ b/extensions/storage-users/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/extensions/storage-users/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-users/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/storage-users/pkg/command/root.go b/extensions/storage-users/pkg/command/root.go new file mode 100644 index 0000000000..1d98daeab8 --- /dev/null +++ b/extensions/storage-users/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-storage-users command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-storage-users", + Usage: "Provide storage for users and projects in oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the accounts command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new storage-users.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.StorageUsers.Commons = cfg.Commons + return SutureService{ + cfg: cfg.StorageUsers, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/storage-users/pkg/command/server.go b/extensions/storage-users/pkg/command/server.go new file mode 100644 index 0000000000..ae83b2435f --- /dev/null +++ b/extensions/storage-users/pkg/command/server.go @@ -0,0 +1,107 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/extensions/storage-users/pkg/config/parser" + "github.com/owncloud/ocis/extensions/storage-users/pkg/logging" + "github.com/owncloud/ocis/extensions/storage-users/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/storage-users/pkg/server/debug" + "github.com/owncloud/ocis/extensions/storage-users/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.StorageUsersConfigFromStruct(cfg) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/storage-users/pkg/command/version.go b/extensions/storage-users/pkg/command/version.go new file mode 100644 index 0000000000..597dcc14df --- /dev/null +++ b/extensions/storage-users/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/storage-users/pkg/config/config.go b/extensions/storage-users/pkg/config/config.go index e47bd01794..732bc70c02 100644 --- a/extensions/storage-users/pkg/config/config.go +++ b/extensions/storage-users/pkg/config/config.go @@ -10,9 +10,8 @@ type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` HTTP HTTPConfig `yaml:"http"` @@ -20,8 +19,6 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - Context context.Context `yaml:"context"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` Driver string `yaml:"driver" env:"STORAGE_USERS_DRIVER" desc:"The storage driver which should be used by the service"` Drivers Drivers `yaml:"drivers"` @@ -32,6 +29,9 @@ type Config struct { MountID string `yaml:"mount_id"` ExposeDataServer bool `yaml:"expose_data_server"` ReadOnly bool `yaml:"readonly"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;STORAGE_USERS_TRACING_ENABLED" desc:"Activates tracing."` @@ -40,7 +40,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;STORAGE_USERS_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;STORAGE_USERS_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;STORAGE_USERS_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;STORAGE_USERS_LOG_COLOR" desc:"Activates colorized log output."` @@ -59,14 +59,16 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"STORAGE_USERS_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"STORAGE_USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"STORAGE_USERS_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"STORAGE_USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type HTTPConfig struct { - Addr string `yaml:"addr" env:"STORAGE_USERS_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"STORAGE_USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` - Prefix string + Addr string `yaml:"addr" env:"STORAGE_USERS_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"STORAGE_USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Prefix string } type Drivers struct { diff --git a/extensions/storage-users/pkg/config/defaults/defaultconfig.go b/extensions/storage-users/pkg/config/defaults/defaultconfig.go index 87c0bb4cd8..fb36a5073d 100644 --- a/extensions/storage-users/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-users/pkg/config/defaults/defaultconfig.go @@ -23,13 +23,15 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9157", - Protocol: "tcp", + Addr: "127.0.0.1:9157", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, HTTP: config.HTTPConfig{ - Addr: "127.0.0.1:9158", - Protocol: "tcp", - Prefix: "data", + Addr: "127.0.0.1:9158", + Namespace: "com.owncloud.web", + Protocol: "tcp", + Prefix: "data", }, Service: config.Service{ Name: "storage-users", @@ -80,15 +82,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/storage-users/pkg/logging/logging.go b/extensions/storage-users/pkg/logging/logging.go new file mode 100644 index 0000000000..3c9fb9c661 --- /dev/null +++ b/extensions/storage-users/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/storage-users/pkg/revaconfig/config.go b/extensions/storage-users/pkg/revaconfig/config.go new file mode 100644 index 0000000000..7794794629 --- /dev/null +++ b/extensions/storage-users/pkg/revaconfig/config.go @@ -0,0 +1,67 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" +) + +// StorageUsersConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func StorageUsersConfigFromStruct(cfg *config.Config) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "storageprovider": map[string]interface{}{ + "driver": cfg.Driver, + "drivers": UserDrivers(cfg), + "mount_id": cfg.MountID, + "expose_data_server": cfg.ExposeDataServer, + "data_server_url": cfg.DataServerURL, + "tmp_folder": cfg.TempFolder, + }, + }, + "interceptors": map[string]interface{}{ + "eventsmiddleware": map[string]interface{}{ + "group": "sharing", + "type": "nats", + "address": cfg.Events.Addr, + "clusterID": cfg.Events.ClusterID, + }, + }, + }, + "http": map[string]interface{}{ + "network": cfg.HTTP.Protocol, + "address": cfg.HTTP.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "dataprovider": map[string]interface{}{ + "prefix": cfg.HTTP.Prefix, + "driver": cfg.Driver, + "drivers": UserDrivers(cfg), + "timeout": 86400, + "insecure": cfg.DataProviderInsecure, + "disable_tus": false, + }, + }, + }, + } + if cfg.ReadOnly { + gcfg := rcfg["grpc"].(map[string]interface{}) + gcfg["interceptors"] = map[string]interface{}{ + "readonly": map[string]interface{}{}, + } + } + return rcfg +} diff --git a/extensions/storage-users/pkg/config/user.go b/extensions/storage-users/pkg/revaconfig/user.go similarity index 97% rename from extensions/storage-users/pkg/config/user.go rename to extensions/storage-users/pkg/revaconfig/user.go index 677b7b35bd..a8c7d73363 100644 --- a/extensions/storage-users/pkg/config/user.go +++ b/extensions/storage-users/pkg/revaconfig/user.go @@ -1,6 +1,8 @@ -package config +package revaconfig -func UserDrivers(cfg *Config) map[string]interface{} { +import "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + +func UserDrivers(cfg *config.Config) map[string]interface{} { return map[string]interface{}{ "eos": map[string]interface{}{ "namespace": cfg.Drivers.EOS.Root, diff --git a/extensions/storage-users/pkg/tracing/tracing.go b/extensions/storage-users/pkg/tracing/tracing.go new file mode 100644 index 0000000000..8e69e85058 --- /dev/null +++ b/extensions/storage-users/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/storage-users/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/user/cmd/user/main.go b/extensions/user/cmd/user/main.go new file mode 100644 index 0000000000..97d008cb00 --- /dev/null +++ b/extensions/user/cmd/user/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/user/pkg/command" + "github.com/owncloud/ocis/extensions/user/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/user/pkg/Makefile b/extensions/user/pkg/Makefile deleted file mode 100644 index 51243d83fc..0000000000 --- a/extensions/user/pkg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -SHELL := bash -NAME := ocs - -include ../../.make/recursion.mk - -############ tooling ############ -ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI -include ../../.bingo/Variables.mk -endif - -############ go tooling ############ -include ../../.make/go.mk - -############ release ############ -include ../../.make/release.mk - -############ docs generate ############ -include ../../.make/docs.mk - -.PHONY: docs-generate -docs-generate: config-docs-generate - -############ generate ############ -include ../../.make/generate.mk - -.PHONY: ci-go-generate -ci-go-generate: # CI runs ci-node-generate automatically before this target - -.PHONY: ci-node-generate -ci-node-generate: - -############ licenses ############ -.PHONY: ci-node-check-licenses -ci-node-check-licenses: - -.PHONY: ci-node-save-licenses -ci-node-save-licenses: diff --git a/extensions/user/pkg/command/health.go b/extensions/user/pkg/command/health.go new file mode 100644 index 0000000000..1039a0efc0 --- /dev/null +++ b/extensions/user/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/extensions/user/pkg/config/parser" + "github.com/owncloud/ocis/extensions/user/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/user/pkg/command/root.go b/extensions/user/pkg/command/root.go new file mode 100644 index 0000000000..23e45a2602 --- /dev/null +++ b/extensions/user/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-user command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-user", + Usage: "Provide users for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the user command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new user.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.User.Commons = cfg.Commons + return SutureService{ + cfg: cfg.User, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/user/pkg/command/server.go b/extensions/user/pkg/command/server.go new file mode 100644 index 0000000000..97baa1f9c4 --- /dev/null +++ b/extensions/user/pkg/command/server.go @@ -0,0 +1,120 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/extensions/user/pkg/config/parser" + "github.com/owncloud/ocis/extensions/user/pkg/logging" + "github.com/owncloud/ocis/extensions/user/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/user/pkg/server/debug" + "github.com/owncloud/ocis/extensions/user/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/ldap" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.UsersConfigFromStruct(cfg) + + // the reva runtime calls os.Exit in the case of a failure and there is no way for the oCIS + // runtime to catch it and restart a reva service. Therefore we need to ensure the service has + // everything it needs, before starting the service. + // In this case: CA certificates + if cfg.Driver == "ldap" { + ldapCfg := cfg.Drivers.LDAP + if err := ldap.WaitForCA(logger, ldapCfg.Insecure, ldapCfg.CACert); err != nil { + logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") + return err + } + } + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/user/pkg/command/version.go b/extensions/user/pkg/command/version.go new file mode 100644 index 0000000000..8330670428 --- /dev/null +++ b/extensions/user/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index 15c0bcd121..7471b751b9 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -1,14 +1,17 @@ package config -import "github.com/owncloud/ocis/ocis-pkg/shared" +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) type Config struct { *shared.Commons `yaml:"-"` Service Service `yaml:"-"` Tracing *Tracing `yaml:"tracing"` - Logging *Logging `yaml:"log"` + Log *Log `yaml:"log"` Debug Debug `yaml:"debug"` - Supervised bool `yaml:"-"` GRPC GRPCConfig `yaml:"grpc"` @@ -19,6 +22,9 @@ type Config struct { UsersCacheExpiration int `yaml:"users_cache_expiration"` Driver string `yaml:"driver"` Drivers Drivers `yaml:"drivers"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` } type Tracing struct { Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;USERS_TRACING_ENABLED" desc:"Activates tracing."` @@ -27,7 +33,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;USERS_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;USERS_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;USERS_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;USERS_LOG_COLOR" desc:"Activates colorized log output."` @@ -46,8 +52,9 @@ type Debug struct { } type GRPCConfig struct { - Addr string `yaml:"addr" env:"USERS_GRPC_ADDR" desc:"The address of the grpc service."` - Protocol string `yaml:"protocol" env:"USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` + Addr string `yaml:"addr" env:"USERS_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } type Drivers struct { diff --git a/extensions/user/pkg/config/defaults/defaultconfig.go b/extensions/user/pkg/config/defaults/defaultconfig.go index b7212abd0b..8a304e74c7 100644 --- a/extensions/user/pkg/config/defaults/defaultconfig.go +++ b/extensions/user/pkg/config/defaults/defaultconfig.go @@ -23,8 +23,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9144", - Protocol: "tcp", + Addr: "127.0.0.1:9144", + Namespace: "com.owncloud.api", + Protocol: "tcp", }, Service: config.Service{ Name: "user", @@ -86,15 +87,15 @@ func DefaultConfig() *config.Config { func EnsureDefaults(cfg *config.Config) { // provide with defaults for shared logging, since we need a valid destination address for BindEnv. - if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { - cfg.Logging = &config.Logging{ + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ Level: cfg.Commons.Log.Level, Pretty: cfg.Commons.Log.Pretty, Color: cfg.Commons.Log.Color, File: cfg.Commons.Log.File, } - } else if cfg.Logging == nil { - cfg.Logging = &config.Logging{} + } else if cfg.Log == nil { + cfg.Log = &config.Log{} } // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { diff --git a/extensions/user/pkg/logging/logging.go b/extensions/user/pkg/logging/logging.go new file mode 100644 index 0000000000..d855cfeb94 --- /dev/null +++ b/extensions/user/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/user/pkg/command/command.go b/extensions/user/pkg/revaconfig/config.go similarity index 50% rename from extensions/user/pkg/command/command.go rename to extensions/user/pkg/revaconfig/config.go index 7214e12e21..b0cfc333c0 100644 --- a/extensions/user/pkg/command/command.go +++ b/extensions/user/pkg/revaconfig/config.go @@ -1,124 +1,17 @@ -package command +package revaconfig import ( - "context" - "flag" - "fmt" - "os" - "path" - "path/filepath" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" "github.com/owncloud/ocis/extensions/user/pkg/config" - "github.com/owncloud/ocis/extensions/user/pkg/config/parser" - "github.com/owncloud/ocis/extensions/user/pkg/server/debug" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/ldap" - "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/owncloud/ocis/ocis-pkg/tracing" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" ) -// User is the entrypoint for the user command. -func User(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "users", - Usage: "start users service", - Before: func(ctx *cli.Context) error { - err := parser.ParseConfig(cfg) - if err != nil { - fmt.Printf("%v", err) - } - return err - }, - Action: func(c *cli.Context) error { - logCfg := cfg.Logging - logger := log.NewLogger( - log.Level(logCfg.Level), - log.File(logCfg.File), - log.Pretty(logCfg.Pretty), - log.Color(logCfg.Color), - ) - tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // precreate folders - if cfg.Driver == "json" && cfg.Drivers.JSON.File != "" { - if err := os.MkdirAll(filepath.Dir(cfg.Drivers.JSON.File), os.FileMode(0700)); err != nil { - return err - } - } - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := usersConfigFromStruct(c, cfg) - - logger.Debug(). - Str("server", "users"). - Interface("reva-config", rcfg). - Msg("config") - - if cfg.Driver == "ldap" { - if err := ldap.WaitForCA(logger, cfg.Drivers.LDAP.Insecure, cfg.Drivers.LDAP.CACert); err != nil { - logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") - return err - } - } - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// usersConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func usersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { +// UsersConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func UsersConfigFromStruct(cfg *config.Config) map[string]interface{} { rcfg := map[string]interface{}{ "core": map[string]interface{}{ "tracing_enabled": cfg.Tracing.Enabled, "tracing_endpoint": cfg.Tracing.Endpoint, "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, + "tracing_service_name": cfg.Service.Name, }, "shared": map[string]interface{}{ "jwt_secret": cfg.TokenManager.JWTSecret, @@ -169,42 +62,6 @@ func usersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interf return rcfg } -// UserProviderSutureService allows for the storage-userprovider command to be embedded and supervised by a suture supervisor tree. -type UserProviderSutureService struct { - cfg *config.Config -} - -// NewUserProviderSutureService creates a new storage.UserProvider -func NewUserProvider(cfg *ociscfg.Config) suture.Service { - cfg.User.Commons = cfg.Commons - return UserProviderSutureService{ - cfg: cfg.User, - } -} - -func (s UserProviderSutureService) Serve(ctx context.Context) error { - // s.cfg.Reva.Users.Context = ctx - cmd := User(s.cfg) - f := &flag.FlagSet{} - cmdFlags := cmd.Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if cmd.Before != nil { - if err := cmd.Before(cliCtx); err != nil { - return err - } - } - if err := cmd.Action(cliCtx); err != nil { - return err - } - - return nil -} - func ldapConfigFromString(cfg config.LDAPDriver) map[string]interface{} { return map[string]interface{}{ "uri": cfg.URI, diff --git a/extensions/user/pkg/tracing/tracing.go b/extensions/user/pkg/tracing/tracing.go new file mode 100644 index 0000000000..497f15ed61 --- /dev/null +++ b/extensions/user/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/webdav/pkg/command/root.go b/extensions/webdav/pkg/command/root.go index fe2a7f3c20..d8b32188e5 100644 --- a/extensions/webdav/pkg/command/root.go +++ b/extensions/webdav/pkg/command/root.go @@ -48,7 +48,7 @@ type SutureService struct { // NewSutureService creates a new webdav.SutureService func NewSutureService(cfg *ociscfg.Config) suture.Service { - cfg.Proxy.Commons = cfg.Commons + cfg.WebDAV.Commons = cfg.Commons return SutureService{ cfg: cfg.WebDAV, } diff --git a/ocis-pkg/service/external/external.go b/ocis-pkg/service/external/external.go index 4ef64adacf..02310c3339 100644 --- a/ocis-pkg/service/external/external.go +++ b/ocis-pkg/service/external/external.go @@ -12,7 +12,6 @@ import ( // RegisterGRPCEndpoint publishes an arbitrary endpoint to the service-registry. This allows to query nodes of // non-micro GRPC-services like reva. No health-checks are done, thus the caller is responsible for canceling. -// func RegisterGRPCEndpoint(ctx context.Context, serviceID, uuid, addr string, version string, logger log.Logger) error { node := ®istry.Node{ Id: serviceID + "-" + uuid, @@ -66,3 +65,59 @@ func RegisterGRPCEndpoint(ctx context.Context, serviceID, uuid, addr string, ver return nil } + +// RegisterHTTPEndpoint publishes an arbitrary endpoint to the service-registry. This allows to query nodes of +// non-micro HTTP-services like reva. No health-checks are done, thus the caller is responsible for canceling. +func RegisterHTTPEndpoint(ctx context.Context, serviceID, uuid, addr string, version string, logger log.Logger) error { + node := ®istry.Node{ + Id: serviceID + "-" + uuid, + Address: addr, + Metadata: make(map[string]string), + } + ocisRegistry := oregistry.GetRegistry() + + node.Metadata["broker"] = broker.String() + node.Metadata["registry"] = ocisRegistry.String() + node.Metadata["server"] = "http" + node.Metadata["transport"] = "http" + node.Metadata["protocol"] = "http" + + service := ®istry.Service{ + Name: serviceID, + Version: version, + Nodes: []*registry.Node{node}, + Endpoints: make([]*registry.Endpoint, 0), + } + + logger.Info().Msgf("registering external service %v@%v", node.Id, node.Address) + + rOpts := []registry.RegisterOption{registry.RegisterTTL(time.Minute)} + if err := ocisRegistry.Register(service, rOpts...); err != nil { + logger.Fatal().Err(err).Msgf("Registration error for external service %v", serviceID) + } + + t := time.NewTicker(time.Second * 30) + + go func() { + for { + select { + case <-t.C: + logger.Debug().Interface("service", service).Msg("refreshing external service-registration") + err := ocisRegistry.Register(service, rOpts...) + if err != nil { + logger.Error().Err(err).Msgf("registration error for external service %v", serviceID) + } + case <-ctx.Done(): + logger.Debug().Interface("service", service).Msg("unregistering") + t.Stop() + err := ocisRegistry.Deregister(service) + if err != nil { + logger.Err(err).Msgf("Error unregistering external service %v", serviceID) + } + + } + } + }() + + return nil +} diff --git a/ocis/pkg/command/storageappprovider.go b/ocis/pkg/command/appprovider.go similarity index 56% rename from ocis/pkg/command/storageappprovider.go rename to ocis/pkg/command/appprovider.go index f44aa55fad..bf76eba894 100644 --- a/ocis/pkg/command/storageappprovider.go +++ b/ocis/pkg/command/appprovider.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageAppProviderCommand is the entrypoint for the reva-app-provider command. -func StorageAppProviderCommand(cfg *config.Config) *cli.Command { +// AppProviderCommand is the entrypoint for the app provider command. +func AppProviderCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-app-provider", - Usage: "start storage app-provider service", + Name: cfg.AppProvider.Service.Name, + Usage: subcommandDescription(cfg.AppProvider.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageAppProviderCommand(cfg *config.Config) *cli.Command { cfg.AppProvider.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.AppProvider(cfg.AppProvider) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.AppProvider), } } func init() { - register.AddCommand(StorageAppProviderCommand) + register.AddCommand(AppProviderCommand) } diff --git a/ocis/pkg/command/storageauthbasic.go b/ocis/pkg/command/auth-basic.go similarity index 56% rename from ocis/pkg/command/storageauthbasic.go rename to ocis/pkg/command/auth-basic.go index 4c8dba5cdb..569ca434b6 100644 --- a/ocis/pkg/command/storageauthbasic.go +++ b/ocis/pkg/command/auth-basic.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageAuthBasicCommand is the entrypoint for the reva-auth-basic command. -func StorageAuthBasicCommand(cfg *config.Config) *cli.Command { +// AuthBasicCommand is the entrypoint for the AuthBasic command. +func AuthBasicCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-auth-basic", - Usage: "start storage auth-basic service", + Name: cfg.AuthBasic.Service.Name, + Usage: subcommandDescription(cfg.AuthBasic.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageAuthBasicCommand(cfg *config.Config) *cli.Command { cfg.AuthBasic.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.AuthBasic(cfg.AuthBasic) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.AuthBasic), } } func init() { - register.AddCommand(StorageAuthBasicCommand) + register.AddCommand(AuthBasicCommand) } diff --git a/ocis/pkg/command/storageauthbearer.go b/ocis/pkg/command/auth-bearer.go similarity index 56% rename from ocis/pkg/command/storageauthbearer.go rename to ocis/pkg/command/auth-bearer.go index 20b641cda4..e44fcb88c0 100644 --- a/ocis/pkg/command/storageauthbearer.go +++ b/ocis/pkg/command/auth-bearer.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageAuthBearerCommand is the entrypoint for the reva-auth-bearer command. -func StorageAuthBearerCommand(cfg *config.Config) *cli.Command { +// AuthBearerCommand is the entrypoint for the AuthBearer command. +func AuthBearerCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-auth-bearer", - Usage: "Start storage auth-bearer service", + Name: cfg.AuthBearer.Service.Name, + Usage: subcommandDescription(cfg.AuthBearer.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageAuthBearerCommand(cfg *config.Config) *cli.Command { cfg.AuthBearer.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.AuthBearer(cfg.AuthBearer) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.AuthBearer), } } func init() { - register.AddCommand(StorageAuthBearerCommand) + register.AddCommand(AuthBearerCommand) } diff --git a/ocis/pkg/command/storageauthmachine.go b/ocis/pkg/command/auth-machine.go similarity index 56% rename from ocis/pkg/command/storageauthmachine.go rename to ocis/pkg/command/auth-machine.go index f42ecb4b55..4ed22342f3 100644 --- a/ocis/pkg/command/storageauthmachine.go +++ b/ocis/pkg/command/auth-machine.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageAuthMachineCommand is the entrypoint for the reva-auth-machine command. -func StorageAuthMachineCommand(cfg *config.Config) *cli.Command { +// AuthMachineCommand is the entrypoint for the AuthMachine command. +func AuthMachineCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-auth-machine", - Usage: "start storage auth-machine service", + Name: cfg.AuthMachine.Service.Name, + Usage: subcommandDescription(cfg.AuthMachine.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageAuthMachineCommand(cfg *config.Config) *cli.Command { cfg.AuthMachine.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.AuthMachine(cfg.AuthMachine) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.AuthMachine), } } func init() { - register.AddCommand(StorageAuthMachineCommand) + register.AddCommand(AuthMachineCommand) } diff --git a/ocis/pkg/command/common.go b/ocis/pkg/command/common.go index 77bfa381ed..dd65d0339d 100644 --- a/ocis/pkg/command/common.go +++ b/ocis/pkg/command/common.go @@ -2,21 +2,8 @@ package command import ( "fmt" - - "github.com/urfave/cli/v2" ) -func handleOriginalAction(c *cli.Context, cmd *cli.Command) error { - - if cmd.Before != nil { - if err := cmd.Before(c); err != nil { - return err - } - } - - return cli.HandleAction(cmd.Action, c) -} - func subcommandDescription(serviceName string) string { return fmt.Sprintf("%s extension commands", serviceName) } diff --git a/ocis/pkg/command/storagefrontend.go b/ocis/pkg/command/frontend.go similarity index 57% rename from ocis/pkg/command/storagefrontend.go rename to ocis/pkg/command/frontend.go index 05252414a9..0e8ad6142e 100644 --- a/ocis/pkg/command/storagefrontend.go +++ b/ocis/pkg/command/frontend.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageFrontendCommand is the entrypoint for the reva-frontend command. -func StorageFrontendCommand(cfg *config.Config) *cli.Command { +// FrontendCommand is the entrypoint for the Frontend command. +func FrontendCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-frontend", - Usage: "start storage frontend", + Name: cfg.Frontend.Service.Name, + Usage: subcommandDescription(cfg.Frontend.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageFrontendCommand(cfg *config.Config) *cli.Command { cfg.Frontend.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.Frontend(cfg.Frontend) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.Frontend), } } func init() { - register.AddCommand(StorageFrontendCommand) + register.AddCommand(FrontendCommand) } diff --git a/ocis/pkg/command/storagegateway.go b/ocis/pkg/command/gateway.go similarity index 58% rename from ocis/pkg/command/storagegateway.go rename to ocis/pkg/command/gateway.go index 17047b6068..b6af96d067 100644 --- a/ocis/pkg/command/storagegateway.go +++ b/ocis/pkg/command/gateway.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageGatewayCommand is the entrypoint for the reva-gateway command. -func StorageGatewayCommand(cfg *config.Config) *cli.Command { +// GatewayCommand is the entrypoint for the Gateway command. +func GatewayCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-gateway", - Usage: "start storage gateway", + Name: cfg.Gateway.Service.Name, + Usage: subcommandDescription(cfg.Gateway.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageGatewayCommand(cfg *config.Config) *cli.Command { cfg.Gateway.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.Gateway(cfg.Gateway) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.Gateway), } } func init() { - register.AddCommand(StorageGatewayCommand) + register.AddCommand(GatewayCommand) } diff --git a/ocis/pkg/command/storagegroupprovider.go b/ocis/pkg/command/group.go similarity index 55% rename from ocis/pkg/command/storagegroupprovider.go rename to ocis/pkg/command/group.go index c93de96c11..fe40ba15ce 100644 --- a/ocis/pkg/command/storagegroupprovider.go +++ b/ocis/pkg/command/group.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageGroupProviderCommand is the entrypoint for the storage-groupprovider command. -func StorageGroupProviderCommand(cfg *config.Config) *cli.Command { +// GroupCommand is the entrypoint for the Group command. +func GroupCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-groupprovider", - Usage: "start storage groupprovider service", + Name: cfg.Group.Service.Name, + Usage: subcommandDescription(cfg.Group.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageGroupProviderCommand(cfg *config.Config) *cli.Command { cfg.Group.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.Groups(cfg.Group) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.Group), } } func init() { - register.AddCommand(StorageGroupProviderCommand) + register.AddCommand(GroupCommand) } diff --git a/ocis/pkg/command/ocdav.go b/ocis/pkg/command/ocdav.go index 85fdeb4570..b9adf24924 100644 --- a/ocis/pkg/command/ocdav.go +++ b/ocis/pkg/command/ocdav.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// OCDavCommand is the entrypoint for the ocdav command. +// OCDavCommand is the entrypoint for the OCDav command. func OCDavCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "ocdav", - Usage: "start ocdav", + Name: cfg.OCDav.Service.Name, + Usage: subcommandDescription(cfg.OCDav.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,10 +24,7 @@ func OCDavCommand(cfg *config.Config) *cli.Command { cfg.OCDav.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.OCDav(cfg.OCDav) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.OCDav), } } diff --git a/ocis/pkg/command/storagesharing.go b/ocis/pkg/command/sharing.go similarity index 57% rename from ocis/pkg/command/storagesharing.go rename to ocis/pkg/command/sharing.go index 63c7e2aa06..de5b391a95 100644 --- a/ocis/pkg/command/storagesharing.go +++ b/ocis/pkg/command/sharing.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageSharingCommand is the entrypoint for the reva-sharing command. -func StorageSharingCommand(cfg *config.Config) *cli.Command { +// SharingCommand is the entrypoint for the Sharing command. +func SharingCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-sharing", - Usage: "start storage sharing service", + Name: cfg.Sharing.Service.Name, + Usage: subcommandDescription(cfg.Sharing.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,13 +24,10 @@ func StorageSharingCommand(cfg *config.Config) *cli.Command { cfg.Sharing.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.Sharing(cfg.Sharing) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.Sharing), } } func init() { - register.AddCommand(StorageSharingCommand) + register.AddCommand(SharingCommand) } diff --git a/ocis/pkg/command/storagemetadata.go b/ocis/pkg/command/storage-metadata.go similarity index 67% rename from ocis/pkg/command/storagemetadata.go rename to ocis/pkg/command/storage-metadata.go index 2965c36cfc..e70c6a120d 100644 --- a/ocis/pkg/command/storagemetadata.go +++ b/ocis/pkg/command/storage-metadata.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageMetadataCommand is the entrypoint for the storage-metadata command. +// StorageMetadataCommand is the entrypoint for the StorageMetadata command. func StorageMetadataCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-metadata", - Usage: "start storage and data service for metadata", + Name: cfg.StorageMetadata.Service.Name, + Usage: subcommandDescription(cfg.StorageMetadata.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,10 +24,7 @@ func StorageMetadataCommand(cfg *config.Config) *cli.Command { cfg.StorageMetadata.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.StorageMetadata(cfg.StorageMetadata) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.StorageMetadata), } } diff --git a/ocis/pkg/command/storagepubliclink.go b/ocis/pkg/command/storage-publiclink.go similarity index 67% rename from ocis/pkg/command/storagepubliclink.go rename to ocis/pkg/command/storage-publiclink.go index fe2f8b75e8..c084b66439 100644 --- a/ocis/pkg/command/storagepubliclink.go +++ b/ocis/pkg/command/storage-publiclink.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StoragePublicLinkCommand is the entrypoint for the reva-storage-oc command. +// StoragePublicLinkCommand is the entrypoint for the StoragePublicLink command. func StoragePublicLinkCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-public-link", - Usage: "start storage public link storage", + Name: cfg.StoragePublicLink.Service.Name, + Usage: subcommandDescription(cfg.StoragePublicLink.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,10 +24,7 @@ func StoragePublicLinkCommand(cfg *config.Config) *cli.Command { cfg.StoragePublicLink.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.StoragePublicLink(cfg.StoragePublicLink) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.StoragePublicLink), } } diff --git a/ocis/pkg/command/storageshares.go b/ocis/pkg/command/storage-shares.go similarity index 67% rename from ocis/pkg/command/storageshares.go rename to ocis/pkg/command/storage-shares.go index 62f13c38a8..dd337dc5e9 100644 --- a/ocis/pkg/command/storageshares.go +++ b/ocis/pkg/command/storage-shares.go @@ -10,11 +10,11 @@ import ( "github.com/urfave/cli/v2" ) -// StorageSharesCommand is the entrypoint for the storage-shares command. +// StorageSharesCommand is the entrypoint for the StorageShares command. func StorageSharesCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-shares", - Usage: "start storage and data provider for shares jail", + Name: cfg.StorageShares.Service.Name, + Usage: subcommandDescription(cfg.StorageShares.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { @@ -24,10 +24,7 @@ func StorageSharesCommand(cfg *config.Config) *cli.Command { cfg.StorageShares.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.StorageShares(cfg.StorageShares) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.StorageShares), } } diff --git a/ocis/pkg/command/storage-users.go b/ocis/pkg/command/storage-users.go new file mode 100644 index 0000000000..e1a4aaf3ea --- /dev/null +++ b/ocis/pkg/command/storage-users.go @@ -0,0 +1,33 @@ +package command + +import ( + "fmt" + + "github.com/owncloud/ocis/extensions/storage-users/pkg/command" + "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/owncloud/ocis/ocis-pkg/config/parser" + "github.com/owncloud/ocis/ocis/pkg/register" + "github.com/urfave/cli/v2" +) + +// StorageUsersCommand is the entrypoint for the StorageUsers command. +func StorageUsersCommand(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: cfg.StorageUsers.Service.Name, + Usage: subcommandDescription(cfg.StorageUsers.Service.Name), + Category: "extensions", + Before: func(c *cli.Context) error { + if err := parser.ParseConfig(cfg); err != nil { + fmt.Printf("%v", err) + return err + } + cfg.StorageUsers.Commons = cfg.Commons + return nil + }, + Subcommands: command.GetCommands(cfg.StorageUsers), + } +} + +func init() { + register.AddCommand(StorageUsersCommand) +} diff --git a/ocis/pkg/command/storageusers.go b/ocis/pkg/command/storageusers.go deleted file mode 100644 index 4ca75f2061..0000000000 --- a/ocis/pkg/command/storageusers.go +++ /dev/null @@ -1,25 +0,0 @@ -package command - -import ( - "github.com/owncloud/ocis/extensions/storage-users/pkg/command" - "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis/pkg/register" - "github.com/urfave/cli/v2" -) - -// StorageUsersCommand is the entrypoint for the storage-users command. -func StorageUsersCommand(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "storage-users", - Usage: "start storage and data provider for /users mount", - Category: "extensions", - Action: func(c *cli.Context) error { - origCmd := command.StorageUsers(cfg.StorageUsers) - return handleOriginalAction(c, origCmd) - }, - } -} - -func init() { - register.AddCommand(StorageUsersCommand) -} diff --git a/ocis/pkg/command/storageuserprovider.go b/ocis/pkg/command/user.go similarity index 51% rename from ocis/pkg/command/storageuserprovider.go rename to ocis/pkg/command/user.go index 5e3af09569..7685f1fc42 100644 --- a/ocis/pkg/command/storageuserprovider.go +++ b/ocis/pkg/command/user.go @@ -10,27 +10,24 @@ import ( "github.com/urfave/cli/v2" ) -// StorageUserProviderCommand is the entrypoint for the storage-userprovider command. -func StorageUserProviderCommand(cfg *config.Config) *cli.Command { +// UserCommand is the entrypoint for the User command. +func UserCommand(cfg *config.Config) *cli.Command { return &cli.Command{ - Name: "storage-userprovider", - Usage: "start storage userprovider service", + Name: cfg.User.Service.Name, + Usage: subcommandDescription(cfg.User.Service.Name), Category: "extensions", Before: func(c *cli.Context) error { if err := parser.ParseConfig(cfg); err != nil { fmt.Printf("%v", err) return err } - cfg.StorageUsers.Commons = cfg.Commons + cfg.User.Commons = cfg.Commons return nil }, - Action: func(c *cli.Context) error { - origCmd := command.User(cfg.User) - return handleOriginalAction(c, origCmd) - }, + Subcommands: command.GetCommands(cfg.User), } } func init() { - register.AddCommand(StorageUserProviderCommand) + register.AddCommand(UserCommand) } diff --git a/ocis/pkg/init/init.go b/ocis/pkg/init/init.go index 4f8bf8a51a..3fc566f0e5 100644 --- a/ocis/pkg/init/init.go +++ b/ocis/pkg/init/init.go @@ -56,8 +56,7 @@ type IdmExtension struct { } type FrontendExtension struct { - Archiver InsecureExtension - AppProvider InsecureExtension `yaml:"app_provider"` + Archiver InsecureExtension } type AuthbasicExtension struct { @@ -256,9 +255,6 @@ func CreateConfig(insecure, forceOverwrite bool, configPath, adminPassword strin }, } cfg.Frontend = FrontendExtension{ - AppProvider: InsecureExtension{ - Insecure: true, - }, Archiver: InsecureExtension{ Insecure: true, }, diff --git a/ocis/pkg/runtime/service/service.go b/ocis/pkg/runtime/service/service.go index 99f947155b..7814989f4a 100644 --- a/ocis/pkg/runtime/service/service.go +++ b/ocis/pkg/runtime/service/service.go @@ -109,7 +109,7 @@ func NewService(options ...Option) (*Service, error) { s.ServicesRegistry[opts.Config.Settings.Service.Name] = settings.NewSutureService s.ServicesRegistry[opts.Config.Nats.Service.Name] = nats.NewSutureService - s.ServicesRegistry[opts.Config.StorageMetadata.Service.Name] = storagemetadata.NewStorageMetadata + s.ServicesRegistry[opts.Config.StorageMetadata.Service.Name] = storagemetadata.NewSutureService s.ServicesRegistry[opts.Config.GLAuth.Service.Name] = glauth.NewSutureService s.ServicesRegistry[opts.Config.Graph.Service.Name] = graph.NewSutureService s.ServicesRegistry[opts.Config.GraphExplorer.Service.Name] = graphExplorer.NewSutureService @@ -119,23 +119,23 @@ func NewService(options ...Option) (*Service, error) { s.ServicesRegistry[opts.Config.Thumbnails.Service.Name] = thumbnails.NewSutureService s.ServicesRegistry[opts.Config.Web.Service.Name] = web.NewSutureService s.ServicesRegistry[opts.Config.WebDAV.Service.Name] = webdav.NewSutureService - s.ServicesRegistry[opts.Config.Frontend.Service.Name] = frontend.NewFrontend - s.ServicesRegistry[opts.Config.OCDav.Service.Name] = ocdav.NewOCDav - s.ServicesRegistry[opts.Config.Gateway.Service.Name] = gateway.NewGateway - s.ServicesRegistry[opts.Config.User.Service.Name] = user.NewUserProvider - s.ServicesRegistry[opts.Config.Group.Service.Name] = group.NewGroupProvider - s.ServicesRegistry[opts.Config.AuthBasic.Service.Name] = authbasic.NewAuthBasic - s.ServicesRegistry[opts.Config.AuthBearer.Service.Name] = authbearer.NewAuthBearer - s.ServicesRegistry[opts.Config.AuthMachine.Service.Name] = authmachine.NewAuthMachine - s.ServicesRegistry[opts.Config.StorageUsers.Service.Name] = storageusers.NewStorageUsers - s.ServicesRegistry[opts.Config.StorageShares.Service.Name] = storageshares.NewStorageShares - s.ServicesRegistry[opts.Config.StoragePublicLink.Service.Name] = storagepublic.NewStoragePublicLink - s.ServicesRegistry[opts.Config.AppProvider.Service.Name] = appprovider.NewAppProvider + s.ServicesRegistry[opts.Config.Frontend.Service.Name] = frontend.NewSutureService + s.ServicesRegistry[opts.Config.OCDav.Service.Name] = ocdav.NewSutureService + s.ServicesRegistry[opts.Config.Gateway.Service.Name] = gateway.NewSutureService + s.ServicesRegistry[opts.Config.User.Service.Name] = user.NewSutureService + s.ServicesRegistry[opts.Config.Group.Service.Name] = group.NewSutureService + s.ServicesRegistry[opts.Config.AuthBasic.Service.Name] = authbasic.NewSutureService + s.ServicesRegistry[opts.Config.AuthBearer.Service.Name] = authbearer.NewSutureService + s.ServicesRegistry[opts.Config.AuthMachine.Service.Name] = authmachine.NewSutureService + s.ServicesRegistry[opts.Config.StorageUsers.Service.Name] = storageusers.NewSutureService + s.ServicesRegistry[opts.Config.StorageShares.Service.Name] = storageshares.NewSutureService + s.ServicesRegistry[opts.Config.StoragePublicLink.Service.Name] = storagepublic.NewSutureService + s.ServicesRegistry[opts.Config.AppProvider.Service.Name] = appprovider.NewSutureService s.ServicesRegistry[opts.Config.Notifications.Service.Name] = notifications.NewSutureService s.ServicesRegistry[opts.Config.Search.Service.Name] = search.NewSutureService // populate delayed services - s.Delayed[opts.Config.Sharing.Service.Name] = sharing.NewSharing + s.Delayed[opts.Config.Sharing.Service.Name] = sharing.NewSutureService s.Delayed[opts.Config.Accounts.Service.Name] = accounts.NewSutureService s.Delayed[opts.Config.Proxy.Service.Name] = proxy.NewSutureService s.Delayed[opts.Config.IDP.Service.Name] = idp.NewSutureService @@ -256,7 +256,7 @@ func (s *Service) generateRunSet(cfg *ociscfg.Config) { } for name := range s.ServicesRegistry { - // don't run glauth by default but keep the possiblity to start it via cfg.Runtime.Extensions for now + // don't run glauth by default but keep the possibility to start it via cfg.Runtime.Extensions for now if name == "glauth" { continue } @@ -264,7 +264,7 @@ func (s *Service) generateRunSet(cfg *ociscfg.Config) { } for name := range s.Delayed { - // don't run accounts by default but keep the possiblity to start it via cfg.Runtime.Extensions for now + // don't run accounts by default but keep the possibility to start it via cfg.Runtime.Extensions for now if name == "accounts" { continue } From b6f03f9a6cc51f8c8c76a136d8f87d318b8147e7 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 11:13:04 +0200 Subject: [PATCH 11/50] frontend config docs --- extensions/auth-basic/pkg/config/config.go | 2 +- extensions/auth-bearer/pkg/config/config.go | 5 +- extensions/auth-machine/pkg/config/config.go | 5 +- extensions/frontend/pkg/config/config.go | 69 ++++++++----------- .../pkg/config/defaults/defaultconfig.go | 5 -- extensions/gateway/pkg/config/config.go | 2 +- extensions/group/pkg/config/config.go | 3 +- extensions/ocdav/pkg/config/config.go | 2 +- extensions/sharing/pkg/config/config.go | 13 ++-- .../storage-metadata/pkg/config/config.go | 13 ++-- .../storage-publiclink/pkg/config/config.go | 7 +- .../storage-shares/pkg/config/config.go | 3 +- extensions/storage-users/pkg/config/config.go | 21 +++--- extensions/user/pkg/config/config.go | 9 +-- 14 files changed, 76 insertions(+), 83 deletions(-) diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index ad70ebbd78..03c747db7b 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + SkipUserGroupsInToken bool `yaml:"-"` AuthProvider string `yaml:"auth_provider" env:"AUTH_BASIC_AUTH_PROVIDER" desc:"The auth provider which should be used by the service"` AuthProviders AuthProviders `yaml:"auth_providers"` diff --git a/extensions/auth-bearer/pkg/config/config.go b/extensions/auth-bearer/pkg/config/config.go index eb769e8be6..a95532f1bd 100644 --- a/extensions/auth-bearer/pkg/config/config.go +++ b/extensions/auth-bearer/pkg/config/config.go @@ -18,8 +18,9 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - OIDC OIDC `yaml:"oidc"` + SkipUserGroupsInToken bool `yaml:"-"` + + OIDC OIDC `yaml:"oidc"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` diff --git a/extensions/auth-machine/pkg/config/config.go b/extensions/auth-machine/pkg/config/config.go index 2479227df0..1e79e1df45 100644 --- a/extensions/auth-machine/pkg/config/config.go +++ b/extensions/auth-machine/pkg/config/config.go @@ -18,8 +18,9 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;AUTH_MACHINE_API_KEY"` + SkipUserGroupsInToken bool `yaml:"-"` + + MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;AUTH_MACHINE_API_KEY"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` diff --git a/extensions/frontend/pkg/config/config.go b/extensions/frontend/pkg/config/config.go index 68bfe4cb18..b2968efde4 100644 --- a/extensions/frontend/pkg/config/config.go +++ b/extensions/frontend/pkg/config/config.go @@ -23,19 +23,18 @@ type Config struct { Reva *Reva `yaml:"reva"` MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;FRONTEND_MACHINE_AUTH_API_KEY"` - SkipUserGroupsInToken bool `yaml:"skip_users_groups_in_token"` + SkipUserGroupsInToken bool `yaml:"-"` - EnableFavorites bool `yaml:"favorites"` + EnableFavorites bool `yaml:"enable_favorites" env:"FRONTEND_ENABLE_FAVORITES"` EnableProjectSpaces bool `yaml:"enable_project_spaces" env:"FRONTEND_ENABLE_PROJECT_SPACES" desc:"Indicates to clients that project spaces are supposed to be made available."` EnableShareJail bool `yaml:"enable_share_jail" env:"FRONTEND_ENABLE_SHARE_JAIL" desc:"Indicates to clients that the share jail is supposed to be used."` - UploadMaxChunkSize int `yaml:"upload_max_chunk_size"` - UploadHTTPMethodOverride string `yaml:"upload_http_method_override"` - DefaultUploadProtocol string `yaml:"default_upload_protocol"` + UploadMaxChunkSize int `yaml:"upload_max_chunk_size" env:"FRONTEND_UPLOAD_MAX_CHUNK_SIZE"` + UploadHTTPMethodOverride string `yaml:"upload_http_method_override" env:"FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE"` + DefaultUploadProtocol string `yaml:"default_upload_protocol" env:"FRONTEND_DEFAULT_UPLOAD_PROTOCOL"` PublicURL string `yaml:"public_url" env:"OCIS_URL;FRONTEND_PUBLIC_URL"` Archiver Archiver `yaml:"archiver"` - AppProvider AppProvider `yaml:"app_provider"` DataGateway DataGateway `yaml:"data_gateway"` OCS OCS `yaml:"ocs"` Checksums Checksums `yaml:"checksums"` @@ -52,7 +51,7 @@ type Tracing struct { Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;FRONTEND_TRACING_COLLECTOR"` } -type Logging struct { +type Log struct { Level string `yaml:"level" env:"OCIS_LOG_LEVEL;FRONTEND_LOG_LEVEL" desc:"The log level."` Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;FRONTEND_LOG_PRETTY" desc:"Activates pretty log output."` Color bool `yaml:"color" env:"OCIS_LOG_COLOR;FRONTEND_LOG_COLOR" desc:"Activates colorized log output."` @@ -71,9 +70,10 @@ type Debug struct { } type HTTPConfig struct { - Addr string `yaml:"addr" env:"FRONTEND_HTTP_ADDR" desc:"The address of the http service."` - Protocol string `yaml:"protocol" env:"FRONTEND_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` - Prefix string `yaml:"prefix"` + Addr string `yaml:"addr" env:"FRONTEND_HTTP_ADDR" desc:"The address of the http service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"FRONTEND_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` + Prefix string `yaml:"prefix" env:"FRONTEND_HTTP_PREFIX"` } // Middleware configures reva middlewares. @@ -87,51 +87,40 @@ type Auth struct { } type Archiver struct { - MaxNumFiles int64 `yaml:"max_num_files"` - MaxSize int64 `yaml:"max_size"` + MaxNumFiles int64 `yaml:"max_num_files" env:"FRONTEND_ARCHIVER_MAX_NUM_FILES"` + MaxSize int64 `yaml:"max_size" env:"FRONTEND_ARCHIVER_MAX_SIZE"` Prefix string `yaml:"-"` Insecure bool `yaml:"insecure" env:"OCIS_INSECURE;FRONTEND_ARCHIVER_INSECURE"` } -type AppProvider struct { - ExternalAddr string `yaml:"external_addr"` - Driver string `yaml:"driver"` - // WopiDriver WopiDriver `yaml:"wopi_driver"` - AppsURL string `yaml:"-"` - OpenURL string `yaml:"-"` - NewURL string `yaml:"-"` - Prefix string `yaml:"-"` - Insecure bool `yaml:"insecure" env:"OCIS_INSECURE;FRONTEND_APPPROVIDER_INSECURE"` -} - type DataGateway struct { - Prefix string + Prefix string `yaml:"prefix" env:"FRONTEND_DATA_GATEWAY_PREFIX"` } type OCS struct { - Prefix string `yaml:"prefix"` - SharePrefix string `yaml:"share_prefix"` - HomeNamespace string `yaml:"home_namespace"` - AdditionalInfoAttribute string `yaml:"additional_info_attribute"` - ResourceInfoCacheTTL int `yaml:"resource_info_cache_ttl"` - CacheWarmupDriver string `yaml:"cache_warmup_driver"` - CacheWarmupDrivers CacheWarmupDrivers + Prefix string `yaml:"prefix" env:"FRONTEND_OCS_PREFIX"` + SharePrefix string `yaml:"share_prefix" env:"FRONTEND_OCS_SHARE_PREFIX"` + HomeNamespace string `yaml:"home_namespace" env:"FRONTEND_OCS_HOME_NAMESPACE"` + AdditionalInfoAttribute string `yaml:"additional_info_attribute" env:"FRONTEND_OCS_ADDITIONAL_INFO_ATTRIBUTE"` + ResourceInfoCacheTTL int `yaml:"resource_info_cache_ttl" env:"FRONTEND_OCS_RESOURCE_INFO_CACHE_TTL"` + CacheWarmupDriver string `yaml:"cache_warmup_driver,omitempty"` // not supported by the oCIS product, therefore not part of docs + CacheWarmupDrivers CacheWarmupDrivers `yaml:"cache_warmup_drivers,omitempty"` // not supported by the oCIS product, therefore not part of docs } type CacheWarmupDrivers struct { - CBOX CBOXDriver + CBOX CBOXDriver `yaml:"cbox,omitempty"` } type CBOXDriver struct { - DBUsername string - DBPassword string - DBHost string - DBPort int - DBName string - Namespace string + DBUsername string `yaml:"db_username,omitempty"` + DBPassword string `yaml:"db_password,omitempty"` + DBHost string `yaml:"db_host,omitempty"` + DBPort int `yaml:"db_port,omitempty"` + DBName string `yaml:"db_name,omitempty"` + Namespace string `yaml:"namespace,omitempty"` } type Checksums struct { - SupportedTypes []string `yaml:"supported_types"` - PreferredUploadType string `yaml:"preferred_upload_type"` + SupportedTypes []string `yaml:"supported_types" env:"FRONTEND_CHECKSUMS_SUPPORTED_TYPES"` + PreferredUploadType string `yaml:"preferred_upload_type" env:"FRONTEND_CHECKSUMS_PREFERRED_UPLOAD_TYPES"` } diff --git a/extensions/frontend/pkg/config/defaults/defaultconfig.go b/extensions/frontend/pkg/config/defaults/defaultconfig.go index d9b05083c0..eec7998649 100644 --- a/extensions/frontend/pkg/config/defaults/defaultconfig.go +++ b/extensions/frontend/pkg/config/defaults/defaultconfig.go @@ -42,10 +42,6 @@ func DefaultConfig() *config.Config { SupportedTypes: []string{"sha1", "md5", "adler32"}, PreferredUploadType: "", }, - AppProvider: config.AppProvider{ - Prefix: "", - Insecure: false, - }, Archiver: config.Archiver{ Insecure: false, Prefix: "archiver", @@ -59,7 +55,6 @@ func DefaultConfig() *config.Config { Prefix: "ocs", SharePrefix: "/Shares", HomeNamespace: "/users/{{.Id.OpaqueId}}", - CacheWarmupDriver: "", AdditionalInfoAttribute: "{{.Mail}}", ResourceInfoCacheTTL: 0, }, diff --git a/extensions/gateway/pkg/config/config.go b/extensions/gateway/pkg/config/config.go index 285c9793c1..02417ffeac 100644 --- a/extensions/gateway/pkg/config/config.go +++ b/extensions/gateway/pkg/config/config.go @@ -19,7 +19,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool + SkipUserGroupsInToken bool `yaml:"-"` CommitShareToStorageGrant bool `yaml:"commit_share_to_storage_grant"` CommitShareToStorageRef bool `yaml:"commit_share_to_storage_ref"` diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index fc718d6540..22cd62c980 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -18,7 +18,8 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + SkipUserGroupsInToken bool `yaml:"-"` + GroupMembersCacheExpiration int `yaml:"group_members_cache_expiration"` Driver string `yaml:"driver"` Drivers Drivers `yaml:"drivers"` diff --git a/extensions/ocdav/pkg/config/config.go b/extensions/ocdav/pkg/config/config.go index 2ed551fe6c..e68e1eb5aa 100644 --- a/extensions/ocdav/pkg/config/config.go +++ b/extensions/ocdav/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + SkipUserGroupsInToken bool `yaml:"-"` WebdavNamespace string `yaml:"webdav_namespace"` FilesNamespace string `yaml:"files_namespace"` diff --git a/extensions/sharing/pkg/config/config.go b/extensions/sharing/pkg/config/config.go index 24dc40c980..c3c0060f42 100644 --- a/extensions/sharing/pkg/config/config.go +++ b/extensions/sharing/pkg/config/config.go @@ -18,12 +18,13 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - UserSharingDriver string `yaml:"user_sharing_driver"` - UserSharingDrivers UserSharingDrivers `yaml:"user_sharin_drivers"` - PublicSharingDriver string `yaml:"public_sharing_driver"` - PublicSharingDrivers PublicSharingDrivers `yaml:"public_sharing_drivers"` - Events Events `yaml:"events"` + SkipUserGroupsInToken bool `yaml:"-"` + + UserSharingDriver string `yaml:"user_sharing_driver"` + UserSharingDrivers UserSharingDrivers `yaml:"user_sharin_drivers"` + PublicSharingDriver string `yaml:"public_sharing_driver"` + PublicSharingDrivers PublicSharingDrivers `yaml:"public_sharing_drivers"` + Events Events `yaml:"events"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` diff --git a/extensions/storage-metadata/pkg/config/config.go b/extensions/storage-metadata/pkg/config/config.go index 8f90172995..9a327cd189 100644 --- a/extensions/storage-metadata/pkg/config/config.go +++ b/extensions/storage-metadata/pkg/config/config.go @@ -21,12 +21,13 @@ type Config struct { MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"STORAGE_METADATA_MACHINE_AUTH_API_KEY"` MetadataUserID string `yaml:"metadata_user_id"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - Driver string `yaml:"driver" env:"STORAGE_METADATA_DRIVER" desc:"The driver which should be used by the service"` - Drivers Drivers `yaml:"drivers"` - DataServerURL string `yaml:"data_server_url"` - TempFolder string `yaml:"temp_folder"` - DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_METADATA_DATAPROVIDER_INSECURE"` + SkipUserGroupsInToken bool `yaml:"-"` + + Driver string `yaml:"driver" env:"STORAGE_METADATA_DRIVER" desc:"The driver which should be used by the service"` + Drivers Drivers `yaml:"drivers"` + DataServerURL string `yaml:"data_server_url"` + TempFolder string `yaml:"temp_folder"` + DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_METADATA_DATAPROVIDER_INSECURE"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` diff --git a/extensions/storage-publiclink/pkg/config/config.go b/extensions/storage-publiclink/pkg/config/config.go index e3cf134ab3..9dc63e4bfd 100644 --- a/extensions/storage-publiclink/pkg/config/config.go +++ b/extensions/storage-publiclink/pkg/config/config.go @@ -18,9 +18,10 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - AuthProvider AuthProvider `yaml:"auth_provider"` - StorageProvider StorageProvider `yaml:"storage_provider"` + SkipUserGroupsInToken bool `yaml:"-"` + + AuthProvider AuthProvider `yaml:"auth_provider"` + StorageProvider StorageProvider `yaml:"storage_provider"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` diff --git a/extensions/storage-shares/pkg/config/config.go b/extensions/storage-shares/pkg/config/config.go index ac68d6e9ed..b3c9f908a2 100644 --- a/extensions/storage-shares/pkg/config/config.go +++ b/extensions/storage-shares/pkg/config/config.go @@ -18,7 +18,8 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` + SkipUserGroupsInToken bool `yaml:"-"` + ReadOnly bool `yaml:"readonly"` SharesProviderEndpoint string `yaml:"shares_provider_endpoint"` diff --git a/extensions/storage-users/pkg/config/config.go b/extensions/storage-users/pkg/config/config.go index 732bc70c02..4b4c6dc30a 100644 --- a/extensions/storage-users/pkg/config/config.go +++ b/extensions/storage-users/pkg/config/config.go @@ -19,16 +19,17 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - Driver string `yaml:"driver" env:"STORAGE_USERS_DRIVER" desc:"The storage driver which should be used by the service"` - Drivers Drivers `yaml:"drivers"` - DataServerURL string `yaml:"data_server_url"` - TempFolder string `yaml:"temp_folder"` - DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_USERS_DATAPROVIDER_INSECURE"` - Events Events `yaml:"events"` - MountID string `yaml:"mount_id"` - ExposeDataServer bool `yaml:"expose_data_server"` - ReadOnly bool `yaml:"readonly"` + SkipUserGroupsInToken bool `yaml:"-"` + + Driver string `yaml:"driver" env:"STORAGE_USERS_DRIVER" desc:"The storage driver which should be used by the service"` + Drivers Drivers `yaml:"drivers"` + DataServerURL string `yaml:"data_server_url"` + TempFolder string `yaml:"temp_folder"` + DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_USERS_DATAPROVIDER_INSECURE"` + Events Events `yaml:"events"` + MountID string `yaml:"mount_id"` + ExposeDataServer bool `yaml:"expose_data_server"` + ReadOnly bool `yaml:"readonly"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index 7471b751b9..bb304c83c3 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -18,10 +18,11 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token"` - UsersCacheExpiration int `yaml:"users_cache_expiration"` - Driver string `yaml:"driver"` - Drivers Drivers `yaml:"drivers"` + SkipUserGroupsInToken bool `yaml:"-"` + + UsersCacheExpiration int `yaml:"users_cache_expiration"` + Driver string `yaml:"driver"` + Drivers Drivers `yaml:"drivers"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` From ba2fbee07d8255c691376fa181d4b7d7fcb01517 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 11:48:20 +0200 Subject: [PATCH 12/50] fix makefile names --- extensions/app-registry/Makefile | 37 ++++++++++++++++++++++++++ extensions/appprovider/Makefile | 2 +- extensions/auth-basic/Makefile | 2 +- extensions/auth-bearer/Makefile | 2 +- extensions/auth-machine/Makefile | 2 +- extensions/frontend/Makefile | 2 +- extensions/gateway/Makefile | 2 +- extensions/group/Makefile | 2 +- extensions/nats/Makefile | 2 +- extensions/notifications/Makefile | 2 +- extensions/ocdav/Makefile | 2 +- extensions/sharing/Makefile | 2 +- extensions/storage-metadata/Makefile | 2 +- extensions/storage-publiclink/Makefile | 2 +- extensions/storage-shares/Makefile | 2 +- extensions/storage-users/Makefile | 2 +- extensions/user/Makefile | 2 +- 17 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 extensions/app-registry/Makefile diff --git a/extensions/app-registry/Makefile b/extensions/app-registry/Makefile new file mode 100644 index 0000000000..8097c27d96 --- /dev/null +++ b/extensions/app-registry/Makefile @@ -0,0 +1,37 @@ +SHELL := bash +NAME := app-registry + +include ../../.make/recursion.mk + +############ tooling ############ +ifneq (, $(shell which go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI +include ../../.bingo/Variables.mk +endif + +############ go tooling ############ +include ../../.make/go.mk + +############ release ############ +include ../../.make/release.mk + +############ docs generate ############ +include ../../.make/docs.mk + +.PHONY: docs-generate +docs-generate: config-docs-generate + +############ generate ############ +include ../../.make/generate.mk + +.PHONY: ci-go-generate +ci-go-generate: # CI runs ci-node-generate automatically before this target + +.PHONY: ci-node-generate +ci-node-generate: + +############ licenses ############ +.PHONY: ci-node-check-licenses +ci-node-check-licenses: + +.PHONY: ci-node-save-licenses +ci-node-save-licenses: diff --git a/extensions/appprovider/Makefile b/extensions/appprovider/Makefile index 51243d83fc..54cdae4059 100644 --- a/extensions/appprovider/Makefile +++ b/extensions/appprovider/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := app-provider include ../../.make/recursion.mk diff --git a/extensions/auth-basic/Makefile b/extensions/auth-basic/Makefile index 51243d83fc..a87c8190d6 100644 --- a/extensions/auth-basic/Makefile +++ b/extensions/auth-basic/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := auth-basic include ../../.make/recursion.mk diff --git a/extensions/auth-bearer/Makefile b/extensions/auth-bearer/Makefile index 51243d83fc..cd958c461e 100644 --- a/extensions/auth-bearer/Makefile +++ b/extensions/auth-bearer/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := auth-bearer include ../../.make/recursion.mk diff --git a/extensions/auth-machine/Makefile b/extensions/auth-machine/Makefile index 51243d83fc..e53ab3cbec 100644 --- a/extensions/auth-machine/Makefile +++ b/extensions/auth-machine/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := auth-machine include ../../.make/recursion.mk diff --git a/extensions/frontend/Makefile b/extensions/frontend/Makefile index 51243d83fc..d44b3161df 100644 --- a/extensions/frontend/Makefile +++ b/extensions/frontend/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := frontend include ../../.make/recursion.mk diff --git a/extensions/gateway/Makefile b/extensions/gateway/Makefile index 51243d83fc..f1130a590f 100644 --- a/extensions/gateway/Makefile +++ b/extensions/gateway/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := gateway include ../../.make/recursion.mk diff --git a/extensions/group/Makefile b/extensions/group/Makefile index 51243d83fc..4f446944ec 100644 --- a/extensions/group/Makefile +++ b/extensions/group/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := group include ../../.make/recursion.mk diff --git a/extensions/nats/Makefile b/extensions/nats/Makefile index 51243d83fc..5da8c05591 100644 --- a/extensions/nats/Makefile +++ b/extensions/nats/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := nats include ../../.make/recursion.mk diff --git a/extensions/notifications/Makefile b/extensions/notifications/Makefile index 51243d83fc..749bf8057b 100644 --- a/extensions/notifications/Makefile +++ b/extensions/notifications/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := notifications include ../../.make/recursion.mk diff --git a/extensions/ocdav/Makefile b/extensions/ocdav/Makefile index 51243d83fc..7fd2d03c35 100644 --- a/extensions/ocdav/Makefile +++ b/extensions/ocdav/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := ocdav include ../../.make/recursion.mk diff --git a/extensions/sharing/Makefile b/extensions/sharing/Makefile index 51243d83fc..074fbff5df 100644 --- a/extensions/sharing/Makefile +++ b/extensions/sharing/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := sharing include ../../.make/recursion.mk diff --git a/extensions/storage-metadata/Makefile b/extensions/storage-metadata/Makefile index 51243d83fc..67d5ce4e3a 100644 --- a/extensions/storage-metadata/Makefile +++ b/extensions/storage-metadata/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := storage-metadata include ../../.make/recursion.mk diff --git a/extensions/storage-publiclink/Makefile b/extensions/storage-publiclink/Makefile index 51243d83fc..0ca4c96683 100644 --- a/extensions/storage-publiclink/Makefile +++ b/extensions/storage-publiclink/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := storage-publiclink include ../../.make/recursion.mk diff --git a/extensions/storage-shares/Makefile b/extensions/storage-shares/Makefile index 51243d83fc..6fc69fef89 100644 --- a/extensions/storage-shares/Makefile +++ b/extensions/storage-shares/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := storage-shares include ../../.make/recursion.mk diff --git a/extensions/storage-users/Makefile b/extensions/storage-users/Makefile index 51243d83fc..f1e9ac0ba8 100644 --- a/extensions/storage-users/Makefile +++ b/extensions/storage-users/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := storage-users include ../../.make/recursion.mk diff --git a/extensions/user/Makefile b/extensions/user/Makefile index 51243d83fc..c249998fc9 100644 --- a/extensions/user/Makefile +++ b/extensions/user/Makefile @@ -1,5 +1,5 @@ SHELL := bash -NAME := ocs +NAME := user include ../../.make/recursion.mk From 26a92f2bad3dcfc8d0bab38738727b2ed927aa7f Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 12:04:59 +0200 Subject: [PATCH 13/50] add app-registry service --- .drone.star | 4 +- Makefile | 1 + docs/extensions/app-registry/_index.md | 16 ++ .../{appprovider => app-registry}/apps.md | 0 docs/extensions/app-registry/configuration.md | 15 ++ docs/extensions/port-ranges.md | 4 +- .../app-registry/cmd/app-registry/main.go | 14 ++ extensions/app-registry/pkg/command/health.go | 57 +++++++ extensions/app-registry/pkg/command/root.go | 64 +++++++ extensions/app-registry/pkg/command/server.go | 102 +++++++++++ .../app-registry/pkg/command/version.go | 50 ++++++ extensions/app-registry/pkg/config/config.go | 70 ++++++++ .../pkg/config/defaults/defaultconfig.go | 158 ++++++++++++++++++ .../app-registry/pkg/config/parser/parse.go | 46 +++++ extensions/app-registry/pkg/config/reva.go | 11 ++ .../app-registry/pkg/logging/logging.go | 17 ++ .../app-registry/pkg/revaconfig/config.go | 48 ++++++ .../app-registry/pkg/server/debug/option.go | 50 ++++++ .../app-registry/pkg/server/debug/server.go | 63 +++++++ .../app-registry/pkg/tracing/tracing.go | 18 ++ .../pkg/config/defaults/defaultconfig.go | 4 +- ocis-pkg/config/config.go | 38 +++-- ocis-pkg/config/defaultconfig.go | 3 + ocis/pkg/command/app-registry.go | 33 ++++ ocis/pkg/runtime/service/service.go | 2 + 25 files changed, 864 insertions(+), 24 deletions(-) create mode 100644 docs/extensions/app-registry/_index.md rename docs/extensions/{appprovider => app-registry}/apps.md (100%) create mode 100644 docs/extensions/app-registry/configuration.md create mode 100644 extensions/app-registry/cmd/app-registry/main.go create mode 100644 extensions/app-registry/pkg/command/health.go create mode 100644 extensions/app-registry/pkg/command/root.go create mode 100644 extensions/app-registry/pkg/command/server.go create mode 100644 extensions/app-registry/pkg/command/version.go create mode 100644 extensions/app-registry/pkg/config/config.go create mode 100644 extensions/app-registry/pkg/config/defaults/defaultconfig.go create mode 100644 extensions/app-registry/pkg/config/parser/parse.go create mode 100644 extensions/app-registry/pkg/config/reva.go create mode 100644 extensions/app-registry/pkg/logging/logging.go create mode 100644 extensions/app-registry/pkg/revaconfig/config.go create mode 100644 extensions/app-registry/pkg/server/debug/option.go create mode 100644 extensions/app-registry/pkg/server/debug/server.go create mode 100644 extensions/app-registry/pkg/tracing/tracing.go create mode 100644 ocis/pkg/command/app-registry.go diff --git a/.drone.star b/.drone.star index ce4ef53550..211d8bbdc4 100644 --- a/.drone.star +++ b/.drone.star @@ -44,6 +44,7 @@ config = { "modules": [ # if you add a module here please also add it to the root level Makefile "extensions/accounts", + "extensions/app-registry", "extensions/appprovider", "extensions/audit", "extensions/auth-basic", @@ -53,9 +54,9 @@ config = { "extensions/gateway", "extensions/glauth", "extensions/graph-explorer", + "extensions/graph", "extensions/group", "extensions/idm", - "extensions/graph", "extensions/idp", "extensions/nats", "extensions/notifications", @@ -68,7 +69,6 @@ config = { "extensions/storage-publiclink", "extensions/storage-shares", "extensions/storage-users", - "extensions/storage", "extensions/store", "extensions/thumbnails", "extensions/user", diff --git a/Makefile b/Makefile index c3c7197bdb..6d751c283d 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ L10N_MODULES := $(shell find . -path '*.tx*' -name 'config' | sed 's|/[^/]*$$||' # if you add a module here please also add it to the .drone.star file OCIS_MODULES = \ extensions/accounts \ + extensions/app-registry \ extensions/appprovider \ extensions/audit \ extensions/auth-basic \ diff --git a/docs/extensions/app-registry/_index.md b/docs/extensions/app-registry/_index.md new file mode 100644 index 0000000000..9b79ea4a89 --- /dev/null +++ b/docs/extensions/app-registry/_index.md @@ -0,0 +1,16 @@ +--- +title: App Registry +date: 2022-03-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/app-registry +geekdocFilePath: _index.md +geekdocCollapseSection: true +--- + +## Abstract + + +## Table of Contents + +{{< toc-tree >}} diff --git a/docs/extensions/appprovider/apps.md b/docs/extensions/app-registry/apps.md similarity index 100% rename from docs/extensions/appprovider/apps.md rename to docs/extensions/app-registry/apps.md diff --git a/docs/extensions/app-registry/configuration.md b/docs/extensions/app-registry/configuration.md new file mode 100644 index 0000000000..f1a18da072 --- /dev/null +++ b/docs/extensions/app-registry/configuration.md @@ -0,0 +1,15 @@ +--- +title: Service Configuration +date: 2018-05-02T00:00:00+00:00 +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis +geekdocEditPath: edit/master/docs/extensions/app-registry +geekdocFilePath: configuration.md +geekdocCollapseSection: true +--- + +## Example YAML Config + +{{< include file="extensions/_includes/app-registry-config-example.yaml" language="yaml" >}} + +{{< include file="extensions/_includes/app-registry_configvars.md" >}} diff --git a/docs/extensions/port-ranges.md b/docs/extensions/port-ranges.md index bc3143c08e..926fb7030b 100644 --- a/docs/extensions/port-ranges.md +++ b/docs/extensions/port-ranges.md @@ -17,7 +17,7 @@ Feel free to "reserve" a free port range when you're developing an extension by If you're developing a non-public extension, we recommend using ports outside of the ranges listed below. -We also suggest to use the last port in your extensions' range as a debug/metrics port. +We also suggest to use the last port in your extensions' range as a debug/metrics port.**** ## Allocations @@ -46,7 +46,7 @@ We also suggest to use the last port in your extensions' range as a debug/metric | 9225-9229 | photoprism (state: PoC) | | 9230-9234 | [nats](https://github.com/owncloud/ocis/tree/master/nats) | | 9235-9239 | idm TBD | -| 9240-9244 | FREE | +| 9240-9244 | [app-registry](https://github.com/owncloud/ocis/tree/master/extensions/app-registry) | | 9245-9249 | FREE | | 9250-9254 | oCIS Runtime | | 9255-9259 | FREE | diff --git a/extensions/app-registry/cmd/app-registry/main.go b/extensions/app-registry/cmd/app-registry/main.go new file mode 100644 index 0000000000..19565e1e81 --- /dev/null +++ b/extensions/app-registry/cmd/app-registry/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/command" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config/defaults" +) + +func main() { + if err := command.Execute(defaults.DefaultConfig()); err != nil { + os.Exit(1) + } +} diff --git a/extensions/app-registry/pkg/command/health.go b/extensions/app-registry/pkg/command/health.go new file mode 100644 index 0000000000..c60fd662a9 --- /dev/null +++ b/extensions/app-registry/pkg/command/health.go @@ -0,0 +1,57 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config/parser" + "github.com/owncloud/ocis/extensions/app-registry/pkg/logging" + "github.com/urfave/cli/v2" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "check health status", + Category: "info", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/extensions/app-registry/pkg/command/root.go b/extensions/app-registry/pkg/command/root.go new file mode 100644 index 0000000000..df302358e1 --- /dev/null +++ b/extensions/app-registry/pkg/command/root.go @@ -0,0 +1,64 @@ +package command + +import ( + "context" + "os" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/clihelper" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// GetCommands provides all commands for this service +func GetCommands(cfg *config.Config) cli.Commands { + return []*cli.Command{ + // start this service + Server(cfg), + + // interaction with this service + + // infos about this service + Health(cfg), + Version(cfg), + } +} + +// Execute is the entry point for the ocis-app-registry command. +func Execute(cfg *config.Config) error { + app := clihelper.DefaultApp(&cli.App{ + Name: "ocis-app-registry", + Usage: "Provide a app registry for oCIS", + Commands: GetCommands(cfg), + }) + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + return app.Run(os.Args) +} + +// SutureService allows for the app-registry command to be embedded and supervised by a suture supervisor tree. +type SutureService struct { + cfg *config.Config +} + +// NewSutureService creates a new app-registry.SutureService +func NewSutureService(cfg *ociscfg.Config) suture.Service { + cfg.AppRegistry.Commons = cfg.Commons + return SutureService{ + cfg: cfg.AppRegistry, + } +} + +func (s SutureService) Serve(ctx context.Context) error { + s.cfg.Context = ctx + if err := Execute(s.cfg); err != nil { + return err + } + + return nil +} diff --git a/extensions/app-registry/pkg/command/server.go b/extensions/app-registry/pkg/command/server.go new file mode 100644 index 0000000000..0ab6f3301c --- /dev/null +++ b/extensions/app-registry/pkg/command/server.go @@ -0,0 +1,102 @@ +package command + +import ( + "context" + "fmt" + "os" + "path" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config/parser" + "github.com/owncloud/ocis/extensions/app-registry/pkg/logging" + "github.com/owncloud/ocis/extensions/app-registry/pkg/revaconfig" + "github.com/owncloud/ocis/extensions/app-registry/pkg/server/debug" + "github.com/owncloud/ocis/extensions/app-registry/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/service/external" + "github.com/owncloud/ocis/ocis-pkg/version" + "github.com/urfave/cli/v2" +) + +// Server is the entry point for the server command. +func Server(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "server", + Usage: fmt.Sprintf("start %s extension without runtime (unsupervised mode)", cfg.Service.Name), + Category: "server", + Before: func(c *cli.Context) error { + err := parser.ParseConfig(cfg) + if err != nil { + fmt.Printf("%v", err) + } + return err + }, + Action: func(c *cli.Context) error { + logger := logging.Configure(cfg.Service.Name, cfg.Log) + err := tracing.Configure(cfg, logger) + if err != nil { + return err + } + gr := run.Group{} + ctx, cancel := defineContext(cfg) + + defer cancel() + + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") + + rcfg := revaconfig.AppRegistryConfigFromStruct(cfg, logger) + + gr.Add(func() error { + runtime.RunWithOptions(rcfg, pidFile, runtime.WithLogger(&logger.Logger)) + return nil + }, func(_ error) { + logger.Info(). + Str("server", cfg.Service.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if err := external.RegisterGRPCEndpoint( + ctx, + cfg.GRPC.Namespace+"."+cfg.Service.Name, + uuid.Must(uuid.NewV4()).String(), + cfg.GRPC.Addr, + version.String, + logger, + ); err != nil { + logger.Fatal().Err(err).Msg("failed to register the grpc endpoint") + } + + return gr.Run() + }, + } +} + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/extensions/app-registry/pkg/command/version.go b/extensions/app-registry/pkg/command/version.go new file mode 100644 index 0000000000..04b2d20c61 --- /dev/null +++ b/extensions/app-registry/pkg/command/version.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "os" + + "github.com/owncloud/ocis/ocis-pkg/registry" + "github.com/owncloud/ocis/ocis-pkg/version" + + tw "github.com/olekukonko/tablewriter" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/urfave/cli/v2" +) + +// Version prints the service versions of all running instances. +func Version(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "version", + Usage: "print the version of this binary and the running extension instances", + Category: "info", + Action: func(c *cli.Context) error { + fmt.Println("Version: " + version.String) + fmt.Printf("Compiled: %s\n", version.Compiled()) + fmt.Println("") + + reg := registry.GetRegistry() + services, err := reg.GetService(cfg.GRPC.Namespace + "." + cfg.Service.Name) + if err != nil { + fmt.Println(fmt.Errorf("could not get %s services from the registry: %v", cfg.Service.Name, err)) + return err + } + + if len(services) == 0 { + fmt.Println("No running " + cfg.Service.Name + " service found.") + return nil + } + + table := tw.NewWriter(os.Stdout) + table.SetHeader([]string{"Version", "Address", "Id"}) + table.SetAutoFormatHeaders(false) + for _, s := range services { + for _, n := range s.Nodes { + table.Append([]string{s.Version, n.Address, n.Id}) + } + } + table.Render() + return nil + }, + } +} diff --git a/extensions/app-registry/pkg/config/config.go b/extensions/app-registry/pkg/config/config.go new file mode 100644 index 0000000000..d3efe36e50 --- /dev/null +++ b/extensions/app-registry/pkg/config/config.go @@ -0,0 +1,70 @@ +package config + +import ( + "context" + + "github.com/owncloud/ocis/ocis-pkg/shared" +) + +type Config struct { + *shared.Commons `yaml:"-"` + + Service Service `yaml:"-"` + Tracing *Tracing `yaml:"tracing"` + Log *Log `yaml:"log"` + Debug Debug `yaml:"debug"` + + GRPC GRPCConfig `yaml:"grpc"` + + TokenManager *TokenManager `yaml:"token_manager"` + Reva *Reva `yaml:"reva"` + + AppRegistry AppRegistry `yaml:"app_registry"` + + Supervised bool `yaml:"-"` + Context context.Context `yaml:"-"` +} +type Tracing struct { + Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;APP_REGISTRY_TRACING_ENABLED" desc:"Activates tracing."` + Type string `yaml:"type" env:"OCIS_TRACING_TYPE;APP_REGISTRY_TRACING_TYPE"` + Endpoint string `yaml:"endpoint" env:"OCIS_TRACING_ENDPOINT;APP_REGISTRY_TRACING_ENDPOINT" desc:"The endpoint to the tracing collector."` + Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;APP_REGISTRY_TRACING_COLLECTOR"` +} + +type Log struct { + Level string `yaml:"level" env:"OCIS_LOG_LEVEL;APP_REGISTRY_LOG_LEVEL" desc:"The log level."` + Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;APP_REGISTRY_LOG_PRETTY" desc:"Activates pretty log output."` + Color bool `yaml:"color" env:"OCIS_LOG_COLOR;APP_REGISTRY_LOG_COLOR" desc:"Activates colorized log output."` + File string `yaml:"file" env:"OCIS_LOG_FILE;APP_REGISTRY_LOG_FILE" desc:"The target log file."` +} + +type Service struct { + Name string `yaml:"-"` +} + +type Debug struct { + Addr string `yaml:"addr" env:"APP_REGISTRY_DEBUG_ADDR"` + Token string `yaml:"token" env:"APP_REGISTRY_DEBUG_TOKEN"` + Pprof bool `yaml:"pprof" env:"APP_REGISTRY_DEBUG_PPROF"` + Zpages bool `yaml:"zpages" env:"APP_REGISTRY_DEBUG_ZPAGES"` +} + +type GRPCConfig struct { + Addr string `yaml:"addr" env:"APP_REGISTRY_GRPC_ADDR" desc:"The address of the grpc service."` + Namespace string `yaml:"-"` + Protocol string `yaml:"protocol" env:"APP_REGISTRY_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` +} + +type AppRegistry struct { + MimeTypeConfig []MimeTypeConfig `yaml:"mimetypes"` +} + +type MimeTypeConfig struct { + MimeType string `yaml:"mime_type" mapstructure:"mime_type"` + Extension string `yaml:"extension" mapstructure:"extension"` + Name string `yaml:"name" mapstructure:"name"` + Description string `yaml:"description" mapstructure:"description"` + Icon string `yaml:"icon" mapstructure:"icon"` + DefaultApp string `yaml:"default_app" mapstructure:"default_app"` + AllowCreation bool `yaml:"allow_creation" mapstructure:"allow_creation"` +} diff --git a/extensions/app-registry/pkg/config/defaults/defaultconfig.go b/extensions/app-registry/pkg/config/defaults/defaultconfig.go new file mode 100644 index 0000000000..de2f4e137c --- /dev/null +++ b/extensions/app-registry/pkg/config/defaults/defaultconfig.go @@ -0,0 +1,158 @@ +package defaults + +import ( + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" +) + +func FullDefaultConfig() *config.Config { + cfg := DefaultConfig() + EnsureDefaults(cfg) + Sanitize(cfg) + return cfg +} + +func DefaultConfig() *config.Config { + return &config.Config{ + Debug: config.Debug{ + Addr: "127.0.0.1:9243", + Token: "", + Pprof: false, + Zpages: false, + }, + GRPC: config.GRPCConfig{ + Addr: "127.0.0.1:9242", + Namespace: "com.owncloud.api", + Protocol: "tcp", + }, + Service: config.Service{ + Name: "app-registry", + }, + Reva: &config.Reva{ + Address: "127.0.0.1:9142", + }, + AppRegistry: config.AppRegistry{ + MimeTypeConfig: defaultMimeTypeConfig(), + }, + } +} + +func defaultMimeTypeConfig() []config.MimeTypeConfig { + return []config.MimeTypeConfig{ + { + MimeType: "application/pdf", + Extension: "pdf", + Name: "PDF", + Description: "PDF document", + }, + { + MimeType: "application/vnd.oasis.opendocument.text", + Extension: "odt", + Name: "OpenDocument", + Description: "OpenDocument text document", + AllowCreation: true, + }, + { + MimeType: "application/vnd.oasis.opendocument.spreadsheet", + Extension: "ods", + Name: "OpenSpreadsheet", + Description: "OpenDocument spreadsheet document", + AllowCreation: true, + }, + { + MimeType: "application/vnd.oasis.opendocument.presentation", + Extension: "odp", + Name: "OpenPresentation", + Description: "OpenDocument presentation document", + AllowCreation: true, + }, + { + MimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + Extension: "docx", + Name: "Microsoft Word", + Description: "Microsoft Word document", + AllowCreation: true, + }, + { + MimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + Extension: "xlsx", + Name: "Microsoft Excel", + Description: "Microsoft Excel document", + AllowCreation: true, + }, + { + MimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation", + Extension: "pptx", + Name: "Microsoft PowerPoint", + Description: "Microsoft PowerPoint document", + AllowCreation: true, + }, + { + MimeType: "application/vnd.jupyter", + Extension: "ipynb", + Name: "Jupyter Notebook", + Description: "Jupyter Notebook", + }, + { + MimeType: "text/markdown", + Extension: "md", + Name: "Markdown file", + Description: "Markdown file", + AllowCreation: true, + }, + { + MimeType: "application/compressed-markdown", + Extension: "zmd", + Name: "Compressed markdown file", + Description: "Compressed markdown file", + }, + } +} + +func EnsureDefaults(cfg *config.Config) { + // provide with defaults for shared logging, since we need a valid destination address for BindEnv. + if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Log = &config.Log{ + Level: cfg.Commons.Log.Level, + Pretty: cfg.Commons.Log.Pretty, + Color: cfg.Commons.Log.Color, + File: cfg.Commons.Log.File, + } + } else if cfg.Log == nil { + cfg.Log = &config.Log{} + } + // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. + if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { + cfg.Tracing = &config.Tracing{ + Enabled: cfg.Commons.Tracing.Enabled, + Type: cfg.Commons.Tracing.Type, + Endpoint: cfg.Commons.Tracing.Endpoint, + Collector: cfg.Commons.Tracing.Collector, + } + } else if cfg.Tracing == nil { + cfg.Tracing = &config.Tracing{} + } + + if cfg.Reva == nil && cfg.Commons != nil && cfg.Commons.Reva != nil { + cfg.Reva = &config.Reva{ + Address: cfg.Commons.Reva.Address, + } + } else if cfg.Reva == nil { + cfg.Reva = &config.Reva{} + } + + if cfg.TokenManager == nil && cfg.Commons != nil && cfg.Commons.TokenManager != nil { + cfg.TokenManager = &config.TokenManager{ + JWTSecret: cfg.Commons.TokenManager.JWTSecret, + } + } else if cfg.TokenManager == nil { + cfg.TokenManager = &config.TokenManager{} + } + + if cfg.TransferSecret == "" && cfg.Commons != nil && cfg.Commons.TransferSecret != "" { + cfg.TransferSecret = cfg.Commons.TransferSecret + } +} + +func Sanitize(cfg *config.Config) { + // nothing to sanitize here atm +} diff --git a/extensions/app-registry/pkg/config/parser/parse.go b/extensions/app-registry/pkg/config/parser/parse.go new file mode 100644 index 0000000000..894f938b6e --- /dev/null +++ b/extensions/app-registry/pkg/config/parser/parse.go @@ -0,0 +1,46 @@ +package parser + +import ( + "errors" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config/defaults" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/owncloud/ocis/ocis-pkg/shared" + + "github.com/owncloud/ocis/ocis-pkg/config/envdecode" +) + +// ParseConfig loads configuration from known paths. +func ParseConfig(cfg *config.Config) error { + _, err := ociscfg.BindSourcesToStructs(cfg.Service.Name, cfg) + if err != nil { + return err + } + + defaults.EnsureDefaults(cfg) + + // load all env variables relevant to the config in the current context. + if err := envdecode.Decode(cfg); err != nil { + // no environment variable set for this config is an expected "error" + if !errors.Is(err, envdecode.ErrNoTargetFieldsAreSet) { + return err + } + } + + defaults.Sanitize(cfg) + + return Validate(cfg) +} + +func Validate(cfg *config.Config) error { + if cfg.TokenManager.JWTSecret == "" { + return shared.MissingJWTTokenError(cfg.Service.Name) + } + + if cfg.TransferSecret == "" { + return shared.MissingRevaTransferSecretError(cfg.Service.Name) + } + + return nil +} diff --git a/extensions/app-registry/pkg/config/reva.go b/extensions/app-registry/pkg/config/reva.go new file mode 100644 index 0000000000..e1648edc4d --- /dev/null +++ b/extensions/app-registry/pkg/config/reva.go @@ -0,0 +1,11 @@ +package config + +// Reva defines all available REVA configuration. +type Reva struct { + Address string `yaml:"address" env:"REVA_GATEWAY"` +} + +// TokenManager is the config for using the reva token manager +type TokenManager struct { + JWTSecret string `yaml:"jwt_secret" env:"OCIS_JWT_SECRET;APP_REGISTRY_JWT_SECRET"` +} diff --git a/extensions/app-registry/pkg/logging/logging.go b/extensions/app-registry/pkg/logging/logging.go new file mode 100644 index 0000000000..f887afef4c --- /dev/null +++ b/extensions/app-registry/pkg/logging/logging.go @@ -0,0 +1,17 @@ +package logging + +import ( + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// LoggerFromConfig initializes a service-specific logger instance. +func Configure(name string, cfg *config.Log) log.Logger { + return log.NewLogger( + log.Name(name), + log.Level(cfg.Level), + log.Pretty(cfg.Pretty), + log.Color(cfg.Color), + log.File(cfg.File), + ) +} diff --git a/extensions/app-registry/pkg/revaconfig/config.go b/extensions/app-registry/pkg/revaconfig/config.go new file mode 100644 index 0000000000..576f1643c6 --- /dev/null +++ b/extensions/app-registry/pkg/revaconfig/config.go @@ -0,0 +1,48 @@ +package revaconfig + +import ( + "github.com/owncloud/ocis/ocis-pkg/log" + + "github.com/mitchellh/mapstructure" + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" +) + +// AppRegistryConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func AppRegistryConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": cfg.Service.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.TokenManager.JWTSecret, + "gatewaysvc": cfg.Reva.Address, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + "services": map[string]interface{}{ + "appregistry": map[string]interface{}{ + "driver": "static", + "drivers": map[string]interface{}{ + "static": map[string]interface{}{ + "mime_types": mimetypes(cfg, logger), + }, + }, + }, + }, + }, + } + return rcfg +} + +func mimetypes(cfg *config.Config, logger log.Logger) []map[string]interface{} { + var m []map[string]interface{} + if err := mapstructure.Decode(cfg.AppRegistry.MimeTypeConfig, &m); err != nil { + logger.Error().Err(err).Msg("Failed to decode appregistry mimetypes to mapstructure") + return nil + } + return m +} diff --git a/extensions/app-registry/pkg/server/debug/option.go b/extensions/app-registry/pkg/server/debug/option.go new file mode 100644 index 0000000000..2ccb53ed45 --- /dev/null +++ b/extensions/app-registry/pkg/server/debug/option.go @@ -0,0 +1,50 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/extensions/app-registry/pkg/server/debug/server.go b/extensions/app-registry/pkg/server/debug/server.go new file mode 100644 index 0000000000..cf106ef99b --- /dev/null +++ b/extensions/app-registry/pkg/server/debug/server.go @@ -0,0 +1,63 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/service/debug" + "github.com/owncloud/ocis/ocis-pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Config.Service.Name), + debug.Version(version.String), + debug.Address(options.Config.Debug.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + //debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins), + //debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods), + //debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders), + //debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO: check if services are up and running + + _, err := io.WriteString(w, http.StatusText(http.StatusOK)) + // io.WriteString should not fail but if it does we want to know. + if err != nil { + panic(err) + } + } +} diff --git a/extensions/app-registry/pkg/tracing/tracing.go b/extensions/app-registry/pkg/tracing/tracing.go new file mode 100644 index 0000000000..212c4f7c11 --- /dev/null +++ b/extensions/app-registry/pkg/tracing/tracing.go @@ -0,0 +1,18 @@ +package tracing + +import ( + "github.com/owncloud/ocis/extensions/app-registry/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "go.opentelemetry.io/otel/trace" +) + +var ( + // TraceProvider is the global trace provider for the proxy service. + TraceProvider = trace.NewNoopTracerProvider() +) + +func Configure(cfg *config.Config, logger log.Logger) error { + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + return nil +} diff --git a/extensions/auth-basic/pkg/config/defaults/defaultconfig.go b/extensions/auth-basic/pkg/config/defaults/defaultconfig.go index 66e3d4d93a..6224e1fb6b 100644 --- a/extensions/auth-basic/pkg/config/defaults/defaultconfig.go +++ b/extensions/auth-basic/pkg/config/defaults/defaultconfig.go @@ -23,9 +23,9 @@ func DefaultConfig() *config.Config { Zpages: false, }, GRPC: config.GRPCConfig{ - Addr: "127.0.0.1:9146", + Addr: "127.0.0.1:9146", Namespace: "com.owncloud.api", - Protocol: "tcp", + Protocol: "tcp", }, Service: config.Service{ Name: "auth-basic", diff --git a/ocis-pkg/config/config.go b/ocis-pkg/config/config.go index 8f6b1e0d83..40a1d9842b 100644 --- a/ocis-pkg/config/config.go +++ b/ocis-pkg/config/config.go @@ -4,6 +4,7 @@ import ( "github.com/owncloud/ocis/ocis-pkg/shared" accounts "github.com/owncloud/ocis/extensions/accounts/pkg/config" + appRegistry "github.com/owncloud/ocis/extensions/app-registry/pkg/config" appprovider "github.com/owncloud/ocis/extensions/appprovider/pkg/config" audit "github.com/owncloud/ocis/extensions/audit/pkg/config" authbasic "github.com/owncloud/ocis/extensions/auth-basic/pkg/config" @@ -71,35 +72,36 @@ type Config struct { MetadataUserID string `yaml:"metadata_user_id" env:"METADATA_USER_ID"` Runtime Runtime `yaml:"runtime"` - Audit *audit.Config `yaml:"audit"` Accounts *accounts.Config `yaml:"accounts"` - GLAuth *glauth.Config `yaml:"glauth"` - Graph *graph.Config `yaml:"graph"` - GraphExplorer *graphExplorer.Config `yaml:"graph-explorer"` - IDP *idp.Config `yaml:"idp"` - IDM *idm.Config `yaml:"idm"` - Nats *nats.Config `yaml:"nats"` - Notifications *notifications.Config `yaml:"notifications"` - OCS *ocs.Config `yaml:"ocs"` - Web *web.Config `yaml:"web"` - Proxy *proxy.Config `yaml:"proxy"` - Settings *settings.Config `yaml:"settings"` - Gateway *gateway.Config `yaml:"gateway"` - Frontend *frontend.Config `yaml:"frontend"` + AppProvider *appprovider.Config `yaml:"appprovider"` + AppRegistry *appRegistry.Config `yaml:"app-registry"` + Audit *audit.Config `yaml:"audit"` AuthBasic *authbasic.Config `yaml:"auth-basic"` AuthBearer *authbearer.Config `yaml:"auth-bearer"` AuthMachine *authmachine.Config `yaml:"auth-machine"` - User *user.Config `yaml:"user"` + Frontend *frontend.Config `yaml:"frontend"` + Gateway *gateway.Config `yaml:"gateway"` + GLAuth *glauth.Config `yaml:"glauth"` + Graph *graph.Config `yaml:"graph"` + GraphExplorer *graphExplorer.Config `yaml:"graph-explorer"` Group *group.Config `yaml:"group"` - AppProvider *appprovider.Config `yaml:"appprovider"` + IDM *idm.Config `yaml:"idm"` + IDP *idp.Config `yaml:"idp"` + Nats *nats.Config `yaml:"nats"` + Notifications *notifications.Config `yaml:"notifications"` + OCDav *ocdav.Config `yaml:"ocdav"` + OCS *ocs.Config `yaml:"ocs"` + Proxy *proxy.Config `yaml:"proxy"` + Settings *settings.Config `yaml:"settings"` Sharing *sharing.Config `yaml:"sharing"` StorageMetadata *storagemetadata.Config `yaml:"storage-metadata"` StoragePublicLink *storagepublic.Config `yaml:"storage-public"` - StorageUsers *storageusers.Config `yaml:"storage-users"` StorageShares *storageshares.Config `yaml:"storage-shares"` - OCDav *ocdav.Config `yaml:"ocdav"` + StorageUsers *storageusers.Config `yaml:"storage-users"` Store *store.Config `yaml:"store"` Thumbnails *thumbnails.Config `yaml:"thumbnails"` + User *user.Config `yaml:"user"` + Web *web.Config `yaml:"web"` WebDAV *webdav.Config `yaml:"webdav"` Search *search.Config `yaml:"search"` } diff --git a/ocis-pkg/config/defaultconfig.go b/ocis-pkg/config/defaultconfig.go index 8798918bfc..b6ee829a10 100644 --- a/ocis-pkg/config/defaultconfig.go +++ b/ocis-pkg/config/defaultconfig.go @@ -2,6 +2,7 @@ package config import ( accounts "github.com/owncloud/ocis/extensions/accounts/pkg/config/defaults" + appregistry "github.com/owncloud/ocis/extensions/app-registry/pkg/config/defaults" appprovider "github.com/owncloud/ocis/extensions/appprovider/pkg/config/defaults" audit "github.com/owncloud/ocis/extensions/audit/pkg/config/defaults" authbasic "github.com/owncloud/ocis/extensions/auth-basic/pkg/config/defaults" @@ -40,8 +41,10 @@ func DefaultConfig() *Config { Port: "9250", Host: "localhost", }, + Accounts: accounts.DefaultConfig(), AppProvider: appprovider.DefaultConfig(), + AppRegistry: appregistry.DefaultConfig(), Audit: audit.DefaultConfig(), AuthBasic: authbasic.DefaultConfig(), AuthBearer: authbearer.DefaultConfig(), diff --git a/ocis/pkg/command/app-registry.go b/ocis/pkg/command/app-registry.go new file mode 100644 index 0000000000..74dcb85ab5 --- /dev/null +++ b/ocis/pkg/command/app-registry.go @@ -0,0 +1,33 @@ +package command + +import ( + "fmt" + + "github.com/owncloud/ocis/extensions/app-registry/pkg/command" + "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/owncloud/ocis/ocis-pkg/config/parser" + "github.com/owncloud/ocis/ocis/pkg/register" + "github.com/urfave/cli/v2" +) + +// AppRegistryCommand is the entrypoint for the AppRegistry command. +func AppRegistryCommand(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: cfg.AppRegistry.Service.Name, + Usage: subcommandDescription(cfg.AppRegistry.Service.Name), + Category: "extensions", + Before: func(c *cli.Context) error { + if err := parser.ParseConfig(cfg); err != nil { + fmt.Printf("%v", err) + return err + } + cfg.AppRegistry.Commons = cfg.Commons + return nil + }, + Subcommands: command.GetCommands(cfg.AppRegistry), + } +} + +func init() { + register.AddCommand(AppRegistryCommand) +} diff --git a/ocis/pkg/runtime/service/service.go b/ocis/pkg/runtime/service/service.go index 7814989f4a..612c67cab9 100644 --- a/ocis/pkg/runtime/service/service.go +++ b/ocis/pkg/runtime/service/service.go @@ -20,6 +20,7 @@ import ( "github.com/olekukonko/tablewriter" accounts "github.com/owncloud/ocis/extensions/accounts/pkg/command" + appregistry "github.com/owncloud/ocis/extensions/app-registry/pkg/command" appprovider "github.com/owncloud/ocis/extensions/appprovider/pkg/command" authbasic "github.com/owncloud/ocis/extensions/auth-basic/pkg/command" authbearer "github.com/owncloud/ocis/extensions/auth-bearer/pkg/command" @@ -122,6 +123,7 @@ func NewService(options ...Option) (*Service, error) { s.ServicesRegistry[opts.Config.Frontend.Service.Name] = frontend.NewSutureService s.ServicesRegistry[opts.Config.OCDav.Service.Name] = ocdav.NewSutureService s.ServicesRegistry[opts.Config.Gateway.Service.Name] = gateway.NewSutureService + s.ServicesRegistry[opts.Config.AppRegistry.Service.Name] = appregistry.NewSutureService s.ServicesRegistry[opts.Config.User.Service.Name] = user.NewSutureService s.ServicesRegistry[opts.Config.Group.Service.Name] = group.NewSutureService s.ServicesRegistry[opts.Config.AuthBasic.Service.Name] = authbasic.NewSutureService From 6c2b9cb29b0893700680e882da06fa73c175e43e Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 12:06:10 +0200 Subject: [PATCH 14/50] gateway config docs --- extensions/gateway/pkg/config/config.go | 53 ++++---- .../pkg/config/defaults/defaultconfig.go | 17 ++- extensions/gateway/pkg/revaconfig/config.go | 123 +----------------- 3 files changed, 34 insertions(+), 159 deletions(-) diff --git a/extensions/gateway/pkg/config/config.go b/extensions/gateway/pkg/config/config.go index 02417ffeac..b8e4ba3366 100644 --- a/extensions/gateway/pkg/config/config.go +++ b/extensions/gateway/pkg/config/config.go @@ -21,29 +21,30 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"-"` - CommitShareToStorageGrant bool `yaml:"commit_share_to_storage_grant"` - CommitShareToStorageRef bool `yaml:"commit_share_to_storage_ref"` - ShareFolder string `yaml:"share_folder"` - DisableHomeCreationOnLogin bool `yaml:"disable_home_creation_on_login"` - TransferSecret string `yaml:"transfer_secret" env:"STORAGE_TRANSFER_SECRET"` - TransferExpires int `yaml:"transfer_expires"` - HomeMapping string `yaml:"home_mapping"` - EtagCacheTTL int `yaml:"etag_cache_ttl"` + CommitShareToStorageGrant bool `yaml:"commit_share_to_storage_grant" env:"GATEWAY_COMMIT_SHARE_TO_STORAGE_GRANT"` + CommitShareToStorageRef bool `yaml:"commit_share_to_storage_ref" env:"GATEWAY_COMMIT_SHARE_TO_STORAGE_REF"` + ShareFolder string `yaml:"share_folder_name" env:"GATEWAY_SHARE_FOLDER_NAME"` + DisableHomeCreationOnLogin bool `yaml:"disable_home_creation_on_login" env:"GATEWAY_DISABLE_HOME_CREATION_ON_LOGIN"` + TransferSecret string `yaml:"transfer_secret" env:"STORAGE_TRANSFER_SECRET"` // TODO: how to name the env + TransferExpires int `yaml:"transfer_expires" env:"GATEWAY_TRANSFER_EXPIRES"` + HomeMapping string `yaml:"home_mapping" env:"GATEWAY_HOME_MAPPIN"` + EtagCacheTTL int `yaml:"etag_cache_ttl" env:"GATEWAY_ETAG_CACHE_TTL"` - UsersEndpoint string `yaml:"users_endpoint"` - GroupsEndpoint string `yaml:"groups_endpoint"` - PermissionsEndpoint string `yaml:"permissions_endpoint"` - SharingEndpoint string `yaml:"sharing_endpoint"` - FrontendPublicURL string `yaml:"frontend_public_url" env:"OCIS_URL;GATEWAY_FRONTEND_PUBLIC_URL"` - AuthBasicEndpoint string `yaml:"auth_basic_endpoint"` - AuthBearerEndpoint string `yaml:"auth_bearer_endpoint"` - AuthMachineEndpoint string `yaml:"auth_machine_endpoint"` - StoragePublicLinkEndpoint string `yaml:"storage_public_link_endpoint"` - StorageUsersEndpoint string `yaml:"storage_users_endpoint"` - StorageSharesEndpoint string `yaml:"storage_shares_endpoint"` + FrontendPublicURL string `yaml:"frontend_public_url" env:"OCIS_URL;GATEWAY_FRONTEND_PUBLIC_URL"` - StorageRegistry StorageRegistry `yaml:"storage_registry"` - AppRegistry AppRegistry `yaml:"app_registry"` + UsersEndpoint string `yaml:"users_endpoint" env:"GATEWAY_USERS_ENDPOINT"` + GroupsEndpoint string `yaml:"groups_endpoint" env:"GATEWAY_GROUPS_ENDPOINT"` + PermissionsEndpoint string `yaml:"permissions_endpoint" env:"GATEWAY_PERMISSIONS_ENDPOINT"` + SharingEndpoint string `yaml:"sharing_endpoint" env:"GATEWAY_SHARING_ENDPOINT"` + AuthBasicEndpoint string `yaml:"auth_basic_endpoint" env:"GATEWAY_AUTH_BASIC_ENDPOINT"` + AuthBearerEndpoint string `yaml:"auth_bearer_endpoint" env:"GATEWAY_AUTH_BEARER_ENDPOINT"` + AuthMachineEndpoint string `yaml:"auth_machine_endpoint" env:"GATEWAY_AUTH_MACHINE_ENDPOINT"` + StoragePublicLinkEndpoint string `yaml:"storage_public_link_endpoint" env:"GATEWAY_STORAGE_PUBLIC_LINK_ENDPOINT"` + StorageUsersEndpoint string `yaml:"storage_users_endpoint" env:"GATEWAY_STORAGE_USERS_ENDPOINT"` + StorageSharesEndpoint string `yaml:"storage_shares_endpoint" env:"GATEWAY_STORAGE_SHARES_ENDPOINT"` + AppRegistryEndpoint string `yaml:"app_registry_endpoint" env:"GATEWAY_APP_REGISTRY_ENDPOINT"` + + StorageRegistry StorageRegistry `yaml:"storage_registry"` //TODO: should we even support switching this? Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` @@ -80,11 +81,7 @@ type GRPCConfig struct { } type StorageRegistry struct { - Driver string - Rules []string - JSON string -} - -type AppRegistry struct { - MimetypesJSON string + Driver string `yaml:"driver"` //TODO: configure via env? + Rules []string `yaml:"rules"` //TODO: configure via env? + JSON string `yaml:"json"` //TODO: configure via env? } diff --git a/extensions/gateway/pkg/config/defaults/defaultconfig.go b/extensions/gateway/pkg/config/defaults/defaultconfig.go index 56b07c1858..e00cb37a92 100644 --- a/extensions/gateway/pkg/config/defaults/defaultconfig.go +++ b/extensions/gateway/pkg/config/defaults/defaultconfig.go @@ -39,25 +39,24 @@ func DefaultConfig() *config.Config { HomeMapping: "", EtagCacheTTL: 0, - UsersEndpoint: "localhost:9144", - GroupsEndpoint: "localhost:9160", - PermissionsEndpoint: "localhost:9191", - SharingEndpoint: "localhost:9150", - FrontendPublicURL: "https://localhost:9200", + FrontendPublicURL: "https://localhost:9200", + + AppRegistryEndpoint: "localhost:9222", AuthBasicEndpoint: "localhost:9146", AuthBearerEndpoint: "localhost:9148", AuthMachineEndpoint: "localhost:9166", + GroupsEndpoint: "localhost:9160", + PermissionsEndpoint: "localhost:9191", + SharingEndpoint: "localhost:9150", StoragePublicLinkEndpoint: "localhost:9178", - StorageUsersEndpoint: "localhost:9157", StorageSharesEndpoint: "localhost:9154", + StorageUsersEndpoint: "localhost:9157", + UsersEndpoint: "localhost:9144", StorageRegistry: config.StorageRegistry{ Driver: "spaces", JSON: "", }, - AppRegistry: config.AppRegistry{ - MimetypesJSON: "", - }, } } diff --git a/extensions/gateway/pkg/revaconfig/config.go b/extensions/gateway/pkg/revaconfig/config.go index 5ff200644c..eccd39f0a3 100644 --- a/extensions/gateway/pkg/revaconfig/config.go +++ b/extensions/gateway/pkg/revaconfig/config.go @@ -8,7 +8,6 @@ import ( "github.com/owncloud/ocis/ocis-pkg/log" "github.com/cs3org/reva/v2/pkg/utils" - "github.com/mitchellh/mapstructure" "github.com/owncloud/ocis/extensions/gateway/pkg/config" ) @@ -35,7 +34,7 @@ func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]i // registries is located on the gateway "authregistrysvc": cfg.Reva.Address, "storageregistrysvc": cfg.Reva.Address, - "appregistrysvc": cfg.Reva.Address, + "appregistrysvc": cfg.AppRegistryEndpoint, // user metadata is located on the users services "preferencessvc": cfg.UsersEndpoint, "userprovidersvc": cfg.UsersEndpoint, @@ -69,14 +68,6 @@ func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]i }, }, }, - "appregistry": map[string]interface{}{ - "driver": "static", - "drivers": map[string]interface{}{ - "static": map[string]interface{}{ - "mime_types": mimetypes(cfg, logger), - }, - }, - }, "storageregistry": map[string]interface{}{ "driver": cfg.StorageRegistry.Driver, "drivers": map[string]interface{}{ @@ -168,115 +159,3 @@ func spacesProviders(cfg *config.Config, logger log.Logger) map[string]map[strin // medatada storage not part of the global namespace } } - -func mimetypes(cfg *config.Config, logger log.Logger) []map[string]interface{} { - - type mimeTypeConfig struct { - MimeType string `json:"mime_type" mapstructure:"mime_type"` - Extension string `json:"extension" mapstructure:"extension"` - Name string `json:"name" mapstructure:"name"` - Description string `json:"description" mapstructure:"description"` - Icon string `json:"icon" mapstructure:"icon"` - DefaultApp string `json:"default_app" mapstructure:"default_app"` - AllowCreation bool `json:"allow_creation" mapstructure:"allow_creation"` - } - var mimetypes []mimeTypeConfig - var m []map[string]interface{} - - // load default app mimetypes from a json file - if cfg.AppRegistry.MimetypesJSON != "" { - data, err := ioutil.ReadFile(cfg.AppRegistry.MimetypesJSON) - if err != nil { - logger.Error().Err(err).Msg("Failed to read app registry mimetypes from JSON file: " + cfg.AppRegistry.MimetypesJSON) - return nil - } - if err = json.Unmarshal(data, &mimetypes); err != nil { - logger.Error().Err(err).Msg("Failed to unmarshal storage registry rules") - return nil - } - if err := mapstructure.Decode(mimetypes, &m); err != nil { - logger.Error().Err(err).Msg("Failed to decode defaultapp registry mimetypes to mapstructure") - return nil - } - return m - } - - logger.Info().Msg("No app registry mimetypes JSON file provided, loading default configuration") - - mimetypes = []mimeTypeConfig{ - { - MimeType: "application/pdf", - Extension: "pdf", - Name: "PDF", - Description: "PDF document", - }, - { - MimeType: "application/vnd.oasis.opendocument.text", - Extension: "odt", - Name: "OpenDocument", - Description: "OpenDocument text document", - AllowCreation: true, - }, - { - MimeType: "application/vnd.oasis.opendocument.spreadsheet", - Extension: "ods", - Name: "OpenSpreadsheet", - Description: "OpenDocument spreadsheet document", - AllowCreation: true, - }, - { - MimeType: "application/vnd.oasis.opendocument.presentation", - Extension: "odp", - Name: "OpenPresentation", - Description: "OpenDocument presentation document", - AllowCreation: true, - }, - { - MimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - Extension: "docx", - Name: "Microsoft Word", - Description: "Microsoft Word document", - AllowCreation: true, - }, - { - MimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - Extension: "xlsx", - Name: "Microsoft Excel", - Description: "Microsoft Excel document", - AllowCreation: true, - }, - { - MimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation", - Extension: "pptx", - Name: "Microsoft PowerPoint", - Description: "Microsoft PowerPoint document", - AllowCreation: true, - }, - { - MimeType: "application/vnd.jupyter", - Extension: "ipynb", - Name: "Jupyter Notebook", - Description: "Jupyter Notebook", - }, - { - MimeType: "text/markdown", - Extension: "md", - Name: "Markdown file", - Description: "Markdown file", - AllowCreation: true, - }, - { - MimeType: "application/compressed-markdown", - Extension: "zmd", - Name: "Compressed markdown file", - Description: "Compressed markdown file", - }, - } - - if err := mapstructure.Decode(mimetypes, &m); err != nil { - logger.Error().Err(err).Msg("Failed to decode defaultapp registry mimetypes to mapstructure") - return nil - } - return m - -} From ecb3d4bc84f6ea932372ff0fa0dbaf3482879dc8 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 12:44:03 +0200 Subject: [PATCH 15/50] fix app registry default config --- extensions/app-registry/pkg/config/defaults/defaultconfig.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/extensions/app-registry/pkg/config/defaults/defaultconfig.go b/extensions/app-registry/pkg/config/defaults/defaultconfig.go index de2f4e137c..8e24bab744 100644 --- a/extensions/app-registry/pkg/config/defaults/defaultconfig.go +++ b/extensions/app-registry/pkg/config/defaults/defaultconfig.go @@ -148,9 +148,6 @@ func EnsureDefaults(cfg *config.Config) { cfg.TokenManager = &config.TokenManager{} } - if cfg.TransferSecret == "" && cfg.Commons != nil && cfg.Commons.TransferSecret != "" { - cfg.TransferSecret = cfg.Commons.TransferSecret - } } func Sanitize(cfg *config.Config) { From 859ae544d56768e80877cfd77a4abc47ab285524 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 12:56:31 +0200 Subject: [PATCH 16/50] groups config docs --- extensions/auth-basic/pkg/config/config.go | 6 +- extensions/group/pkg/config/config.go | 75 +++++++++---------- .../pkg/config/defaults/defaultconfig.go | 6 +- 3 files changed, 41 insertions(+), 46 deletions(-) diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index 03c747db7b..92a1b496c9 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -57,9 +57,9 @@ type GRPCConfig struct { } type AuthProviders struct { - JSON JSONProvider `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs LDAP LDAPProvider `yaml:"ldap"` OwnCloudSQL OwnCloudSQLProvider `yaml:"owncloud_sql"` + JSON JSONProvider `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs } type JSONProvider struct { @@ -81,7 +81,7 @@ type LDAPProvider struct { UserObjectClass string `yaml:"user_object_filter" env:"LDAP_USER_OBJECTCLASS;AUTH_BASIC_LDAP_USER_OBJECTCLASS"` GroupObjectClass string `yaml:"group_object_class" env:"LDAP_GROUP_OBJECTCLASS;AUTH_BASIC_LDAP_GROUP_OBJECTCLASS"` LoginAttributes []string `yaml:"login_attributes" env:"LDAP_LOGIN_ATTRIBUTES;AUTH_BASIC_LDAP_LOGIN_ATTRIBUTES"` - IDP string `yaml:"idp" env:"OCIS_URL;AUTH_BASIC_IDP_URL"` // TODO what is this for? + IDP string `yaml:"idp" env:"OCIS_URL;AUTH_BASIC_IDP_URL"` UserSchema LDAPUserSchema `yaml:"user_schema"` GroupSchema LDAPGroupSchema `yaml:"group_schema"` } @@ -109,7 +109,7 @@ type OwnCloudSQLProvider struct { DBHost string `yaml:"db_host" env:"AUTH_BASIC_OWNCLOUDSQL_DB_HOST"` DBPort int `yaml:"db_port" env:"AUTH_BASIC_OWNCLOUDSQL_DB_PORT"` DBName string `yaml:"db_name" env:"AUTH_BASIC_OWNCLOUDSQL_DB_NAME"` - IDP string `yaml:"idp" env:"AUTH_BASIC_OWNCLOUDSQL_IDP"` // TODO do we need this? + IDP string `yaml:"idp" env:"AUTH_BASIC_OWNCLOUDSQL_IDP"` Nobody int64 `yaml:"nobody" env:"AUTH_BASIC_OWNCLOUDSQL_NOBODY"` // TODO what is this? JoinUsername bool `yaml:"join_username" env:"AUTH_BASIC_OWNCLOUDSQL_JOIN_USERNAME"` JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid" env:"AUTH_BASIC_OWNCLOUDSQL_JOIN_OWNCLOUD_UUID"` diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index 22cd62c980..70857f2e38 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -59,51 +59,46 @@ type GRPCConfig struct { } type Drivers struct { - JSON JSONDriver // not supported by the oCIS product, therefore not part of docs - LDAP LDAPDriver - OwnCloudSQL OwnCloudSQLDriver - REST RESTProvider // not supported by the oCIS product, therefore not part of docs -} - -type JSONDriver struct { - File string + LDAP LDAPDriver `yaml:"ldap"` + OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` + JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs + REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs } type LDAPDriver struct { - URI string `env:"LDAP_URI;GROUPS_LDAP_URI"` - CACert string `env:"LDAP_CACERT;GROUPS_LDAP_CACERT"` - Insecure bool `env:"LDAP_INSECURE;GROUPS_LDAP_INSECURE"` - BindDN string `env:"LDAP_BIND_DN;GROUPS_LDAP_BIND_DN"` - BindPassword string `yaml:"bind_password" env:"LDAP_BIND_PASSWORD;GROUPS_LDAP_BIND_PASSWORD"` - UserBaseDN string `env:"LDAP_USER_BASE_DN;GROUPS_LDAP_USER_BASE_DN"` - GroupBaseDN string `env:"LDAP_GROUP_BASE_DN;GROUPS_LDAP_GROUP_BASE_DN"` - UserScope string `env:"LDAP_USER_SCOPE;GROUPS_LDAP_USER_SCOPE"` - GroupScope string `env:"LDAP_GROUP_SCOPE;GROUPS_LDAP_GROUP_SCOPE"` - UserFilter string `env:"LDAP_USERFILTER;GROUPS_LDAP_USERFILTER"` - GroupFilter string `env:"LDAP_GROUPFILTER;GROUPS_LDAP_USERFILTER"` - UserObjectClass string `env:"LDAP_USER_OBJECTCLASS;GROUPS_LDAP_USER_OBJECTCLASS"` - GroupObjectClass string `env:"LDAP_GROUP_OBJECTCLASS;GROUPS_LDAP_GROUP_OBJECTCLASS"` - LoginAttributes []string `env:"LDAP_LOGIN_ATTRIBUTES;GROUPS_LDAP_LOGIN_ATTRIBUTES"` - IDP string `env:"OCIS_URL;GROUPS_IDP_URL"` // TODO what is this for? - GatewayEndpoint string // TODO do we need this here? - UserSchema LDAPUserSchema - GroupSchema LDAPGroupSchema + URI string `yaml:"uri" env:"LDAP_URI;GROUPS_LDAP_URI"` + CACert string `yaml:"ca_cert" env:"LDAP_CACERT;GROUPS_LDAP_CACERT"` + Insecure bool `yaml:"insecure" env:"LDAP_INSECURE;GROUPS_LDAP_INSECURE"` + BindDN string `yaml:"bind_dn" env:"LDAP_BIND_DN;GROUPS_LDAP_BIND_DN"` + BindPassword string `yaml:"bind_password" env:"LDAP_BIND_PASSWORD;GROUPS_LDAP_BIND_PASSWORD"` + UserBaseDN string `yaml:"user_base_dn" env:"LDAP_USER_BASE_DN;GROUPS_LDAP_USER_BASE_DN"` + GroupBaseDN string `yaml:"group_base_dn" env:"LDAP_GROUP_BASE_DN;GROUPS_LDAP_GROUP_BASE_DN"` + UserScope string `yaml:"user_scope" env:"LDAP_USER_SCOPE;GROUPS_LDAP_USER_SCOPE"` + GroupScope string `yaml:"group_scope" env:"LDAP_GROUP_SCOPE;GROUPS_LDAP_GROUP_SCOPE"` + UserFilter string `yaml:"user_filter" env:"LDAP_USERFILTER;GROUPS_LDAP_USERFILTER"` + GroupFilter string `yaml:"group_filter" env:"LDAP_GROUPFILTER;GROUPS_LDAP_USERFILTER"` + UserObjectClass string `yaml:"user_object_class" env:"LDAP_USER_OBJECTCLASS;GROUPS_LDAP_USER_OBJECTCLASS"` + GroupObjectClass string `yaml:"group_object_class" env:"LDAP_GROUP_OBJECTCLASS;GROUPS_LDAP_GROUP_OBJECTCLASS"` + LoginAttributes []string `yaml:"login_attributes" env:"LDAP_LOGIN_ATTRIBUTES;GROUPS_LDAP_LOGIN_ATTRIBUTES"` + IDP string `yaml:"idp" env:"OCIS_URL;GROUPS_IDP_URL"` + UserSchema LDAPUserSchema `yaml:"user_schema"` + GroupSchema LDAPGroupSchema `yaml:"group_schema"` } type LDAPUserSchema struct { - ID string `env:"LDAP_USER_SCHEMA_ID;GROUPS_LDAP_USER_SCHEMA_ID"` - IDIsOctetString bool `env:"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING;GROUPS_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"` - Mail string `env:"LDAP_USER_SCHEMA_MAIL;GROUPS_LDAP_USER_SCHEMA_MAIL"` - DisplayName string `env:"LDAP_USER_SCHEMA_DISPLAYNAME;GROUPS_LDAP_USER_SCHEMA_DISPLAYNAME"` - Username string `env:"LDAP_USER_SCHEMA_USERNAME;GROUPS_LDAP_USER_SCHEMA_USERNAME"` + ID string `yaml:"id" env:"LDAP_USER_SCHEMA_ID;GROUPS_LDAP_USER_SCHEMA_ID"` + IDIsOctetString bool `yaml:"id_is_octet_string" env:"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING;GROUPS_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"` + Mail string `yaml:"mail" env:"LDAP_USER_SCHEMA_MAIL;GROUPS_LDAP_USER_SCHEMA_MAIL"` + DisplayName string `yaml:"display_name" env:"LDAP_USER_SCHEMA_DISPLAYNAME;GROUPS_LDAP_USER_SCHEMA_DISPLAYNAME"` + Username string `yaml:"user_name" env:"LDAP_USER_SCHEMA_USERNAME;GROUPS_LDAP_USER_SCHEMA_USERNAME"` } type LDAPGroupSchema struct { - ID string `env:"LDAP_GROUP_SCHEMA_ID;GROUPS_LDAP_GROUP_SCHEMA_ID"` - IDIsOctetString bool `env:"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING;GROUPS_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"` - Mail string `env:"LDAP_GROUP_SCHEMA_MAIL;GROUPS_LDAP_GROUP_SCHEMA_MAIL"` - DisplayName string `env:"LDAP_GROUP_SCHEMA_DISPLAYNAME;GROUPS_LDAP_GROUP_SCHEMA_DISPLAYNAME"` - Groupname string `env:"LDAP_GROUP_SCHEMA_GROUPNAME;GROUPS_LDAP_GROUP_SCHEMA_GROUPNAME"` - Member string `env:"LDAP_GROUP_SCHEMA_MEMBER;GROUPS_LDAP_GROUP_SCHEMA_MEMBER"` + ID string `yaml:"id" env:"LDAP_GROUP_SCHEMA_ID;GROUPS_LDAP_GROUP_SCHEMA_ID"` + IDIsOctetString bool `yaml:"id_is_octet_string" env:"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING;GROUPS_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"` + Mail string `yaml:"mail" env:"LDAP_GROUP_SCHEMA_MAIL;GROUPS_LDAP_GROUP_SCHEMA_MAIL"` + DisplayName string `yaml:"display_name" env:"LDAP_GROUP_SCHEMA_DISPLAYNAME;GROUPS_LDAP_GROUP_SCHEMA_DISPLAYNAME"` + Groupname string `yaml:"group_name" env:"LDAP_GROUP_SCHEMA_GROUPNAME;GROUPS_LDAP_GROUP_SCHEMA_GROUPNAME"` + Member string `yaml:"member" env:"LDAP_GROUP_SCHEMA_MEMBER;GROUPS_LDAP_GROUP_SCHEMA_MEMBER"` } type OwnCloudSQLDriver struct { @@ -112,13 +107,17 @@ type OwnCloudSQLDriver struct { DBHost string `yaml:"db_host" env:"GROUPS_OWNCLOUDSQL_DB_HOST"` DBPort int `yaml:"db_port" env:"GROUPS_OWNCLOUDSQL_DB_PORT"` DBName string `yaml:"db_name" env:"GROUPS_OWNCLOUDSQL_DB_NAME"` - IDP string `yaml:"idp" env:"GROUPS_OWNCLOUDSQL_IDP"` // TODO do we need this? + IDP string `yaml:"idp" env:"GROUPS_OWNCLOUDSQL_IDP"` Nobody int64 `yaml:"nobody" env:"GROUPS_OWNCLOUDSQL_NOBODY"` // TODO what is this? JoinUsername bool `yaml:"join_username" env:"GROUPS_OWNCLOUDSQL_JOIN_USERNAME"` JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid" env:"GROUPS_OWNCLOUDSQL_JOIN_OWNCLOUD_UUID"` EnableMedialSearch bool `yaml:"enable_medial_search" env:"GROUPS_OWNCLOUDSQL_ENABLE_MEDIAL_SEARCH"` } +type JSONDriver struct { + File string +} + type RESTProvider struct { ClientID string ClientSecret string diff --git a/extensions/group/pkg/config/defaults/defaultconfig.go b/extensions/group/pkg/config/defaults/defaultconfig.go index 123b5e04d8..5743008290 100644 --- a/extensions/group/pkg/config/defaults/defaultconfig.go +++ b/extensions/group/pkg/config/defaults/defaultconfig.go @@ -65,10 +65,9 @@ func DefaultConfig() *config.Config { Member: "member", }, }, - JSON: config.JSONDriver{}, OwnCloudSQL: config.OwnCloudSQLDriver{ DBUsername: "owncloud", - DBPassword: "secret", + DBPassword: "", DBHost: "mysql", DBPort: 3306, DBName: "owncloud", @@ -78,9 +77,6 @@ func DefaultConfig() *config.Config { JoinOwnCloudUUID: false, EnableMedialSearch: false, }, - REST: config.RESTProvider{ - RedisAddr: "localhost:6379", - }, }, } } From c0c19dc36a7fd438a0731137675d721b08b7ebb5 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 12:59:48 +0200 Subject: [PATCH 17/50] fix app registry port --- extensions/gateway/pkg/config/defaults/defaultconfig.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/gateway/pkg/config/defaults/defaultconfig.go b/extensions/gateway/pkg/config/defaults/defaultconfig.go index e00cb37a92..3cc5b42116 100644 --- a/extensions/gateway/pkg/config/defaults/defaultconfig.go +++ b/extensions/gateway/pkg/config/defaults/defaultconfig.go @@ -41,7 +41,7 @@ func DefaultConfig() *config.Config { FrontendPublicURL: "https://localhost:9200", - AppRegistryEndpoint: "localhost:9222", + AppRegistryEndpoint: "localhost:9242", AuthBasicEndpoint: "localhost:9146", AuthBearerEndpoint: "localhost:9148", AuthMachineEndpoint: "localhost:9166", From dde2d4183121abd2903b1ff2d7b735ea79c2f4b5 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 13:04:44 +0200 Subject: [PATCH 18/50] ocdav config docs --- extensions/ocdav/pkg/config/config.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/ocdav/pkg/config/config.go b/extensions/ocdav/pkg/config/config.go index e68e1eb5aa..a9bfe08e13 100644 --- a/extensions/ocdav/pkg/config/config.go +++ b/extensions/ocdav/pkg/config/config.go @@ -20,16 +20,16 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"-"` - WebdavNamespace string `yaml:"webdav_namespace"` - FilesNamespace string `yaml:"files_namespace"` - SharesNamespace string `yaml:"shares_namespace"` + WebdavNamespace string `yaml:"webdav_namespace" env:"OCDVAV_WEBDAV_NAMESPACE"` + FilesNamespace string `yaml:"files_namespace" env:"OCDAV_FILES_NAMESPACE"` + SharesNamespace string `yaml:"shares_namespace" env:"OCDAV_SHARES_NAMESPACE"` // PublicURL used to redirect /s/{token} URLs to PublicURL string `yaml:"public_url" env:"OCIS_URL;OCDAV_PUBLIC_URL"` // Insecure certificates allowed when making requests to the gateway Insecure bool `yaml:"insecure" env:"OCIS_INSECURE;OCDAV_INSECURE"` // Timeout in seconds when making requests to the gateway - Timeout int64 `yaml:"timeout"` + Timeout int64 `yaml:"gateway_request_timeout" env:"OCDAV_GATEWAY_REQUEST_TIMEOUT"` Middleware Middleware `yaml:"middleware"` Context context.Context `yaml:"-"` @@ -63,7 +63,7 @@ type HTTPConfig struct { Addr string `yaml:"addr" env:"OCDAV_HTTP_ADDR" desc:"The address of the http service."` Namespace string `yaml:"-"` Protocol string `yaml:"protocol" env:"OCDAV_HTTP_PROTOCOL" desc:"The transport protocol of the http service."` - Prefix string `yaml:"prefix"` + Prefix string `yaml:"prefix" env:"OCDAV_HTTP_PREFIX"` } // Middleware configures reva middlewares. @@ -73,5 +73,5 @@ type Middleware struct { // Auth configures reva http auth middleware. type Auth struct { - CredentialsByUserAgent map[string]string `yaml:"credentials_by_user_agenr"` + CredentialsByUserAgent map[string]string `yaml:"credentials_by_user_agent"` } From c6af86c2a891c317324a0533111780ffcd368678 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 13:25:36 +0200 Subject: [PATCH 19/50] sharing config docs --- extensions/sharing/pkg/config/config.go | 78 +++++++++---------- .../pkg/config/defaults/defaultconfig.go | 24 +----- 2 files changed, 41 insertions(+), 61 deletions(-) diff --git a/extensions/sharing/pkg/config/config.go b/extensions/sharing/pkg/config/config.go index c3c0060f42..149b91f076 100644 --- a/extensions/sharing/pkg/config/config.go +++ b/extensions/sharing/pkg/config/config.go @@ -17,14 +17,14 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` + Events Events `yaml:"events"` SkipUserGroupsInToken bool `yaml:"-"` - UserSharingDriver string `yaml:"user_sharing_driver"` + UserSharingDriver string `yaml:"user_sharing_driver" env:"SHARING_USER_DRIVER"` UserSharingDrivers UserSharingDrivers `yaml:"user_sharin_drivers"` - PublicSharingDriver string `yaml:"public_sharing_driver"` + PublicSharingDriver string `yaml:"public_sharing_driver" env:"SHARING_PUBLIC_DRIVER"` PublicSharingDrivers PublicSharingDrivers `yaml:"public_sharing_drivers"` - Events Events `yaml:"events"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` @@ -61,64 +61,64 @@ type GRPCConfig struct { } type UserSharingDrivers struct { - JSON UserSharingJSONDriver - SQL UserSharingSQLDriver - CS3 UserSharingCS3Driver + JSON UserSharingJSONDriver `yaml:"json"` + CS3 UserSharingCS3Driver `yaml:"cs3"` + SQL UserSharingSQLDriver `yaml:"sql,omitempty"` // not supported by the oCIS product, therefore not part of docs } type UserSharingJSONDriver struct { - File string `env:"SHARING_USER_JSON_FILE"` + File string `yaml:"file" env:"SHARING_USER_JSON_FILE"` } type UserSharingSQLDriver struct { - DBUsername string `env:"SHARING_USER_SQL_USERNAME"` - DBPassword string `env:"SHARING_USER_SQL_PASSWORD"` - DBHost string `env:"SHARING_USER_SQL_HOST"` - DBPort int `env:"SHARING_USER_SQL_PORT"` - DBName string `env:"SHARING_USER_SQL_NAME"` - PasswordHashCost int - EnableExpiredSharesCleanup bool - JanitorRunInterval int - UserStorageMountID string + DBUsername string `yaml:"db_username"` + DBPassword string `yaml:"db_password"` + DBHost string `yaml:"db_host"` + DBPort int `yaml:"db_port"` + DBName string `yaml:"db_name"` + PasswordHashCost int `yaml:"password_hash_cost"` + EnableExpiredSharesCleanup bool `yaml:"enable_expired_shares_cleanup"` + JanitorRunInterval int `yaml:"janitor_run_interval"` + UserStorageMountID string `yaml:"user_storage_mount_id"` } type UserSharingCS3Driver struct { - ProviderAddr string - ServiceUserID string - ServiceUserIDP string `env:"OCIS_URL;SHARING_CS3_SERVICE_USER_IDP"` - MachineAuthAPIKey string `env:"OCIS_MACHINE_AUTH_API_KEY"` + ProviderAddr string `yaml:"provider_addr" env:"SHARING_USER_CS3_PROVIDER_ADDR"` + ServiceUserID string `yaml:"service_user_id" env:"SHARING_USER_CS3_SERVICE_USER_ID"` + ServiceUserIDP string `yaml:"service_user_idp" env:"OCIS_URL;SHARING_USER_CS3_SERVICE_USER_IDP"` + MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;SHARING_USER_CS3_MACHINE_AUTH_API_KEY"` } type PublicSharingDrivers struct { - JSON PublicSharingJSONDriver - SQL PublicSharingSQLDriver - CS3 PublicSharingCS3Driver + JSON PublicSharingJSONDriver `yaml:"json"` + CS3 PublicSharingCS3Driver `yaml:"cs3"` + SQL PublicSharingSQLDriver `yaml:"sql,omitempty"` // not supported by the oCIS product, therefore not part of docs } type PublicSharingJSONDriver struct { - File string + File string `yaml:"file" env:"SHARING_PUBLIC_JSON_FILE"` } type PublicSharingSQLDriver struct { - DBUsername string - DBPassword string - DBHost string - DBPort int - DBName string - PasswordHashCost int - EnableExpiredSharesCleanup bool - JanitorRunInterval int - UserStorageMountID string + DBUsername string `yaml:"db_username"` + DBPassword string `yaml:"db_password"` + DBHost string `yaml:"db_host"` + DBPort int `yaml:"db_port"` + DBName string `yaml:"db_name"` + PasswordHashCost int `yaml:"password_hash_cost"` + EnableExpiredSharesCleanup bool `yaml:"enable_expired_shares_cleanup"` + JanitorRunInterval int `yaml:"janitor_run_interval"` + UserStorageMountID string `yaml:"user_storage_mount_id"` } type PublicSharingCS3Driver struct { - ProviderAddr string - ServiceUserID string - ServiceUserIDP string - MachineAuthAPIKey string `env:"OCIS_MACHINE_AUTH_API_KEY"` + ProviderAddr string `yaml:"provider_addr" env:"SHARING_PUBLIC_CS3_PROVIDER_ADDR"` + ServiceUserID string `yaml:"service_user_id" env:"SHARING_PUBLIC_CS3_SERVICE_USER_ID"` + ServiceUserIDP string `yaml:"service_user_idp" env:"OCIS_URL;SHARING_PUBLIC_CS3_SERVICE_USER_IDP"` + MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;SHARING_PUBLIC_CS3_MACHINE_AUTH_API_KEY"` } type Events struct { - Addr string - ClusterID string + Addr string `yaml:"addr" env:"SHARING_EVENTS_ADDR"` + ClusterID string `yaml:"cluster_id" env:"SHARING_EVENTS_CLUSTER_ID"` } diff --git a/extensions/sharing/pkg/config/defaults/defaultconfig.go b/extensions/sharing/pkg/config/defaults/defaultconfig.go index 47f4f2e15a..0210afe326 100644 --- a/extensions/sharing/pkg/config/defaults/defaultconfig.go +++ b/extensions/sharing/pkg/config/defaults/defaultconfig.go @@ -33,41 +33,21 @@ func DefaultConfig() *config.Config { Reva: &config.Reva{ Address: "127.0.0.1:9142", }, - UserSharingDriver: "json", + UserSharingDriver: "cs3", UserSharingDrivers: config.UserSharingDrivers{ JSON: config.UserSharingJSONDriver{ File: filepath.Join(defaults.BaseDataPath(), "storage", "shares.json"), }, - SQL: config.UserSharingSQLDriver{ - DBUsername: "", - DBPassword: "", - DBHost: "", - DBPort: 1433, - DBName: "", - PasswordHashCost: 11, - EnableExpiredSharesCleanup: true, - JanitorRunInterval: 60, - }, CS3: config.UserSharingCS3Driver{ ProviderAddr: "127.0.0.1:9215", // metadata storage ServiceUserIDP: "internal", }, }, - PublicSharingDriver: "json", + PublicSharingDriver: "cs3", PublicSharingDrivers: config.PublicSharingDrivers{ JSON: config.PublicSharingJSONDriver{ File: filepath.Join(defaults.BaseDataPath(), "storage", "publicshares.json"), }, - SQL: config.PublicSharingSQLDriver{ - DBUsername: "", - DBPassword: "", - DBHost: "", - DBPort: 1433, - DBName: "", - PasswordHashCost: 11, - EnableExpiredSharesCleanup: true, - JanitorRunInterval: 60, - }, CS3: config.PublicSharingCS3Driver{ ProviderAddr: "127.0.0.1:9215", // metadata storage ServiceUserIDP: "internal", From f501814bef7298094a0bcda49a07489461e8efa2 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 14:28:24 +0200 Subject: [PATCH 20/50] storage-metadata config docs --- .../storage-metadata/pkg/config/config.go | 85 ++----------------- .../pkg/config/defaults/defaultconfig.go | 38 +-------- .../storage-metadata/pkg/config/metadata.go | 62 -------------- 3 files changed, 8 insertions(+), 177 deletions(-) diff --git a/extensions/storage-metadata/pkg/config/config.go b/extensions/storage-metadata/pkg/config/config.go index 9a327cd189..be9ebd5523 100644 --- a/extensions/storage-metadata/pkg/config/config.go +++ b/extensions/storage-metadata/pkg/config/config.go @@ -25,8 +25,8 @@ type Config struct { Driver string `yaml:"driver" env:"STORAGE_METADATA_DRIVER" desc:"The driver which should be used by the service"` Drivers Drivers `yaml:"drivers"` - DataServerURL string `yaml:"data_server_url"` - TempFolder string `yaml:"temp_folder"` + DataServerURL string `yaml:"data_server_url" env:"STORAGE_METADATA_DATA_SERVER_URL"` + TempFolder string `yaml:"temp_folder" env:"STORAGE_METADATA_TEMP_FOLDER"` DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_METADATA_DATAPROVIDER_INSECURE"` Supervised bool `yaml:"-"` @@ -70,85 +70,12 @@ type HTTPConfig struct { } type Drivers struct { - EOS EOSDriver - Local LocalDriver - OCIS OCISDriver - S3 S3Driver - S3NG S3NGDriver -} - -type EOSDriver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root"` - // ShadowNamespace for storing shadow data - ShadowNamespace string `yaml:"shadow_namespace"` - // UploadsNamespace for storing upload data - UploadsNamespace string `yaml:"uploads_namespace"` - // Location of the eos binary. - // Default is /usr/bin/eos. - EosBinary string `yaml:"eos_binary"` - // Location of the xrdcopy binary. - // Default is /usr/bin/xrdcopy. - XrdcopyBinary string `yaml:"xrd_copy_binary"` - // URL of the Master EOS MGM. - // Default is root://eos-example.org - MasterURL string `yaml:"master_url"` - // URL of the Slave EOS MGM. - // Default is root://eos-example.org - SlaveURL string `yaml:"slave_url"` - // Location on the local fs where to store reads. - // Defaults to os.TempDir() - CacheDirectory string `yaml:"cache_directory"` - // SecProtocol specifies the xrootd security protocol to use between the server and EOS. - SecProtocol string `yaml:"sec_protocol"` - // Keytab specifies the location of the keytab to use to authenticate to EOS. - Keytab string `yaml:"keytab"` - // SingleUsername is the username to use when SingleUserMode is enabled - SingleUsername string `yaml:"single_username"` - // Enables logging of the commands executed - // Defaults to false - EnableLogging bool `yaml:"enable_logging"` - // ShowHiddenSysFiles shows internal EOS files like - // .sys.v# and .sys.a# files. - ShowHiddenSysFiles bool `yaml:"shadow_hidden_files"` - // ForceSingleUserMode will force connections to EOS to use SingleUsername - ForceSingleUserMode bool `yaml:"force_single_user_mode"` - // UseKeyTabAuth changes will authenticate requests by using an EOS keytab. - UseKeytab bool `yaml:"user_keytab"` - // gateway service to use for uid lookups - GatewaySVC string `yaml:"gateway_svc"` - GRPCURI string - UserLayout string -} - -type LocalDriver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root"` + OCIS OCISDriver `yaml:"ocis"` } type OCISDriver struct { // Root is the absolute path to the location of the data - Root string `yaml:"root" env:"STORAGE_METADATA_DRIVER_OCIS_ROOT"` - UserLayout string - PermissionsEndpoint string -} - -type S3Driver struct { - Region string `yaml:"region"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` - Endpoint string `yaml:"endpoint"` - Bucket string `yaml:"bucket"` -} - -type S3NGDriver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root"` - UserLayout string - PermissionsEndpoint string - Region string `yaml:"region"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` - Endpoint string `yaml:"endpoint"` - Bucket string `yaml:"bucket"` + Root string `yaml:"root" env:"STORAGE_METADATA_OCIS_ROOT"` + UserLayout string `yaml:"-"` + PermissionsEndpoint string `yaml:"permissions_endpoint" env:"STORAGE_METADATA_OCIS_PERMISSIONS_ENDPOINT"` } diff --git a/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go b/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go index 715ad43932..f23c58077a 100644 --- a/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go @@ -1,7 +1,6 @@ package defaults import ( - "os" "path/filepath" "github.com/owncloud/ocis/extensions/storage-metadata/pkg/config" @@ -43,42 +42,9 @@ func DefaultConfig() *config.Config { DataServerURL: "http://localhost:9216/data", Driver: "ocis", Drivers: config.Drivers{ - EOS: config.EOSDriver{ - Root: "/eos/dockertest/reva", - UserLayout: "{{substr 0 1 .Username}}/{{.Username}}", - ShadowNamespace: "", - UploadsNamespace: "", - EosBinary: "/usr/bin/eos", - XrdcopyBinary: "/usr/bin/xrdcopy", - MasterURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - GRPCURI: "", - SlaveURL: "root://eos-mgm1.eoscluster.cern.ch:1094", - CacheDirectory: os.TempDir(), - EnableLogging: false, - ShowHiddenSysFiles: false, - ForceSingleUserMode: false, - UseKeytab: false, - SecProtocol: "", - Keytab: "", - SingleUsername: "", - GatewaySVC: "127.0.0.1:9215", - }, - Local: config.LocalDriver{ - Root: filepath.Join(defaults.BaseDataPath(), "storage", "local", "metadata"), - }, - S3: config.S3Driver{ - Region: "default", - }, - S3NG: config.S3NGDriver{ - Root: filepath.Join(defaults.BaseDataPath(), "storage", "metadata"), - UserLayout: "{{.Id.OpaqueId}}", - Region: "default", - PermissionsEndpoint: "127.0.0.1:9215", - }, OCIS: config.OCISDriver{ - Root: filepath.Join(defaults.BaseDataPath(), "storage", "metadata"), - UserLayout: "{{.Id.OpaqueId}}", - PermissionsEndpoint: "127.0.0.1:9215", + Root: filepath.Join(defaults.BaseDataPath(), "storage", "metadata"), + UserLayout: "{{.Id.OpaqueId}}", }, }, } diff --git a/extensions/storage-metadata/pkg/config/metadata.go b/extensions/storage-metadata/pkg/config/metadata.go index e580882378..0eb10b48fd 100644 --- a/extensions/storage-metadata/pkg/config/metadata.go +++ b/extensions/storage-metadata/pkg/config/metadata.go @@ -2,48 +2,6 @@ package config func MetadataDrivers(cfg *Config) map[string]interface{} { return map[string]interface{}{ - "eos": map[string]interface{}{ - "namespace": cfg.Drivers.EOS.Root, - "shadow_namespace": cfg.Drivers.EOS.ShadowNamespace, - "uploads_namespace": cfg.Drivers.EOS.UploadsNamespace, - "eos_binary": cfg.Drivers.EOS.EosBinary, - "xrdcopy_binary": cfg.Drivers.EOS.XrdcopyBinary, - "master_url": cfg.Drivers.EOS.MasterURL, - "slave_url": cfg.Drivers.EOS.SlaveURL, - "cache_directory": cfg.Drivers.EOS.CacheDirectory, - "sec_protocol": cfg.Drivers.EOS.SecProtocol, - "keytab": cfg.Drivers.EOS.Keytab, - "single_username": cfg.Drivers.EOS.SingleUsername, - "enable_logging": cfg.Drivers.EOS.EnableLogging, - "show_hidden_sys_files": cfg.Drivers.EOS.ShowHiddenSysFiles, - "force_single_user_mode": cfg.Drivers.EOS.ForceSingleUserMode, - "use_keytab": cfg.Drivers.EOS.UseKeytab, - "gatewaysvc": cfg.Drivers.EOS.GatewaySVC, - "enable_home": false, - }, - "eosgrpc": map[string]interface{}{ - "namespace": cfg.Drivers.EOS.Root, - "shadow_namespace": cfg.Drivers.EOS.ShadowNamespace, - "eos_binary": cfg.Drivers.EOS.EosBinary, - "xrdcopy_binary": cfg.Drivers.EOS.XrdcopyBinary, - "master_url": cfg.Drivers.EOS.MasterURL, - "master_grpc_uri": cfg.Drivers.EOS.GRPCURI, - "slave_url": cfg.Drivers.EOS.SlaveURL, - "cache_directory": cfg.Drivers.EOS.CacheDirectory, - "sec_protocol": cfg.Drivers.EOS.SecProtocol, - "keytab": cfg.Drivers.EOS.Keytab, - "single_username": cfg.Drivers.EOS.SingleUsername, - "user_layout": cfg.Drivers.EOS.UserLayout, - "enable_logging": cfg.Drivers.EOS.EnableLogging, - "show_hidden_sys_files": cfg.Drivers.EOS.ShowHiddenSysFiles, - "force_single_user_mode": cfg.Drivers.EOS.ForceSingleUserMode, - "use_keytab": cfg.Drivers.EOS.UseKeytab, - "enable_home": false, - "gatewaysvc": cfg.Drivers.EOS.GatewaySVC, - }, - "local": map[string]interface{}{ - "root": cfg.Drivers.Local.Root, - }, "ocis": map[string]interface{}{ "root": cfg.Drivers.OCIS.Root, "user_layout": cfg.Drivers.OCIS.UserLayout, @@ -51,25 +9,5 @@ func MetadataDrivers(cfg *Config) map[string]interface{} { "treesize_accounting": false, "permissionssvc": cfg.Drivers.OCIS.PermissionsEndpoint, }, - "s3": map[string]interface{}{ - "region": cfg.Drivers.S3.Region, - "access_key": cfg.Drivers.S3.AccessKey, - "secret_key": cfg.Drivers.S3.SecretKey, - "endpoint": cfg.Drivers.S3.Endpoint, - "bucket": cfg.Drivers.S3.Bucket, - }, - "s3ng": map[string]interface{}{ - "root": cfg.Drivers.S3NG.Root, - "enable_home": false, - "user_layout": cfg.Drivers.S3NG.UserLayout, - "treetime_accounting": false, - "treesize_accounting": false, - "permissionssvc": cfg.Drivers.S3NG.PermissionsEndpoint, - "s3.region": cfg.Drivers.S3NG.Region, - "s3.access_key": cfg.Drivers.S3NG.AccessKey, - "s3.secret_key": cfg.Drivers.S3NG.SecretKey, - "s3.endpoint": cfg.Drivers.S3NG.Endpoint, - "s3.bucket": cfg.Drivers.S3NG.Bucket, - }, } } From d2edd6e98e749ead2a7c6163842b97cd78dc6008 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 14:34:15 +0200 Subject: [PATCH 21/50] storage-publiclink config docs --- extensions/storage-publiclink/pkg/config/config.go | 8 +------- extensions/storage-publiclink/pkg/revaconfig/config.go | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/extensions/storage-publiclink/pkg/config/config.go b/extensions/storage-publiclink/pkg/config/config.go index 9dc63e4bfd..08db7ac06c 100644 --- a/extensions/storage-publiclink/pkg/config/config.go +++ b/extensions/storage-publiclink/pkg/config/config.go @@ -20,7 +20,6 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"-"` - AuthProvider AuthProvider `yaml:"auth_provider"` StorageProvider StorageProvider `yaml:"storage_provider"` Supervised bool `yaml:"-"` @@ -57,11 +56,6 @@ type GRPCConfig struct { Protocol string `yaml:"protocol" env:"STORAGE_PUBLICLINK_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` } -type AuthProvider struct { - GatewayEndpoint string -} - type StorageProvider struct { - MountID string - GatewayEndpoint string + MountID string `yaml:"mount_id" env:"STORAGE_PUBLICLINK_STORAGE_PROVIDER_MOUNT_ID"` } diff --git a/extensions/storage-publiclink/pkg/revaconfig/config.go b/extensions/storage-publiclink/pkg/revaconfig/config.go index fcab22c09d..9d1ac314f8 100644 --- a/extensions/storage-publiclink/pkg/revaconfig/config.go +++ b/extensions/storage-publiclink/pkg/revaconfig/config.go @@ -27,13 +27,13 @@ func StoragePublicLinkConfigFromStruct(cfg *config.Config) map[string]interface{ "services": map[string]interface{}{ "publicstorageprovider": map[string]interface{}{ "mount_id": cfg.StorageProvider.MountID, - "gateway_addr": cfg.StorageProvider.GatewayEndpoint, + "gateway_addr": cfg.Reva.Address, }, "authprovider": map[string]interface{}{ "auth_manager": "publicshares", "auth_managers": map[string]interface{}{ "publicshares": map[string]interface{}{ - "gateway_addr": cfg.AuthProvider.GatewayEndpoint, + "gateway_addr": cfg.Reva.Address, }, }, }, From b3c8ee3d3067c5e07fbeaed6976d0b4a8876d0df Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 14:36:18 +0200 Subject: [PATCH 22/50] storage sahres config docs --- extensions/storage-shares/pkg/config/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/storage-shares/pkg/config/config.go b/extensions/storage-shares/pkg/config/config.go index b3c9f908a2..5d6cc84234 100644 --- a/extensions/storage-shares/pkg/config/config.go +++ b/extensions/storage-shares/pkg/config/config.go @@ -20,8 +20,8 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"-"` - ReadOnly bool `yaml:"readonly"` - SharesProviderEndpoint string `yaml:"shares_provider_endpoint"` + ReadOnly bool `yaml:"readonly" env:"STORAGE_SHARES_READ_ONLY"` + SharesProviderEndpoint string `yaml:"user_share_provider_endpoint" env:"STORAGE_SHARES_USER_SHARE_PROVIDER_ENDPOINT"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` From fd44da4629e25fe86890fb35cf91f36f5d430d6d Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 14:55:07 +0200 Subject: [PATCH 23/50] storage-users config docs --- extensions/audit/pkg/config/config.go | 6 +- extensions/graph/pkg/config/config.go | 4 +- extensions/notifications/pkg/config/config.go | 6 +- extensions/search/pkg/config/config.go | 6 +- extensions/sharing/pkg/config/config.go | 4 +- extensions/storage-users/pkg/config/config.go | 155 +++++++++--------- 6 files changed, 90 insertions(+), 91 deletions(-) diff --git a/extensions/audit/pkg/config/config.go b/extensions/audit/pkg/config/config.go index b14a78a752..6d21112898 100644 --- a/extensions/audit/pkg/config/config.go +++ b/extensions/audit/pkg/config/config.go @@ -23,9 +23,9 @@ type Config struct { // Events combines the configuration options for the event bus. type Events struct { - Endpoint string `yaml:"events_endpoint" env:"AUDIT_EVENTS_ENDPOINT" desc:"the address of the streaming service"` - Cluster string `yaml:"events_cluster" env:"AUDIT_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` - ConsumerGroup string `yaml:"events_group" env:"AUDIT_EVENTS_GROUP" desc:"the customergroup of the service. One group will only get one vopy of an event"` + Endpoint string `yaml:"endpoint" env:"AUDIT_EVENTS_ENDPOINT" desc:"the address of the streaming service"` + Cluster string `yaml:"cluster" env:"AUDIT_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` + ConsumerGroup string `yaml:"group" env:"AUDIT_EVENTS_GROUP" desc:"the customergroup of the service. One group will only get one copy of an event"` } // Auditlog holds audit log information diff --git a/extensions/graph/pkg/config/config.go b/extensions/graph/pkg/config/config.go index d147eaa30c..c109a402c7 100644 --- a/extensions/graph/pkg/config/config.go +++ b/extensions/graph/pkg/config/config.go @@ -68,6 +68,6 @@ type Identity struct { // Events combines the configuration options for the event bus. type Events struct { - Endpoint string `yaml:"events_endpoint" env:"GRAPH_EVENTS_ENDPOINT" desc:"the address of the streaming service"` - Cluster string `yaml:"events_cluster" env:"GRAPH_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` + Endpoint string `yaml:"endpoint" env:"GRAPH_EVENTS_ENDPOINT" desc:"the address of the streaming service"` + Cluster string `yaml:"cluster" env:"GRAPH_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` } diff --git a/extensions/notifications/pkg/config/config.go b/extensions/notifications/pkg/config/config.go index 36ff2e6c8c..dc49e46cc8 100644 --- a/extensions/notifications/pkg/config/config.go +++ b/extensions/notifications/pkg/config/config.go @@ -39,7 +39,7 @@ type SMTP struct { // Events combines the configuration options for the event bus. type Events struct { - Endpoint string `yaml:"events_endpoint" env:"NOTIFICATIONS_EVENTS_ENDPOINT"` - Cluster string `yaml:"events_cluster" env:"NOTIFICATIONS_EVENTS_CLUSTER"` - ConsumerGroup string `yaml:"events_group" env:"NOTIFICATIONS_EVENTS_GROUP"` + Endpoint string `yaml:"endpoint" env:"NOTIFICATIONS_EVENTS_ENDPOINT"` + Cluster string `yaml:"cluster" env:"NOTIFICATIONS_EVENTS_CLUSTER"` + ConsumerGroup string `yaml:"group" env:"NOTIFICATIONS_EVENTS_GROUP"` } diff --git a/extensions/search/pkg/config/config.go b/extensions/search/pkg/config/config.go index 7c7ac33ff6..b1396872ee 100644 --- a/extensions/search/pkg/config/config.go +++ b/extensions/search/pkg/config/config.go @@ -29,7 +29,7 @@ type Config struct { // Events combines the configuration options for the event bus. type Events struct { - Endpoint string `yaml:"events_endpoint" env:"SEARCH_EVENTS_ENDPOINT" desc:"the address of the streaming service"` - Cluster string `yaml:"events_cluster" env:"SEARCH_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` - ConsumerGroup string `yaml:"events_group" env:"SEARCH_EVENTS_GROUP" desc:"the customergroup of the service. One group will only get one copy of an event"` + Endpoint string `yaml:"endpoint" env:"SEARCH_EVENTS_ENDPOINT" desc:"the address of the streaming service"` + Cluster string `yaml:"cluster" env:"SEARCH_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` + ConsumerGroup string `yaml:"group" env:"SEARCH_EVENTS_GROUP" desc:"the customergroup of the service. One group will only get one copy of an event"` } diff --git a/extensions/sharing/pkg/config/config.go b/extensions/sharing/pkg/config/config.go index 149b91f076..430354daa3 100644 --- a/extensions/sharing/pkg/config/config.go +++ b/extensions/sharing/pkg/config/config.go @@ -119,6 +119,6 @@ type PublicSharingCS3Driver struct { } type Events struct { - Addr string `yaml:"addr" env:"SHARING_EVENTS_ADDR"` - ClusterID string `yaml:"cluster_id" env:"SHARING_EVENTS_CLUSTER_ID"` + Addr string `yaml:"endpoint" env:"SHARING_EVENTS_ENDPOINT" desc:"the address of the streaming service"` + ClusterID string `yaml:"cluster" env:"SHARING_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` } diff --git a/extensions/storage-users/pkg/config/config.go b/extensions/storage-users/pkg/config/config.go index 4b4c6dc30a..7dd56e44e8 100644 --- a/extensions/storage-users/pkg/config/config.go +++ b/extensions/storage-users/pkg/config/config.go @@ -23,13 +23,13 @@ type Config struct { Driver string `yaml:"driver" env:"STORAGE_USERS_DRIVER" desc:"The storage driver which should be used by the service"` Drivers Drivers `yaml:"drivers"` - DataServerURL string `yaml:"data_server_url"` - TempFolder string `yaml:"temp_folder"` + DataServerURL string `yaml:"data_server_url" env:"STORAGE_USERS_DATA_SERVER_URL"` + TempFolder string `yaml:"temp_folder" env:"STORAGE_USERS_TEMP_FOLDER"` DataProviderInsecure bool `yaml:"data_provider_insecure" env:"OCIS_INSECURE;STORAGE_USERS_DATAPROVIDER_INSECURE"` Events Events `yaml:"events"` - MountID string `yaml:"mount_id"` - ExposeDataServer bool `yaml:"expose_data_server"` - ReadOnly bool `yaml:"readonly"` + MountID string `yaml:"mount_id" env:"STORAGE_USERS_MOUNT_ID"` + ExposeDataServer bool `yaml:"expose_data_server" env:"STORAGE_USERS_EXPOSE_DATA_SERVER"` + ReadOnly bool `yaml:"readonly" env:"STORAGE_USERS_READ_ONLY"` Supervised bool `yaml:"-"` Context context.Context `yaml:"-"` @@ -73,14 +73,78 @@ type HTTPConfig struct { } type Drivers struct { - EOS EOSDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs - Local LocalDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs - OCIS OCISDriver - S3 S3Driver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs - S3NG S3NGDriver - OwnCloudSQL OwnCloudSQLDriver + OCIS OCISDriver `yaml:"ocis"` + S3NG S3NGDriver `yaml:"s3ng"` + OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` + + S3 S3Driver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs + EOS EOSDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs + Local LocalDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs } +type OCISDriver struct { + // Root is the absolute path to the location of the data + Root string `yaml:"root" env:"STORAGE_USERS_OCIS_ROOT"` + UserLayout string `yaml:"user_layout" env:"STORAGE_USERS_OCIS_USER_LAYOUT"` + PermissionsEndpoint string `yaml:"permissions_endpoint" env:"STORAGE_USERS_OCIS_PERMISSIONS_ENDPOINT"` + // PersonalSpaceAliasTemplate contains the template used to construct + // the personal space alias, eg: `"{{.SpaceType}}/{{.User.Username | lower}}"` + PersonalSpaceAliasTemplate string `yaml:"personalspacealias_template" env:"STORAGE_USERS_OCIS_PERSONAL_SPACE_ALIAS_TEMPLATE"` + // GeneralSpaceAliasTemplate contains the template used to construct + // the general space alias, eg: `{{.SpaceType}}/{{.SpaceName | replace " " "-" | lower}}` + GeneralSpaceAliasTemplate string `yaml:"generalspacealias_template" env:"STORAGE_USERS_OCIS_GENERAL_SPACE_ALIAS_TEMPLATE"` + //ShareFolder defines the name of the folder jailing all shares + ShareFolder string `yaml:"share_folder" env:"STORAGE_USERS_OCIS_SHARE_FOLDER"` +} + +type S3NGDriver struct { + // Root is the absolute path to the location of the data + Root string `yaml:"root" env:"STORAGE_USERS_S3NG_ROOT"` + UserLayout string `yaml:"user_layout" env:"STORAGE_USERS_S3NG_USER_LAYOUT"` + PermissionsEndpoint string `yaml:"permissions_endpoint" env:"STORAGE_USERS_PERMISSION_ENDPOINT;STORAGE_USERS_S3NG_USERS_PROVIDER_ENDPOINT"` + Region string `yaml:"region" env:"STORAGE_USERS_S3NG_REGION"` + AccessKey string `yaml:"access_key" env:"STORAGE_USERS_S3NG_ACCESS_KEY"` + SecretKey string `yaml:"secret_key" env:"STORAGE_USERS_S3NG_SECRET_KEY"` + Endpoint string `yaml:"endpoint" env:"STORAGE_USERS_S3NG_ENDPOINT"` + Bucket string `yaml:"bucket" env:"STORAGE_USERS_S3NG_BUCKET"` + // PersonalSpaceAliasTemplate contains the template used to construct + // the personal space alias, eg: `"{{.SpaceType}}/{{.User.Username | lower}}"` + PersonalSpaceAliasTemplate string `yaml:"personalspacealias_template" env:"STORAGE_USERS_S3NG_PERSONAL_SPACE_ALIAS_TEMPLATE"` + // GeneralSpaceAliasTemplate contains the template used to construct + // the general space alias, eg: `{{.SpaceType}}/{{.SpaceName | replace " " "-" | lower}}` + GeneralSpaceAliasTemplate string `yaml:"generalspacealias_template" env:"STORAGE_USERS_S3NG_GENERAL_SPACE_ALIAS_TEMPLATE"` + //ShareFolder defines the name of the folder jailing all shares + ShareFolder string `yaml:"share_folder" env:"STORAGE_USERS_S3NG_SHARE_FOLDER"` +} + +type OwnCloudSQLDriver struct { + // Root is the absolute path to the location of the data + Root string `yaml:"root" env:"STORAGE_USERS_OWNCLOUDSQL_DATADIR"` + //ShareFolder defines the name of the folder jailing all shares + ShareFolder string `yaml:"share_folder" env:"STORAGE_USERS_OWNCLOUDSQL_SHARE_FOLDER"` + UserLayout string `env:"STORAGE_USERS_OWNCLOUDSQL_LAYOUT"` + UploadInfoDir string `yaml:"upload_info_dir" env:"STORAGE_USERS_UPLOADINFO_DIR"` + DBUsername string `yaml:"db_username" env:"STORAGE_USERS_OWNCLOUDSQL_DB_USERNAME"` + DBPassword string `yaml:"db_password" env:"STORAGE_USERS_OWNCLOUDSQL_DB_PASSWORD"` + DBHost string `yaml:"db_host" env:"STORAGE_USERS_OWNCLOUDSQL_DB_HOST"` + DBPort int `yaml:"db_port" env:"STORAGE_USERS_OWNCLOUDSQL_DB_PORT"` + DBName string `yaml:"db_name" env:"STORAGE_USERS_OWNCLOUDSQL_DB_NAME"` + UsersProviderEndpoint string `yaml:"users_provider_endpoint" env:"STORAGE_USERS_PERMISSION_ENDPOINT;STORAGE_USERS_OWNCLOUDSQL_USERS_PROVIDER_ENDPOINT"` +} + +type Events struct { + Addr string `yaml:"endpoint" env:"STORAGE_USERS_EVENTS_ENDPOINT" desc:"the address of the streaming service"` + ClusterID string `yaml:"cluster" env:"STORAGE_USERS_EVENTS_CLUSTER" desc:"the clusterID of the streaming service. Mandatory when using nats"` +} +type S3Driver struct { + // Root is the absolute path to the location of the data + Root string `yaml:"root"` + Region string `yaml:"region"` + AccessKey string `yaml:"access_key"` + SecretKey string `yaml:"secret_key"` + Endpoint string `yaml:"endpoint"` + Bucket string `yaml:"bucket"` +} type EOSDriver struct { // Root is the absolute path to the location of the data Root string `yaml:"root"` @@ -129,73 +193,8 @@ type EOSDriver struct { type LocalDriver struct { // Root is the absolute path to the location of the data - Root string `yaml:"root" env:"STORAGE_USERS_LOCAL_ROOT"` + Root string `yaml:"root"` //ShareFolder defines the name of the folder jailing all shares ShareFolder string `yaml:"share_folder"` - UserLayout string -} - -type OCISDriver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root" env:"STORAGE_USERS_OCIS_ROOT"` - UserLayout string - PermissionsEndpoint string - // PersonalSpaceAliasTemplate contains the template used to construct - // the personal space alias, eg: `"{{.SpaceType}}/{{.User.Username | lower}}"` - PersonalSpaceAliasTemplate string `yaml:"personalspacealias_template"` - // GeneralSpaceAliasTemplate contains the template used to construct - // the general space alias, eg: `{{.SpaceType}}/{{.SpaceName | replace " " "-" | lower}}` - GeneralSpaceAliasTemplate string `yaml:"generalspacealias_template"` - //ShareFolder defines the name of the folder jailing all shares - ShareFolder string `yaml:"share_folder"` -} - -type S3Driver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root"` - Region string `yaml:"region"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` - Endpoint string `yaml:"endpoint"` - Bucket string `yaml:"bucket"` -} - -type S3NGDriver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root"` - UserLayout string - PermissionsEndpoint string - Region string `yaml:"region"` - AccessKey string `yaml:"access_key"` - SecretKey string `yaml:"secret_key"` - Endpoint string `yaml:"endpoint"` - Bucket string `yaml:"bucket"` - // PersonalSpaceAliasTemplate contains the template used to construct - // the personal space alias, eg: `"{{.SpaceType}}/{{.User.Username | lower}}"` - PersonalSpaceAliasTemplate string `yaml:"personalspacealias_template"` - // GeneralSpaceAliasTemplate contains the template used to construct - // the general space alias, eg: `{{.SpaceType}}/{{.SpaceName | replace " " "-" | lower}}` - GeneralSpaceAliasTemplate string `yaml:"generalspacealias_template"` - //ShareFolder defines the name of the folder jailing all shares - ShareFolder string `yaml:"share_folder"` -} - -type OwnCloudSQLDriver struct { - // Root is the absolute path to the location of the data - Root string `yaml:"root" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DATADIR"` - //ShareFolder defines the name of the folder jailing all shares - ShareFolder string `yaml:"share_folder" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_SHARE_FOLDER"` - UserLayout string `env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_LAYOUT"` - UploadInfoDir string `yaml:"upload_info_dir" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_UPLOADINFO_DIR"` - DBUsername string `yaml:"db_username" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBUSERNAME"` - DBPassword string `yaml:"db_password" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBPASSWORD"` - DBHost string `yaml:"db_host" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBHOST"` - DBPort int `yaml:"db_port" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBPORT"` - DBName string `yaml:"db_name" env:"STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBNAME"` - UsersProviderEndpoint string -} - -type Events struct { - Addr string - ClusterID string + UserLayout string `yaml:"user_layout"` } From 2df402cf7e093acea13767ef4f894b2957dd5f7a Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 15:04:59 +0200 Subject: [PATCH 24/50] user config docs --- extensions/group/pkg/config/config.go | 5 +- extensions/user/pkg/config/config.go | 70 ++++++++++++------------ extensions/user/pkg/revaconfig/config.go | 12 ---- 3 files changed, 38 insertions(+), 49 deletions(-) diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index 70857f2e38..50188f6838 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -61,8 +61,9 @@ type GRPCConfig struct { type Drivers struct { LDAP LDAPDriver `yaml:"ldap"` OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` - JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs - REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs + + JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs + REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs } type LDAPDriver struct { URI string `yaml:"uri" env:"LDAP_URI;GROUPS_LDAP_URI"` diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index bb304c83c3..17e36ee7b5 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -59,50 +59,51 @@ type GRPCConfig struct { } type Drivers struct { - LDAP LDAPDriver - OwnCloudSQL OwnCloudSQLDriver - JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs - REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs + LDAP LDAPDriver `yaml:"ldap"` + OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` + + JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs + REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs } type JSONDriver struct { - File string + File string `yaml:"file"` } type LDAPDriver struct { - URI string `env:"LDAP_URI;USERS_LDAP_URI"` - CACert string `env:"LDAP_CACERT;USERS_LDAP_CACERT"` - Insecure bool `env:"LDAP_INSECURE;USERS_LDAP_INSECURE"` - BindDN string `env:"LDAP_BIND_DN;USERS_LDAP_BIND_DN"` - BindPassword string `yaml:"bind_password" env:"LDAP_BIND_PASSWORD;USERS_LDAP_BIND_PASSWORD"` - UserBaseDN string `env:"LDAP_USER_BASE_DN;USERS_LDAP_USER_BASE_DN"` - GroupBaseDN string `env:"LDAP_GROUP_BASE_DN;USERS_LDAP_GROUP_BASE_DN"` - UserScope string `env:"LDAP_USER_SCOPE;USERS_LDAP_USER_SCOPE"` - GroupScope string `env:"LDAP_GROUP_SCOPE;USERS_LDAP_GROUP_SCOPE"` - UserFilter string `env:"LDAP_USERFILTER;USERS_LDAP_USERFILTER"` - GroupFilter string `env:"LDAP_GROUPFILTER;USERS_LDAP_USERFILTER"` - UserObjectClass string `env:"LDAP_USER_OBJECTCLASS;USERS_LDAP_USER_OBJECTCLASS"` - GroupObjectClass string `env:"LDAP_GROUP_OBJECTCLASS;USERS_LDAP_GROUP_OBJECTCLASS"` - LoginAttributes []string `env:"LDAP_LOGIN_ATTRIBUTES;USERS_LDAP_LOGIN_ATTRIBUTES"` - IDP string `env:"OCIS_URL;USERS_IDP_URL"` // TODO what is this for? - UserSchema LDAPUserSchema - GroupSchema LDAPGroupSchema + URI string `yaml:"uri" env:"LDAP_URI;USERS_LDAP_URI"` + CACert string `yaml:"ca_cert" env:"LDAP_CACERT;USERS_LDAP_CACERT"` + Insecure bool `yaml:"insecure" env:"LDAP_INSECURE;USERS_LDAP_INSECURE"` + BindDN string `yaml:"bind_dn" env:"LDAP_BIND_DN;USERS_LDAP_BIND_DN"` + BindPassword string `yaml:"bind_password" env:"LDAP_BIND_PASSWORD;USERS_LDAP_BIND_PASSWORD"` + UserBaseDN string `yaml:"user_base_dn" env:"LDAP_USER_BASE_DN;USERS_LDAP_USER_BASE_DN"` + GroupBaseDN string `yaml:"group_base_dn" env:"LDAP_GROUP_BASE_DN;USERS_LDAP_GROUP_BASE_DN"` + UserScope string `yaml:"user_scope" env:"LDAP_USER_SCOPE;USERS_LDAP_USER_SCOPE"` + GroupScope string `yaml:"group_scope" env:"LDAP_GROUP_SCOPE;USERS_LDAP_GROUP_SCOPE"` + UserFilter string `yaml:"user_filter" env:"LDAP_USERFILTER;USERS_LDAP_USERFILTER"` + GroupFilter string `yaml:"group_filter" env:"LDAP_GROUPFILTER;USERS_LDAP_USERFILTER"` + UserObjectClass string `yaml:"user_object_class" env:"LDAP_USER_OBJECTCLASS;USERS_LDAP_USER_OBJECTCLASS"` + GroupObjectClass string `yaml:"group_object_class" env:"LDAP_GROUP_OBJECTCLASS;USERS_LDAP_GROUP_OBJECTCLASS"` + LoginAttributes []string `yaml:"login_attributes" env:"LDAP_LOGIN_ATTRIBUTES;USERS_LDAP_LOGIN_ATTRIBUTES"` + IDP string `yaml:"idp" env:"OCIS_URL;USERS_IDP_URL"` + UserSchema LDAPUserSchema `yaml:"user_schema"` + GroupSchema LDAPGroupSchema `yaml:"group_schema"` } type LDAPUserSchema struct { - ID string `env:"LDAP_USER_SCHEMA_ID;USERS_LDAP_USER_SCHEMA_ID"` - IDIsOctetString bool `env:"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING;USERS_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"` - Mail string `env:"LDAP_USER_SCHEMA_MAIL;USERS_LDAP_USER_SCHEMA_MAIL"` - DisplayName string `env:"LDAP_USER_SCHEMA_DISPLAYNAME;USERS_LDAP_USER_SCHEMA_DISPLAYNAME"` - Username string `env:"LDAP_USER_SCHEMA_USERNAME;USERS_LDAP_USER_SCHEMA_USERNAME"` + ID string `yaml:"id" env:"LDAP_USER_SCHEMA_ID;USERS_LDAP_USER_SCHEMA_ID"` + IDIsOctetString bool `yaml:"id_is_octet_string" env:"LDAP_USER_SCHEMA_ID_IS_OCTETSTRING;USERS_LDAP_USER_SCHEMA_ID_IS_OCTETSTRING"` + Mail string `yaml:"mail" env:"LDAP_USER_SCHEMA_MAIL;USERS_LDAP_USER_SCHEMA_MAIL"` + DisplayName string `yaml:"display_name" env:"LDAP_USER_SCHEMA_DISPLAYNAME;USERS_LDAP_USER_SCHEMA_DISPLAYNAME"` + Username string `yaml:"user_name" env:"LDAP_USER_SCHEMA_USERNAME;USERS_LDAP_USER_SCHEMA_USERNAME"` } type LDAPGroupSchema struct { - ID string `env:"LDAP_GROUP_SCHEMA_ID;USERS_LDAP_GROUP_SCHEMA_ID"` - IDIsOctetString bool `env:"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING;USERS_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"` - Mail string `env:"LDAP_GROUP_SCHEMA_MAIL;USERS_LDAP_GROUP_SCHEMA_MAIL"` - DisplayName string `env:"LDAP_GROUP_SCHEMA_DISPLAYNAME;USERS_LDAP_GROUP_SCHEMA_DISPLAYNAME"` - Groupname string `env:"LDAP_GROUP_SCHEMA_GROUPNAME;USERS_LDAP_GROUP_SCHEMA_GROUPNAME"` - Member string `env:"LDAP_GROUP_SCHEMA_MEMBER;USERS_LDAP_GROUP_SCHEMA_MEMBER"` + ID string `yaml:"id" env:"LDAP_GROUP_SCHEMA_ID;USERS_LDAP_GROUP_SCHEMA_ID"` + IDIsOctetString bool `yaml:"id_is_octet_string" env:"LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING;USERS_LDAP_GROUP_SCHEMA_ID_IS_OCTETSTRING"` + Mail string `yaml:"mail" env:"LDAP_GROUP_SCHEMA_MAIL;USERS_LDAP_GROUP_SCHEMA_MAIL"` + DisplayName string `yaml:"display_name" env:"LDAP_GROUP_SCHEMA_DISPLAYNAME;USERS_LDAP_GROUP_SCHEMA_DISPLAYNAME"` + Groupname string `yaml:"group_name" env:"LDAP_GROUP_SCHEMA_GROUPNAME;USERS_LDAP_GROUP_SCHEMA_GROUPNAME"` + Member string `yaml:"member" env:"LDAP_GROUP_SCHEMA_MEMBER;USERS_LDAP_GROUP_SCHEMA_MEMBER"` } type OwnCloudSQLDriver struct { @@ -111,13 +112,12 @@ type OwnCloudSQLDriver struct { DBHost string `yaml:"db_host" env:"USERS_OWNCLOUDSQL_DB_HOST"` DBPort int `yaml:"db_port" env:"USERS_OWNCLOUDSQL_DB_PORT"` DBName string `yaml:"db_name" env:"USERS_OWNCLOUDSQL_DB_NAME"` - IDP string `yaml:"idp" env:"USERS_OWNCLOUDSQL_IDP"` // TODO do we need this? + IDP string `yaml:"idp" env:"USERS_OWNCLOUDSQL_IDP"` Nobody int64 `yaml:"nobody" env:"USERS_OWNCLOUDSQL_NOBODY"` // TODO what is this? JoinUsername bool `yaml:"join_username" env:"USERS_OWNCLOUDSQL_JOIN_USERNAME"` JoinOwnCloudUUID bool `yaml:"join_owncloud_uuid" env:"USERS_OWNCLOUDSQL_JOIN_OWNCLOUD_UUID"` EnableMedialSearch bool `yaml:"enable_medial_search" env:"USERS_OWNCLOUDSQL_ENABLE_MEDIAL_SEARCH"` } - type RESTProvider struct { ClientID string ClientSecret string diff --git a/extensions/user/pkg/revaconfig/config.go b/extensions/user/pkg/revaconfig/config.go index b0cfc333c0..1ce6e51b1a 100644 --- a/extensions/user/pkg/revaconfig/config.go +++ b/extensions/user/pkg/revaconfig/config.go @@ -30,18 +30,6 @@ func UsersConfigFromStruct(cfg *config.Config) map[string]interface{} { "users": cfg.Drivers.JSON.File, }, "ldap": ldapConfigFromString(cfg.Drivers.LDAP), - "rest": map[string]interface{}{ - "client_id": cfg.Drivers.REST.ClientID, - "client_secret": cfg.Drivers.REST.ClientSecret, - "redis_address": cfg.Drivers.REST.RedisAddr, - "redis_username": cfg.Drivers.REST.RedisUsername, - "redis_password": cfg.Drivers.REST.RedisPassword, - "user_groups_cache_expiration": cfg.UsersCacheExpiration, - "id_provider": cfg.Drivers.REST.IDProvider, - "api_base_url": cfg.Drivers.REST.APIBaseURL, - "oidc_token_endpoint": cfg.Drivers.REST.OIDCTokenEndpoint, - "target_api": cfg.Drivers.REST.TargetAPI, - }, "owncloudsql": map[string]interface{}{ "dbusername": cfg.Drivers.OwnCloudSQL.DBUsername, "dbpassword": cfg.Drivers.OwnCloudSQL.DBPassword, From 9268fdcf861aa621cb95983c218a324406f1a393 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 15:11:53 +0200 Subject: [PATCH 25/50] fix ocis build --- .../storage-publiclink/pkg/config/defaults/defaultconfig.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go b/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go index 67dfbcedc6..d8595c935d 100644 --- a/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-publiclink/pkg/config/defaults/defaultconfig.go @@ -30,12 +30,8 @@ func DefaultConfig() *config.Config { Reva: &config.Reva{ Address: "127.0.0.1:9142", }, - AuthProvider: config.AuthProvider{ - GatewayEndpoint: "127.0.0.1:9142", - }, StorageProvider: config.StorageProvider{ - MountID: "7993447f-687f-490d-875c-ac95e89a62a4", - GatewayEndpoint: "127.0.0.1:9142", + MountID: "7993447f-687f-490d-875c-ac95e89a62a4", }, } } From 771bfb6c6bfa7de5b1861e8d46a5aec003235586 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 15:27:12 +0200 Subject: [PATCH 26/50] remove rest default config from user provider --- extensions/user/pkg/config/defaults/defaultconfig.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/extensions/user/pkg/config/defaults/defaultconfig.go b/extensions/user/pkg/config/defaults/defaultconfig.go index 8a304e74c7..b3f4ac3386 100644 --- a/extensions/user/pkg/config/defaults/defaultconfig.go +++ b/extensions/user/pkg/config/defaults/defaultconfig.go @@ -78,9 +78,6 @@ func DefaultConfig() *config.Config { JoinOwnCloudUUID: false, EnableMedialSearch: false, }, - REST: config.RESTProvider{ - RedisAddr: "localhost:6379", - }, }, } } From 2be54a8c5461e7c30ad71ad67bb4036ac23bf48a Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 15:31:44 +0200 Subject: [PATCH 27/50] fix owner on ocis config files --- .drone.star | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.star b/.drone.star index 211d8bbdc4..d46a20100e 100644 --- a/.drone.star +++ b/.drone.star @@ -2620,6 +2620,7 @@ def copyConfigs(): # ocis proxy config "mkdir -p /etc/ocis", "cp %s/ocis/proxy.yaml /etc/ocis/proxy.yaml" % (PARALLEL_DEPLOY_CONFIG_PATH), + "chown -R 33:33 /etc/ocis", # oc10 configs "mkdir -p /etc/templates", "mkdir -p /etc/pre_server.d", From 59c472742100e53f9d982c5d7915646cd97a46ad Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 15:41:53 +0200 Subject: [PATCH 28/50] temporarily revert back to json sharing drivers --- extensions/sharing/pkg/config/defaults/defaultconfig.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/sharing/pkg/config/defaults/defaultconfig.go b/extensions/sharing/pkg/config/defaults/defaultconfig.go index 0210afe326..d4538c4204 100644 --- a/extensions/sharing/pkg/config/defaults/defaultconfig.go +++ b/extensions/sharing/pkg/config/defaults/defaultconfig.go @@ -33,7 +33,7 @@ func DefaultConfig() *config.Config { Reva: &config.Reva{ Address: "127.0.0.1:9142", }, - UserSharingDriver: "cs3", + UserSharingDriver: "json", //"cs3", UserSharingDrivers: config.UserSharingDrivers{ JSON: config.UserSharingJSONDriver{ File: filepath.Join(defaults.BaseDataPath(), "storage", "shares.json"), @@ -43,7 +43,7 @@ func DefaultConfig() *config.Config { ServiceUserIDP: "internal", }, }, - PublicSharingDriver: "cs3", + PublicSharingDriver: "json", // "cs3", PublicSharingDrivers: config.PublicSharingDrivers{ JSON: config.PublicSharingJSONDriver{ File: filepath.Join(defaults.BaseDataPath(), "storage", "publicshares.json"), From 49e39f3a4f7277c11fdee965b15aabcde3a35027 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 15:44:57 +0200 Subject: [PATCH 29/50] remove artifacts from ports docs --- docs/extensions/port-ranges.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extensions/port-ranges.md b/docs/extensions/port-ranges.md index 926fb7030b..7aa428f9cd 100644 --- a/docs/extensions/port-ranges.md +++ b/docs/extensions/port-ranges.md @@ -17,7 +17,7 @@ Feel free to "reserve" a free port range when you're developing an extension by If you're developing a non-public extension, we recommend using ports outside of the ranges listed below. -We also suggest to use the last port in your extensions' range as a debug/metrics port.**** +We also suggest to use the last port in your extensions' range as a debug/metrics port. ## Allocations From 3ad56ed8ad425d6fcf269a750a0d96a223504a05 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 16:00:48 +0200 Subject: [PATCH 30/50] bring back folde precreation for sharing service --- extensions/sharing/pkg/command/server.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/extensions/sharing/pkg/command/server.go b/extensions/sharing/pkg/command/server.go index 26c085082c..fe5ad30b6f 100644 --- a/extensions/sharing/pkg/command/server.go +++ b/extensions/sharing/pkg/command/server.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "path" + "path/filepath" "github.com/cs3org/reva/v2/cmd/revad/runtime" "github.com/gofrs/uuid" @@ -45,6 +46,18 @@ func Server(cfg *config.Config) *cli.Command { defer cancel() + // precreate folders + if cfg.UserSharingDriver == "json" && cfg.UserSharingDrivers.JSON.File != "" { + if err := os.MkdirAll(filepath.Dir(cfg.UserSharingDrivers.JSON.File), os.FileMode(0700)); err != nil { + return err + } + } + if cfg.PublicSharingDriver == "json" && cfg.PublicSharingDrivers.JSON.File != "" { + if err := os.MkdirAll(filepath.Dir(cfg.PublicSharingDrivers.JSON.File), os.FileMode(0700)); err != nil { + return err + } + } + pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid") rcfg := revaconfig.SharingConfigFromStruct(cfg) From e97ec5ed5833f24739241451bda0bd6e1e5aa5a9 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 16:48:09 +0200 Subject: [PATCH 31/50] reintroduce Skip users groups in token option --- extensions/auth-basic/pkg/config/config.go | 2 +- extensions/auth-bearer/pkg/config/config.go | 2 +- extensions/auth-machine/pkg/config/config.go | 2 +- extensions/frontend/pkg/config/config.go | 2 +- extensions/gateway/pkg/config/config.go | 2 +- extensions/group/pkg/config/config.go | 2 +- extensions/ocdav/pkg/config/config.go | 2 +- extensions/sharing/pkg/config/config.go | 4 ++-- extensions/storage-metadata/pkg/config/config.go | 2 +- extensions/storage-publiclink/pkg/config/config.go | 2 +- extensions/storage-shares/pkg/config/config.go | 2 +- extensions/storage-users/pkg/config/config.go | 2 +- extensions/user/pkg/config/config.go | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index 92a1b496c9..e8d592ba1f 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"AUTH_BASIC_SKIP_USER_GROUPS_IN_TOKEN"` AuthProvider string `yaml:"auth_provider" env:"AUTH_BASIC_AUTH_PROVIDER" desc:"The auth provider which should be used by the service"` AuthProviders AuthProviders `yaml:"auth_providers"` diff --git a/extensions/auth-bearer/pkg/config/config.go b/extensions/auth-bearer/pkg/config/config.go index a95532f1bd..6d8fc3faf6 100644 --- a/extensions/auth-bearer/pkg/config/config.go +++ b/extensions/auth-bearer/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"AUTH_BEARER_SKIP_USER_GROUPS_IN_TOKEN"` OIDC OIDC `yaml:"oidc"` diff --git a/extensions/auth-machine/pkg/config/config.go b/extensions/auth-machine/pkg/config/config.go index 1e79e1df45..d78749ce54 100644 --- a/extensions/auth-machine/pkg/config/config.go +++ b/extensions/auth-machine/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"AUTH_MACHINE_SKIP_USER_GROUPS_IN_TOKEN"` MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;AUTH_MACHINE_API_KEY"` diff --git a/extensions/frontend/pkg/config/config.go b/extensions/frontend/pkg/config/config.go index b2968efde4..5029c44560 100644 --- a/extensions/frontend/pkg/config/config.go +++ b/extensions/frontend/pkg/config/config.go @@ -23,7 +23,7 @@ type Config struct { Reva *Reva `yaml:"reva"` MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY;FRONTEND_MACHINE_AUTH_API_KEY"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"FRONTEND_SKIP_USER_GROUPS_IN_TOKEN"` EnableFavorites bool `yaml:"enable_favorites" env:"FRONTEND_ENABLE_FAVORITES"` EnableProjectSpaces bool `yaml:"enable_project_spaces" env:"FRONTEND_ENABLE_PROJECT_SPACES" desc:"Indicates to clients that project spaces are supposed to be made available."` diff --git a/extensions/gateway/pkg/config/config.go b/extensions/gateway/pkg/config/config.go index b8e4ba3366..3d644e98e4 100644 --- a/extensions/gateway/pkg/config/config.go +++ b/extensions/gateway/pkg/config/config.go @@ -19,7 +19,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"GATEWAY_SKIP_USER_GROUPS_IN_TOKEN"` CommitShareToStorageGrant bool `yaml:"commit_share_to_storage_grant" env:"GATEWAY_COMMIT_SHARE_TO_STORAGE_GRANT"` CommitShareToStorageRef bool `yaml:"commit_share_to_storage_ref" env:"GATEWAY_COMMIT_SHARE_TO_STORAGE_REF"` diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index 50188f6838..def9387c9b 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"GROUPS_SKIP_USER_GROUPS_IN_TOKEN"` GroupMembersCacheExpiration int `yaml:"group_members_cache_expiration"` Driver string `yaml:"driver"` diff --git a/extensions/ocdav/pkg/config/config.go b/extensions/ocdav/pkg/config/config.go index a9bfe08e13..559d8bf224 100644 --- a/extensions/ocdav/pkg/config/config.go +++ b/extensions/ocdav/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"OCDAV_SKIP_USER_GROUPS_IN_TOKEN"` WebdavNamespace string `yaml:"webdav_namespace" env:"OCDVAV_WEBDAV_NAMESPACE"` FilesNamespace string `yaml:"files_namespace" env:"OCDAV_FILES_NAMESPACE"` diff --git a/extensions/sharing/pkg/config/config.go b/extensions/sharing/pkg/config/config.go index 430354daa3..8c0ab68a16 100644 --- a/extensions/sharing/pkg/config/config.go +++ b/extensions/sharing/pkg/config/config.go @@ -19,10 +19,10 @@ type Config struct { Reva *Reva `yaml:"reva"` Events Events `yaml:"events"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"SHARING_SKIP_USER_GROUPS_IN_TOKEN"` UserSharingDriver string `yaml:"user_sharing_driver" env:"SHARING_USER_DRIVER"` - UserSharingDrivers UserSharingDrivers `yaml:"user_sharin_drivers"` + UserSharingDrivers UserSharingDrivers `yaml:"user_sharing_drivers"` PublicSharingDriver string `yaml:"public_sharing_driver" env:"SHARING_PUBLIC_DRIVER"` PublicSharingDrivers PublicSharingDrivers `yaml:"public_sharing_drivers"` diff --git a/extensions/storage-metadata/pkg/config/config.go b/extensions/storage-metadata/pkg/config/config.go index be9ebd5523..78bf7bcf17 100644 --- a/extensions/storage-metadata/pkg/config/config.go +++ b/extensions/storage-metadata/pkg/config/config.go @@ -21,7 +21,7 @@ type Config struct { MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"STORAGE_METADATA_MACHINE_AUTH_API_KEY"` MetadataUserID string `yaml:"metadata_user_id"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"STORAGE_METADATA_SKIP_USER_GROUPS_IN_TOKEN"` Driver string `yaml:"driver" env:"STORAGE_METADATA_DRIVER" desc:"The driver which should be used by the service"` Drivers Drivers `yaml:"drivers"` diff --git a/extensions/storage-publiclink/pkg/config/config.go b/extensions/storage-publiclink/pkg/config/config.go index 08db7ac06c..0420deb666 100644 --- a/extensions/storage-publiclink/pkg/config/config.go +++ b/extensions/storage-publiclink/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"STORAGE_PUBLICLINK_SKIP_USER_GROUPS_IN_TOKEN"` StorageProvider StorageProvider `yaml:"storage_provider"` diff --git a/extensions/storage-shares/pkg/config/config.go b/extensions/storage-shares/pkg/config/config.go index 5d6cc84234..d555ed2d3f 100644 --- a/extensions/storage-shares/pkg/config/config.go +++ b/extensions/storage-shares/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"STORAGE_SHARES_SKIP_USER_GROUPS_IN_TOKEN"` ReadOnly bool `yaml:"readonly" env:"STORAGE_SHARES_READ_ONLY"` SharesProviderEndpoint string `yaml:"user_share_provider_endpoint" env:"STORAGE_SHARES_USER_SHARE_PROVIDER_ENDPOINT"` diff --git a/extensions/storage-users/pkg/config/config.go b/extensions/storage-users/pkg/config/config.go index 7dd56e44e8..0d886d0456 100644 --- a/extensions/storage-users/pkg/config/config.go +++ b/extensions/storage-users/pkg/config/config.go @@ -19,7 +19,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"STORAGE_USERS_SKIP_USER_GROUPS_IN_TOKEN"` Driver string `yaml:"driver" env:"STORAGE_USERS_DRIVER" desc:"The storage driver which should be used by the service"` Drivers Drivers `yaml:"drivers"` diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index 17e36ee7b5..24df40c5ee 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -18,7 +18,7 @@ type Config struct { TokenManager *TokenManager `yaml:"token_manager"` Reva *Reva `yaml:"reva"` - SkipUserGroupsInToken bool `yaml:"-"` + SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"USER_SKIP_USER_GROUPS_IN_TOKEN"` UsersCacheExpiration int `yaml:"users_cache_expiration"` Driver string `yaml:"driver"` From 7c6cdf0008d7be778b17c8ba46a9726e31b22902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 16:51:20 +0200 Subject: [PATCH 32/50] Apply suggestions from code review update usage --- extensions/auth-bearer/pkg/command/root.go | 2 +- extensions/auth-machine/pkg/command/root.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/auth-bearer/pkg/command/root.go b/extensions/auth-bearer/pkg/command/root.go index 4589c17c30..a4f863ec0f 100644 --- a/extensions/auth-bearer/pkg/command/root.go +++ b/extensions/auth-bearer/pkg/command/root.go @@ -29,7 +29,7 @@ func GetCommands(cfg *config.Config) cli.Commands { func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ Name: "ocis-auth-bearer", - Usage: "Provide apps for oCIS", + Usage: "Provide bearer authentication for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/auth-machine/pkg/command/root.go b/extensions/auth-machine/pkg/command/root.go index 9c675862fa..40712fe913 100644 --- a/extensions/auth-machine/pkg/command/root.go +++ b/extensions/auth-machine/pkg/command/root.go @@ -29,7 +29,7 @@ func GetCommands(cfg *config.Config) cli.Commands { func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ Name: "ocis-auth-machine", - Usage: "Provide apps for oCIS", + Usage: "Provide machine authentication for oCIS", Commands: GetCommands(cfg), }) From 28978e81ed9b515b4e947cc903fd13f6489349b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 16:52:13 +0200 Subject: [PATCH 33/50] fix env var typo --- extensions/gateway/pkg/config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/gateway/pkg/config/config.go b/extensions/gateway/pkg/config/config.go index 3d644e98e4..8cd5229aa9 100644 --- a/extensions/gateway/pkg/config/config.go +++ b/extensions/gateway/pkg/config/config.go @@ -27,7 +27,7 @@ type Config struct { DisableHomeCreationOnLogin bool `yaml:"disable_home_creation_on_login" env:"GATEWAY_DISABLE_HOME_CREATION_ON_LOGIN"` TransferSecret string `yaml:"transfer_secret" env:"STORAGE_TRANSFER_SECRET"` // TODO: how to name the env TransferExpires int `yaml:"transfer_expires" env:"GATEWAY_TRANSFER_EXPIRES"` - HomeMapping string `yaml:"home_mapping" env:"GATEWAY_HOME_MAPPIN"` + HomeMapping string `yaml:"home_mapping" env:"GATEWAY_HOME_MAPPING"` EtagCacheTTL int `yaml:"etag_cache_ttl" env:"GATEWAY_ETAG_CACHE_TTL"` FrontendPublicURL string `yaml:"frontend_public_url" env:"OCIS_URL;GATEWAY_FRONTEND_PUBLIC_URL"` From 003945edec202be758ca6cfd7cd5c7380e7c9190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 16:53:45 +0200 Subject: [PATCH 34/50] Update group service usage --- extensions/group/pkg/command/root.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/group/pkg/command/root.go b/extensions/group/pkg/command/root.go index a4a3feaf37..c9c4da6212 100644 --- a/extensions/group/pkg/command/root.go +++ b/extensions/group/pkg/command/root.go @@ -29,7 +29,7 @@ func GetCommands(cfg *config.Config) cli.Commands { func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ Name: "ocis-group", - Usage: "Provide apps for oCIS", + Usage: "Provide groups for oCIS", Commands: GetCommands(cfg), }) From 4f6cc66d570cae5c093a0cb04ac95333771f821b Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 16:57:17 +0200 Subject: [PATCH 35/50] fix metadata storage permissions endpoint --- extensions/storage-metadata/pkg/config/config.go | 4 +--- .../pkg/config/defaults/defaultconfig.go | 3 +-- .../storage-metadata/pkg/config/metadata.go | 13 ------------- .../storage-metadata/pkg/revaconfig/config.go | 16 ++++++++++++++-- 4 files changed, 16 insertions(+), 20 deletions(-) delete mode 100644 extensions/storage-metadata/pkg/config/metadata.go diff --git a/extensions/storage-metadata/pkg/config/config.go b/extensions/storage-metadata/pkg/config/config.go index 78bf7bcf17..b6a285c41f 100644 --- a/extensions/storage-metadata/pkg/config/config.go +++ b/extensions/storage-metadata/pkg/config/config.go @@ -75,7 +75,5 @@ type Drivers struct { type OCISDriver struct { // Root is the absolute path to the location of the data - Root string `yaml:"root" env:"STORAGE_METADATA_OCIS_ROOT"` - UserLayout string `yaml:"-"` - PermissionsEndpoint string `yaml:"permissions_endpoint" env:"STORAGE_METADATA_OCIS_PERMISSIONS_ENDPOINT"` + Root string `yaml:"root" env:"STORAGE_METADATA_OCIS_ROOT"` } diff --git a/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go b/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go index f23c58077a..0b9c1d2a50 100644 --- a/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go +++ b/extensions/storage-metadata/pkg/config/defaults/defaultconfig.go @@ -43,8 +43,7 @@ func DefaultConfig() *config.Config { Driver: "ocis", Drivers: config.Drivers{ OCIS: config.OCISDriver{ - Root: filepath.Join(defaults.BaseDataPath(), "storage", "metadata"), - UserLayout: "{{.Id.OpaqueId}}", + Root: filepath.Join(defaults.BaseDataPath(), "storage", "metadata"), }, }, } diff --git a/extensions/storage-metadata/pkg/config/metadata.go b/extensions/storage-metadata/pkg/config/metadata.go deleted file mode 100644 index 0eb10b48fd..0000000000 --- a/extensions/storage-metadata/pkg/config/metadata.go +++ /dev/null @@ -1,13 +0,0 @@ -package config - -func MetadataDrivers(cfg *Config) map[string]interface{} { - return map[string]interface{}{ - "ocis": map[string]interface{}{ - "root": cfg.Drivers.OCIS.Root, - "user_layout": cfg.Drivers.OCIS.UserLayout, - "treetime_accounting": false, - "treesize_accounting": false, - "permissionssvc": cfg.Drivers.OCIS.PermissionsEndpoint, - }, - } -} diff --git a/extensions/storage-metadata/pkg/revaconfig/config.go b/extensions/storage-metadata/pkg/revaconfig/config.go index be7706efd0..70b5056dbc 100644 --- a/extensions/storage-metadata/pkg/revaconfig/config.go +++ b/extensions/storage-metadata/pkg/revaconfig/config.go @@ -92,7 +92,7 @@ func StorageMetadataFromStruct(cfg *config.Config) map[string]interface{} { }, "storageprovider": map[string]interface{}{ "driver": cfg.Driver, - "drivers": config.MetadataDrivers(cfg), + "drivers": metadataDrivers(cfg), "data_server_url": cfg.DataServerURL, "tmp_folder": cfg.TempFolder, }, @@ -106,7 +106,7 @@ func StorageMetadataFromStruct(cfg *config.Config) map[string]interface{} { "dataprovider": map[string]interface{}{ "prefix": "data", "driver": cfg.Driver, - "drivers": config.MetadataDrivers(cfg), + "drivers": metadataDrivers(cfg), "timeout": 86400, "insecure": cfg.DataProviderInsecure, "disable_tus": true, @@ -116,3 +116,15 @@ func StorageMetadataFromStruct(cfg *config.Config) map[string]interface{} { } return rcfg } + +func metadataDrivers(cfg *config.Config) map[string]interface{} { + return map[string]interface{}{ + "ocis": map[string]interface{}{ + "root": cfg.Drivers.OCIS.Root, + "user_layout": "{{.Id.OpaqueId}}", + "treetime_accounting": false, + "treesize_accounting": false, + "permissionssvc": cfg.GRPC.Addr, + }, + } +} From eac18a9404ad6819a8612a194b4b4444f759eb00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 17:04:45 +0200 Subject: [PATCH 36/50] Update group doc --- extensions/group/pkg/tracing/tracing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/group/pkg/tracing/tracing.go b/extensions/group/pkg/tracing/tracing.go index 1dcb178061..c28e13c7bd 100644 --- a/extensions/group/pkg/tracing/tracing.go +++ b/extensions/group/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the group service. TraceProvider = trace.NewNoopTracerProvider() ) From b65936fe995e4cc85121abc6349acb22a8601688 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 17:08:23 +0200 Subject: [PATCH 37/50] strip `ocis-` from command name for all standalone services --- extensions/accounts/pkg/command/root.go | 2 +- extensions/app-registry/pkg/command/root.go | 2 +- extensions/appprovider/pkg/command/root.go | 2 +- extensions/auth-basic/pkg/command/root.go | 2 +- extensions/auth-bearer/pkg/command/root.go | 2 +- extensions/auth-machine/pkg/command/root.go | 2 +- extensions/frontend/pkg/command/root.go | 2 +- extensions/gateway/pkg/command/root.go | 2 +- extensions/glauth/pkg/command/root.go | 2 +- extensions/graph/pkg/command/root.go | 2 +- extensions/group/pkg/command/root.go | 2 +- extensions/idm/pkg/command/root.go | 2 +- extensions/idp/pkg/command/root.go | 2 +- extensions/ocdav/pkg/command/root.go | 2 +- extensions/ocs/pkg/command/root.go | 2 +- extensions/proxy/pkg/command/root.go | 2 +- extensions/search/pkg/command/root.go | 2 +- extensions/settings/pkg/command/root.go | 2 +- extensions/sharing/pkg/command/root.go | 2 +- extensions/storage-metadata/pkg/command/root.go | 2 +- extensions/storage-publiclink/pkg/command/root.go | 2 +- extensions/storage-shares/pkg/command/root.go | 2 +- extensions/storage-users/pkg/command/root.go | 2 +- extensions/store/pkg/command/root.go | 2 +- extensions/thumbnails/pkg/command/root.go | 2 +- extensions/user/pkg/command/root.go | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/extensions/accounts/pkg/command/root.go b/extensions/accounts/pkg/command/root.go index aee23e547d..bb68f61678 100644 --- a/extensions/accounts/pkg/command/root.go +++ b/extensions/accounts/pkg/command/root.go @@ -34,7 +34,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-accounts command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-accounts", + Name: "accounts", Usage: "Provide accounts and groups for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/app-registry/pkg/command/root.go b/extensions/app-registry/pkg/command/root.go index df302358e1..4525aeefc4 100644 --- a/extensions/app-registry/pkg/command/root.go +++ b/extensions/app-registry/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-app-registry command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-app-registry", + Name: "app-registry", Usage: "Provide a app registry for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/appprovider/pkg/command/root.go b/extensions/appprovider/pkg/command/root.go index 6cede536d0..37218bdacb 100644 --- a/extensions/appprovider/pkg/command/root.go +++ b/extensions/appprovider/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-accounts command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-appprovider", + Name: "appprovider", Usage: "Provide apps for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/auth-basic/pkg/command/root.go b/extensions/auth-basic/pkg/command/root.go index 3dff2f589d..735941988a 100644 --- a/extensions/auth-basic/pkg/command/root.go +++ b/extensions/auth-basic/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-auth-basic command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-auth-basic", + Name: "auth-basic", Usage: "Provide basic authentication for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/auth-bearer/pkg/command/root.go b/extensions/auth-bearer/pkg/command/root.go index a4f863ec0f..41431fd498 100644 --- a/extensions/auth-bearer/pkg/command/root.go +++ b/extensions/auth-bearer/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-auth-bearer command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-auth-bearer", + Name: "auth-bearer", Usage: "Provide bearer authentication for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/auth-machine/pkg/command/root.go b/extensions/auth-machine/pkg/command/root.go index 40712fe913..593d455702 100644 --- a/extensions/auth-machine/pkg/command/root.go +++ b/extensions/auth-machine/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-auth-machine command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-auth-machine", + Name: "auth-machine", Usage: "Provide machine authentication for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/frontend/pkg/command/root.go b/extensions/frontend/pkg/command/root.go index afe7fa3ef3..4905363b29 100644 --- a/extensions/frontend/pkg/command/root.go +++ b/extensions/frontend/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-frontend command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-frontend", + Name: "frontend", Usage: "Provide various ownCloud apis for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/gateway/pkg/command/root.go b/extensions/gateway/pkg/command/root.go index d064ab4713..a162c6d3d4 100644 --- a/extensions/gateway/pkg/command/root.go +++ b/extensions/gateway/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-gateway command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-gateway", + Name: "gateway", Usage: "Provide a CS3api gateway for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/glauth/pkg/command/root.go b/extensions/glauth/pkg/command/root.go index 5fbfbf5760..27d48cc8ca 100644 --- a/extensions/glauth/pkg/command/root.go +++ b/extensions/glauth/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-glauth command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-glauth", + Name: "glauth", Usage: "Serve GLAuth API for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/graph/pkg/command/root.go b/extensions/graph/pkg/command/root.go index ecfeb2d15d..be426b0c79 100644 --- a/extensions/graph/pkg/command/root.go +++ b/extensions/graph/pkg/command/root.go @@ -29,7 +29,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-graph command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-graph", + Name: "graph", Usage: "Serve Graph API for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/group/pkg/command/root.go b/extensions/group/pkg/command/root.go index c9c4da6212..7a392363a4 100644 --- a/extensions/group/pkg/command/root.go +++ b/extensions/group/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-group command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-group", + Name: "group", Usage: "Provide groups for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/idm/pkg/command/root.go b/extensions/idm/pkg/command/root.go index 50f6444346..74866c9ecc 100644 --- a/extensions/idm/pkg/command/root.go +++ b/extensions/idm/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-idm command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-idm", + Name: "idm", Usage: "Embedded LDAP service for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/idp/pkg/command/root.go b/extensions/idp/pkg/command/root.go index 120e847139..8e8394ac1c 100644 --- a/extensions/idp/pkg/command/root.go +++ b/extensions/idp/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-idp command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-idp", + Name: "idp", Usage: "Serve IDP API for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/ocdav/pkg/command/root.go b/extensions/ocdav/pkg/command/root.go index e022dd0fec..c37fdd6852 100644 --- a/extensions/ocdav/pkg/command/root.go +++ b/extensions/ocdav/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-ocdav command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-ocdav", + Name: "ocdav", Usage: "Provide a WebDav API for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/ocs/pkg/command/root.go b/extensions/ocs/pkg/command/root.go index 61b65c7486..446db14b92 100644 --- a/extensions/ocs/pkg/command/root.go +++ b/extensions/ocs/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-ocs command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-ocs", + Name: "ocs", Usage: "Serve OCS API for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/proxy/pkg/command/root.go b/extensions/proxy/pkg/command/root.go index bcd4fcaec0..98a47d7571 100644 --- a/extensions/proxy/pkg/command/root.go +++ b/extensions/proxy/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-proxy command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-proxy", + Name: "proxy", Usage: "proxy for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/search/pkg/command/root.go b/extensions/search/pkg/command/root.go index a43261631f..41dc43f558 100644 --- a/extensions/search/pkg/command/root.go +++ b/extensions/search/pkg/command/root.go @@ -30,7 +30,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-search command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-search", + Name: "search", Usage: "Serve search API for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/settings/pkg/command/root.go b/extensions/settings/pkg/command/root.go index 5ad6a4bff4..81a01cc32d 100644 --- a/extensions/settings/pkg/command/root.go +++ b/extensions/settings/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-settings command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-settings", + Name: "settings", Usage: "Provide settings and permissions for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/sharing/pkg/command/root.go b/extensions/sharing/pkg/command/root.go index 30e24793fa..b5c634002b 100644 --- a/extensions/sharing/pkg/command/root.go +++ b/extensions/sharing/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-sharing command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-sharing", + Name: "sharing", Usage: "Provide sharing for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/storage-metadata/pkg/command/root.go b/extensions/storage-metadata/pkg/command/root.go index 8515d544ee..c64d6dcc0f 100644 --- a/extensions/storage-metadata/pkg/command/root.go +++ b/extensions/storage-metadata/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-storage-metadata command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-storage-metadata", + Name: "storage-metadata", Usage: "Provide apps for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/storage-publiclink/pkg/command/root.go b/extensions/storage-publiclink/pkg/command/root.go index 1b89e3d262..0d1081585b 100644 --- a/extensions/storage-publiclink/pkg/command/root.go +++ b/extensions/storage-publiclink/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-accounts command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-appprovider", + Name: "appprovider", Usage: "Provide apps for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/storage-shares/pkg/command/root.go b/extensions/storage-shares/pkg/command/root.go index f055516f66..bafe1a336b 100644 --- a/extensions/storage-shares/pkg/command/root.go +++ b/extensions/storage-shares/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the storage-shares command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-storage-shares", + Name: "storage-shares", Usage: "Provide a virtual storage for shares in oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/storage-users/pkg/command/root.go b/extensions/storage-users/pkg/command/root.go index 1d98daeab8..49304eebe2 100644 --- a/extensions/storage-users/pkg/command/root.go +++ b/extensions/storage-users/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-storage-users command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-storage-users", + Name: "storage-users", Usage: "Provide storage for users and projects in oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/store/pkg/command/root.go b/extensions/store/pkg/command/root.go index 9dc06b0e74..4ab42c4465 100644 --- a/extensions/store/pkg/command/root.go +++ b/extensions/store/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-store command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-store", + Name: "store", Usage: "Service to store values for ocis extensions", Commands: GetCommands(cfg), }) diff --git a/extensions/thumbnails/pkg/command/root.go b/extensions/thumbnails/pkg/command/root.go index 44d4948dbe..07fca1eae4 100644 --- a/extensions/thumbnails/pkg/command/root.go +++ b/extensions/thumbnails/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-thumbnails command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-thumbnails", + Name: "thumbnails", Usage: "Example usage", Commands: GetCommands(cfg), }) diff --git a/extensions/user/pkg/command/root.go b/extensions/user/pkg/command/root.go index 23e45a2602..2f4c83aca6 100644 --- a/extensions/user/pkg/command/root.go +++ b/extensions/user/pkg/command/root.go @@ -28,7 +28,7 @@ func GetCommands(cfg *config.Config) cli.Commands { // Execute is the entry point for the ocis-user command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "ocis-user", + Name: "user", Usage: "Provide users for oCIS", Commands: GetCommands(cfg), }) From b13a9d7bba6fc15ae719dd4c7787e673dabf7839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 17:10:52 +0200 Subject: [PATCH 38/50] ocdav env typo --- extensions/ocdav/pkg/config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ocdav/pkg/config/config.go b/extensions/ocdav/pkg/config/config.go index 559d8bf224..3b52046d65 100644 --- a/extensions/ocdav/pkg/config/config.go +++ b/extensions/ocdav/pkg/config/config.go @@ -20,7 +20,7 @@ type Config struct { SkipUserGroupsInToken bool `yaml:"skip_user_groups_in_token" env:"OCDAV_SKIP_USER_GROUPS_IN_TOKEN"` - WebdavNamespace string `yaml:"webdav_namespace" env:"OCDVAV_WEBDAV_NAMESPACE"` + WebdavNamespace string `yaml:"webdav_namespace" env:"OCDAV_WEBDAV_NAMESPACE"` FilesNamespace string `yaml:"files_namespace" env:"OCDAV_FILES_NAMESPACE"` SharesNamespace string `yaml:"shares_namespace" env:"OCDAV_SHARES_NAMESPACE"` // PublicURL used to redirect /s/{token} URLs to From 8ded0ced20ac6bd74cf04358e47def2c27e02728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 17:22:39 +0200 Subject: [PATCH 39/50] fix doc typo --- extensions/sharing/pkg/command/root.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/sharing/pkg/command/root.go b/extensions/sharing/pkg/command/root.go index b5c634002b..c2ce475e8d 100644 --- a/extensions/sharing/pkg/command/root.go +++ b/extensions/sharing/pkg/command/root.go @@ -25,7 +25,7 @@ func GetCommands(cfg *config.Config) cli.Commands { } } -// Execute is the entry point for the ocis-sharing command. +// Execute is the entry point for the sharing command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ Name: "sharing", From 0fe667673835f26fb99b67bc7a5aca36fad271fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 17:48:45 +0200 Subject: [PATCH 40/50] drop specific service name from tracing docs --- extensions/app-registry/pkg/tracing/tracing.go | 2 +- extensions/appprovider/pkg/tracing/tracing.go | 2 +- extensions/auth-basic/pkg/tracing/tracing.go | 2 +- extensions/auth-bearer/pkg/tracing/tracing.go | 2 +- extensions/auth-machine/pkg/tracing/tracing.go | 2 +- extensions/frontend/pkg/tracing/tracing.go | 2 +- extensions/gateway/pkg/tracing/tracing.go | 2 +- extensions/group/pkg/tracing/tracing.go | 2 +- extensions/ocdav/pkg/tracing/tracing.go | 2 +- extensions/sharing/pkg/tracing/tracing.go | 2 +- extensions/storage-metadata/pkg/tracing/tracing.go | 2 +- extensions/storage-publiclink/pkg/tracing/tracing.go | 2 +- extensions/storage-shares/pkg/tracing/tracing.go | 2 +- extensions/storage-users/pkg/tracing/tracing.go | 2 +- extensions/user/pkg/tracing/tracing.go | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/extensions/app-registry/pkg/tracing/tracing.go b/extensions/app-registry/pkg/tracing/tracing.go index 212c4f7c11..8d3a224445 100644 --- a/extensions/app-registry/pkg/tracing/tracing.go +++ b/extensions/app-registry/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/appprovider/pkg/tracing/tracing.go b/extensions/appprovider/pkg/tracing/tracing.go index a2f1e636e8..36e5b9e2b5 100644 --- a/extensions/appprovider/pkg/tracing/tracing.go +++ b/extensions/appprovider/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/auth-basic/pkg/tracing/tracing.go b/extensions/auth-basic/pkg/tracing/tracing.go index 7f7180555e..3d6cd1b15d 100644 --- a/extensions/auth-basic/pkg/tracing/tracing.go +++ b/extensions/auth-basic/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/auth-bearer/pkg/tracing/tracing.go b/extensions/auth-bearer/pkg/tracing/tracing.go index 74ff9ceca4..cb139893c7 100644 --- a/extensions/auth-bearer/pkg/tracing/tracing.go +++ b/extensions/auth-bearer/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/auth-machine/pkg/tracing/tracing.go b/extensions/auth-machine/pkg/tracing/tracing.go index 87da6d0892..3536995a76 100644 --- a/extensions/auth-machine/pkg/tracing/tracing.go +++ b/extensions/auth-machine/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/frontend/pkg/tracing/tracing.go b/extensions/frontend/pkg/tracing/tracing.go index c6490616bf..8ce5814dfc 100644 --- a/extensions/frontend/pkg/tracing/tracing.go +++ b/extensions/frontend/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/gateway/pkg/tracing/tracing.go b/extensions/gateway/pkg/tracing/tracing.go index 5f1af28563..cdc355b20d 100644 --- a/extensions/gateway/pkg/tracing/tracing.go +++ b/extensions/gateway/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/group/pkg/tracing/tracing.go b/extensions/group/pkg/tracing/tracing.go index c28e13c7bd..af58cbf4f9 100644 --- a/extensions/group/pkg/tracing/tracing.go +++ b/extensions/group/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the group service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/ocdav/pkg/tracing/tracing.go b/extensions/ocdav/pkg/tracing/tracing.go index 45fc03ba67..adcb593161 100644 --- a/extensions/ocdav/pkg/tracing/tracing.go +++ b/extensions/ocdav/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/sharing/pkg/tracing/tracing.go b/extensions/sharing/pkg/tracing/tracing.go index 443fbc88c6..55a39d9ffc 100644 --- a/extensions/sharing/pkg/tracing/tracing.go +++ b/extensions/sharing/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/storage-metadata/pkg/tracing/tracing.go b/extensions/storage-metadata/pkg/tracing/tracing.go index 49a96c8451..540715bfb9 100644 --- a/extensions/storage-metadata/pkg/tracing/tracing.go +++ b/extensions/storage-metadata/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/storage-publiclink/pkg/tracing/tracing.go b/extensions/storage-publiclink/pkg/tracing/tracing.go index 753c732c60..7c3c1bb60d 100644 --- a/extensions/storage-publiclink/pkg/tracing/tracing.go +++ b/extensions/storage-publiclink/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/storage-shares/pkg/tracing/tracing.go b/extensions/storage-shares/pkg/tracing/tracing.go index 16a443b084..3ba5dbbc40 100644 --- a/extensions/storage-shares/pkg/tracing/tracing.go +++ b/extensions/storage-shares/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/storage-users/pkg/tracing/tracing.go b/extensions/storage-users/pkg/tracing/tracing.go index 8e69e85058..d0bcbb5538 100644 --- a/extensions/storage-users/pkg/tracing/tracing.go +++ b/extensions/storage-users/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) diff --git a/extensions/user/pkg/tracing/tracing.go b/extensions/user/pkg/tracing/tracing.go index 497f15ed61..836d0516c1 100644 --- a/extensions/user/pkg/tracing/tracing.go +++ b/extensions/user/pkg/tracing/tracing.go @@ -8,7 +8,7 @@ import ( ) var ( - // TraceProvider is the global trace provider for the proxy service. + // TraceProvider is the global trace provider for the service. TraceProvider = trace.NewNoopTracerProvider() ) From 2c49a47d661f19f47085a9f495b424dc5e473521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 17:50:40 +0200 Subject: [PATCH 41/50] fix misnamed owncloudsql driver --- extensions/storage-metadata/pkg/command/root.go | 2 +- extensions/storage-publiclink/pkg/command/root.go | 6 +++--- extensions/storage-users/pkg/config/config.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/storage-metadata/pkg/command/root.go b/extensions/storage-metadata/pkg/command/root.go index c64d6dcc0f..a76ba2e082 100644 --- a/extensions/storage-metadata/pkg/command/root.go +++ b/extensions/storage-metadata/pkg/command/root.go @@ -25,7 +25,7 @@ func GetCommands(cfg *config.Config) cli.Commands { } } -// Execute is the entry point for the ocis-storage-metadata command. +// Execute is the entry point for the storage-metadata command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ Name: "storage-metadata", diff --git a/extensions/storage-publiclink/pkg/command/root.go b/extensions/storage-publiclink/pkg/command/root.go index 0d1081585b..87cb0586c6 100644 --- a/extensions/storage-publiclink/pkg/command/root.go +++ b/extensions/storage-publiclink/pkg/command/root.go @@ -25,11 +25,11 @@ func GetCommands(cfg *config.Config) cli.Commands { } } -// Execute is the entry point for the ocis-accounts command. +// Execute is the entry point for the storage-publiclink command. func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ - Name: "appprovider", - Usage: "Provide apps for oCIS", + Name: "storage-publiclink", + Usage: "Provide publiclink storage for oCIS", Commands: GetCommands(cfg), }) diff --git a/extensions/storage-users/pkg/config/config.go b/extensions/storage-users/pkg/config/config.go index 0d886d0456..59f95849cc 100644 --- a/extensions/storage-users/pkg/config/config.go +++ b/extensions/storage-users/pkg/config/config.go @@ -75,7 +75,7 @@ type HTTPConfig struct { type Drivers struct { OCIS OCISDriver `yaml:"ocis"` S3NG S3NGDriver `yaml:"s3ng"` - OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` + OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloudsql"` S3 S3Driver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs EOS EOSDriver `yaml:",omitempty"` // not supported by the oCIS product, therefore not part of docs From 68ccfa39f3dfce6f077b36da90521044aa4ab723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 17:59:32 +0200 Subject: [PATCH 42/50] owncloudsql driver typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- extensions/auth-basic/pkg/config/config.go | 2 +- extensions/group/pkg/config/config.go | 2 +- extensions/user/pkg/config/config.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/auth-basic/pkg/config/config.go b/extensions/auth-basic/pkg/config/config.go index e8d592ba1f..b09148fb13 100644 --- a/extensions/auth-basic/pkg/config/config.go +++ b/extensions/auth-basic/pkg/config/config.go @@ -58,7 +58,7 @@ type GRPCConfig struct { type AuthProviders struct { LDAP LDAPProvider `yaml:"ldap"` - OwnCloudSQL OwnCloudSQLProvider `yaml:"owncloud_sql"` + OwnCloudSQL OwnCloudSQLProvider `yaml:"owncloudsql"` JSON JSONProvider `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs } diff --git a/extensions/group/pkg/config/config.go b/extensions/group/pkg/config/config.go index def9387c9b..a8861c962d 100644 --- a/extensions/group/pkg/config/config.go +++ b/extensions/group/pkg/config/config.go @@ -60,7 +60,7 @@ type GRPCConfig struct { type Drivers struct { LDAP LDAPDriver `yaml:"ldap"` - OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` + OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloudsql"` JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go index 24df40c5ee..c044b2adab 100644 --- a/extensions/user/pkg/config/config.go +++ b/extensions/user/pkg/config/config.go @@ -60,7 +60,7 @@ type GRPCConfig struct { type Drivers struct { LDAP LDAPDriver `yaml:"ldap"` - OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloud_sql"` + OwnCloudSQL OwnCloudSQLDriver `yaml:"owncloudsql"` JSON JSONDriver `yaml:"json,omitempty"` // not supported by the oCIS product, therefore not part of docs REST RESTProvider `yaml:"rest,omitempty"` // not supported by the oCIS product, therefore not part of docs From 201722a88f034ac400a8ce408cd778d5cdc0b8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 18:04:10 +0200 Subject: [PATCH 43/50] Update extensions/storage-metadata/pkg/command/root.go --- extensions/storage-metadata/pkg/command/root.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/storage-metadata/pkg/command/root.go b/extensions/storage-metadata/pkg/command/root.go index a76ba2e082..c1949566f6 100644 --- a/extensions/storage-metadata/pkg/command/root.go +++ b/extensions/storage-metadata/pkg/command/root.go @@ -29,7 +29,7 @@ func GetCommands(cfg *config.Config) cli.Commands { func Execute(cfg *config.Config) error { app := clihelper.DefaultApp(&cli.App{ Name: "storage-metadata", - Usage: "Provide apps for oCIS", + Usage: "Provide metadata storage for oCIS", Commands: GetCommands(cfg), }) From e32f909b8205e56c8fbc1950db6ca8d167f3b364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 16:08:07 +0000 Subject: [PATCH 44/50] oc10-sql -> owncloudsql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- extensions/sharing/pkg/revaconfig/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/sharing/pkg/revaconfig/config.go b/extensions/sharing/pkg/revaconfig/config.go index a7c8710e78..07cec047f2 100644 --- a/extensions/sharing/pkg/revaconfig/config.go +++ b/extensions/sharing/pkg/revaconfig/config.go @@ -40,7 +40,7 @@ func SharingConfigFromStruct(cfg *config.Config) map[string]interface{} { "enable_expired_shares_cleanup": cfg.UserSharingDrivers.SQL.EnableExpiredSharesCleanup, "janitor_run_interval": cfg.UserSharingDrivers.SQL.JanitorRunInterval, }, - "oc10-sql": map[string]interface{}{ + "owncloudsql": map[string]interface{}{ "storage_mount_id": cfg.UserSharingDrivers.SQL.UserStorageMountID, "db_username": cfg.UserSharingDrivers.SQL.DBUsername, "db_password": cfg.UserSharingDrivers.SQL.DBPassword, @@ -73,7 +73,7 @@ func SharingConfigFromStruct(cfg *config.Config) map[string]interface{} { "enable_expired_shares_cleanup": cfg.PublicSharingDrivers.SQL.EnableExpiredSharesCleanup, "janitor_run_interval": cfg.PublicSharingDrivers.SQL.JanitorRunInterval, }, - "oc10-sql": map[string]interface{}{ + "owncloudsql": map[string]interface{}{ "storage_mount_id": cfg.PublicSharingDrivers.SQL.UserStorageMountID, "db_username": cfg.PublicSharingDrivers.SQL.DBUsername, "db_password": cfg.PublicSharingDrivers.SQL.DBPassword, From 5bf8f254e15427cf2a90837160c9e02a78620bdd Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 18:40:55 +0200 Subject: [PATCH 45/50] expose owncloudsql sharing driver --- extensions/sharing/pkg/config/config.go | 20 ++++++++++++++---- extensions/sharing/pkg/revaconfig/config.go | 23 ++++++--------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/extensions/sharing/pkg/config/config.go b/extensions/sharing/pkg/config/config.go index 8c0ab68a16..553ba05ec7 100644 --- a/extensions/sharing/pkg/config/config.go +++ b/extensions/sharing/pkg/config/config.go @@ -61,9 +61,11 @@ type GRPCConfig struct { } type UserSharingDrivers struct { - JSON UserSharingJSONDriver `yaml:"json"` - CS3 UserSharingCS3Driver `yaml:"cs3"` - SQL UserSharingSQLDriver `yaml:"sql,omitempty"` // not supported by the oCIS product, therefore not part of docs + JSON UserSharingJSONDriver `yaml:"json"` + CS3 UserSharingCS3Driver `yaml:"cs3"` + OwnCloudSQL UserSharingOwnCloudSQLDriver `yaml:"owncloudsql"` + + SQL UserSharingSQLDriver `yaml:"sql,omitempty"` // not supported by the oCIS product, therefore not part of docs } type UserSharingJSONDriver struct { @@ -82,6 +84,15 @@ type UserSharingSQLDriver struct { UserStorageMountID string `yaml:"user_storage_mount_id"` } +type UserSharingOwnCloudSQLDriver struct { + DBUsername string `yaml:"db_username" env:"SHARING_USER_OWNCLOUDSQL_DB_USERNAME"` + DBPassword string `yaml:"db_password" env:"SHARING_USER_OWNCLOUDSQL_DB_PASSWORD"` + DBHost string `yaml:"db_host" env:"SHARING_USER_OWNCLOUDSQL_DB_HOST"` + DBPort int `yaml:"db_port" env:"SHARING_USER_OWNCLOUDSQL_DB_PORT"` + DBName string `yaml:"db_name" env:"SHARING_USER_OWNCLOUDSQL_DB_NAME"` + UserStorageMountID string `yaml:"user_storage_mount_id" env:"SHARING_USER_OWNCLOUDSQL_USER_STORAGE_MOUNT_ID"` +} + type UserSharingCS3Driver struct { ProviderAddr string `yaml:"provider_addr" env:"SHARING_USER_CS3_PROVIDER_ADDR"` ServiceUserID string `yaml:"service_user_id" env:"SHARING_USER_CS3_SERVICE_USER_ID"` @@ -92,7 +103,8 @@ type UserSharingCS3Driver struct { type PublicSharingDrivers struct { JSON PublicSharingJSONDriver `yaml:"json"` CS3 PublicSharingCS3Driver `yaml:"cs3"` - SQL PublicSharingSQLDriver `yaml:"sql,omitempty"` // not supported by the oCIS product, therefore not part of docs + + SQL PublicSharingSQLDriver `yaml:"sql,omitempty"` // not supported by the oCIS product, therefore not part of docs } type PublicSharingJSONDriver struct { diff --git a/extensions/sharing/pkg/revaconfig/config.go b/extensions/sharing/pkg/revaconfig/config.go index 07cec047f2..00a8d3a251 100644 --- a/extensions/sharing/pkg/revaconfig/config.go +++ b/extensions/sharing/pkg/revaconfig/config.go @@ -41,12 +41,12 @@ func SharingConfigFromStruct(cfg *config.Config) map[string]interface{} { "janitor_run_interval": cfg.UserSharingDrivers.SQL.JanitorRunInterval, }, "owncloudsql": map[string]interface{}{ - "storage_mount_id": cfg.UserSharingDrivers.SQL.UserStorageMountID, - "db_username": cfg.UserSharingDrivers.SQL.DBUsername, - "db_password": cfg.UserSharingDrivers.SQL.DBPassword, - "db_host": cfg.UserSharingDrivers.SQL.DBHost, - "db_port": cfg.UserSharingDrivers.SQL.DBPort, - "db_name": cfg.UserSharingDrivers.SQL.DBName, + "storage_mount_id": cfg.UserSharingDrivers.OwnCloudSQL.UserStorageMountID, + "db_username": cfg.UserSharingDrivers.OwnCloudSQL.DBUsername, + "db_password": cfg.UserSharingDrivers.OwnCloudSQL.DBPassword, + "db_host": cfg.UserSharingDrivers.OwnCloudSQL.DBHost, + "db_port": cfg.UserSharingDrivers.OwnCloudSQL.DBPort, + "db_name": cfg.UserSharingDrivers.OwnCloudSQL.DBName, }, "cs3": map[string]interface{}{ "provider_addr": cfg.UserSharingDrivers.CS3.ProviderAddr, @@ -73,17 +73,6 @@ func SharingConfigFromStruct(cfg *config.Config) map[string]interface{} { "enable_expired_shares_cleanup": cfg.PublicSharingDrivers.SQL.EnableExpiredSharesCleanup, "janitor_run_interval": cfg.PublicSharingDrivers.SQL.JanitorRunInterval, }, - "owncloudsql": map[string]interface{}{ - "storage_mount_id": cfg.PublicSharingDrivers.SQL.UserStorageMountID, - "db_username": cfg.PublicSharingDrivers.SQL.DBUsername, - "db_password": cfg.PublicSharingDrivers.SQL.DBPassword, - "db_host": cfg.PublicSharingDrivers.SQL.DBHost, - "db_port": cfg.PublicSharingDrivers.SQL.DBPort, - "db_name": cfg.PublicSharingDrivers.SQL.DBName, - "password_hash_cost": cfg.PublicSharingDrivers.SQL.PasswordHashCost, - "enable_expired_shares_cleanup": cfg.PublicSharingDrivers.SQL.EnableExpiredSharesCleanup, - "janitor_run_interval": cfg.PublicSharingDrivers.SQL.JanitorRunInterval, - }, "cs3": map[string]interface{}{ "provider_addr": cfg.PublicSharingDrivers.CS3.ProviderAddr, "service_user_id": cfg.PublicSharingDrivers.CS3.ServiceUserID, From 90e0eb47cbba3d7844120ba4911e8fe2ddfcc657 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 18:44:15 +0200 Subject: [PATCH 46/50] update owncloudsql sharing settings in CI --- .drone.star | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.drone.star b/.drone.star index d46a20100e..283dbe4e65 100644 --- a/.drone.star +++ b/.drone.star @@ -1790,11 +1790,11 @@ def ocisServer(storage, accounts_hash_difficulty = 4, volumes = [], depends_on = "STORAGE_USERS_DRIVER_OWNCLOUDSQL_REDIS_ADDR": "redis:6379", # ownCloudSQL sharing driver "SHARING_USER_DRIVER": "owncloudsql", - "SHARING_USER_SQL_USERNAME": "owncloud", - "SHARING_USER_SQL_PASSWORD": "owncloud", - "SHARING_USER_SQL_HOST": "oc10-db", - "SHARING_USER_SQL_PORT": 3306, - "SHARING_USER_SQL_NAME": "owncloud", + "SHARING_USER_OWNCLOUDSQL_DB_USERNAME": "owncloud", + "SHARING_USER_OWNCLOUDSQL_DB_PASSWORD": "owncloud", + "SHARING_USER_OWNCLOUDSQL_DB_HOST": "oc10-db", + "SHARING_USER_OWNCLOUDSQL_DB_PORT": 3306, + "SHARING_USER_OWNCLOUDSQL_DB_NAME": "owncloud", # General oCIS config # OCIS_RUN_EXTENSIONS specifies to start all extensions except glauth, idp and accounts. These are replaced by external services "OCIS_RUN_EXTENSIONS": "settings,storage-metadata,graph,graph-explorer,ocs,store,thumbnails,web,webdav,frontend,gateway,user,group,auth-basic,auth-bearer,auth-machine,storage-users,storage-shares,storage-publiclink,appprovider,sharing,proxy,nats,ocdav", From e14952a0afbb1cbd49ae91e497c3a7f3bdd610df Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 18:47:58 +0200 Subject: [PATCH 47/50] update environment variables for parallel deployment in CI --- .drone.star | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/.drone.star b/.drone.star index 283dbe4e65..07946b118f 100644 --- a/.drone.star +++ b/.drone.star @@ -1776,18 +1776,14 @@ def ocisServer(storage, accounts_hash_difficulty = 4, volumes = [], depends_on = "LDAP_LOGIN_ATTRIBUTES": "uid,mail", # ownCloudSQL storage driver "STORAGE_USERS_DRIVER": "owncloudsql", - "STORAGE_METADATA_DRIVER": "ocis", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_DATADIR": "/mnt/data/files", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_UPLOADINFO_DIR": "/tmp", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_SHARE_FOLDER": "/Shares", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_LAYOUT": "{{.Username}}", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBUSERNAME": "owncloud", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBPASSWORD": "owncloud", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBHOST": "oc10-db", - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBPORT": 3306, - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_DBNAME": "owncloud", - # TODO: redis is not yet supported - "STORAGE_USERS_DRIVER_OWNCLOUDSQL_REDIS_ADDR": "redis:6379", + "STORAGE_USERS_OWNCLOUDSQL_DATADIR": "/mnt/data/files", + "STORAGE_USERS_OWNCLOUDSQL_SHARE_FOLDER": "/Shares", + "STORAGE_USERS_OWNCLOUDSQL_LAYOUT": "{{.Username}}", + "STORAGE_USERS_OWNCLOUDSQL_DB_USERNAME": "owncloud", + "STORAGE_USERS_OWNCLOUDSQL_DB_PASSWORD": "owncloud", + "STORAGE_USERS_OWNCLOUDSQL_DB_HOST": "oc10-db", + "STORAGE_USERS_OWNCLOUDSQL_DB_PORT": 3306, + "STORAGE_USERS_OWNCLOUDSQL_DB_NAME": "owncloud", # ownCloudSQL sharing driver "SHARING_USER_DRIVER": "owncloudsql", "SHARING_USER_OWNCLOUDSQL_DB_USERNAME": "owncloud", @@ -2373,8 +2369,7 @@ def parallelDeployAcceptancePipeline(ctx): parallelAcceptance(environment) + failEarly(ctx, early_fail), "services": oc10DbService() + - ldapService() + - redis(), + ldapService(), "volumes": [ pipeOC10TemplatesVol, pipeOC10PreServerVol, From 231041737b8fb7c4a98985cd891a0027bb5fd24b Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Tue, 3 May 2022 19:10:32 +0200 Subject: [PATCH 48/50] reintroduce redis in ci --- .drone.star | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.drone.star b/.drone.star index f6935cce1b..4a19b924bc 100644 --- a/.drone.star +++ b/.drone.star @@ -2293,7 +2293,8 @@ def parallelDeployAcceptancePipeline(ctx): parallelAcceptance(environment) + failEarly(ctx, early_fail), "services": oc10DbService() + - ldapService(), + ldapService() + + redis(), "volumes": [ pipeOC10TemplatesVol, pipeOC10PreServerVol, From 39cc17bb36125bcbe0f867e5a576935dcd984d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 18:55:28 +0000 Subject: [PATCH 49/50] fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- .../features/apiWebdavOperations/downloadFile.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/parallelDeployAcceptance/features/apiWebdavOperations/downloadFile.feature b/tests/parallelDeployAcceptance/features/apiWebdavOperations/downloadFile.feature index 1db4f76b9c..acd824aa02 100644 --- a/tests/parallelDeployAcceptance/features/apiWebdavOperations/downloadFile.feature +++ b/tests/parallelDeployAcceptance/features/apiWebdavOperations/downloadFile.feature @@ -2,7 +2,7 @@ Feature: download file As a user I want to be able to download files - So that I can work wih local copies of files on my client system + So that I can work with local copies of files on my client system Background: Given using "oc10" as owncloud selector From 3d2c80432fbe1817313a6636df9bbe9b375aa297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 May 2022 18:56:01 +0000 Subject: [PATCH 50/50] Revert "reenable parallel deployment tests" This reverts commit f588e90e23c4c33f890b86f83ba17efc2d03ad7d. --- .drone.star | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.drone.star b/.drone.star index 4a19b924bc..874a370376 100644 --- a/.drone.star +++ b/.drone.star @@ -110,7 +110,9 @@ config = { "suites": [ "apiShareManagement", ], - "skip": False, + # The tests fail after the storage config changes + # They will be fixed later. + "skip": True, "earlyFail": True, "cron": "nightly", }, @@ -118,7 +120,9 @@ config = { "suites": [ "apiWebdavOperations", ], - "skip": False, + # The tests fail after the storage config changes + # They will be fixed later. + "skip": True, "earlyFail": True, "cron": "nightly", },