From 4f5281bd85732616a3c43af45eef7a7cf53d734b Mon Sep 17 00:00:00 2001 From: Adrian Richter Date: Wed, 13 May 2026 15:14:34 +0200 Subject: [PATCH 1/6] Make --address, --password-file settable from env --- internal/manage/actions/action/action.go | 13 +++++++++++-- internal/manage/actions/createuser/createuser.go | 13 +++++++++++-- internal/manage/actions/initialdata/initialdata.go | 12 ++++++++++-- internal/manage/actions/migrations/migrations.go | 13 +++++++++++-- internal/manage/actions/set/set.go | 13 +++++++++++-- internal/manage/actions/setpassword/setpassword.go | 13 +++++++++++-- 6 files changed, 65 insertions(+), 12 deletions(-) diff --git a/internal/manage/actions/action/action.go b/internal/manage/actions/action/action.go index a7dcc9b..4f3eb00 100644 --- a/internal/manage/actions/action/action.go +++ b/internal/manage/actions/action/action.go @@ -3,6 +3,7 @@ package action import ( "encoding/json" "fmt" + "os" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" @@ -46,8 +47,16 @@ func Cmd() *cobra.Command { passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { + address = &addressEnv + } else { + _ = cmd.MarkFlagRequired("address") + } + if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { + passwordFile = &passwordFileEnv + } else { + _ = cmd.MarkFlagRequired("password-file") + } cmd.RunE = func(cmd *cobra.Command, args []string) error { logger.Info("=== ACTION ===") diff --git a/internal/manage/actions/createuser/createuser.go b/internal/manage/actions/createuser/createuser.go index c2668c8..43fdb5b 100644 --- a/internal/manage/actions/createuser/createuser.go +++ b/internal/manage/actions/createuser/createuser.go @@ -3,6 +3,7 @@ package createuser import ( "encoding/json" "fmt" + "os" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" @@ -46,8 +47,16 @@ func Cmd() *cobra.Command { passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") userFile := cmd.Flags().StringP("file", "f", "", "JSON file with user data, or - for stdin") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { + address = &addressEnv + } else { + _ = cmd.MarkFlagRequired("address") + } + if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { + passwordFile = &passwordFileEnv + } else { + _ = cmd.MarkFlagRequired("password-file") + } cmd.RunE = func(cmd *cobra.Command, args []string) error { logger.Info("=== CREATE USER ===") diff --git a/internal/manage/actions/initialdata/initialdata.go b/internal/manage/actions/initialdata/initialdata.go index 62e2cab..09248b6 100644 --- a/internal/manage/actions/initialdata/initialdata.go +++ b/internal/manage/actions/initialdata/initialdata.go @@ -50,8 +50,16 @@ func Cmd() *cobra.Command { superadminPasswordFile := cmd.Flags().String("superadmin-password-file", "", "file with superadmin password (required)") dataFile := cmd.Flags().StringP("file", "f", "", "JSON file with initial data, or - for stdin") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { + address = &addressEnv + } else { + _ = cmd.MarkFlagRequired("address") + } + if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { + passwordFile = &passwordFileEnv + } else { + _ = cmd.MarkFlagRequired("password-file") + } _ = cmd.MarkFlagRequired("superadmin-password-file") cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/migrations/migrations.go b/internal/manage/actions/migrations/migrations.go index d4773ef..98afc8e 100644 --- a/internal/manage/actions/migrations/migrations.go +++ b/internal/manage/actions/migrations/migrations.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "os" "strings" "time" @@ -115,8 +116,16 @@ func createMigrationCmd(name, description string, withProgressTracking bool) *co address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { + address = &addressEnv + } else { + _ = cmd.MarkFlagRequired("address") + } + if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { + passwordFile = &passwordFileEnv + } else { + _ = cmd.MarkFlagRequired("password-file") + } var progressInterval *time.Duration if withProgressTracking { diff --git a/internal/manage/actions/set/set.go b/internal/manage/actions/set/set.go index fde5945..2ca1e3f 100644 --- a/internal/manage/actions/set/set.go +++ b/internal/manage/actions/set/set.go @@ -3,6 +3,7 @@ package set import ( "encoding/json" "fmt" + "os" "sort" "strings" @@ -62,8 +63,16 @@ func Cmd() *cobra.Command { passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { + address = &addressEnv + } else { + _ = cmd.MarkFlagRequired("address") + } + if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { + passwordFile = &passwordFileEnv + } else { + _ = cmd.MarkFlagRequired("password-file") + } cmd.RunE = func(cmd *cobra.Command, args []string) error { logger.Info("=== SET ACTION ===") diff --git a/internal/manage/actions/setpassword/setpassword.go b/internal/manage/actions/setpassword/setpassword.go index 848d97c..4f105c4 100644 --- a/internal/manage/actions/setpassword/setpassword.go +++ b/internal/manage/actions/setpassword/setpassword.go @@ -3,6 +3,7 @@ package setpassword import ( "encoding/json" "fmt" + "os" "strings" "github.com/OpenSlides/openslides-cli/internal/logger" @@ -30,8 +31,16 @@ func Cmd() *cobra.Command { password := cmd.Flags().StringP("password", "p", "", "new password of the user (required)") userID := cmd.Flags().Int64P("user_id", "u", 0, "ID of the user account (required)") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { + address = &addressEnv + } else { + _ = cmd.MarkFlagRequired("address") + } + if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { + passwordFile = &passwordFileEnv + } else { + _ = cmd.MarkFlagRequired("password-file") + } _ = cmd.MarkFlagRequired("user_id") _ = cmd.MarkFlagRequired("password") From ebf5069e6af3605884d93ed0f711d1d302287241 Mon Sep 17 00:00:00 2001 From: Adrian Richter Date: Fri, 15 May 2026 15:56:35 +0200 Subject: [PATCH 2/6] Analogous change for --postgres-* flags --- internal/manage/actions/get/get.go | 32 ++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/internal/manage/actions/get/get.go b/internal/manage/actions/get/get.go index 5918dbd..1e49914 100644 --- a/internal/manage/actions/get/get.go +++ b/internal/manage/actions/get/get.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "os" "reflect" "regexp" "strconv" @@ -94,12 +95,31 @@ func Cmd() *cobra.Command { postgresDatabase := cmd.Flags().String("postgres-database", "", "PostgreSQL database (required)") postgresPasswordFile := cmd.Flags().String("postgres-password-file", "", "PostgreSQL password file (required)") - // Mark PostgreSQL flags as required - _ = cmd.MarkFlagRequired("postgres-host") - _ = cmd.MarkFlagRequired("postgres-port") - _ = cmd.MarkFlagRequired("postgres-user") - _ = cmd.MarkFlagRequired("postgres-database") - _ = cmd.MarkFlagRequired("postgres-password-file") + if postgresHostEnv := os.Getenv("OSMANAGE_POSTGRES_HOST"); postgresHostEnv != "" { + postgresHost = &postgresHostEnv + } else { + _ = cmd.MarkFlagRequired("postgres-host") + } + if postgresPortEnv := os.Getenv("OSMANAGE_POSTGRES_PORT"); postgresPortEnv != "" { + postgresPort = &postgresPortEnv + } else { + _ = cmd.MarkFlagRequired("postgres-port") + } + if postgresUserEnv := os.Getenv("OSMANAGE_POSTGRES_USER"); postgresUserEnv != "" { + postgresUser = &postgresUserEnv + } else { + _ = cmd.MarkFlagRequired("postgres-user") + } + if postgresDatabaseEnv := os.Getenv("OSMANAGE_POSTGRES_DATABASE"); postgresDatabaseEnv != "" { + postgresDatabase = &postgresDatabaseEnv + } else { + _ = cmd.MarkFlagRequired("postgres-database") + } + if postgresPasswordFileEnv := os.Getenv("OSMANAGE_POSTGRES_PASSWORD_FILE"); postgresPasswordFileEnv != "" { + postgresPasswordFile = &postgresPasswordFileEnv + } else { + _ = cmd.MarkFlagRequired("postgres-password-file") + } // Query flags fields := cmd.Flags().StringSlice("fields", nil, "only include the provided fields in output") From 30897372ef868ca5649f6aeb23e0cd2891bd6b6a Mon Sep 17 00:00:00 2001 From: Adrian Richter Date: Fri, 22 May 2026 21:40:44 +0200 Subject: [PATCH 3/6] Add defaults for address and passwordFile --- internal/constants/constants.go | 10 ++++++++++ internal/manage/actions/action/action.go | 9 +++------ internal/manage/actions/createuser/createuser.go | 9 +++------ internal/manage/actions/initialdata/initialdata.go | 10 +++------- internal/manage/actions/migrations/migrations.go | 8 ++------ internal/manage/actions/set/set.go | 9 +++------ internal/manage/actions/setpassword/setpassword.go | 10 ++++------ 7 files changed, 28 insertions(+), 37 deletions(-) diff --git a/internal/constants/constants.go b/internal/constants/constants.go index fcd9821..11526be 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -187,6 +187,16 @@ const ( DefaultOrganizationFields string = "id,name" ) +// Connect flags defaults +const ( + // DefaultBackendManageAddress is the default address for reaching backendManage + DefaultBackendManageAddress = "localhost:9002" + + // DefaultPasswordFile is the default file read when authenticating to backendManage + // TODO : const + "/" + const + DefaultPasswordFile = "secrets/internal_auth_password" +) + // Migration command defaults and configuration const ( // DefaultMigrationProgressInterval is the default interval for checking migration progress diff --git a/internal/manage/actions/action/action.go b/internal/manage/actions/action/action.go index 4f3eb00..d01c226 100644 --- a/internal/manage/actions/action/action.go +++ b/internal/manage/actions/action/action.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" "github.com/OpenSlides/openslides-cli/internal/utils" @@ -43,19 +44,15 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(1, 2), } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") + passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { address = &addressEnv - } else { - _ = cmd.MarkFlagRequired("address") } if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { passwordFile = &passwordFileEnv - } else { - _ = cmd.MarkFlagRequired("password-file") } cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/createuser/createuser.go b/internal/manage/actions/createuser/createuser.go index 43fdb5b..691980d 100644 --- a/internal/manage/actions/createuser/createuser.go +++ b/internal/manage/actions/createuser/createuser.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" "github.com/OpenSlides/openslides-cli/internal/utils" @@ -43,19 +44,15 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(0, 1), } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") + passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") userFile := cmd.Flags().StringP("file", "f", "", "JSON file with user data, or - for stdin") if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { address = &addressEnv - } else { - _ = cmd.MarkFlagRequired("address") } if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { passwordFile = &passwordFileEnv - } else { - _ = cmd.MarkFlagRequired("password-file") } cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/initialdata/initialdata.go b/internal/manage/actions/initialdata/initialdata.go index 09248b6..9f6ec91 100644 --- a/internal/manage/actions/initialdata/initialdata.go +++ b/internal/manage/actions/initialdata/initialdata.go @@ -7,6 +7,7 @@ import ( "os" "strings" + "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" "github.com/OpenSlides/openslides-cli/internal/utils" @@ -45,22 +46,17 @@ func Cmd() *cobra.Command { Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") + passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") superadminPasswordFile := cmd.Flags().String("superadmin-password-file", "", "file with superadmin password (required)") dataFile := cmd.Flags().StringP("file", "f", "", "JSON file with initial data, or - for stdin") if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { address = &addressEnv - } else { - _ = cmd.MarkFlagRequired("address") } if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { passwordFile = &passwordFileEnv - } else { - _ = cmd.MarkFlagRequired("password-file") } - _ = cmd.MarkFlagRequired("superadmin-password-file") cmd.RunE = func(cmd *cobra.Command, args []string) error { if strings.TrimSpace(*superadminPasswordFile) == "" { diff --git a/internal/manage/actions/migrations/migrations.go b/internal/manage/actions/migrations/migrations.go index 98afc8e..e2b180a 100644 --- a/internal/manage/actions/migrations/migrations.go +++ b/internal/manage/actions/migrations/migrations.go @@ -113,18 +113,14 @@ func createMigrationCmd(name, description string, withProgressTracking bool) *co Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") + passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { address = &addressEnv - } else { - _ = cmd.MarkFlagRequired("address") } if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { passwordFile = &passwordFileEnv - } else { - _ = cmd.MarkFlagRequired("password-file") } var progressInterval *time.Duration diff --git a/internal/manage/actions/set/set.go b/internal/manage/actions/set/set.go index 2ca1e3f..eb15a37 100644 --- a/internal/manage/actions/set/set.go +++ b/internal/manage/actions/set/set.go @@ -7,6 +7,7 @@ import ( "sort" "strings" + "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" "github.com/OpenSlides/openslides-cli/internal/utils" @@ -59,19 +60,15 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(1, 2), } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") + passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { address = &addressEnv - } else { - _ = cmd.MarkFlagRequired("address") } if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { passwordFile = &passwordFileEnv - } else { - _ = cmd.MarkFlagRequired("password-file") } cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/setpassword/setpassword.go b/internal/manage/actions/setpassword/setpassword.go index 4f105c4..31fb76f 100644 --- a/internal/manage/actions/setpassword/setpassword.go +++ b/internal/manage/actions/setpassword/setpassword.go @@ -6,6 +6,7 @@ import ( "os" "strings" + "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" "github.com/OpenSlides/openslides-cli/internal/manage/client" "github.com/OpenSlides/openslides-cli/internal/utils" @@ -26,21 +27,18 @@ func Cmd() *cobra.Command { Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") + passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") password := cmd.Flags().StringP("password", "p", "", "new password of the user (required)") userID := cmd.Flags().Int64P("user_id", "u", 0, "ID of the user account (required)") if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { address = &addressEnv - } else { - _ = cmd.MarkFlagRequired("address") } if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { passwordFile = &passwordFileEnv - } else { - _ = cmd.MarkFlagRequired("password-file") } + _ = cmd.MarkFlagRequired("user_id") _ = cmd.MarkFlagRequired("password") From a249f8acc8eccee635354a09f540d56df64a0ac2 Mon Sep 17 00:00:00 2001 From: Adrian Richter Date: Wed, 27 May 2026 16:49:23 +0200 Subject: [PATCH 4/6] Use utils function to calc value for -a and --p --- internal/constants/constants.go | 6 ++++++ internal/manage/actions/action/action.go | 15 +++++---------- internal/manage/actions/createuser/createuser.go | 15 +++++---------- .../manage/actions/initialdata/initialdata.go | 14 +++++--------- internal/manage/actions/migrations/migrations.go | 15 +++++---------- internal/manage/actions/set/set.go | 15 +++++---------- .../manage/actions/setpassword/setpassword.go | 15 +++++---------- internal/utils/utils.go | 14 ++++++++++++++ 8 files changed, 50 insertions(+), 59 deletions(-) diff --git a/internal/constants/constants.go b/internal/constants/constants.go index 11526be..7b70f3a 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -150,6 +150,12 @@ const ( // PostgreSQL datastore environment variable keys (used by get command) const ( + // EnvOsmanageBackendAddress is the environment variable for address to reach backendManage + EnvOsmanageBackendAddress string = "OSMANAGE_BACKEND_ADDRESS" + + // EnvOsmanageBackendPasswordFile is the environment variable for the password file read to authenticate to backendManage + EnvOsmanageBackendPasswordFile string = "OSMANAGE_BACKEND_PASSWORD_FILE" + // EnvDatabaseHost is the environment variable for PostgreSQL host EnvDatabaseHost string = "DATABASE_HOST" diff --git a/internal/manage/actions/action/action.go b/internal/manage/actions/action/action.go index d01c226..60ffb21 100644 --- a/internal/manage/actions/action/action.go +++ b/internal/manage/actions/action/action.go @@ -3,7 +3,6 @@ package action import ( "encoding/json" "fmt" - "os" "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" @@ -44,18 +43,14 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(1, 2), } - address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") - if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { - address = &addressEnv - } - if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { - passwordFile = &passwordFileEnv - } - cmd.RunE = func(cmd *cobra.Command, args []string) error { + utils.KeepValueOrEnvOrDefault(address, constants.EnvOsmanageBackendAddress, constants.DefaultBackendManageAddress) + utils.KeepValueOrEnvOrDefault(passwordFile, constants.EnvOsmanageBackendPasswordFile, constants.DefaultPasswordFile) + logger.Info("=== ACTION ===") actionName := args[0] diff --git a/internal/manage/actions/createuser/createuser.go b/internal/manage/actions/createuser/createuser.go index 691980d..9d1b7ae 100644 --- a/internal/manage/actions/createuser/createuser.go +++ b/internal/manage/actions/createuser/createuser.go @@ -3,7 +3,6 @@ package createuser import ( "encoding/json" "fmt" - "os" "github.com/OpenSlides/openslides-cli/internal/constants" "github.com/OpenSlides/openslides-cli/internal/logger" @@ -44,18 +43,14 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(0, 1), } - address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") userFile := cmd.Flags().StringP("file", "f", "", "JSON file with user data, or - for stdin") - if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { - address = &addressEnv - } - if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { - passwordFile = &passwordFileEnv - } - cmd.RunE = func(cmd *cobra.Command, args []string) error { + utils.KeepValueOrEnvOrDefault(address, constants.EnvOsmanageBackendAddress, constants.DefaultBackendManageAddress) + utils.KeepValueOrEnvOrDefault(passwordFile, constants.EnvOsmanageBackendPasswordFile, constants.DefaultPasswordFile) + logger.Info("=== CREATE USER ===") var input string diff --git a/internal/manage/actions/initialdata/initialdata.go b/internal/manage/actions/initialdata/initialdata.go index 9f6ec91..e980c56 100644 --- a/internal/manage/actions/initialdata/initialdata.go +++ b/internal/manage/actions/initialdata/initialdata.go @@ -46,23 +46,19 @@ func Cmd() *cobra.Command { Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") superadminPasswordFile := cmd.Flags().String("superadmin-password-file", "", "file with superadmin password (required)") dataFile := cmd.Flags().StringP("file", "f", "", "JSON file with initial data, or - for stdin") - if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { - address = &addressEnv - } - if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { - passwordFile = &passwordFileEnv - } - cmd.RunE = func(cmd *cobra.Command, args []string) error { if strings.TrimSpace(*superadminPasswordFile) == "" { return fmt.Errorf("--superadmin-password-file cannot be empty") } + utils.KeepValueOrEnvOrDefault(address, constants.EnvOsmanageBackendAddress, constants.DefaultBackendManageAddress) + utils.KeepValueOrEnvOrDefault(passwordFile, constants.EnvOsmanageBackendPasswordFile, constants.DefaultPasswordFile) + logger.Info("=== INITIAL DATA ===") var data []byte diff --git a/internal/manage/actions/migrations/migrations.go b/internal/manage/actions/migrations/migrations.go index e2b180a..ddabb2e 100644 --- a/internal/manage/actions/migrations/migrations.go +++ b/internal/manage/actions/migrations/migrations.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "os" "strings" "time" @@ -113,15 +112,8 @@ func createMigrationCmd(name, description string, withProgressTracking bool) *co Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") - - if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { - address = &addressEnv - } - if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { - passwordFile = &passwordFileEnv - } + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") var progressInterval *time.Duration if withProgressTracking { @@ -130,6 +122,9 @@ func createMigrationCmd(name, description string, withProgressTracking bool) *co } cmd.RunE = func(cmd *cobra.Command, args []string) error { + utils.KeepValueOrEnvOrDefault(address, constants.EnvOsmanageBackendAddress, constants.DefaultBackendManageAddress) + utils.KeepValueOrEnvOrDefault(passwordFile, constants.EnvOsmanageBackendPasswordFile, constants.DefaultPasswordFile) + logger.Info("=== MIGRATIONS: %s ===", strings.ToUpper(name)) authPassword, err := utils.ReadPassword(*passwordFile) diff --git a/internal/manage/actions/set/set.go b/internal/manage/actions/set/set.go index eb15a37..8a3e44f 100644 --- a/internal/manage/actions/set/set.go +++ b/internal/manage/actions/set/set.go @@ -3,7 +3,6 @@ package set import ( "encoding/json" "fmt" - "os" "sort" "strings" @@ -60,18 +59,14 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(1, 2), } - address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") - if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { - address = &addressEnv - } - if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { - passwordFile = &passwordFileEnv - } - cmd.RunE = func(cmd *cobra.Command, args []string) error { + utils.KeepValueOrEnvOrDefault(address, constants.EnvOsmanageBackendAddress, constants.DefaultBackendManageAddress) + utils.KeepValueOrEnvOrDefault(passwordFile, constants.EnvOsmanageBackendPasswordFile, constants.DefaultPasswordFile) + logger.Info("=== SET ACTION ===") action := args[0] diff --git a/internal/manage/actions/setpassword/setpassword.go b/internal/manage/actions/setpassword/setpassword.go index 31fb76f..0913ae0 100644 --- a/internal/manage/actions/setpassword/setpassword.go +++ b/internal/manage/actions/setpassword/setpassword.go @@ -3,7 +3,6 @@ package setpassword import ( "encoding/json" "fmt" - "os" "strings" "github.com/OpenSlides/openslides-cli/internal/constants" @@ -27,18 +26,11 @@ func Cmd() *cobra.Command { Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", constants.DefaultBackendManageAddress, "address of the OpenSlides backendManage service (required)") - passwordFile := cmd.Flags().String("password-file", constants.DefaultPasswordFile, "file with password for authorization (required)") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") password := cmd.Flags().StringP("password", "p", "", "new password of the user (required)") userID := cmd.Flags().Int64P("user_id", "u", 0, "ID of the user account (required)") - if addressEnv := os.Getenv("OSMANAGE_BACKEND_ADDRESS"); addressEnv != "" { - address = &addressEnv - } - if passwordFileEnv := os.Getenv("OSMANAGE_BACKEND_PASSWORD_FILE"); passwordFileEnv != "" { - passwordFile = &passwordFileEnv - } - _ = cmd.MarkFlagRequired("user_id") _ = cmd.MarkFlagRequired("password") @@ -50,6 +42,9 @@ func Cmd() *cobra.Command { return fmt.Errorf("--user_id cannot be empty or less than 1") } + utils.KeepValueOrEnvOrDefault(address, constants.EnvOsmanageBackendAddress, constants.DefaultBackendManageAddress) + utils.KeepValueOrEnvOrDefault(passwordFile, constants.EnvOsmanageBackendPasswordFile, constants.DefaultPasswordFile) + logger.Info("=== SET PASSWORD ===") logger.Debug("Setting password for user ID: %d", *userID) diff --git a/internal/utils/utils.go b/internal/utils/utils.go index 78bd432..f452a80 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -120,3 +120,17 @@ func IsYAMLFile(filename string) bool { ext := filepath.Ext(filename) return ext == ".yaml" || ext == ".yml" } + +// KeepValueOrEnvOrDefault sets value to value OR envValue OR defaultValue +func KeepValueOrEnvOrDefault(value *string, envVarName string, defaultValue string) { + if *value != "" { + return + } + + *value = os.Getenv(envVarName) + if *value != "" { + return + } + + *value = defaultValue +} From b6adec964921a3f9e7ca940ffce0165c609387e7 Mon Sep 17 00:00:00 2001 From: Adrian Richter Date: Wed, 27 May 2026 16:52:23 +0200 Subject: [PATCH 5/6] initialdata --superadmin-password-file IS required --- internal/manage/actions/initialdata/initialdata.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/manage/actions/initialdata/initialdata.go b/internal/manage/actions/initialdata/initialdata.go index e980c56..b07fd48 100644 --- a/internal/manage/actions/initialdata/initialdata.go +++ b/internal/manage/actions/initialdata/initialdata.go @@ -51,6 +51,8 @@ func Cmd() *cobra.Command { superadminPasswordFile := cmd.Flags().String("superadmin-password-file", "", "file with superadmin password (required)") dataFile := cmd.Flags().StringP("file", "f", "", "JSON file with initial data, or - for stdin") + _ = cmd.MarkFlagRequired("superadmin-password-file") + cmd.RunE = func(cmd *cobra.Command, args []string) error { if strings.TrimSpace(*superadminPasswordFile) == "" { return fmt.Errorf("--superadmin-password-file cannot be empty") From 0fb6aec7dfd5feea7b99cfb1bb58ef2aef844104 Mon Sep 17 00:00:00 2001 From: Adrian Richter Date: Wed, 27 May 2026 16:55:56 +0200 Subject: [PATCH 6/6] Format --- internal/manage/actions/action/action.go | 4 ++-- internal/manage/actions/createuser/createuser.go | 4 ++-- internal/manage/actions/initialdata/initialdata.go | 4 ++-- internal/manage/actions/migrations/migrations.go | 4 ++-- internal/manage/actions/set/set.go | 4 ++-- internal/manage/actions/setpassword/setpassword.go | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/manage/actions/action/action.go b/internal/manage/actions/action/action.go index 60ffb21..b0b5a78 100644 --- a/internal/manage/actions/action/action.go +++ b/internal/manage/actions/action/action.go @@ -43,8 +43,8 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(1, 2), } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: "+constants.DefaultBackendManageAddress+")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: "+constants.DefaultPasswordFile+")") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/createuser/createuser.go b/internal/manage/actions/createuser/createuser.go index 9d1b7ae..2a1e939 100644 --- a/internal/manage/actions/createuser/createuser.go +++ b/internal/manage/actions/createuser/createuser.go @@ -43,8 +43,8 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(0, 1), } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: "+constants.DefaultBackendManageAddress+")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: "+constants.DefaultPasswordFile+")") userFile := cmd.Flags().StringP("file", "f", "", "JSON file with user data, or - for stdin") cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/initialdata/initialdata.go b/internal/manage/actions/initialdata/initialdata.go index b07fd48..3f3ad3d 100644 --- a/internal/manage/actions/initialdata/initialdata.go +++ b/internal/manage/actions/initialdata/initialdata.go @@ -46,8 +46,8 @@ func Cmd() *cobra.Command { Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: "+constants.DefaultBackendManageAddress+")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: "+constants.DefaultPasswordFile+")") superadminPasswordFile := cmd.Flags().String("superadmin-password-file", "", "file with superadmin password (required)") dataFile := cmd.Flags().StringP("file", "f", "", "JSON file with initial data, or - for stdin") diff --git a/internal/manage/actions/migrations/migrations.go b/internal/manage/actions/migrations/migrations.go index ddabb2e..19daafe 100644 --- a/internal/manage/actions/migrations/migrations.go +++ b/internal/manage/actions/migrations/migrations.go @@ -112,8 +112,8 @@ func createMigrationCmd(name, description string, withProgressTracking bool) *co Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: "+constants.DefaultBackendManageAddress+")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: "+constants.DefaultPasswordFile+")") var progressInterval *time.Duration if withProgressTracking { diff --git a/internal/manage/actions/set/set.go b/internal/manage/actions/set/set.go index 8a3e44f..4fb4d72 100644 --- a/internal/manage/actions/set/set.go +++ b/internal/manage/actions/set/set.go @@ -59,8 +59,8 @@ func Cmd() *cobra.Command { Args: cobra.RangeArgs(1, 2), } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: "+constants.DefaultBackendManageAddress+")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: "+constants.DefaultPasswordFile+")") payloadFile := cmd.Flags().StringP("file", "f", "", "JSON file with the payload, or - for stdin") cmd.RunE = func(cmd *cobra.Command, args []string) error { diff --git a/internal/manage/actions/setpassword/setpassword.go b/internal/manage/actions/setpassword/setpassword.go index 0913ae0..a4815ca 100644 --- a/internal/manage/actions/setpassword/setpassword.go +++ b/internal/manage/actions/setpassword/setpassword.go @@ -26,8 +26,8 @@ func Cmd() *cobra.Command { Args: cobra.NoArgs, } - address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: " + constants.DefaultBackendManageAddress + ")") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: " + constants.DefaultPasswordFile + ")") + address := cmd.Flags().StringP("address", "a", "", "address of the OpenSlides backendManage service (default: "+constants.DefaultBackendManageAddress+")") + passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (default: "+constants.DefaultPasswordFile+")") password := cmd.Flags().StringP("password", "p", "", "new password of the user (required)") userID := cmd.Flags().Int64P("user_id", "u", 0, "ID of the user account (required)")