From fe4ba455ed7f5c0685ce928d5dec8ca1247736ac Mon Sep 17 00:00:00 2001 From: David Steele Date: Mon, 8 Mar 2021 16:01:05 -0500 Subject: [PATCH] Move configuration definition to src/build/config/config.yaml. Moving to YAML allows the configuration data to be read by C programs. Also go back to using YAML::XS since it is the only implementation that has proper boolean support. --- .cirrus.yml | 4 +- CONTRIBUTING.md | 4 +- .../lib/pgBackRestBuild/Config/BuildParse.pm | 6 +- build/lib/pgBackRestBuild/Config/Data.pm | 3329 +---------------- build/lib/pgBackRestBuild/Error/Data.pm | 4 +- doc/lib/pgBackRestDoc/Common/DocConfig.pm | 4 +- doc/xml/contributing.xml | 4 +- src/build/config/config.yaml | 1981 ++++++++++ test/Vagrantfile | 4 +- .../pgBackRestTest/Common/CodeCountTest.pm | 4 +- .../pgBackRestTest/Common/ContainerTest.pm | 4 +- test/lib/pgBackRestTest/Common/DefineTest.pm | 4 +- test/test.pl | 3 +- 13 files changed, 2067 insertions(+), 3288 deletions(-) create mode 100644 src/build/config/config.yaml diff --git a/.cirrus.yml b/.cirrus.yml index 01b7d3914..89c54f269 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -15,7 +15,7 @@ freebsd_12_task: cpu: 4 memory: 4G - install_script: pkg install -y git postgresql-libpqxx pkgconf libxml2 gmake perl5 p5-YAML rsync + install_script: pkg install -y git postgresql-libpqxx pkgconf libxml2 gmake perl5 p5-YAML-LibYAML rsync script: - perl ${CIRRUS_WORKING_DIR}/test/test.pl --no-gen --make-cmd=gmake --vm=none --vm-max=2 --no-coverage --no-valgrind --module=command --test=backup @@ -36,7 +36,7 @@ macos_catalina_task: install_script: - brew install -q openssl@1.1 libpq libxml2 cpanm - - cpanm --local-lib=/usr/local/opt/perl5 install YAML + - cpanm --local-lib=/usr/local/opt/perl5 install YAML::XS script: - ${CIRRUS_WORKING_DIR}/test/test.pl --no-gen --vm=none --vm-max=2 --no-coverage --no-valgrind --module=command --test=backup diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4dd39bbad..1624bd8a2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -170,13 +170,13 @@ Options can be added to a command or multiple commands. Options can be configura To add an option, two files need be to be modified: -- `build/lib/pgBackRestBuild/Config/Data.pm` +- `src/build/config/config.yaml` - `doc/xml/reference.xml` These files are discussed in the following sections. -### Data.pm +### `src/build/config/config.yaml` There is a detailed comment at the top of this file on the configuration definitions which one can refer to in determining how to define the rules for the option. diff --git a/build/lib/pgBackRestBuild/Config/BuildParse.pm b/build/lib/pgBackRestBuild/Config/BuildParse.pm index b6a887bf8..b98dee385 100644 --- a/build/lib/pgBackRestBuild/Config/BuildParse.pm +++ b/build/lib/pgBackRestBuild/Config/BuildParse.pm @@ -449,9 +449,9 @@ sub buildConfigParse my @stryOptionName = ($strOption); - if (defined($rhOption->{&CFGDEF_NAME_ALT})) + if (defined($rhOption->{&CFGDEF_DEPRECATE})) { - foreach my $strOptionNameAlt (sort(keys(%{$rhOption->{&CFGDEF_NAME_ALT}}))) + foreach my $strOptionNameAlt (sort(keys(%{$rhOption->{&CFGDEF_DEPRECATE}}))) { push(@stryOptionName, $strOptionNameAlt); } @@ -467,7 +467,7 @@ sub buildConfigParse for (my $iOptionNameIdx = 0; $iOptionNameIdx < @stryOptionName; $iOptionNameIdx++) { my $strOptionName = $stryOptionName[$iOptionNameIdx]; - my $rhNameAlt = $rhOption->{&CFGDEF_NAME_ALT}{$strOptionName}; + my $rhNameAlt = $rhOption->{&CFGDEF_DEPRECATE}{$strOptionName}; # Skip alt name if it is not valid for this option index if ($iOptionNameIdx > 0 && defined($rhNameAlt->{&CFGDEF_INDEX}) && $rhNameAlt->{&CFGDEF_INDEX} != $iOptionIdx) diff --git a/build/lib/pgBackRestBuild/Config/Data.pm b/build/lib/pgBackRestBuild/Config/Data.pm index a16759298..d65448dd9 100644 --- a/build/lib/pgBackRestBuild/Config/Data.pm +++ b/build/lib/pgBackRestBuild/Config/Data.pm @@ -1,79 +1,7 @@ #################################################################################################################################### # Configuration Definition Data # -# Contains the defines for options: which commands the option can/cannot be specified, for which commands it is required, default -# settings, types, ranges, whether the option is negatable, whether it has dependencies, etc. The initial section is the global -# section meaning the defines defined there apply to all commands listed for the option. -# -# CFGDEF_INHERIT: -# Inherit all definitions for the referenced option. Any definitions can be overridden. -# -# CFGDEF_COMMAND: -# List of commands the option can be used with this option. An empty hash signifies that the command does not deviate from the -# option defaults. Otherwise, overrides can be specified. -# -# If another option is referenced (e.g. CFGDEF_COMMAND => CFGOPT_REPO_TYPE) then the list of commands will be copied from the -# referenced option. -# -# NOTE: If the option (A) has a dependency on another option (B) then the CFGCMD_ must also be specified in the other option -# (B), else it will still error on the option (A). -# -# CFGDEF_COMMAND_ROLE: -# 1) Define the command roles for a command. CFGCMD_ROLE_DEFAULT is valid for all commands and is therefore added -# programmatically. -# -# 2) Define the command roles for an option. If not defined, the option will be valid for all roles of all commands for which it -# is valid. If command roles are defined for the option, then they override the roles for all commands for which the option -# is valid. CFGCMD_ROLE_DEFAULT must be defined explicitly in this case. For example, if an option is only valid for the -# default role and the async role for each command then CFGDEF_COMMAND_ROLE must list the CFGCMD_ROLE_DEFAULT and -# CFGCMD_ROLE_ASYNC, meaning each command has a default role so the option is valid for that role and for commands that have -# the async role, it is also valid for the async role of those commands. -# -# 3) Define the command roles for an option command override. If not defined, the option will be valid for all roles of the -# command or the roles specified by rule 2) above. CFGCMD_ROLE_DEFAULT must be defined explicitly in this case. If command -# roles are defined for the option command override, then they override command roles defined for the option (rule 2) above) -# and all roles defined for the command (rule 1) above). -# -# CFGDEF_REQUIRED: -# In global section: -# true - if the option does not have a default, then setting CFGDEF_REQUIRED in the global section means all commands -# listed in CFGDEF_COMMAND require the user to set it. -# false - no commands listed require it as an option but it can be set. This can be overridden for individual commands by -# setting CFGDEF_REQUIRED in the CFGDEF_COMMAND section. -# In CFGDEF_COMMAND section: -# true - the option must be set somehow for the command, either by default (CFGDEF_DEFAULT) or by the user. -# &CFGCMD_CHECK => -# { -# &CFGDEF_REQUIRED => true -# }, -# false - mainly used for overriding the CFGDEF_REQUIRED in the global section. -# -# CFGDEF_DEFAULT: -# Sets a default for the option for all commands if listed in the global section, or for specific commands if listed in the -# CFGDEF_COMMAND section. All boolean types require a default. -# -# CFGDEF_DEFAULT_LITERAL: -# If the default is a string output it as-is without quoting. This allows C defines to be used as defaults. -# -# CFGDEF_NEGATE: -# The option can be negated with "no" e.g. --no-compress. This applies to options that are only valid on the command line (i.e. -# no config section defined) and if not specifically defined, the default is false. All config file boolean options are -# automatically negatable. -# -# CFGDEF_RESET: -# The option can be reset to default even if the default is undefined. -# -# CFGDEF_DEPEND: -# Specify the dependencies this option has on another option. All commands listed for this option must also be listed in the -# dependent option(s). -# CFGDEF_DEPEND_LIST further defines the allowable settings for the depended option. -# -# CFGDEF_ALLOW_LIST: -# Lists the allowable settings for the option. -# -# CFGDEF_INTERNAL: -# Option is used by the command internally but is not exposed in the documentation. This is useful for commands that need to know -# where they are running by looking at other options in the config. Also good for test options. +# The configuration is defined in src/build/config/config.yaml, which also contains the documentation. #################################################################################################################################### package pgBackRestBuild::Config::Data; @@ -95,30 +23,14 @@ use pgBackRestDoc::ProjectInfo; use pgBackRestTest::Common::Wait; #################################################################################################################################### -# Command constants - commands that are allowed in the exe +# Command constants #################################################################################################################################### -use constant CFGCMD_ARCHIVE_GET => 'archive-get'; -use constant CFGCMD_ARCHIVE_PUSH => 'archive-push'; use constant CFGCMD_BACKUP => 'backup'; push @EXPORT, qw(CFGCMD_BACKUP); -use constant CFGCMD_CHECK => 'check'; -use constant CFGCMD_EXPIRE => 'expire'; use constant CFGCMD_HELP => 'help'; push @EXPORT, qw(CFGCMD_HELP); use constant CFGCMD_INFO => 'info'; push @EXPORT, qw(CFGCMD_INFO); -use constant CFGCMD_REPO_CREATE => 'repo-create'; -use constant CFGCMD_REPO_GET => 'repo-get'; -use constant CFGCMD_REPO_LS => 'repo-ls'; -use constant CFGCMD_REPO_PUT => 'repo-put'; -use constant CFGCMD_REPO_RM => 'repo-rm'; -use constant CFGCMD_RESTORE => 'restore'; -use constant CFGCMD_STANZA_CREATE => 'stanza-create'; -use constant CFGCMD_STANZA_DELETE => 'stanza-delete'; -use constant CFGCMD_STANZA_UPGRADE => 'stanza-upgrade'; -use constant CFGCMD_START => 'start'; -use constant CFGCMD_STOP => 'stop'; -use constant CFGCMD_VERIFY => 'verify'; use constant CFGCMD_VERSION => 'version'; #################################################################################################################################### @@ -150,61 +62,11 @@ use constant CFGCMD_ROLE_REMOTE => 'remote'; #----------------------------------------------------------------------------------------------------------------------------------- use constant CFGOPT_CONFIG => 'config'; push @EXPORT, qw(CFGOPT_CONFIG); -use constant CFGOPT_CONFIG_PATH => 'config-path'; -use constant CFGOPT_CONFIG_INCLUDE_PATH => 'config-include-path'; -use constant CFGOPT_DELTA => 'delta'; -use constant CFGOPT_DRYRUN => 'dry-run'; -use constant CFGOPT_FORCE => 'force'; -use constant CFGOPT_ONLINE => 'online'; -use constant CFGOPT_SET => 'set'; use constant CFGOPT_STANZA => 'stanza'; push @EXPORT, qw(CFGOPT_STANZA); -use constant CFGOPT_TARGET => 'target'; -use constant CFGOPT_TARGET_EXCLUSIVE => 'target-exclusive'; -use constant CFGOPT_TARGET_ACTION => 'target-action'; -use constant CFGOPT_TARGET_TIMELINE => 'target-timeline'; -use constant CFGOPT_TYPE => 'type'; -use constant CFGOPT_OUTPUT => 'output'; # Command-line only local/remote options #----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPT_EXEC_ID => 'exec-id'; -use constant CFGOPT_PROCESS => 'process'; -use constant CFGOPT_REMOTE_TYPE => 'remote-type'; - -# Command-line only storage options -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPT_CIPHER_PASS => 'cipher-pass'; -use constant CFGOPT_FILTER => 'filter'; -use constant CFGOPT_IGNORE_MISSING => 'ignore-missing'; -use constant CFGOPT_RAW => 'raw'; -use constant CFGOPT_RECURSE => 'recurse'; -use constant CFGOPT_SORT => 'sort'; - -# General options -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPT_ARCHIVE_TIMEOUT => 'archive-timeout'; -use constant CFGOPT_BUFFER_SIZE => 'buffer-size'; -use constant CFGOPT_DB_TIMEOUT => 'db-timeout'; -use constant CFGOPT_COMPRESS => 'compress'; -use constant CFGOPT_COMPRESS_TYPE => 'compress-type'; -use constant CFGOPT_COMPRESS_LEVEL => 'compress-level'; -use constant CFGOPT_COMPRESS_LEVEL_NETWORK => 'compress-level-network'; -use constant CFGOPT_IO_TIMEOUT => 'io-timeout'; -use constant CFGOPT_JOB_RETRY => 'job-retry'; -use constant CFGOPT_JOB_RETRY_INTERVAL => CFGOPT_JOB_RETRY . '-interval'; -use constant CFGOPT_NEUTRAL_UMASK => 'neutral-umask'; -use constant CFGOPT_PROTOCOL_TIMEOUT => 'protocol-timeout'; -use constant CFGOPT_PROCESS_MAX => 'process-max'; -use constant CFGOPT_SCK_BLOCK => 'sck-block'; -use constant CFGOPT_SCK_KEEP_ALIVE => 'sck-keep-alive'; -use constant CFGOPT_TCP_KEEP_ALIVE_COUNT => 'tcp-keep-alive-count'; -use constant CFGOPT_TCP_KEEP_ALIVE_IDLE => 'tcp-keep-alive-idle'; -use constant CFGOPT_TCP_KEEP_ALIVE_INTERVAL => 'tcp-keep-alive-interval'; - -# Commands -use constant CFGOPT_CMD_SSH => 'cmd-ssh'; - # Paths use constant CFGOPT_LOCK_PATH => 'lock-path'; push @EXPORT, qw(CFGOPT_LOCK_PATH); @@ -214,116 +76,24 @@ use constant CFGOPT_SPOOL_PATH => 'spool-pa push @EXPORT, qw(CFGOPT_SPOOL_PATH); # Logging -use constant CFGOPT_LOG_LEVEL_CONSOLE => 'log-level-console'; -use constant CFGOPT_LOG_LEVEL_FILE => 'log-level-file'; use constant CFGOPT_LOG_LEVEL_STDERR => 'log-level-stderr'; push @EXPORT, qw(CFGOPT_LOG_LEVEL_STDERR); -use constant CFGOPT_LOG_SUBPROCESS => 'log-subprocess'; use constant CFGOPT_LOG_TIMESTAMP => 'log-timestamp'; push @EXPORT, qw(CFGOPT_LOG_TIMESTAMP); # Repository options #----------------------------------------------------------------------------------------------------------------------------------- -# Determines how many repositories can be configured -use constant CFGDEF_INDEX_REPO => 4; - # Prefix that must be used by all repo options that allow multiple configurations use constant CFGDEF_PREFIX_REPO => 'repo'; -# Set default repository -use constant CFGOPT_REPO => CFGDEF_PREFIX_REPO; - # Repository General -use constant CFGOPT_REPO_CIPHER_TYPE => CFGDEF_PREFIX_REPO . '-cipher-type'; -use constant CFGOPT_REPO_CIPHER_PASS => CFGDEF_PREFIX_REPO . '-cipher-pass'; -use constant CFGOPT_REPO_HARDLINK => CFGDEF_PREFIX_REPO . '-hardlink'; use constant CFGOPT_REPO_PATH => CFGDEF_PREFIX_REPO . '-path'; push @EXPORT, qw(CFGOPT_REPO_PATH); -use constant CFGOPT_REPO_TYPE => CFGDEF_PREFIX_REPO . '-type'; - -# Repository Retention -use constant CFGOPT_REPO_RETENTION_ARCHIVE => CFGDEF_PREFIX_REPO . '-retention-archive'; -use constant CFGOPT_REPO_RETENTION_ARCHIVE_TYPE => CFGDEF_PREFIX_REPO . '-retention-archive-type'; -use constant CFGOPT_REPO_RETENTION_DIFF => CFGDEF_PREFIX_REPO . '-retention-diff'; -use constant CFGOPT_REPO_RETENTION_FULL => CFGDEF_PREFIX_REPO . '-retention-full'; -use constant CFGOPT_REPO_RETENTION_FULL_TYPE => CFGDEF_PREFIX_REPO . '-retention-full-type'; # Repository Host -use constant CFGOPT_REPO_LOCAL => CFGDEF_PREFIX_REPO . '-local'; - use constant CFGOPT_REPO_HOST => CFGDEF_PREFIX_REPO . '-host'; use constant CFGOPT_REPO_HOST_CMD => CFGOPT_REPO_HOST . '-cmd'; push @EXPORT, qw(CFGOPT_REPO_HOST_CMD); -use constant CFGOPT_REPO_HOST_CONFIG => CFGOPT_REPO_HOST . '-config'; -use constant CFGOPT_REPO_HOST_CONFIG_INCLUDE_PATH => CFGOPT_REPO_HOST_CONFIG . '-include-path'; -use constant CFGOPT_REPO_HOST_CONFIG_PATH => CFGOPT_REPO_HOST_CONFIG . '-path'; -use constant CFGOPT_REPO_HOST_PORT => CFGOPT_REPO_HOST . '-port'; -use constant CFGOPT_REPO_HOST_USER => CFGOPT_REPO_HOST . '-user'; - -# Repository Azure -use constant CFGDEF_REPO_AZURE => CFGDEF_PREFIX_REPO . '-azure'; -use constant CFGOPT_REPO_AZURE_ACCOUNT => CFGDEF_REPO_AZURE . '-account'; -use constant CFGOPT_REPO_AZURE_CONTAINER => CFGDEF_REPO_AZURE . '-container'; -use constant CFGOPT_REPO_AZURE_ENDPOINT => CFGDEF_REPO_AZURE . '-endpoint'; -use constant CFGOPT_REPO_AZURE_KEY => CFGDEF_REPO_AZURE . '-key'; -use constant CFGOPT_REPO_AZURE_KEY_TYPE => CFGDEF_REPO_AZURE . '-key-type'; - -# Repository GCS -use constant CFGDEF_REPO_GCS => CFGDEF_PREFIX_REPO . '-gcs'; -use constant CFGOPT_REPO_GCS_BUCKET => CFGDEF_REPO_GCS . '-bucket'; -use constant CFGOPT_REPO_GCS_ENDPOINT => CFGDEF_REPO_GCS . '-endpoint'; -use constant CFGOPT_REPO_GCS_KEY => CFGDEF_REPO_GCS . '-key'; -use constant CFGOPT_REPO_GCS_KEY_TYPE => CFGDEF_REPO_GCS . '-key-type'; - -# Repository S3 -use constant CFGDEF_REPO_S3 => CFGDEF_PREFIX_REPO . '-s3'; -use constant CFGOPT_REPO_S3_KEY => CFGDEF_REPO_S3 . '-key'; -use constant CFGOPT_REPO_S3_KEY_SECRET => CFGDEF_REPO_S3 . '-key-secret'; -use constant CFGOPT_REPO_S3_KEY_TYPE => CFGDEF_REPO_S3 . '-key-type'; -use constant CFGOPT_REPO_S3_BUCKET => CFGDEF_REPO_S3 . '-bucket'; -use constant CFGOPT_REPO_S3_ENDPOINT => CFGDEF_REPO_S3 . '-endpoint'; -use constant CFGOPT_REPO_S3_ROLE => CFGDEF_REPO_S3 . '-role'; -use constant CFGOPT_REPO_S3_REGION => CFGDEF_REPO_S3 . '-region'; -use constant CFGOPT_REPO_S3_TOKEN => CFGDEF_REPO_S3 . '-token'; -use constant CFGOPT_REPO_S3_URI_STYLE => CFGDEF_REPO_S3 . '-uri-style'; - -# Repository Storage -use constant CFGDEF_REPO_STORAGE => CFGDEF_PREFIX_REPO . '-storage'; -use constant CFGOPT_REPO_STORAGE_CA_FILE => CFGDEF_REPO_STORAGE . '-ca-file'; -use constant CFGOPT_REPO_STORAGE_CA_PATH => CFGDEF_REPO_STORAGE . '-ca-path'; -use constant CFGOPT_REPO_STORAGE_HOST => CFGDEF_REPO_STORAGE . '-host'; -use constant CFGOPT_REPO_STORAGE_PORT => CFGDEF_REPO_STORAGE . '-port'; -use constant CFGOPT_REPO_STORAGE_VERIFY_TLS => CFGDEF_REPO_STORAGE . '-verify-tls'; - -# Archive options -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPT_ARCHIVE_ASYNC => 'archive-async'; -use constant CFGOPT_ARCHIVE_GET_QUEUE_MAX => 'archive-get-queue-max'; -use constant CFGOPT_ARCHIVE_PUSH_QUEUE_MAX => 'archive-push-queue-max'; - -# Backup options -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPT_ARCHIVE_CHECK => 'archive-check'; -use constant CFGOPT_ARCHIVE_COPY => 'archive-copy'; -use constant CFGOPT_ARCHIVE_MODE_CHECK => 'archive-mode-check'; -use constant CFGOPT_BACKUP_STANDBY => 'backup-standby'; -use constant CFGOPT_CHECKSUM_PAGE => 'checksum-page'; -use constant CFGOPT_EXCLUDE => 'exclude'; -use constant CFGOPT_EXPIRE_AUTO => 'expire-auto'; -use constant CFGOPT_MANIFEST_SAVE_THRESHOLD => 'manifest-save-threshold'; -use constant CFGOPT_RESUME => 'resume'; -use constant CFGOPT_START_FAST => 'start-fast'; -use constant CFGOPT_STOP_AUTO => 'stop-auto'; - -# Restore options -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPT_ARCHIVE_MODE => 'archive-mode'; -use constant CFGOPT_DB_INCLUDE => 'db-include'; -use constant CFGOPT_LINK_ALL => 'link-all'; -use constant CFGOPT_LINK_MAP => 'link-map'; -use constant CFGOPT_TABLESPACE_MAP_ALL => 'tablespace-map-all'; -use constant CFGOPT_TABLESPACE_MAP => 'tablespace-map'; -use constant CFGOPT_RECOVERY_OPTION => 'recovery-option'; # Stanza options #----------------------------------------------------------------------------------------------------------------------------------- @@ -336,97 +106,9 @@ use constant CFGDEF_PREFIX_PG => 'pg'; push @EXPORT, qw(CFGDEF_PREFIX_PG); # Set default PostgreSQL cluster -use constant CFGOPT_PG => CFGDEF_PREFIX_PG; - -use constant CFGOPT_PG_LOCAL => CFGDEF_PREFIX_PG . '-local'; - use constant CFGOPT_PG_HOST => CFGDEF_PREFIX_PG . '-host'; use constant CFGOPT_PG_HOST_CMD => CFGOPT_PG_HOST . '-cmd'; push @EXPORT, qw(CFGOPT_PG_HOST_CMD); -use constant CFGOPT_PG_HOST_CONFIG => CFGOPT_PG_HOST . '-config'; -use constant CFGOPT_PG_HOST_CONFIG_INCLUDE_PATH => CFGOPT_PG_HOST_CONFIG . '-include-path'; -use constant CFGOPT_PG_HOST_CONFIG_PATH => CFGOPT_PG_HOST_CONFIG . '-path'; -use constant CFGOPT_PG_HOST_PORT => CFGOPT_PG_HOST . '-port'; -use constant CFGOPT_PG_HOST_USER => CFGOPT_PG_HOST . '-user'; - -use constant CFGOPT_PG_DATABASE => CFGDEF_PREFIX_PG . '-database'; -use constant CFGOPT_PG_PATH => CFGDEF_PREFIX_PG . '-path'; -use constant CFGOPT_PG_PORT => CFGDEF_PREFIX_PG . '-port'; -use constant CFGOPT_PG_SOCKET_PATH => CFGDEF_PREFIX_PG . '-socket-path'; -use constant CFGOPT_PG_USER => CFGDEF_PREFIX_PG . '-user'; - -#################################################################################################################################### -# Option values - for options that have a specific list of allowed values -#################################################################################################################################### - -# Storage types -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_STORAGE_TYPE_PG => 'pg'; -use constant CFGOPTVAL_STORAGE_TYPE_REPO => 'repo'; - -# Backup type -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_BACKUP_TYPE_FULL => 'full'; -use constant CFGOPTVAL_BACKUP_TYPE_DIFF => 'diff'; -use constant CFGOPTVAL_BACKUP_TYPE_INCR => 'incr'; - -# Repo type -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_REPO_TYPE_AZURE => 'azure'; -use constant CFGOPTVAL_REPO_TYPE_CIFS => 'cifs'; -use constant CFGOPTVAL_REPO_TYPE_GCS => 'gcs'; -use constant CFGOPTVAL_REPO_TYPE_POSIX => 'posix'; -use constant CFGOPTVAL_REPO_TYPE_S3 => 's3'; - -# Repo encryption type -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_REPO_CIPHER_TYPE_NONE => 'none'; -use constant CFGOPTVAL_REPO_CIPHER_TYPE_AES_256_CBC => 'aes-256-cbc'; - -# Repo S3 URI style -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_REPO_S3_URI_STYLE_HOST => 'host'; -use constant CFGOPTVAL_REPO_S3_URI_STYLE_PATH => 'path'; - -# Info output -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_OUTPUT_TEXT => 'text'; -use constant CFGOPTVAL_OUTPUT_JSON => 'json'; - -# Restore type -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_RESTORE_TYPE_NAME => 'name'; -use constant CFGOPTVAL_RESTORE_TYPE_TIME => 'time'; -use constant CFGOPTVAL_RESTORE_TYPE_XID => 'xid'; -use constant CFGOPTVAL_RESTORE_TYPE_PRESERVE => 'preserve'; -use constant CFGOPTVAL_RESTORE_TYPE_NONE => 'none'; -use constant CFGOPTVAL_RESTORE_TYPE_IMMEDIATE => 'immediate'; -use constant CFGOPTVAL_RESTORE_TYPE_DEFAULT => 'default'; -use constant CFGOPTVAL_RESTORE_TYPE_STANDBY => 'standby'; - -# Restore target action -#----------------------------------------------------------------------------------------------------------------------------------- -use constant CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE => 'pause'; -use constant CFGOPTVAL_RESTORE_TARGET_ACTION_PROMOTE => 'promote'; -use constant CFGOPTVAL_RESTORE_TARGET_ACTION_SHUTDOWN => 'shutdown'; - -#################################################################################################################################### -# Option defaults - only defined here when the default is used in more than one place -#################################################################################################################################### -use constant CFGDEF_DEFAULT_BUFFER_SIZE_MIN => 16384; - -use constant CFGDEF_DEFAULT_COMPRESS_LEVEL_MIN => 0; -use constant CFGDEF_DEFAULT_COMPRESS_LEVEL_MAX => 9; - -use constant CFGDEF_DEFAULT_DB_TIMEOUT => 1800; -use constant CFGDEF_DEFAULT_DB_TIMEOUT_MIN => WAIT_TIME_MINIMUM; -use constant CFGDEF_DEFAULT_DB_TIMEOUT_MAX => 86400 * 7; - -use constant CFGDEF_DEFAULT_PROTOCOL_PORT_MIN => 0; -use constant CFGDEF_DEFAULT_PROTOCOL_PORT_MAX => 65535; - -use constant CFGDEF_DEFAULT_RETENTION_MIN => 1; -use constant CFGDEF_DEFAULT_RETENTION_MAX => 9999999; #################################################################################################################################### # Option definition constants - defines, types, sections, etc. @@ -434,41 +116,19 @@ use constant CFGDEF_DEFAULT_RETENTION_MAX => 9999999; # Command defines #----------------------------------------------------------------------------------------------------------------------------------- -# Does this command log to a file? This is the default behavior, but it can be overridden in code by calling logFileInit(). The -# default is true. use constant CFGDEF_LOG_FILE => 'log-file'; push @EXPORT, qw(CFGDEF_LOG_FILE); - -# Defines the log level to use for default messages that are output for every command. For example, the log message that lists all -# the options passed is usually output at the info level, but that might not be appropriate for some commands, such as info. Allow -# the log level to be lowered so these common messages will not be emitted where they might be distracting. use constant CFGDEF_LOG_LEVEL_DEFAULT => 'log-level-default'; push @EXPORT, qw(CFGDEF_LOG_LEVEL_DEFAULT); - -# Does the command require a lock? This doesn't mean a lock can't be taken explicitly later, just controls whether a lock will be -# acquired as soon at the command starts. use constant CFGDEF_LOCK_REQUIRED => 'lock-required'; push @EXPORT, qw(CFGDEF_LOCK_REQUIRED); - -# Does the command require a lock on the remote? The lock will only be acquired for process id 0. use constant CFGDEF_LOCK_REMOTE_REQUIRED => 'lock-remote-required'; push @EXPORT, qw(CFGDEF_LOCK_REMOTE_REQUIRED); -# What type of lock is required? use constant CFGDEF_LOCK_TYPE => 'lock-type'; push @EXPORT, qw(CFGDEF_LOCK_TYPE); - -use constant CFGDEF_LOCK_TYPE_ARCHIVE => 'archive'; - push @EXPORT, qw(CFGDEF_LOCK_TYPE_ARCHIVE); -use constant CFGDEF_LOCK_TYPE_BACKUP => 'backup'; - push @EXPORT, qw(CFGDEF_LOCK_TYPE_BACKUP); -use constant CFGDEF_LOCK_TYPE_ALL => 'all'; - push @EXPORT, qw(CFGDEF_LOCK_TYPE_ALL); use constant CFGDEF_LOCK_TYPE_NONE => 'none'; - push @EXPORT, qw(CFGDEF_LOCK_TYPE_NONE); -# Does the command allow parameters? If not then the config parser will automatically error out if parameters are detected. If so, -# then the command is responsible for ensuring that the parameters are valid. use constant CFGDEF_PARAMETER_ALLOWED => 'parameter-allowed'; push @EXPORT, qw(CFGDEF_PARAMETER_ALLOWED); @@ -484,9 +144,9 @@ use constant CFGDEF_DEFAULT_LITERAL => 'default- push @EXPORT, qw(CFGDEF_DEFAULT_LITERAL); use constant CFGDEF_DEPEND => 'depend'; push @EXPORT, qw(CFGDEF_DEPEND); -use constant CFGDEF_DEPEND_OPTION => 'depend-option'; +use constant CFGDEF_DEPEND_OPTION => 'option'; push @EXPORT, qw(CFGDEF_DEPEND_OPTION); -use constant CFGDEF_DEPEND_LIST => 'depend-list'; +use constant CFGDEF_DEPEND_LIST => 'list'; push @EXPORT, qw(CFGDEF_DEPEND_LIST); # Group options together to share common configuration @@ -501,8 +161,8 @@ use constant CFGDEF_INHERIT => 'inherit' push @EXPORT, qw(CFGDEF_INHERIT); use constant CFGDEF_INTERNAL => 'internal'; push @EXPORT, qw(CFGDEF_INTERNAL); -use constant CFGDEF_NAME_ALT => 'name-alt'; - push @EXPORT, qw(CFGDEF_NAME_ALT); +use constant CFGDEF_DEPRECATE => 'deprecate'; + push @EXPORT, qw(CFGDEF_DEPRECATE); use constant CFGDEF_NEGATE => 'negate'; push @EXPORT, qw(CFGDEF_NEGATE); use constant CFGDEF_PREFIX => 'prefix'; @@ -549,2880 +209,17 @@ use constant CFGDEF_SECTION_STANZA => 'stanza'; push @EXPORT, qw(CFGDEF_SECTION_STANZA); #################################################################################################################################### -# Command definition data +# Load configuration #################################################################################################################################### -my $rhCommandDefine = -{ - &CFGCMD_ARCHIVE_GET => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ARCHIVE, - &CFGDEF_PARAMETER_ALLOWED => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, +use YAML::XS qw(LoadFile); - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOCK_REMOTE_REQUIRED => true, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ARCHIVE, - &CFGDEF_PARAMETER_ALLOWED => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, +# Required so booleans are not read-only +local $YAML::XS::Boolean = "JSON::PP"; - &CFGCMD_BACKUP => - { - &CFGDEF_LOCK_REQUIRED => true, - &CFGDEF_LOCK_REMOTE_REQUIRED => true, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_BACKUP, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_CHECK => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_EXPIRE => - { - &CFGDEF_LOCK_REQUIRED => true, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_BACKUP, - }, - - &CFGCMD_HELP => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - &CFGDEF_PARAMETER_ALLOWED => true, - }, - - &CFGCMD_INFO => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_REPO_CREATE => - { - &CFGDEF_INTERNAL => true, - &CFGDEF_LOG_FILE => false, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_REPO_GET => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - &CFGDEF_PARAMETER_ALLOWED => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_REPO_LS => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - &CFGDEF_PARAMETER_ALLOWED => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_REPO_PUT => - { - &CFGDEF_INTERNAL => true, - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - &CFGDEF_PARAMETER_ALLOWED => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_REPO_RM => - { - &CFGDEF_INTERNAL => true, - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - &CFGDEF_PARAMETER_ALLOWED => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_RESTORE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_STANZA_CREATE => - { - &CFGDEF_LOCK_REQUIRED => true, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ALL, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_STANZA_DELETE => - { - &CFGDEF_LOCK_REQUIRED => true, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ALL, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_STANZA_UPGRADE => - { - &CFGDEF_LOCK_REQUIRED => true, - &CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ALL, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_START => - { - }, - - &CFGCMD_STOP => - { - }, - - &CFGCMD_VERIFY => - { - &CFGDEF_INTERNAL => true, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGCMD_VERSION => - { - &CFGDEF_LOG_FILE => false, - &CFGDEF_LOG_LEVEL_DEFAULT => DEBUG, - }, -}; - -#################################################################################################################################### -# Option group definition data -# -# Options groups allow related options to be grouped together so, e.g. test and valid, operations can be run across all options in -# the group. -#################################################################################################################################### -use constant CFGOPTGRP_PG => CFGDEF_PREFIX_PG; -use constant CFGOPTGRP_REPO => CFGDEF_PREFIX_REPO; - -my $rhOptionGroupDefine = -{ - &CFGOPTGRP_PG => - { - &CFGDEF_PREFIX => CFGDEF_PREFIX_PG, - &CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG, - }, - - &CFGOPTGRP_REPO => - { - &CFGDEF_PREFIX => CFGDEF_PREFIX_REPO, - &CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO, - }, -}; - -#################################################################################################################################### -# Option definition data -#################################################################################################################################### -my %hConfigDefine = -( - # Command-line only options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_CONFIG => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_FILE", - &CFGDEF_DEFAULT_LITERAL => true, - &CFGDEF_NEGATE => true, - }, - - &CFGOPT_CONFIG_INCLUDE_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_CONFIG, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_INCLUDE_PATH", - &CFGDEF_DEFAULT_LITERAL => true, - &CFGDEF_NEGATE => false, - }, - - &CFGOPT_CONFIG_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_CONFIG, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH", - &CFGDEF_DEFAULT_LITERAL => true, - &CFGDEF_NEGATE => false, - }, - - &CFGOPT_DRYRUN => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_EXPIRE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_FORCE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => - { - &CFGDEF_DEFAULT => false, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_ONLINE, - &CFGDEF_DEPEND_LIST => [false], - }, - }, - - &CFGCMD_RESTORE => - { - &CFGDEF_DEFAULT => false, - }, - - &CFGCMD_STANZA_CREATE => - { - &CFGDEF_DEFAULT => false, - &CFGDEF_INTERNAL => true, - }, - - &CFGCMD_STANZA_DELETE => - { - &CFGDEF_DEFAULT => false, - }, - - &CFGCMD_STOP => - { - &CFGDEF_DEFAULT => false - } - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_ONLINE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_NEGATE => true, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_SET => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_EXPIRE => - { - &CFGDEF_REQUIRED => false, - }, - &CFGCMD_INFO => - { - &CFGDEF_REQUIRED => false, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_STANZA, - }, - }, - &CFGCMD_RESTORE => - { - &CFGDEF_DEFAULT => 'latest', - }, - &CFGCMD_VERIFY => - { - &CFGDEF_REQUIRED => false, - &CFGDEF_INTERNAL => true, - }, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_STANZA => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_EXPIRE => {}, - &CFGCMD_INFO => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_REPO_CREATE => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_REPO_GET => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_REPO_LS => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_REPO_PUT => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_REPO_RM => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_START => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_STOP => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_VERIFY => {}, - } - }, - - &CFGOPT_TARGET => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => - { - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_TYPE, - &CFGDEF_DEPEND_LIST => - [ - &CFGOPTVAL_RESTORE_TYPE_NAME, - &CFGOPTVAL_RESTORE_TYPE_TIME, - &CFGOPTVAL_RESTORE_TYPE_XID, - ], - }, - }, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_TARGET_EXCLUSIVE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => - { - &CFGDEF_DEFAULT => false, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_TYPE, - &CFGDEF_DEPEND_LIST => - [ - &CFGOPTVAL_RESTORE_TYPE_TIME, - &CFGOPTVAL_RESTORE_TYPE_XID, - ], - }, - }, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_TARGET_ACTION => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => - { - &CFGDEF_DEFAULT => CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE, - - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE, - &CFGOPTVAL_RESTORE_TARGET_ACTION_PROMOTE, - &CFGOPTVAL_RESTORE_TARGET_ACTION_SHUTDOWN, - ], - - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_TYPE, - &CFGDEF_DEPEND_LIST => - [ - &CFGOPTVAL_RESTORE_TYPE_IMMEDIATE, - &CFGOPTVAL_RESTORE_TYPE_NAME, - &CFGOPTVAL_RESTORE_TYPE_TIME, - &CFGOPTVAL_RESTORE_TYPE_XID, - ], - }, - }, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_TARGET_TIMELINE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => - { - &CFGDEF_REQUIRED => false, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_TYPE, - &CFGDEF_DEPEND_LIST => - [ - &CFGOPTVAL_RESTORE_TYPE_DEFAULT, - &CFGOPTVAL_RESTORE_TYPE_NAME, - &CFGOPTVAL_RESTORE_TYPE_STANDBY, - &CFGOPTVAL_RESTORE_TYPE_TIME, - &CFGOPTVAL_RESTORE_TYPE_XID, - ], - }, - }, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_TYPE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => - { - &CFGDEF_DEFAULT => CFGOPTVAL_BACKUP_TYPE_INCR, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_BACKUP_TYPE_FULL, - &CFGOPTVAL_BACKUP_TYPE_DIFF, - &CFGOPTVAL_BACKUP_TYPE_INCR, - ] - }, - - &CFGCMD_RESTORE => - { - &CFGDEF_DEFAULT => CFGOPTVAL_RESTORE_TYPE_DEFAULT, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_RESTORE_TYPE_NAME, - &CFGOPTVAL_RESTORE_TYPE_TIME, - &CFGOPTVAL_RESTORE_TYPE_XID, - &CFGOPTVAL_RESTORE_TYPE_PRESERVE, - &CFGOPTVAL_RESTORE_TYPE_NONE, - &CFGOPTVAL_RESTORE_TYPE_IMMEDIATE, - &CFGOPTVAL_RESTORE_TYPE_DEFAULT, - &CFGOPTVAL_RESTORE_TYPE_STANDBY, - ] - } - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_OUTPUT => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_COMMAND => - { - &CFGCMD_INFO => - { - &CFGDEF_DEFAULT => CFGOPTVAL_OUTPUT_TEXT, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_OUTPUT_TEXT, - &CFGOPTVAL_OUTPUT_JSON, - ] - }, - - &CFGCMD_REPO_LS => - { - &CFGDEF_DEFAULT => CFGOPTVAL_OUTPUT_TEXT, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_OUTPUT_TEXT, - &CFGOPTVAL_OUTPUT_JSON, - ] - } - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - # Command-line only local/remote options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_EXEC_ID => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_INTERNAL => true, - }, - - &CFGOPT_PROCESS => - { - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_INTERNAL => true, - &CFGDEF_ALLOW_RANGE => [0, 1024], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - &CFGOPT_REMOTE_TYPE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_INTERNAL => true, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_STORAGE_TYPE_PG, - &CFGOPTVAL_STORAGE_TYPE_REPO, - ], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - - # Command-line only storage options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_CIPHER_PASS => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_INTERNAL => true, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_PUT => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_FILTER => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_REPO_LS => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_IGNORE_MISSING => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_REPO_GET => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_RAW => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_PUT => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_RECURSE => - { - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_RM => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_SORT => - { - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'asc', - &CFGDEF_ALLOW_LIST => - [ - 'none', - 'asc', - 'desc', - ], - &CFGDEF_COMMAND => - { - &CFGCMD_REPO_LS => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - # General options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_ARCHIVE_TIMEOUT => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_TIME, - &CFGDEF_DEFAULT => 60, - &CFGDEF_ALLOW_RANGE => [WAIT_TIME_MINIMUM, 86400], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_BUFFER_SIZE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_SIZE, - &CFGDEF_DEFAULT => 1048576, - &CFGDEF_ALLOW_LIST => - [ - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 2, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 4, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 8, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 16, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 32, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 64, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 128, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 256, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 512, - &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 1024, - ], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_EXPIRE => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - } - }, - - &CFGOPT_SCK_BLOCK => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_INTERNAL => true, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE, - }, - - &CFGOPT_SCK_KEEP_ALIVE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE, - }, - - &CFGOPT_TCP_KEEP_ALIVE_COUNT => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE, - &CFGDEF_ALLOW_RANGE => [1, 32], - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_SCK_KEEP_ALIVE, - &CFGDEF_DEPEND_LIST => [true], - }, - }, - - &CFGOPT_TCP_KEEP_ALIVE_IDLE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE, - &CFGDEF_ALLOW_RANGE => [1, 3600], - &CFGDEF_DEPEND => CFGOPT_TCP_KEEP_ALIVE_COUNT, - }, - - &CFGOPT_TCP_KEEP_ALIVE_INTERVAL => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE, - &CFGDEF_ALLOW_RANGE => [1, 900], - &CFGDEF_DEPEND => CFGOPT_TCP_KEEP_ALIVE_COUNT, - }, - - &CFGOPT_DB_TIMEOUT => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_TIME, - &CFGDEF_DEFAULT => CFGDEF_DEFAULT_DB_TIMEOUT, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_DB_TIMEOUT_MIN, CFGDEF_DEFAULT_DB_TIMEOUT_MAX], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - } - }, - - &CFGOPT_DELTA => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - # Option is deprecated and should not be referenced outside of cfgLoadUpdateOption(). - &CFGOPT_COMPRESS => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_COMPRESS_TYPE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'gz', - &CFGDEF_ALLOW_LIST => - [ - 'none', - 'bz2', - 'gz', - 'lz4', - 'zst', - ], - &CFGDEF_COMMAND => CFGOPT_COMPRESS, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - }, - }, - - &CFGOPT_COMPRESS_LEVEL => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_COMPRESS_LEVEL_MIN, CFGDEF_DEFAULT_COMPRESS_LEVEL_MAX], - &CFGDEF_COMMAND => CFGOPT_COMPRESS, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - }, - }, - - &CFGOPT_COMPRESS_LEVEL_NETWORK => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_DEFAULT => 3, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_COMPRESS_LEVEL_MIN, CFGDEF_DEFAULT_COMPRESS_LEVEL_MAX], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_NEUTRAL_UMASK => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_EXPIRE => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_START => {}, - &CFGCMD_STOP => {}, - &CFGCMD_VERIFY => {}, - } - }, - - &CFGOPT_CMD_SSH => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'ssh', - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_IO_TIMEOUT => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_TIME, - &CFGDEF_DEFAULT => 60, - &CFGDEF_ALLOW_RANGE => [.1, 3600], - &CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE, - }, - - &CFGOPT_JOB_RETRY => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_INTERNAL => true, - &CFGDEF_DEFAULT => 2, - &CFGDEF_ALLOW_RANGE => [0, 360], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => - { - &CFGDEF_DEFAULT => 1, - }, - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_DEFAULT => 1, - }, - &CFGCMD_BACKUP => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_JOB_RETRY_INTERVAL => - { - &CFGDEF_INHERIT => &CFGOPT_JOB_RETRY, - &CFGDEF_TYPE => CFGDEF_TYPE_TIME, - &CFGDEF_DEFAULT => 15, - &CFGDEF_ALLOW_RANGE => [0, 900], - }, - - &CFGOPT_LOCK_PATH => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_DEFAULT => '/tmp/' . PROJECT_EXE, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_EXPIRE => {}, - &CFGCMD_INFO => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_START => {}, - &CFGCMD_STOP => {}, - }, - }, - - &CFGOPT_LOG_PATH => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_DEFAULT => '/var/log/' . PROJECT_EXE, - }, - - &CFGOPT_PROTOCOL_TIMEOUT => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_TIME, - &CFGDEF_DEFAULT => CFGDEF_DEFAULT_DB_TIMEOUT + 30, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_DB_TIMEOUT_MIN, CFGDEF_DEFAULT_DB_TIMEOUT_MAX], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - } - }, - - # Repository selector - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_REPO => - { - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [1, CFGDEF_INDEX_REPO], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_BACKUP => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - &CFGCMD_CHECK => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_EXPIRE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - &CFGCMD_INFO => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_CREATE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_GET => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_LS => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_PUT => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_RM => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_RESTORE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_STANZA_CREATE => - { - &CFGDEF_COMMAND_ROLE => {}, - }, - &CFGCMD_STANZA_DELETE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - &CFGCMD_STANZA_UPGRADE => - { - &CFGDEF_COMMAND_ROLE => {}, - }, - &CFGCMD_START => - { - &CFGDEF_COMMAND_ROLE => {}, - }, - &CFGCMD_STOP => - { - &CFGDEF_COMMAND_ROLE => {}, - }, - &CFGCMD_VERIFY => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - }, - }, - - # Repository options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_REPO_CIPHER_PASS => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_SECURE => true, - &CFGDEF_REQUIRED => true, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_CIPHER_TYPE, - &CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_CIPHER_TYPE_AES_256_CBC], - }, - &CFGDEF_NAME_ALT => - { - 'repo-cipher-pass' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_CIPHER_TYPE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => CFGOPTVAL_REPO_CIPHER_TYPE_NONE, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_REPO_CIPHER_TYPE_NONE, - &CFGOPTVAL_REPO_CIPHER_TYPE_AES_256_CBC, - ], - &CFGDEF_NAME_ALT => - { - 'repo-cipher-type' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_HARDLINK => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_NAME_ALT => - { - 'hardlink' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_REPO_LOCAL => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_INTERNAL => true, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_CHECK => {}, - &CFGCMD_EXPIRE => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_STANZA_DELETE => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_STANZA_UPGRADE => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_REPO_HOST => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'backup-host' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_LOCAL, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_LOCAL, - &CFGDEF_DEPEND_LIST => [false], - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_REPO_HOST_CMD => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'backup-cmd' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST - }, - }, - - &CFGOPT_REPO_HOST_CONFIG => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_FILE", - &CFGDEF_DEFAULT_LITERAL => true, - &CFGDEF_NAME_ALT => - { - 'backup-config' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_HOST_CMD, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST - }, - }, - - &CFGOPT_REPO_HOST_CONFIG_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_REPO_HOST_CONFIG, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH", - &CFGDEF_DEFAULT_LITERAL => true, - }, - - &CFGOPT_REPO_HOST_CONFIG_INCLUDE_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_REPO_HOST_CONFIG, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_INCLUDE_PATH", - &CFGDEF_DEFAULT_LITERAL => true, - }, - - &CFGOPT_REPO_HOST_PORT => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_PROTOCOL_PORT_MIN, CFGDEF_DEFAULT_PROTOCOL_PORT_MAX], - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'backup-ssh-port' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_HOST_CMD, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST - } - }, - - &CFGOPT_REPO_HOST_USER => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => PROJECT_EXE, - &CFGDEF_NAME_ALT => - { - 'backup-user' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_HOST_CMD, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - &CFGDEF_REQUIRED => false, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST - } - }, - - &CFGOPT_REPO_PATH => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_DEFAULT => '/var/lib/' . PROJECT_EXE, - &CFGDEF_NAME_ALT => - { - 'repo-path' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_RETENTION_ARCHIVE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_RETENTION_MIN, CFGDEF_DEFAULT_RETENTION_MAX], - &CFGDEF_NAME_ALT => - { - 'retention-archive' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_EXPIRE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_REPO_RETENTION_ARCHIVE_TYPE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => CFGOPTVAL_BACKUP_TYPE_FULL, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_EXPIRE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - &CFGDEF_NAME_ALT => - { - 'retention-archive-type' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_BACKUP_TYPE_FULL, - &CFGOPTVAL_BACKUP_TYPE_DIFF, - &CFGOPTVAL_BACKUP_TYPE_INCR, - ] - }, - - &CFGOPT_REPO_RETENTION_DIFF => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_RETENTION_MIN, CFGDEF_DEFAULT_RETENTION_MAX], - &CFGDEF_NAME_ALT => - { - 'retention-diff' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_EXPIRE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_REPO_RETENTION_FULL => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_RETENTION_MIN, CFGDEF_DEFAULT_RETENTION_MAX], - &CFGDEF_NAME_ALT => - { - 'retention-full' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_RETENTION_FULL_TYPE, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_REPO_RETENTION_FULL_TYPE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'count', - &CFGDEF_ALLOW_LIST => - [ - 'count', - 'time', - ], - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_EXPIRE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_REPO_AZURE_ACCOUNT => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_SECURE => true, - &CFGDEF_REQUIRED => true, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_TYPE, - &CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_AZURE], - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_AZURE_CONTAINER => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_DEPEND => CFGOPT_REPO_AZURE_ACCOUNT, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_AZURE_ENDPOINT => - { - &CFGDEF_INHERIT => CFGOPT_REPO_AZURE_ACCOUNT, - &CFGDEF_DEFAULT => 'blob.core.windows.net', - }, - - &CFGOPT_REPO_AZURE_KEY => - { - &CFGDEF_INHERIT => CFGOPT_REPO_AZURE_ACCOUNT, - }, - - &CFGOPT_REPO_AZURE_KEY_TYPE => - { - &CFGDEF_INHERIT => CFGOPT_REPO_AZURE_CONTAINER, - &CFGDEF_DEFAULT => 'shared', - &CFGDEF_ALLOW_LIST => - [ - 'shared', - 'sas', - ], - }, - - &CFGOPT_REPO_GCS_BUCKET => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => true, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_GCS_KEY_TYPE, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_GCS_ENDPOINT => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'storage.googleapis.com', - &CFGDEF_DEPEND => CFGOPT_REPO_GCS_BUCKET, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_GCS_KEY => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_SECURE => true, - &CFGDEF_DEPEND => CFGOPT_REPO_GCS_BUCKET, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_GCS_KEY_TYPE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'service', - &CFGDEF_ALLOW_LIST => - [ - 'service', - 'token', - ], - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_TYPE, - &CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_GCS], - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_S3_BUCKET => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_TYPE, - &CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_S3], - }, - &CFGDEF_NAME_ALT => - { - 'repo-s3-bucket' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_S3_KEY_TYPE => - { - &CFGDEF_INHERIT => CFGOPT_REPO_S3_BUCKET, - &CFGDEF_DEFAULT => 'shared', - &CFGDEF_ALLOW_LIST => - [ - 'shared', - 'auto', - ], - }, - - &CFGOPT_REPO_S3_KEY => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_SECURE => true, - &CFGDEF_REQUIRED => true, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_S3_KEY_TYPE, - &CFGDEF_DEPEND_LIST => ['shared'], - }, - &CFGDEF_NAME_ALT => - { - 'repo-s3-key' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_S3_KEY_SECRET => - { - &CFGDEF_INHERIT => CFGOPT_REPO_S3_KEY, - &CFGDEF_NAME_ALT => - { - 'repo-s3-key-secret' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - }, - - &CFGOPT_REPO_S3_ENDPOINT => - { - &CFGDEF_INHERIT => CFGOPT_REPO_S3_BUCKET, - &CFGDEF_NAME_ALT => - { - 'repo-s3-endpoint' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - }, - - &CFGOPT_REPO_S3_REGION, - { - &CFGDEF_INHERIT => CFGOPT_REPO_S3_BUCKET, - &CFGDEF_NAME_ALT => - { - 'repo-s3-region' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - }, - - &CFGOPT_REPO_S3_ROLE => - { - &CFGDEF_INHERIT => CFGOPT_REPO_S3_BUCKET, - &CFGDEF_REQUIRED => false, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_S3_KEY_TYPE, - &CFGDEF_DEPEND_LIST => ['auto'], - }, - }, - - &CFGOPT_REPO_S3_TOKEN => - { - &CFGDEF_INHERIT => CFGOPT_REPO_S3_KEY, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_S3_URI_STYLE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => CFGOPTVAL_REPO_S3_URI_STYLE_HOST, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_REPO_S3_URI_STYLE_HOST, - &CFGOPTVAL_REPO_S3_URI_STYLE_PATH, - ], - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - &CFGDEF_DEPEND => CFGOPT_REPO_S3_BUCKET, - }, - - &CFGOPT_REPO_STORAGE_CA_FILE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'repo?-azure-ca-file' => {&CFGDEF_INDEX => 1}, - 'repo-s3-ca-file' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'repo?-s3-ca-file' => {&CFGDEF_INDEX => 1}, - }, - &CFGDEF_DEPEND => CFGOPT_REPO_STORAGE_VERIFY_TLS, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_STORAGE_CA_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_REPO_STORAGE_CA_FILE, - &CFGDEF_NAME_ALT => - { - 'repo?-azure-ca-path' => {&CFGDEF_INDEX => 1}, - 'repo-s3-ca-path' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'repo?-s3-ca-path' => {&CFGDEF_INDEX => 1}, - }, - }, - - &CFGOPT_REPO_STORAGE_HOST => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'repo?-azure-host' => {&CFGDEF_INDEX => 1}, - 'repo-s3-host' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'repo?-s3-host' => {&CFGDEF_INDEX => 1}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_TYPE, - &CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_AZURE, CFGOPTVAL_REPO_TYPE_S3], - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_STORAGE_PORT => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_DEFAULT => 443, - &CFGDEF_ALLOW_RANGE => [1, 65535], - &CFGDEF_NAME_ALT => - { - 'repo?-azure-port' => {&CFGDEF_INDEX => 1}, - 'repo?-s3-port' => {&CFGDEF_INDEX => 1}, - }, - &CFGDEF_DEPEND => CFGOPT_REPO_STORAGE_HOST, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_STORAGE_VERIFY_TLS => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_NAME_ALT => - { - 'repo?-azure-verify-tls' => {&CFGDEF_INDEX => 1}, - 'repo-s3-verify-ssl' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'repo?-s3-verify-ssl' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'repo?-s3-verify-tls' => {&CFGDEF_INDEX => 1}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_REPO_TYPE, - &CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_AZURE, CFGOPTVAL_REPO_TYPE_GCS, CFGOPTVAL_REPO_TYPE_S3], - }, - &CFGDEF_COMMAND => CFGOPT_REPO_TYPE, - }, - - &CFGOPT_REPO_TYPE => - { - &CFGDEF_GROUP => CFGOPTGRP_REPO, - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => CFGOPTVAL_REPO_TYPE_POSIX, - &CFGDEF_ALLOW_LIST => - [ - &CFGOPTVAL_REPO_TYPE_AZURE, - &CFGOPTVAL_REPO_TYPE_CIFS, - &CFGOPTVAL_REPO_TYPE_GCS, - &CFGOPTVAL_REPO_TYPE_POSIX, - &CFGOPTVAL_REPO_TYPE_S3, - ], - &CFGDEF_NAME_ALT => - { - 'repo-type' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_BACKUP => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - &CFGCMD_CHECK => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_EXPIRE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - &CFGCMD_INFO => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_CREATE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_GET => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_LS => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_PUT => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_REPO_RM => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_RESTORE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - &CFGCMD_STANZA_CREATE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - &CFGCMD_STANZA_DELETE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - &CFGCMD_STANZA_UPGRADE => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - &CFGCMD_START => - { - &CFGDEF_COMMAND_ROLE => {}, - }, - &CFGCMD_STOP => - { - &CFGDEF_COMMAND_ROLE => {}, - }, - &CFGCMD_VERIFY => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_LOCAL => {}, - &CFGCMD_ROLE_REMOTE => {}, - }, - }, - }, - }, - - &CFGOPT_SPOOL_PATH => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_DEFAULT => '/var/spool/' . PROJECT_EXE, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => - { - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_ARCHIVE_ASYNC, - &CFGDEF_DEPEND_LIST => [true], - }, - }, - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_ARCHIVE_ASYNC, - &CFGDEF_DEPEND_LIST => [true], - }, - }, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_PROCESS_MAX => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_DEFAULT => 1, - &CFGDEF_ALLOW_RANGE => [1, 999], - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_VERIFY => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - }, - }, - - # Logging options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_LOG_LEVEL_CONSOLE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => lc(WARN), - &CFGDEF_ALLOW_LIST => - [ - lc(OFF), - lc(ERROR), - lc(WARN), - lc(INFO), - lc(DETAIL), - lc(DEBUG), - lc(TRACE), - ], - }, - - &CFGOPT_LOG_LEVEL_FILE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => lc(INFO), - &CFGDEF_ALLOW_LIST => CFGOPT_LOG_LEVEL_CONSOLE, - }, - - &CFGOPT_LOG_LEVEL_STDERR => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => lc(WARN), - &CFGDEF_ALLOW_LIST => CFGOPT_LOG_LEVEL_CONSOLE, - }, - - &CFGOPT_LOG_SUBPROCESS => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_INFO => {}, - &CFGCMD_REPO_CREATE => {}, - &CFGCMD_REPO_GET => {}, - &CFGCMD_REPO_LS => {}, - &CFGCMD_REPO_PUT => {}, - &CFGCMD_REPO_RM => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - &CFGCMD_VERIFY => {}, - } - }, - - &CFGOPT_LOG_TIMESTAMP => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => CFGOPT_LOG_LEVEL_CONSOLE, - }, - - # Archive options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_ARCHIVE_ASYNC => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => {}, - } - }, - - &CFGOPT_ARCHIVE_PUSH_QUEUE_MAX => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_SIZE, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'archive-queue-max' => {}, - }, - &CFGDEF_ALLOW_RANGE => [0, 4 * 1024 * 1024 * 1024 * 1024 * 1024], # 0-4PB - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_PUSH => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - }, - }, - - &CFGOPT_ARCHIVE_GET_QUEUE_MAX => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_SIZE, - &CFGDEF_DEFAULT => 128 * 1024 * 1024, # 128MB - &CFGDEF_ALLOW_RANGE => [0, 4 * 1024 * 1024 * 1024 * 1024 * 1024], # 0-4PB - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - }, - }, - - # Backup options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_ARCHIVE_CHECK => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => - { - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_ONLINE, - &CFGDEF_DEPEND_LIST => [true], - }, - }, - &CFGCMD_CHECK => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_ARCHIVE_COPY => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => - { - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_ARCHIVE_CHECK, - &CFGDEF_DEPEND_LIST => [true], - } - } - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_ARCHIVE_MODE_CHECK => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_ARCHIVE_CHECK, - &CFGDEF_DEPEND_LIST => [true], - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_BACKUP_STANDBY => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_CHECKSUM_PAGE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_EXCLUDE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_LIST, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_EXPIRE_AUTO => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_MANIFEST_SAVE_THRESHOLD => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_SIZE, - &CFGDEF_DEFAULT => 1 * 1024 * 1024 * 1024, - &CFGDEF_ALLOW_RANGE => [1, 1024 * 1024 * 1024 * 1024], # 1-1TB - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_RESUME => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => true, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_START_FAST => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_STOP_AUTO => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - # Restore options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_ARCHIVE_MODE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'preserve', - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_ALLOW_LIST => - [ - 'off', - 'preserve', - ], - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_DB_INCLUDE => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_LIST, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_LINK_ALL => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_LINK_MAP => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_HASH, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_TABLESPACE_MAP_ALL => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_TABLESPACE_MAP => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_HASH, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - &CFGOPT_RECOVERY_OPTION => - { - &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, - &CFGDEF_TYPE => CFGDEF_TYPE_HASH, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_RESTORE => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_TYPE, - &CFGDEF_DEPEND_LIST => - [ - &CFGOPTVAL_RESTORE_TYPE_DEFAULT, - &CFGOPTVAL_RESTORE_TYPE_IMMEDIATE, - &CFGOPTVAL_RESTORE_TYPE_NAME, - &CFGOPTVAL_RESTORE_TYPE_TIME, - &CFGOPTVAL_RESTORE_TYPE_STANDBY, - &CFGOPTVAL_RESTORE_TYPE_XID, - ], - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - }, - }, - - # Stanza options - #------------------------------------------------------------------------------------------------------------------------------- - &CFGOPT_PG => - { - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_INTERNAL => true, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [1, CFGDEF_INDEX_PG], - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => - { - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - }, - }, - - &CFGOPT_PG_LOCAL => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_INTERNAL => true, - &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, - &CFGDEF_DEFAULT => false, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_RESTORE => - { - &CFGDEF_INTERNAL => true, - }, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - }, - - &CFGOPT_PG_HOST => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'db-host' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-host' => {&CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => CFGOPT_PG_LOCAL, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_PG_LOCAL, - &CFGDEF_DEPEND_LIST => [false], - }, - }, - - &CFGOPT_PG_HOST_CMD => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'db-cmd' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-cmd' => {&CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - &CFGDEF_COMMAND_ROLE => - { - &CFGCMD_ROLE_DEFAULT => {}, - &CFGCMD_ROLE_ASYNC => {}, - &CFGCMD_ROLE_LOCAL => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_PG_HOST - }, - }, - - &CFGOPT_PG_HOST_CONFIG => - { - &CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_FILE", - &CFGDEF_DEFAULT_LITERAL => true, - &CFGDEF_REQUIRED => true, - &CFGDEF_NAME_ALT => - { - 'db-config' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-config' => {&CFGDEF_RESET => false}, - }, - }, - - &CFGOPT_PG_HOST_CONFIG_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH", - &CFGDEF_DEFAULT_LITERAL => true, - }, - - &CFGOPT_PG_HOST_CONFIG_INCLUDE_PATH => - { - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD, - &CFGDEF_DEFAULT => "CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_INCLUDE_PATH", - &CFGDEF_DEFAULT_LITERAL => true, - }, - - &CFGOPT_PG_HOST_PORT => - { - &CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_REQUIRED => false, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_PROTOCOL_PORT_MIN, CFGDEF_DEFAULT_PROTOCOL_PORT_MAX], - &CFGDEF_NAME_ALT => - { - 'db-ssh-port' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-ssh-port' => {&CFGDEF_RESET => false}, - }, - }, - - &CFGOPT_PG_HOST_USER => - { - &CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD, - &CFGDEF_DEFAULT => 'postgres', - &CFGDEF_NAME_ALT => - { - 'db-user' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-user' => {&CFGDEF_RESET => false}, - }, - &CFGDEF_REQUIRED => false, - }, - - &CFGOPT_PG_DATABASE => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_DEFAULT => 'postgres', - &CFGDEF_COMMAND => CFGOPT_PG_PORT, - &CFGDEF_DEPEND => CFGOPT_PG_PORT, - }, - - &CFGOPT_PG_PATH => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_REQUIRED => true, - &CFGDEF_NAME_ALT => - { - 'db-path' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-path' => {&CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_ARCHIVE_GET => {}, - &CFGCMD_ARCHIVE_PUSH => - { - &CFGDEF_REQUIRED => false - }, - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_RESTORE => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - }, - - &CFGOPT_PG_PORT => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_TYPE => CFGDEF_TYPE_INTEGER, - &CFGDEF_DEFAULT => 5432, - &CFGDEF_ALLOW_RANGE => [CFGDEF_DEFAULT_PROTOCOL_PORT_MIN, CFGDEF_DEFAULT_PROTOCOL_PORT_MAX], - &CFGDEF_NAME_ALT => - { - 'db-port' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-port' => {&CFGDEF_RESET => false}, - }, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_PG_PATH - }, - }, - - &CFGOPT_PG_SOCKET_PATH => - { - &CFGDEF_INHERIT => CFGOPT_PG_PORT, - &CFGDEF_TYPE => CFGDEF_TYPE_PATH, - &CFGDEF_DEFAULT => undef, - &CFGDEF_REQUIRED => false, - &CFGDEF_NAME_ALT => - { - 'db-socket-path' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false}, - 'db?-socket-path' => {&CFGDEF_RESET => false}, - }, - }, - - &CFGOPT_PG_USER => - { - &CFGDEF_GROUP => CFGOPTGRP_PG, - &CFGDEF_SECTION => CFGDEF_SECTION_STANZA, - &CFGDEF_TYPE => CFGDEF_TYPE_STRING, - &CFGDEF_REQUIRED => false, - &CFGDEF_COMMAND => - { - &CFGCMD_BACKUP => {}, - &CFGCMD_CHECK => {}, - &CFGCMD_STANZA_CREATE => {}, - &CFGCMD_STANZA_DELETE => {}, - &CFGCMD_STANZA_UPGRADE => {}, - }, - &CFGDEF_DEPEND => - { - &CFGDEF_DEPEND_OPTION => CFGOPT_PG_PATH - }, - }, -); +my $rhConfig = LoadFile(dirname(dirname($0)) . '/src/build/config/config.yaml'); +my $rhCommandDefine = $rhConfig->{'command'}; +my $rhOptionGroupDefine = $rhConfig->{'optionGroup'}; +my $rhConfigDefine = $rhConfig->{'option'}; #################################################################################################################################### # Process command define defaults @@ -3511,9 +308,9 @@ foreach my $strGroup (sort(keys(%{$rhOptionGroupDefine}))) #################################################################################################################################### # Process option define defaults #################################################################################################################################### -foreach my $strKey (sort(keys(%hConfigDefine))) +foreach my $strKey (sort(keys(%{$rhConfigDefine}))) { - my $rhOption = $hConfigDefine{$strKey}; + my $rhOption = $rhConfigDefine->{$strKey}; # Error on invalid configuration if (defined($rhOption->{&CFGDEF_INDEX_TOTAL})) @@ -3527,34 +324,34 @@ foreach my $strKey (sort(keys(%hConfigDefine))) } # If the define is a scalar then copy the entire define from the referenced option - if (defined($hConfigDefine{$strKey}{&CFGDEF_INHERIT})) + if (defined($rhConfigDefine->{$strKey}{&CFGDEF_INHERIT})) { # Make a copy in case there are overrides that need to be applied after inheriting - my $hConfigDefineOverride = dclone($hConfigDefine{$strKey}); + my $hConfigDefineOverride = dclone($rhConfigDefine->{$strKey}); # Copy the option being inherited from - $hConfigDefine{$strKey} = dclone($hConfigDefine{$hConfigDefine{$strKey}{&CFGDEF_INHERIT}}); + $rhConfigDefine->{$strKey} = dclone($rhConfigDefine->{$rhConfigDefine->{$strKey}{&CFGDEF_INHERIT}}); # No need to copy the inheritance key - delete($hConfigDefine{$strKey}{&CFGDEF_INHERIT}); + delete($rhConfigDefine->{$strKey}{&CFGDEF_INHERIT}); - # It makes no sense to inherit alt names - they must be specified for each option - delete($hConfigDefine{$strKey}{&CFGDEF_NAME_ALT}); + # It makes no sense to inherit deprecations - they must be specified for each option + delete($rhConfigDefine->{$strKey}{&CFGDEF_DEPRECATE}); # Apply overrides foreach my $strOptionDef (sort(keys(%{$hConfigDefineOverride}))) { - $hConfigDefine{$strKey}{$strOptionDef} = $hConfigDefineOverride->{$strOptionDef}; + $rhConfigDefine->{$strKey}{$strOptionDef} = $hConfigDefineOverride->{$strOptionDef}; } # Update option variable with new hash reference - $rhOption = $hConfigDefine{$strKey} + $rhOption = $rhConfigDefine->{$strKey} } # If the option group is defined then copy configuration from the group to the option if (defined($rhOption->{&CFGDEF_GROUP})) { - my $rhGroup = $rhOptionGroupDefine->{$hConfigDefine{$strKey}{&CFGDEF_GROUP}}; + my $rhGroup = $rhOptionGroupDefine->{$rhConfigDefine->{$strKey}{&CFGDEF_GROUP}}; $rhOption->{&CFGDEF_INDEX_TOTAL} = $rhGroup->{&CFGDEF_INDEX_TOTAL}; $rhOption->{&CFGDEF_PREFIX} = $rhGroup->{&CFGDEF_PREFIX}; @@ -3571,95 +368,95 @@ foreach my $strKey (sort(keys(%hConfigDefine))) } } # Else if the command section is a scalar then copy the section from the referenced option - elsif (defined($hConfigDefine{$strKey}{&CFGDEF_COMMAND}) && !ref($hConfigDefine{$strKey}{&CFGDEF_COMMAND})) + elsif (defined($rhConfigDefine->{$strKey}{&CFGDEF_COMMAND}) && !ref($rhConfigDefine->{$strKey}{&CFGDEF_COMMAND})) { - $hConfigDefine{$strKey}{&CFGDEF_COMMAND} = - dclone($hConfigDefine{$hConfigDefine{$strKey}{&CFGDEF_COMMAND}}{&CFGDEF_COMMAND}); + $rhConfigDefine->{$strKey}{&CFGDEF_COMMAND} = + dclone($rhConfigDefine->{$rhConfigDefine->{$strKey}{&CFGDEF_COMMAND}}{&CFGDEF_COMMAND}); } # If the required section is a scalar then copy the section from the referenced option - if (defined($hConfigDefine{$strKey}{&CFGDEF_DEPEND}) && !ref($hConfigDefine{$strKey}{&CFGDEF_DEPEND})) + if (defined($rhConfigDefine->{$strKey}{&CFGDEF_DEPEND}) && !ref($rhConfigDefine->{$strKey}{&CFGDEF_DEPEND})) { - $hConfigDefine{$strKey}{&CFGDEF_DEPEND} = - dclone($hConfigDefine{$hConfigDefine{$strKey}{&CFGDEF_DEPEND}}{&CFGDEF_DEPEND}); + $rhConfigDefine->{$strKey}{&CFGDEF_DEPEND} = + dclone($rhConfigDefine->{$rhConfigDefine->{$strKey}{&CFGDEF_DEPEND}}{&CFGDEF_DEPEND}); } # If the allow list is a scalar then copy the list from the referenced option - if (defined($hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST}) && !ref($hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST})) + if (defined($rhConfigDefine->{$strKey}{&CFGDEF_ALLOW_LIST}) && !ref($rhConfigDefine->{$strKey}{&CFGDEF_ALLOW_LIST})) { - $hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST} = - dclone($hConfigDefine{$hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST}}{&CFGDEF_ALLOW_LIST}); + $rhConfigDefine->{$strKey}{&CFGDEF_ALLOW_LIST} = + dclone($rhConfigDefine->{$rhConfigDefine->{$strKey}{&CFGDEF_ALLOW_LIST}}{&CFGDEF_ALLOW_LIST}); } # Default type is string - if (!defined($hConfigDefine{$strKey}{&CFGDEF_TYPE})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_TYPE})) { &log(ASSERT, "type is required for option '${strKey}'"); } # Default required is true - if (!defined($hConfigDefine{$strKey}{&CFGDEF_REQUIRED})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_REQUIRED})) { - $hConfigDefine{$strKey}{&CFGDEF_REQUIRED} = true; + $rhConfigDefine->{$strKey}{&CFGDEF_REQUIRED} = true; } # Default internal is false - if (!defined($hConfigDefine{$strKey}{&CFGDEF_INTERNAL})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_INTERNAL})) { - $hConfigDefine{$strKey}{&CFGDEF_INTERNAL} = false; + $rhConfigDefine->{$strKey}{&CFGDEF_INTERNAL} = false; } # Set index total for any option where it has not been explicitly defined - if (!defined($hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_INDEX_TOTAL})) { - $hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL} = 1; + $rhConfigDefine->{$strKey}{&CFGDEF_INDEX_TOTAL} = 1; } # All boolean config options can be negated. Boolean command-line options must be marked for negation individually. - if ($hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_BOOLEAN && defined($hConfigDefine{$strKey}{&CFGDEF_SECTION})) + if ($rhConfigDefine->{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_BOOLEAN && defined($rhConfigDefine->{$strKey}{&CFGDEF_SECTION})) { - $hConfigDefine{$strKey}{&CFGDEF_NEGATE} = true; + $rhConfigDefine->{$strKey}{&CFGDEF_NEGATE} = true; } # Default for negation is false - if (!defined($hConfigDefine{$strKey}{&CFGDEF_NEGATE})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_NEGATE})) { - $hConfigDefine{$strKey}{&CFGDEF_NEGATE} = false; + $rhConfigDefine->{$strKey}{&CFGDEF_NEGATE} = false; } # All config options can be reset - if (defined($hConfigDefine{$strKey}{&CFGDEF_SECTION})) + if (defined($rhConfigDefine->{$strKey}{&CFGDEF_SECTION})) { - $hConfigDefine{$strKey}{&CFGDEF_RESET} = true; + $rhConfigDefine->{$strKey}{&CFGDEF_RESET} = true; } - elsif (!defined($hConfigDefine{$strKey}{&CFGDEF_RESET})) + elsif (!defined($rhConfigDefine->{$strKey}{&CFGDEF_RESET})) { - $hConfigDefine{$strKey}{&CFGDEF_RESET} = false; + $rhConfigDefine->{$strKey}{&CFGDEF_RESET} = false; } # By default options are not secure - if (!defined($hConfigDefine{$strKey}{&CFGDEF_SECURE})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_SECURE})) { - $hConfigDefine{$strKey}{&CFGDEF_SECURE} = false; + $rhConfigDefine->{$strKey}{&CFGDEF_SECURE} = false; } # Set all indices to 1 by default - this defines how many copies of any option there can be - if (!defined($hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL})) + if (!defined($rhConfigDefine->{$strKey}{&CFGDEF_INDEX_TOTAL})) { - $hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL} = 1; + $rhConfigDefine->{$strKey}{&CFGDEF_INDEX_TOTAL} = 1; } # All int, size and time options must have an allow range - if (($hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_INTEGER || - $hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_TIME || - $hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_SIZE) && - !(defined($hConfigDefine{$strKey}{&CFGDEF_ALLOW_RANGE}) || defined($hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST}))) + if (($rhConfigDefine->{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_INTEGER || + $rhConfigDefine->{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_TIME || + $rhConfigDefine->{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_SIZE) && + !(defined($rhConfigDefine->{$strKey}{&CFGDEF_ALLOW_RANGE}) || defined($rhConfigDefine->{$strKey}{&CFGDEF_ALLOW_LIST}))) { confess &log(ASSERT, "int/size/time option '${strKey}' must have allow range or list"); } # Ensure all commands are valid - foreach my $strCommand (sort(keys(%{$hConfigDefine{$strKey}{&CFGDEF_COMMAND}}))) + foreach my $strCommand (sort(keys(%{$rhConfigDefine->{$strKey}{&CFGDEF_COMMAND}}))) { if (!defined($rhCommandDefine->{$strCommand})) { @@ -3669,9 +466,9 @@ foreach my $strKey (sort(keys(%hConfigDefine))) } # Generate valid command roles for each option -foreach my $strOption (sort(keys(%hConfigDefine))) +foreach my $strOption (sort(keys(%{$rhConfigDefine}))) { - my $rhOption = $hConfigDefine{$strOption}; + my $rhOption = $rhConfigDefine->{$strOption}; # Generate valid command roles for each command in the option foreach my $strCommand (sort(keys(%{$rhOption->{&CFGDEF_COMMAND}}))) @@ -3718,7 +515,7 @@ foreach my $strOption (sort(keys(%hConfigDefine))) #################################################################################################################################### sub cfgDefine { - return dclone(\%hConfigDefine); + return dclone($rhConfigDefine); } push @EXPORT, qw(cfgDefine); @@ -3762,9 +559,9 @@ sub cfgDefineOptionTypeList my $rhOptionTypeMap; # Get unique list of types - foreach my $strOption (sort(keys(%hConfigDefine))) + foreach my $strOption (sort(keys(%{$rhConfigDefine}))) { - my $strOptionType = $hConfigDefine{$strOption}{&CFGDEF_TYPE}; + my $strOptionType = $rhConfigDefine->{$strOption}{&CFGDEF_TYPE}; if (!defined($rhOptionTypeMap->{$strOptionType})) { diff --git a/build/lib/pgBackRestBuild/Error/Data.pm b/build/lib/pgBackRestBuild/Error/Data.pm index 8b88ad8c1..c869f5957 100644 --- a/build/lib/pgBackRestBuild/Error/Data.pm +++ b/build/lib/pgBackRestBuild/Error/Data.pm @@ -31,8 +31,8 @@ sub errorDefineLoad { my $strErrorYaml = shift; - require YAML::Any; - YAML::Any->import(qw(Load)); + require YAML::XS; + YAML::XS->import(qw(Load)); $rhErrorDefine = Load($strErrorYaml); } diff --git a/doc/lib/pgBackRestDoc/Common/DocConfig.pm b/doc/lib/pgBackRestDoc/Common/DocConfig.pm index f62a7049b..a08c92b61 100644 --- a/doc/lib/pgBackRestDoc/Common/DocConfig.pm +++ b/doc/lib/pgBackRestDoc/Common/DocConfig.pm @@ -325,11 +325,11 @@ sub process $$oCommandOption{&CONFIG_HELP_NAME} = $oOptionDoc->paramGet('name'); # Generate a list of alternate names - if (defined($rhConfigDefine->{$strOption}{&CFGDEF_NAME_ALT})) + if (defined($rhConfigDefine->{$strOption}{&CFGDEF_DEPRECATE})) { my $rhNameAlt = {}; - foreach my $strNameAlt (sort(keys(%{$rhConfigDefine->{$strOption}{&CFGDEF_NAME_ALT}}))) + foreach my $strNameAlt (sort(keys(%{$rhConfigDefine->{$strOption}{&CFGDEF_DEPRECATE}}))) { $strNameAlt =~ s/\?//g; diff --git a/doc/xml/contributing.xml b/doc/xml/contributing.xml index 0b561b687..e32d16914 100644 --- a/doc/xml/contributing.xml +++ b/doc/xml/contributing.xml @@ -193,14 +193,14 @@

