diff --git a/internal/constants/constants.go b/internal/constants/constants.go index fcd9821..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" @@ -187,6 +193,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 a7dcc9b..b0b5a78 100644 --- a/internal/manage/actions/action/action.go +++ b/internal/manage/actions/action/action.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "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" @@ -42,14 +43,14 @@ 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", "", "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.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") - 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 c2668c8..2a1e939 100644 --- a/internal/manage/actions/createuser/createuser.go +++ b/internal/manage/actions/createuser/createuser.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "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" @@ -42,14 +43,14 @@ 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", "", "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.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") - 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/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") diff --git a/internal/manage/actions/initialdata/initialdata.go b/internal/manage/actions/initialdata/initialdata.go index 62e2cab..3f3ad3d 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,13 +46,11 @@ 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", "", "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") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") _ = cmd.MarkFlagRequired("superadmin-password-file") cmd.RunE = func(cmd *cobra.Command, args []string) error { @@ -59,6 +58,9 @@ func Cmd() *cobra.Command { 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 d4773ef..19daafe 100644 --- a/internal/manage/actions/migrations/migrations.go +++ b/internal/manage/actions/migrations/migrations.go @@ -112,11 +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 (required)") - passwordFile := cmd.Flags().String("password-file", "", "file with password for authorization (required)") - - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") + 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 { @@ -125,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 fde5945..4fb4d72 100644 --- a/internal/manage/actions/set/set.go +++ b/internal/manage/actions/set/set.go @@ -6,6 +6,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" @@ -58,14 +59,14 @@ 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", "", "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.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") - 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 848d97c..a4815ca 100644 --- a/internal/manage/actions/setpassword/setpassword.go +++ b/internal/manage/actions/setpassword/setpassword.go @@ -5,6 +5,7 @@ import ( "fmt" "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" @@ -25,13 +26,11 @@ 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", "", "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)") - _ = cmd.MarkFlagRequired("address") - _ = cmd.MarkFlagRequired("password-file") _ = cmd.MarkFlagRequired("user_id") _ = cmd.MarkFlagRequired("password") @@ -43,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 +}