To add an option, two files need be to be modified:

- build/lib/pgBackRestBuild/Config/Data.pm + src/build/config/config.yaml doc/xml/reference.xml

These files are discussed in the following sections.

- Data.pm + <file>src/build/config/config.yaml</file>

There is a detailed comment at the top of this file on the configuration definitions which one can refer to in determining how to define the rules for the option.

diff --git a/src/build/config/config.yaml b/src/build/config/config.yaml new file mode 100644 index 000000000..a42c78d9f --- /dev/null +++ b/src/build/config/config.yaml @@ -0,0 +1,1981 @@ +#################################################################################################################################### +# Configuration Definition +#################################################################################################################################### + +#################################################################################################################################### +# Commands +# +# Define valid commands. +# +# log-file: +# Does this command log to a file? This is the default behavior, but it can be overridden in code by calling logFileInit(). The +# default is true. +# +# log-level-default: +# Defines the log level to use for default messages that are output for every command. For example, the log message that lists +# all the options passed is usually output at the info level, but that might not be appropriate for some commands, such as info, +# Allow the log level to be lowered so these common messages will not be emitted where they might be distracting. +# +# log-required: +# Does the command require a lock? This doesn't mean a lock can't be taken explicitly later, just controls whether a lock will be +# acquired as soon at the command starts. +# +# lock-remote-required: +# Does the command require a lock on the remote? The lock will only be acquired for process id 0. +# +# lock-type: +# What type of lock is required (archive, backup, or all)? +# +# parameter-allowed +# Does the command allow parameters? If not then the config parser will automatically error out if parameters are detected. If so, +# then the command is responsible for ensuring that the parameters are valid. +#################################################################################################################################### +command: + archive-get: + command-role: + async: {} + local: {} + remote: {} + lock-type: archive + log-file: false + parameter-allowed: true + + archive-push: + command-role: + async: {} + local: {} + remote: {} + lock-remote-required: true + lock-type: archive + log-file: false + parameter-allowed: true + + backup: + command-role: + local: {} + remote: {} + lock-remote-required: true + lock-required: true + lock-type: backup + + check: + command-role: + remote: {} + log-file: false + + expire: + lock-required: true + lock-type: backup + + help: + log-file: false + log-level-default: DEBUG + parameter-allowed: true + + info: + command-role: + remote: {} + log-file: false + log-level-default: DEBUG + + repo-create: + command-role: + remote: {} + internal: true + log-file: false + + repo-get: + command-role: + remote: {} + log-file: false + log-level-default: DEBUG + parameter-allowed: true + + repo-ls: + command-role: + remote: {} + log-file: false + log-level-default: DEBUG + parameter-allowed: true + + repo-put: + command-role: + remote: {} + internal: true + log-file: false + log-level-default: DEBUG + parameter-allowed: true + + repo-rm: + command-role: + remote: {} + internal: true + log-file: false + log-level-default: DEBUG + parameter-allowed: true + + restore: + command-role: + local: {} + remote: {} + + stanza-create: + command-role: + remote: {} + lock-required: true + lock-type: all + + stanza-delete: + command-role: + remote: {} + lock-required: true + lock-type: all + + stanza-upgrade: + command-role: + remote: {} + lock-required: true + lock-type: all + + start: {} + + stop: {} + + verify: + command-role: + local: {} + remote: {} + internal: true + + version: + log-file: false + log-level-default: DEBUG + +#################################################################################################################################### +# Option Groups +# +# Options groups allow related options to be grouped together so, e.g. test and valid, operations can be run across all options in +# the group. +#################################################################################################################################### +optionGroup: + pg: + indexTotal: 8 + prefix: pg + repo: + indexTotal: 4 + prefix: repo + +#################################################################################################################################### +# Options +# +# Contains the defines for options: which commands the option can/cannot be specified, for which commands it is required, default +# settings, types, ranges, whether the option is negatable, whether it has dependencies, etc. The initial section is the global +# section, meaning that the defines defined there apply to all commands listed for the option. +# +# inherit: +# Inherit all definitions for the referenced option. Any definitions can be overridden. +# +# command: +# List of commands the option can be used with this option. An empty hash signifies that the command does not deviate from the +# option defaults. Otherwise, overrides can be specified. +# +# If another option is referenced (e.g. command: repo-type) then the list of commands will be copied from the referenced option. +# +# NOTE: If the option (A) has a dependency on another option (B) then the command must also be specified in the other option +# (B), else it will still error on the option (A). +# +# command-role: +# 1) Define the command roles for a command. 'default' is valid for all commands and is therefore added programmatically. +# +# 2) Define the command roles for an option. If not defined, the option will be valid for all roles of all commands for which it +# is valid. If command roles are defined for the option, then they override the roles for all commands for which the option is +# valid. 'default' must be defined explicitly in this case. For example, if an option is only valid for the 'default' role and +# the async role for each command then command-role must list 'default' and 'async', meaning each command has a default role +# so the option is valid for that role and for commands that have the 'async' role, it is also valid for the 'async' role of +# those commands. +# +# 3) Define the command roles for an option command override. If not defined, the option will be valid for all roles of the +# command or the roles specified by rule 2) above. 'default' must be defined explicitly in this case. If command roles are +# defined for the option command override, then they override command roles defined for the option (rule 2) above) +# and all roles defined for the command (rule 1) above). +# +# required: +# In global section: +# true - if the option does not have a default, then setting required in the global section means all commands listed in +# command require the user to set it. +# false - no commands listed require it as an option but it can be set. This can be overridden for individual commands by +# setting required in the command section. +# In command section: +# true - the option must be set somehow for the command, either by default or by the user, e.g. +# check: +# required: true +# false - mainly used for overriding required in the global section. +# +# default: +# Sets a default for the option for all commands if listed in the global section, or for specific commands if listed in the +# command section. All boolean types require a default. +# +# default-literal: +# If the default is a string output it as-is without quoting. This allows C defines to be used as defaults. +# +# negate: +# The option can be negated with "no" e.g. --no-compress. This applies to options that are only valid on the command line (i.e. +# no config section defined) and if not specifically defined, the default is false. All config file boolean options are +# automatically negatable. +# +# reset: +# The option can be reset to default even if the default is undefined. +# +# depend: +# Specify the dependencies this option has on another option. All commands listed for this option must also be listed in the +# dependent option(s). +# +# 'list' further defines the allowable settings for the depended option. +# +# allow-list: +# Lists the allowable settings for the option. +# +# internal: +# Option is used by the command internally but is not exposed in the documentation. This is useful for commands that need to know +# where they are running by looking at other options in the config. Also good for test options. +#################################################################################################################################### +option: + # Command-line only options + #--------------------------------------------------------------------------------------------------------------------------------- + config: + type: string + default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_FILE + default-literal: true + negate: y + + config-include-path: + type: path + default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_INCLUDE_PATH + default-literal: true + + config-path: + type: path + default: CFGOPTDEF_CONFIG_PATH + default-literal: true + + dry-run: + type: boolean + default: false + command: + expire: {} + command-role: + default: {} + + force: + type: boolean + command: + backup: + default: false + depend: + option: online + list: + - false + restore: + default: false + stanza-create: + default: false + internal: true + stanza-delete: + default: false + stop: + default: false + command-role: + default: {} + + online: + type: boolean + default: true + negate: y + command: + backup: {} + stanza-create: {} + stanza-upgrade: {} + command-role: + default: {} + + output: + type: string + command: + info: + default: text + allow-list: + - text + - json + repo-ls: + default: text + allow-list: + - text + - json + command-role: + default: {} + + set: + type: string + command: + expire: + required: false + info: + depend: + option: stanza + required: false + restore: + default: latest + verify: + internal: true + required: false + command-role: + default: {} + + stanza: + type: string + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + expire: {} + info: + required: false + repo-create: + required: false + repo-get: + required: false + repo-ls: + required: false + repo-put: + required: false + repo-rm: + required: false + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + start: + required: false + stop: + required: false + verify: {} + + target: + type: string + command: + restore: + depend: + option: type + list: + - name + - time + - xid + command-role: + default: {} + + target-action: + type: string + command: + restore: + allow-list: + - pause + - promote + - shutdown + default: pause + depend: + option: type + list: + - immediate + - name + - time + - xid + command-role: + default: {} + + target-exclusive: + type: boolean + command: + restore: + default: false + depend: + option: type + list: + - time + - xid + command-role: + default: {} + + target-timeline: + type: string + command: + restore: + required: false + depend: + option: type + list: + - default + - name + - standby + - time + - xid + command-role: + default: {} + + type: + command: + backup: + allow-list: + - full + - diff + - incr + default: incr + restore: + allow-list: + - name + - time + - xid + - preserve + - none + - immediate + - default + - standby + default: default + command-role: + default: {} + type: string + + # Command-line only local/remote options + #--------------------------------------------------------------------------------------------------------------------------------- + exec-id: + type: string + internal: true + required: false + + process: + type: integer + internal: true + required: false + allow-range: [0, 1024] + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + command-role: + local: {} + remote: {} + + remote-type: + type: string + internal: true + required: false + allow-list: + - pg + - repo + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + command-role: + local: {} + remote: {} + + # Command-line only storage options + #--------------------------------------------------------------------------------------------------------------------------------- + cipher-pass: + type: string + internal: true + required: false + command: + repo-get: {} + repo-put: {} + command-role: + default: {} + + filter: + type: string + required: false + command: + repo-ls: {} + command-role: + default: {} + + ignore-missing: + type: boolean + default: false + command: + repo-get: {} + command-role: + default: {} + + raw: + type: boolean + default: false + command: + repo-get: {} + repo-put: {} + command-role: + default: {} + + recurse: + type: boolean + default: false + command: + repo-ls: {} + repo-rm: {} + command-role: + default: {} + + sort: + type: string + default: asc + allow-list: + - none + - asc + - desc + command: + repo-ls: {} + command-role: + default: {} + + # General options + #--------------------------------------------------------------------------------------------------------------------------------- + archive-timeout: + section: global + type: time + default: 60 + allow-range: [0.1, 86400] + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + command-role: + default: {} + + buffer-size: + section: global + type: size + default: 1048576 + allow-list: + - 16384 + - 32768 + - 65536 + - 131072 + - 262144 + - 524288 + - 1048576 + - 2097152 + - 4194304 + - 8388608 + - 16777216 + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + expire: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + + cmd-ssh: + section: global + type: string + default: ssh + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + command-role: + async: {} + default: {} + local: {} + + # Option is deprecated and should not be referenced outside of cfgLoadUpdateOption() + compress: + section: global + type: boolean + default: true + command: + archive-push: {} + backup: {} + command-role: + default: {} + + compress-level: + section: global + type: integer + required: false + allow-range: [0, 9] + command: compress + command-role: + async: {} + default: {} + + compress-level-network: + section: global + type: integer + default: 3 + allow-range: [0, 9] + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + info: {} + repo-get: {} + repo-ls: {} + repo-put: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + command-role: + async: {} + default: {} + local: {} + + compress-type: + section: global + type: string + default: gz + allow-list: + - none + - bz2 + - gz + - lz4 + - zst + command: compress + command-role: + async: {} + default: {} + + db-timeout: + section: global + type: time + default: 1800 + allow-range: [0.1, 604800] + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + + delta: + section: global + type: boolean + default: false + command: + backup: {} + restore: {} + command-role: + default: {} + + io-timeout: + section: global + type: time + default: 60 + allow-range: [0.1, 3600] + command: buffer-size + + job-retry: + section: global + type: integer + internal: true + default: 2 + allow-range: [0, 360] + command: + archive-get: + default: true + archive-push: + default: true + backup: {} + restore: {} + verify: {} + command-role: + async: {} + default: {} + local: {} + + job-retry-interval: + inherit: job-retry + type: time + default: 15 + allow-range: [0, 900] + + lock-path: + section: global + type: path + default: /tmp/pgbackrest + command: + archive-get: {} + archive-push: {} + backup: {} + expire: {} + info: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + start: {} + stop: {} + + neutral-umask: + section: global + type: boolean + default: true + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + expire: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + start: {} + stop: {} + verify: {} + + process-max: + section: global + type: integer + default: true + allow-range: [1, 999] + command: + archive-get: {} + archive-push: {} + backup: {} + restore: {} + verify: {} + command-role: + async: {} + default: {} + + protocol-timeout: + section: global + type: time + default: 1830 + allow-range: [0.1, 604800] + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + + sck-block: + section: global + type: boolean + default: false + internal: true + command: buffer-size + + sck-keep-alive: + type: boolean + section: global + default: true + command: buffer-size + + spool-path: + section: global + type: path + default: /var/spool/pgbackrest + command: + archive-get: + depend: + option: archive-async + list: + - true + archive-push: + depend: + option: archive-async + list: + - true + command-role: + async: {} + default: {} + local: {} + + tcp-keep-alive-count: + section: global + type: integer + required: false + allow-range: [1, 32] + command: buffer-size + depend: + option: sck-keep-alive + list: + - true + + tcp-keep-alive-idle: + section: global + type: integer + required: false + allow-range: [1, 3600] + command: buffer-size + depend: tcp-keep-alive-count + + tcp-keep-alive-interval: + section: global + type: integer + required: false + allow-range: [1, 900] + command: buffer-size + depend: tcp-keep-alive-count + + # Logging options + #--------------------------------------------------------------------------------------------------------------------------------- + log-level-console: + section: global + type: string + default: warn + allow-list: + - off + - error + - warn + - info + - detail + - debug + - trace + + log-level-file: + section: global + type: string + default: info + allow-list: log-level-console + + log-level-stderr: + section: global + type: string + default: warn + allow-list: log-level-console + + log-path: + section: global + type: path + default: /var/log/pgbackrest + + log-subprocess: + section: global + type: boolean + default: false + command: + archive-get: {} + archive-push: {} + backup: {} + check: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + verify: {} + + log-timestamp: + section: global + type: boolean + default: true + command: log-level-console + + # Archive options + #--------------------------------------------------------------------------------------------------------------------------------- + archive-async: + section: global + type: boolean + default: false + command: + archive-get: {} + archive-push: {} + + archive-get-queue-max: + section: global + type: size + default: 134217728 + allow-range: [0, 4503599627370496] + command: + archive-get: {} + command-role: + async: {} + default: {} + + archive-push-queue-max: + section: global + type: size + required: false + allow-range: [0, 4503599627370496] + command: + archive-push: {} + command-role: + async: {} + default: {} + deprecate: + archive-queue-max: {} + + # Backup options + #--------------------------------------------------------------------------------------------------------------------------------- + archive-check: + section: global + type: boolean + default: true + command: + backup: + depend: + option: online + list: + - true + check: {} + command-role: + default: {} + + archive-copy: + section: global + type: boolean + default: false + command: + backup: + depend: + option: archive-check + list: + - true + command-role: + default: {} + + archive-mode-check: + section: global + type: boolean + default: true + command: + backup: {} + check: {} + command-role: + default: {} + depend: + option: archive-check + list: + - true + + backup-standby: + section: global + type: boolean + default: false + command: + backup: {} + check: {} + stanza-create: {} + stanza-upgrade: {} + command-role: + default: {} + + checksum-page: + section: global + type: boolean + required: false + command: + backup: {} + command-role: + default: {} + + exclude: + section: global + type: list + required: false + command: + backup: {} + command-role: + default: {} + + expire-auto: + section: global + type: boolean + default: true + command: + backup: {} + command-role: + default: {} + + manifest-save-threshold: + section: global + type: size + default: 1073741824 + allow-range: [1, 1099511627776] + command: + backup: {} + command-role: + default: {} + + resume: + section: global + type: boolean + default: true + command: + backup: {} + command-role: + default: {} + + start-fast: + section: global + type: boolean + default: false + command: + backup: {} + command-role: + default: {} + + stop-auto: + section: global + type: boolean + default: false + command: + backup: {} + command-role: + default: {} + + # Restore options + #--------------------------------------------------------------------------------------------------------------------------------- + archive-mode: + section: global + type: string + default: preserve + allow-list: + - off + - preserve + command: + restore: {} + command-role: + default: {} + + db-include: + section: global + type: list + required: false + command: + restore: {} + command-role: + default: {} + + link-all: + section: global + type: boolean + default: false + command: + restore: {} + command-role: + default: {} + + link-map: + section: global + type: hash + required: false + command: + restore: {} + command-role: + default: {} + + tablespace-map: + section: global + type: hash + required: false + command: + restore: {} + command-role: + default: {} + + tablespace-map-all: + section: global + type: string + required: false + command: + restore: {} + command-role: + default: {} + + recovery-option: + section: global + type: hash + required: false + command: + restore: {} + command-role: + default: {} + depend: + option: type + list: + - default + - immediate + - name + - time + - standby + - xid + + # Stanza options + #--------------------------------------------------------------------------------------------------------------------------------- + pg: + type: integer + internal: true + required: false + allow-range: [1, 8] + command: + backup: + command-role: + local: {} + + pg-database: + section: stanza + group: pg + type: string + command: pg-port + default: postgres + depend: pg-port + + pg-host: + section: stanza + group: pg + type: string + required: false + command: pg-local + command-role: + async: {} + default: {} + local: {} + depend: + option: pg-local + list: + - false + deprecate: + db-host: {index: 1, reset: false} + db?-host: {reset: false} + + pg-host-cmd: + section: stanza + group: pg + type: string + required: false + command: + backup: {} + check: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + command-role: + async: {} + default: {} + local: {} + depend: + option: pg-host + deprecate: + db-cmd: {index: 1, reset: false} + db?-cmd: {reset: false} + + pg-host-config: + inherit: pg-host-cmd + default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_FILE + default-literal: true + required: true + deprecate: + db-config: {index: 1, reset: false} + db?-config: {reset: false} + + pg-host-config-include-path: + inherit: pg-host-cmd + type: path + default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_INCLUDE_PATH + default-literal: true + + pg-host-config-path: + inherit: pg-host-cmd + type: path + default: CFGOPTDEF_CONFIG_PATH + default-literal: true + + pg-host-port: + inherit: pg-host-cmd + type: integer + required: false + allow-range: [0, 65535] + deprecate: + db-ssh-port: {index: 1, reset: false} + db?-ssh-port: {reset: false} + + pg-host-user: + inherit: pg-host-cmd + default: postgres + required: false + deprecate: + db-user: {index: 1, reset: false} + db?-user: {reset: false} + + pg-local: + section: stanza + group: pg + type: boolean + internal: true + default: false + command: + archive-get: + internal: true + archive-push: + internal: true + backup: {} + check: {} + restore: + internal: true + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + command-role: + async: {} + default: {} + local: {} + + pg-path: + section: stanza + group: pg + type: path + command: + archive-get: {} + archive-push: + required: false + backup: {} + check: {} + restore: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + deprecate: + db-path: {index: 1, reset: false} + db?-path: {reset: false} + + pg-port: + section: stanza + group: pg + type: integer + default: 5432 + allow-range: [0, 65535] + command: + backup: {} + check: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + depend: + option: pg-path + deprecate: + db-port: {index: 1, reset: false} + db?-port: {reset: false} + + pg-socket-path: + inherit: pg-port + type: path + required: false + default: ~ + deprecate: + db-socket-path: {index: 1, reset: false} + db?-socket-path: {reset: false} + + pg-user: + section: stanza + group: pg + type: string + required: false + + command: + backup: {} + check: {} + stanza-create: {} + stanza-delete: {} + stanza-upgrade: {} + depend: + option: pg-path + + # Repository options + #--------------------------------------------------------------------------------------------------------------------------------- + repo: + type: integer + required: false + allow-range: [1, 4] + command: + archive-get: + command-role: + async: {} + default: {} + local: {} + remote: {} + archive-push: + command-role: + remote: {} + backup: + command-role: + default: {} + local: {} + check: + command-role: + remote: {} + expire: + command-role: + default: {} + info: + command-role: + default: {} + remote: {} + repo-create: + command-role: + default: {} + remote: {} + repo-get: + command-role: + default: {} + remote: {} + repo-ls: + command-role: + default: {} + remote: {} + repo-put: + command-role: + default: {} + remote: {} + repo-rm: + command-role: + default: {} + remote: {} + restore: + command-role: + default: {} + local: {} + remote: {} + stanza-create: + command-role: {} + stanza-delete: + command-role: + default: {} + stanza-upgrade: + command-role: {} + start: + command-role: {} + stop: + command-role: {} + verify: + command-role: + default: {} + local: {} + remote: {} + + repo-azure-account: + section: global + type: string + group: repo + secure: true + command: repo-type + depend: + option: repo-type + list: + - azure + + repo-azure-container: + section: global + type: string + group: repo + command: repo-type + depend: repo-azure-account + + repo-azure-endpoint: + inherit: repo-azure-account + default: blob.core.windows.net + + repo-azure-key: + inherit: repo-azure-account + + repo-azure-key-type: + inherit: repo-azure-container + default: shared + allow-list: + - shared + - sas + + repo-cipher-pass: + section: global + type: string + secure: true + command: repo-type + depend: + option: repo-cipher-type + list: + - aes-256-cbc + group: repo + deprecate: + repo-cipher-pass: {index: 1, reset: false} + + repo-cipher-type: + section: global + type: string + group: repo + default: none + allow-list: + - none + - aes-256-cbc + command: repo-type + deprecate: + repo-cipher-type: {index: 1, reset: false} + + repo-gcs-bucket: + section: global + type: string + group: repo + command: repo-type + depend: + option: repo-gcs-key-type + + repo-gcs-endpoint: + section: global + type: string + group: repo + default: storage.googleapis.com + command: repo-type + depend: repo-gcs-bucket + + repo-gcs-key: + section: global + type: string + group: repo + secure: true + command: repo-type + depend: repo-gcs-bucket + + repo-gcs-key-type: + section: global + type: string + group: repo + default: service + allow-list: + - service + - token + command: repo-type + depend: + option: repo-type + list: + - gcs + + repo-hardlink: + section: global + group: repo + type: boolean + default: false + command: + backup: {} + command-role: + default: {} + deprecate: + hardlink: {index: 1, reset: false} + + repo-host: + section: global + group: repo + type: string + required: false + command: repo-local + command-role: + async: {} + default: {} + local: {} + depend: + option: repo-local + list: + - false + deprecate: + backup-host: {index: 1, reset: false} + + repo-host-cmd: + section: global + group: repo + type: string + required: false + command: + archive-get: {} + archive-push: {} + check: {} + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + verify: {} + command-role: + async: {} + default: {} + local: {} + depend: + option: repo-host + deprecate: + backup-cmd: {index: 1, reset: false} + + repo-host-config: + section: global + group: repo + type: string + command: repo-host-cmd + command-role: + async: {} + default: {} + local: {} + default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_FILE + default-literal: true + depend: + option: repo-host + deprecate: + backup-config: {index: 1, reset: false} + + repo-host-config-include-path: + inherit: repo-host-config + type: path + default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_INCLUDE_PATH + default-literal: true + + repo-host-config-path: + inherit: repo-host-config + type: path + default: CFGOPTDEF_CONFIG_PATH + default-literal: true + + repo-host-port: + section: global + group: repo + type: integer + required: false + allow-range: [0, 65535] + command: repo-host-cmd + command-role: + async: {} + default: {} + local: {} + depend: + option: repo-host + deprecate: + backup-ssh-port: {index: 1, reset: false} + + repo-host-user: + section: global + group: repo + type: string + required: false + command: repo-host-cmd + command-role: + async: {} + default: {} + local: {} + default: pgbackrest + depend: + option: repo-host + deprecate: + backup-user: {index: 1, reset: false} + + repo-local: + section: global + group: repo + type: boolean + internal: true + default: false + command: + archive-get: {} + archive-push: {} + backup: + internal: true + check: {} + expire: + internal: true + info: {} + repo-create: {} + repo-get: {} + repo-ls: {} + repo-put: {} + repo-rm: {} + restore: {} + stanza-create: + internal: true + stanza-delete: + internal: true + stanza-upgrade: + internal: true + verify: {} + command-role: + async: {} + default: {} + local: {} + + repo-path: + section: global + group: repo + type: path + default: /var/lib/pgbackrest + command: repo-type + deprecate: + repo-path: {index: 1, reset: false} + + repo-retention-archive: + section: global + group: repo + type: integer + required: false + allow-range: [1, 9999999] + command: + backup: {} + expire: {} + command-role: + default: {} + deprecate: + retention-archive: {index: 1, reset: false} + + repo-retention-archive-type: + section: global + type: string + group: repo + default: full + allow-list: + - full + - diff + - incr + command: + backup: {} + expire: {} + command-role: + default: {} + deprecate: + retention-archive-type: {index: 1, reset: false} + + repo-retention-diff: + section: global + group: repo + type: integer + required: false + allow-range: [1, 9999999] + command: + backup: {} + expire: {} + command-role: + default: {} + deprecate: + retention-diff: {index: 1, reset: false} + + repo-retention-full: + section: global + group: repo + type: integer + required: false + allow-range: [1, 9999999] + command: repo-retention-full-type + command-role: + default: {} + deprecate: + retention-full: {index: 1, reset: false} + + repo-retention-full-type: + section: global + group: repo + type: string + default: count + allow-list: + - count + - time + command: + backup: {} + expire: {} + command-role: + default: {} + + repo-s3-bucket: + section: global + group: repo + type: string + command: repo-type + depend: + option: repo-type + list: + - s3 + deprecate: + repo-s3-bucket: {index: 1, reset: false} + + repo-s3-endpoint: + inherit: repo-s3-bucket + deprecate: + repo-s3-endpoint: {index: 1, reset: false} + + repo-s3-key: + section: global + group: repo + type: string + secure: true + command: repo-type + depend: + option: repo-s3-key-type + list: + - shared + deprecate: + repo-s3-key: {index: 1, reset: false} + + repo-s3-key-secret: + inherit: repo-s3-key + deprecate: + repo-s3-key-secret: {index: 1, reset: false} + + repo-s3-key-type: + inherit: repo-s3-bucket + default: shared + allow-list: + - shared + - auto + + repo-s3-region: + inherit: repo-s3-bucket + deprecate: + repo-s3-region: {index: 1, reset: false} + + repo-s3-role: + inherit: repo-s3-bucket + required: false + depend: + option: repo-s3-key-type + list: + - auto + + repo-s3-token: + inherit: repo-s3-key + required: false + command: repo-type + + repo-s3-uri-style: + section: global + group: repo + type: string + default: host + allow-list: + - host + - path + command: repo-type + depend: repo-s3-bucket + + repo-storage-ca-file: + section: global + group: repo + type: string + required: false + command: repo-type + depend: repo-storage-verify-tls + deprecate: + repo-s3-ca-file: {index: 1, reset: false} + repo?-azure-ca-file: {index: 1} + repo?-s3-ca-file: {index: 1} + + repo-storage-ca-path: + inherit: repo-storage-ca-file + type: path + deprecate: + repo-s3-ca-path: {index: 1, reset: false} + repo?-azure-ca-path: {index: 1} + repo?-s3-ca-path: {index: 1} + + repo-storage-host: + section: global + group: repo + type: string + required: false + command: repo-type + depend: + option: repo-type + list: + - azure + - s3 + deprecate: + repo-s3-host: {index: 1, reset: false} + repo?-azure-host: {index: 1} + repo?-s3-host: {index: 1} + + repo-storage-port: + section: global + group: repo + type: integer + default: 443 + allow-range: [1, 65535] + command: repo-type + depend: repo-storage-host + deprecate: + repo?-azure-port: {index: 1} + repo?-s3-port: {index: 1} + + repo-storage-verify-tls: + section: global + group: repo + type: boolean + default: true + command: repo-type + depend: + option: repo-type + list: + - azure + - gcs + - s3 + deprecate: + repo-s3-verify-ssl: {index: 1, reset: false} + repo?-azure-verify-tls: {index: 1} + repo?-s3-verify-ssl: {index: 1, reset: false} + repo?-s3-verify-tls: {index: 1} + + repo-type: + section: global + group: repo + type: string + default: posix + allow-list: + - azure + - cifs + - gcs + - posix + - s3 + command: + archive-get: + command-role: + async: {} + default: {} + local: {} + remote: {} + archive-push: + command-role: + async: {} + default: {} + local: {} + remote: {} + backup: + command-role: + default: {} + local: {} + check: + command-role: + default: {} + remote: {} + expire: + command-role: + default: {} + info: + command-role: + default: {} + remote: {} + repo-create: + command-role: + default: {} + remote: {} + repo-get: + command-role: + default: {} + remote: {} + repo-ls: + command-role: + default: {} + remote: {} + repo-put: + command-role: + default: {} + remote: {} + repo-rm: + command-role: + default: {} + remote: {} + restore: + command-role: + default: {} + local: {} + remote: {} + stanza-create: + command-role: + default: {} + stanza-delete: + command-role: + default: {} + stanza-upgrade: + command-role: + default: {} + start: + command-role: {} + stop: + command-role: {} + verify: + command-role: + default: {} + local: {} + remote: {} + deprecate: + repo-type: {index: 1, reset: false} diff --git a/test/Vagrantfile b/test/Vagrantfile index 1eef47d94..afc23ea57 100644 --- a/test/Vagrantfile +++ b/test/Vagrantfile @@ -136,7 +136,7 @@ Vagrant.configure(2) do |config| #----------------------------------------------------------------------------------------------------------------------- echo 'Install Build Tools' && date - pkg install -y git postgresql-libpqxx pkgconf libxml2 gmake perl5 p5-YAML rsync + pkg install -y git postgresql-libpqxx pkgconf libxml2 gmake perl5 p5-YAML-LibYAML rsync #----------------------------------------------------------------------------------------------------------------------- echo 'Build End' && date @@ -149,7 +149,7 @@ Vagrant.configure(2) do |config| #------------------------------------------------------------------------------------------------------------------------------- # mkdir ~/homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C ~/homebrew # ~/homebrew/bin/brew install -q libpq libxml2 cpanm - # ~/homebrew/bin/cpanm --force --local-lib=~/homebrew/perl5 install YAML XML::Checker::Parser + # ~/homebrew/bin/cpanm --force --local-lib=~/homebrew/perl5 install YAML::XS XML::Checker::Parser # # export LDFLAGS="-L${HOME?}/homebrew/opt/openssl@1.1/lib -L${HOME?}/homebrew/opt/libpq/lib -L${HOME?}/homebrew/opt/libxml2/lib" # export CPPFLAGS="-I${HOME?}/homebrew/opt/openssl@1.1/include -I/${HOME?}/homebrew/opt/libpq/include" diff --git a/test/lib/pgBackRestTest/Common/CodeCountTest.pm b/test/lib/pgBackRestTest/Common/CodeCountTest.pm index 975d0d41b..3e3849689 100644 --- a/test/lib/pgBackRestTest/Common/CodeCountTest.pm +++ b/test/lib/pgBackRestTest/Common/CodeCountTest.pm @@ -27,8 +27,8 @@ sub codeCountScan my $strBasePath = shift; # Load YAML - require YAML::Any; - YAML::Any->import(qw(Load Dump)); + require YAML::XS; + YAML::XS->import(qw(Load Dump)); my $hCodeCount = {}; diff --git a/test/lib/pgBackRestTest/Common/ContainerTest.pm b/test/lib/pgBackRestTest/Common/ContainerTest.pm index 23caf7adc..4c56755f0 100755 --- a/test/lib/pgBackRestTest/Common/ContainerTest.pm +++ b/test/lib/pgBackRestTest/Common/ContainerTest.pm @@ -301,8 +301,8 @@ sub containerBuild $oStorageDocker->pathCreate($strTempPath, {strMode => '0770', bIgnoreExists => true, bCreateParent => true}); # Load container definitions from yaml - require YAML::Any; - YAML::Any->import(qw(Load)); + require YAML::XS; + YAML::XS->import(qw(Load)); $hContainerCache = Load(${$oStorageDocker->get($oStorageDocker->pathGet('test/container.yaml'))}); diff --git a/test/lib/pgBackRestTest/Common/DefineTest.pm b/test/lib/pgBackRestTest/Common/DefineTest.pm index 716b8718b..1930b8d35 100644 --- a/test/lib/pgBackRestTest/Common/DefineTest.pm +++ b/test/lib/pgBackRestTest/Common/DefineTest.pm @@ -92,8 +92,8 @@ sub testDefLoad my $strDefineYaml = shift; # Load test definitions from yaml - require YAML::Any; - YAML::Any->import(qw(Load)); + require YAML::XS; + YAML::XS->import(qw(Load)); my $hTestDef = Load($strDefineYaml); diff --git a/test/test.pl b/test/test.pl index 3404f2577..9c22f7828 100755 --- a/test/test.pl +++ b/test/test.pl @@ -572,7 +572,8 @@ eval # Auto-generate C files #----------------------------------------------------------------------------------------------------------------------- - if (!$bSmart || grep(/^build\//, @stryModifiedList) || grep(/^doc\/xml\/reference\.xml/, @stryModifiedList)) + if (!$bSmart || grep(/^build\//, @stryModifiedList) || grep(/^doc\/xml\/reference\.xml/, @stryModifiedList) || + grep(/^src\/build\/config\/config\.yaml/, @stryModifiedList)) { errorDefineLoad(${$oStorageBackRest->get("build/error.yaml")});