1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-14 10:13:05 +02:00
pgbackrest/build/lib/pgBackRestBuild/Config/Data.pm

2961 lines
104 KiB
Perl
Raw Normal View History

####################################################################################################################################
# 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.
#
# 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_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.
2019-12-19 23:25:46 +02:00
# &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_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.
####################################################################################################################################
package pgBackRestBuild::Config::Data;
use strict;
use warnings FATAL => qw(all);
use Carp qw(confess);
use Cwd qw(abs_path);
use Exporter qw(import);
our @EXPORT = qw();
use File::Basename qw(dirname basename);
use Getopt::Long qw(GetOptions);
use Storable qw(dclone);
use pgBackRestDoc::Common::Exception;
use pgBackRestDoc::Common::Log;
use pgBackRestDoc::ProjectInfo;
use pgBackRestTest::Common::Wait;
####################################################################################################################################
# Command constants - commands that are allowed in the exe
####################################################################################################################################
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_VERSION => 'version';
####################################################################################################################################
# Option constants - options that are allowed for commands
####################################################################################################################################
# Command-line only options
#-----------------------------------------------------------------------------------------------------------------------------------
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_PROCESS => 'process';
use constant CFGOPT_HOST_ID => 'host-id';
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_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);
use constant CFGOPT_LOG_PATH => 'log-path';
push @EXPORT, qw(CFGOPT_LOG_PATH);
use constant CFGOPT_SPOOL_PATH => 'spool-path';
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 => 1;
# Prefix that must be used by all repo options that allow multiple configurations
use constant CFGDEF_PREFIX_REPO => '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_CA_FILE => CFGDEF_REPO_AZURE . '-ca-file';
use constant CFGOPT_REPO_AZURE_CA_PATH => CFGDEF_REPO_AZURE . '-ca-path';
use constant CFGOPT_REPO_AZURE_CONTAINER => CFGDEF_REPO_AZURE . '-container';
use constant CFGOPT_REPO_AZURE_HOST => CFGDEF_REPO_AZURE . '-host';
use constant CFGOPT_REPO_AZURE_KEY => CFGDEF_REPO_AZURE . '-key';
use constant CFGOPT_REPO_AZURE_KEY_TYPE => CFGDEF_REPO_AZURE . '-key-type';
use constant CFGOPT_REPO_AZURE_PORT => CFGDEF_REPO_AZURE . '-port';
use constant CFGOPT_REPO_AZURE_VERIFY_TLS => CFGDEF_REPO_AZURE . '-verify-tls';
# 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_BUCKET => CFGDEF_REPO_S3 . '-bucket';
use constant CFGOPT_REPO_S3_CA_FILE => CFGDEF_REPO_S3 . '-ca-file';
use constant CFGOPT_REPO_S3_CA_PATH => CFGDEF_REPO_S3 . '-ca-path';
use constant CFGOPT_REPO_S3_ENDPOINT => CFGDEF_REPO_S3 . '-endpoint';
use constant CFGOPT_REPO_S3_HOST => CFGDEF_REPO_S3 . '-host';
use constant CFGOPT_REPO_S3_PORT => CFGDEF_REPO_S3 . '-port';
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';
use constant CFGOPT_REPO_S3_VERIFY_TLS => CFGDEF_REPO_S3 . '-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_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_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
#-----------------------------------------------------------------------------------------------------------------------------------
# Determines how many databases can be configured
use constant CFGDEF_INDEX_PG => 8;
push @EXPORT, qw(CFGDEF_INDEX_PG);
# Prefix that must be used by all db options that allow multiple configurations
use constant CFGDEF_PREFIX_PG => 'pg';
push @EXPORT, qw(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_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_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_CONFIG_PATH => '/etc/' . PROJECT_EXE;
use constant CFGDEF_DEFAULT_CONFIG => CFGDEF_DEFAULT_CONFIG_PATH . '/' . PROJECT_CONF;
use constant CFGDEF_DEFAULT_CONFIG_INCLUDE_PATH => CFGDEF_DEFAULT_CONFIG_PATH . '/conf.d';
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.
####################################################################################################################################
# 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);
# Option defines
#-----------------------------------------------------------------------------------------------------------------------------------
use constant CFGDEF_ALLOW_LIST => 'allow-list';
push @EXPORT, qw(CFGDEF_ALLOW_LIST);
use constant CFGDEF_ALLOW_RANGE => 'allow-range';
push @EXPORT, qw(CFGDEF_ALLOW_RANGE);
use constant CFGDEF_DEFAULT => 'default';
push @EXPORT, qw(CFGDEF_DEFAULT);
use constant CFGDEF_DEPEND => 'depend';
push @EXPORT, qw(CFGDEF_DEPEND);
use constant CFGDEF_DEPEND_OPTION => 'depend-option';
push @EXPORT, qw(CFGDEF_DEPEND_OPTION);
use constant CFGDEF_DEPEND_LIST => 'depend-list';
push @EXPORT, qw(CFGDEF_DEPEND_LIST);
use constant CFGDEF_INDEX => 'index';
push @EXPORT, qw(CFGDEF_INDEX);
use constant CFGDEF_INDEX_TOTAL => 'indexTotal';
push @EXPORT, qw(CFGDEF_INDEX_TOTAL);
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_NEGATE => 'negate';
push @EXPORT, qw(CFGDEF_NEGATE);
use constant CFGDEF_PREFIX => 'prefix';
push @EXPORT, qw(CFGDEF_PREFIX);
use constant CFGDEF_COMMAND => 'command';
push @EXPORT, qw(CFGDEF_COMMAND);
use constant CFGDEF_REQUIRED => 'required';
push @EXPORT, qw(CFGDEF_REQUIRED);
use constant CFGDEF_RESET => 'reset';
push @EXPORT, qw(CFGDEF_RESET);
use constant CFGDEF_SECTION => 'section';
push @EXPORT, qw(CFGDEF_SECTION);
use constant CFGDEF_SECURE => 'secure';
push @EXPORT, qw(CFGDEF_SECURE);
use constant CFGDEF_TYPE => 'type';
push @EXPORT, qw(CFGDEF_TYPE);
# Option types
#-----------------------------------------------------------------------------------------------------------------------------------
use constant CFGDEF_TYPE_BOOLEAN => 'boolean';
push @EXPORT, qw(CFGDEF_TYPE_BOOLEAN);
use constant CFGDEF_TYPE_FLOAT => 'float';
push @EXPORT, qw(CFGDEF_TYPE_FLOAT);
use constant CFGDEF_TYPE_HASH => 'hash';
push @EXPORT, qw(CFGDEF_TYPE_HASH);
use constant CFGDEF_TYPE_INTEGER => 'integer';
push @EXPORT, qw(CFGDEF_TYPE_INTEGER);
use constant CFGDEF_TYPE_LIST => 'list';
push @EXPORT, qw(CFGDEF_TYPE_LIST);
use constant CFGDEF_TYPE_PATH => 'path';
push @EXPORT, qw(CFGDEF_TYPE_PATH);
use constant CFGDEF_TYPE_STRING => 'string';
push @EXPORT, qw(CFGDEF_TYPE_STRING);
use constant CFGDEF_TYPE_SIZE => 'size';
push @EXPORT, qw(CFGDEF_TYPE_SIZE);
# Option config sections
#-----------------------------------------------------------------------------------------------------------------------------------
use constant CFGDEF_SECTION_GLOBAL => 'global';
push @EXPORT, qw(CFGDEF_SECTION_GLOBAL);
use constant CFGDEF_SECTION_STANZA => 'stanza';
push @EXPORT, qw(CFGDEF_SECTION_STANZA);
####################################################################################################################################
# Command definition data
####################################################################################################################################
my $rhCommandDefine =
{
&CFGCMD_ARCHIVE_GET =>
{
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ARCHIVE,
&CFGDEF_PARAMETER_ALLOWED => true,
},
&CFGCMD_ARCHIVE_PUSH =>
{
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOCK_REMOTE_REQUIRED => true,
&CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ARCHIVE,
&CFGDEF_PARAMETER_ALLOWED => true,
},
&CFGCMD_BACKUP =>
{
&CFGDEF_LOCK_REQUIRED => true,
&CFGDEF_LOCK_REMOTE_REQUIRED => true,
&CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_BACKUP,
},
&CFGCMD_CHECK =>
{
&CFGDEF_LOG_FILE => false,
},
&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,
},
&CFGCMD_REPO_CREATE =>
{
&CFGDEF_INTERNAL => true,
&CFGDEF_LOG_FILE => false,
},
&CFGCMD_REPO_GET =>
{
&CFGDEF_INTERNAL => true,
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOG_LEVEL_DEFAULT => DEBUG,
&CFGDEF_PARAMETER_ALLOWED => true,
},
&CFGCMD_REPO_LS =>
{
&CFGDEF_INTERNAL => true,
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOG_LEVEL_DEFAULT => DEBUG,
&CFGDEF_PARAMETER_ALLOWED => true,
},
&CFGCMD_REPO_PUT =>
{
&CFGDEF_INTERNAL => true,
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOG_LEVEL_DEFAULT => DEBUG,
&CFGDEF_PARAMETER_ALLOWED => true,
},
&CFGCMD_REPO_RM =>
{
&CFGDEF_INTERNAL => true,
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOG_LEVEL_DEFAULT => DEBUG,
&CFGDEF_PARAMETER_ALLOWED => true,
},
&CFGCMD_RESTORE =>
{
},
&CFGCMD_STANZA_CREATE =>
{
&CFGDEF_LOCK_REQUIRED => true,
&CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ALL,
},
&CFGCMD_STANZA_DELETE =>
{
&CFGDEF_LOCK_REQUIRED => true,
&CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ALL,
},
&CFGCMD_STANZA_UPGRADE =>
{
&CFGDEF_LOCK_REQUIRED => true,
&CFGDEF_LOCK_TYPE => CFGDEF_LOCK_TYPE_ALL,
},
&CFGCMD_START =>
{
},
&CFGCMD_STOP =>
{
},
&CFGCMD_VERSION =>
{
&CFGDEF_LOG_FILE => false,
&CFGDEF_LOG_LEVEL_DEFAULT => DEBUG,
},
};
####################################################################################################################################
# Option definition data
####################################################################################################################################
my %hConfigDefine =
(
# Command-line only options
#-------------------------------------------------------------------------------------------------------------------------------
&CFGOPT_CONFIG =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG,
&CFGDEF_NEGATE => true,
&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_START => {},
&CFGCMD_STOP => {},
}
},
&CFGOPT_CONFIG_INCLUDE_PATH =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_INHERIT => CFGOPT_CONFIG,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG_INCLUDE_PATH,
&CFGDEF_NEGATE => false,
},
&CFGOPT_CONFIG_PATH =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_INHERIT => CFGOPT_CONFIG,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG_PATH,
&CFGDEF_NEGATE => false,
},
&CFGOPT_DRYRUN =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_EXPIRE => {},
},
},
&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
}
}
},
&CFGOPT_ONLINE =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_NEGATE => true,
&CFGDEF_DEFAULT => true,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
&CFGCMD_STANZA_CREATE => {},
&CFGCMD_STANZA_UPGRADE => {},
}
},
&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',
},
}
},
&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
}
}
},
&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,
],
},
},
},
},
&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,
],
},
},
},
},
&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,
],
},
},
},
},
&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,
],
},
},
},
},
&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,
]
}
}
},
&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,
]
}
}
},
# Command-line only local/remote options
#-------------------------------------------------------------------------------------------------------------------------------
&CFGOPT_HOST_ID =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_REQUIRED => false,
&CFGDEF_INTERNAL => true,
&CFGDEF_ALLOW_RANGE => [1, CFGDEF_INDEX_PG > CFGDEF_INDEX_REPO ? CFGDEF_INDEX_PG : CFGDEF_INDEX_REPO],
&CFGDEF_COMMAND =>
{
&CFGCMD_ARCHIVE_GET => {},
&CFGCMD_ARCHIVE_PUSH => {},
&CFGCMD_BACKUP => {},
&CFGCMD_RESTORE => {},
},
},
&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 => {},
},
},
&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 => {},
},
},
# 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 => {},
}
},
&CFGOPT_FILTER =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_REPO_LS => {},
}
},
&CFGOPT_IGNORE_MISSING =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_REPO_GET => {},
}
},
&CFGOPT_RAW =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_REPO_GET => {},
&CFGCMD_REPO_PUT => {},
}
},
&CFGOPT_RECURSE =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_REPO_LS => {},
&CFGCMD_REPO_RM => {},
}
},
&CFGOPT_SORT =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_DEFAULT => 'asc',
&CFGDEF_ALLOW_LIST =>
[
'none',
'asc',
'desc',
],
&CFGDEF_COMMAND =>
{
&CFGCMD_REPO_LS => {},
}
},
# General options
#-------------------------------------------------------------------------------------------------------------------------------
&CFGOPT_ARCHIVE_TIMEOUT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_FLOAT,
&CFGDEF_DEFAULT => 60,
&CFGDEF_ALLOW_RANGE => [WAIT_TIME_MINIMUM, 86400],
&CFGDEF_COMMAND =>
{
&CFGCMD_ARCHIVE_GET => {},
&CFGCMD_ARCHIVE_PUSH => {},
&CFGCMD_BACKUP => {},
&CFGCMD_CHECK => {},
},
},
&CFGOPT_BUFFER_SIZE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_SIZE,
Reduce buffer-size default to 1MiB. The prior default was determined by benchmarking the Perl code prior to the 1.0 release. In general buffer allocation was more expensive in Perl so large buffers gave the best performance. This was due to multiple buffer allocations for each filter in an IO operation. The C code allocates fixed buffers for each IO operation so the cost for buffer allocation is lower than Perl. That being the case it made sense to benchmark the C code to determine the optimal buffer default. The performance/storage tests were used to measure the performance of a variety of filters. 1GiB of data was processed by each filter 10 times and the results of the tests were averaged. While most buffer sizes gave similar performance, 1MiB appeared to perform the best overall. Of course, different architectures are likely to yield different results but this seems like a sensible default. The buffer-size option may still need to be manually configured to give optimal results. Raw test data for reference: 4MB buffer (prior default) copy time 1807ms, avg time 180ms, avg throughput: 5942MB/s md5 time 14200ms, avg time 1420ms, avg throughput: 756MB/s sha1 time 11431ms, avg time 1143ms, avg throughput: 939MB/s sha256 time 23463ms, avg time 2346ms, avg throughput: 457MB/s gzip -6 time 381199ms, avg time 38119ms, avg throughput: 28MB/s lz4 -1 time 15484ms, avg time 1548ms, avg throughput: 693MB/s 1MB buffer (new default) copy time 1760ms, avg time 176ms, avg throughput: 6100MB/s md5 time 13739ms, avg time 1373ms, avg throughput: 781MB/s sha1 time 11025ms, avg time 1102ms, avg throughput: 973MB/s sha256 time 22539ms, avg time 2253ms, avg throughput: 476MB/s gzip -6 time 372995ms, avg time 37299ms, avg throughput: 28MB/s lz4 -1 time 15118ms, avg time 1511ms, avg throughput: 710MB/s 512K buffer copy time 1782ms, avg time 178ms, avg throughput: 6025MB/s md5 time 13724ms, avg time 1372ms, avg throughput: 782MB/s sha1 time 10959ms, avg time 1095ms, avg throughput: 979MB/s sha256 time 22982ms, avg time 2298ms, avg throughput: 467MB/s gzip -6 time 378120ms, avg time 37812ms, avg throughput: 28MB/s lz4 -1 time 15484ms, avg time 1548ms, avg throughput: 693MB/s 256K buffer copy time 1805ms, avg time 180ms, avg throughput: 5948MB/s md5 time 13706ms, avg time 1370ms, avg throughput: 783MB/s sha1 time 11074ms, avg time 1107ms, avg throughput: 969MB/s sha256 time 22588ms, avg time 2258ms, avg throughput: 475MB/s gzip -6 time 372645ms, avg time 37264ms, avg throughput: 28MB/s lz4 -1 time 16346ms, avg time 1634ms, avg throughput: 656MB/s
2020-05-19 22:58:49 +02:00
&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 => {},
}
},
&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_FLOAT,
&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 => {},
},
},
# 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 => {},
}
},
&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,
},
&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,
},
&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 => {},
}
},
&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 => {},
}
},
&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_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_START => {},
&CFGCMD_STOP => {},
},
},
&CFGOPT_IO_TIMEOUT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_FLOAT,
&CFGDEF_DEFAULT => 60,
&CFGDEF_ALLOW_RANGE => [.1, 3600],
&CFGDEF_COMMAND => CFGOPT_BUFFER_SIZE,
},
&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,
&CFGDEF_COMMAND =>
{
&CFGCMD_ARCHIVE_GET => {},
&CFGCMD_ARCHIVE_PUSH => {},
2017-12-23 06:27:49 +02:00
&CFGCMD_BACKUP => {},
&CFGCMD_CHECK => {},
&CFGCMD_EXPIRE => {},
&CFGCMD_INFO => {},
&CFGCMD_REPO_CREATE => {},
&CFGCMD_REPO_GET => {},
&CFGCMD_REPO_LS => {},
&CFGCMD_REPO_PUT => {},
&CFGCMD_REPO_RM => {},
2017-12-23 06:27:49 +02:00
&CFGCMD_RESTORE => {},
&CFGCMD_STANZA_CREATE => {},
&CFGCMD_STANZA_DELETE => {},
2017-12-23 06:27:49 +02:00
&CFGCMD_STANZA_UPGRADE => {},
&CFGCMD_START => {},
&CFGCMD_STOP => {},
},
},
&CFGOPT_PROTOCOL_TIMEOUT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_FLOAT,
&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 => {},
}
},
# Repository options
#-------------------------------------------------------------------------------------------------------------------------------
&CFGOPT_REPO_CIPHER_PASS =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_NAME_ALT =>
{
'hardlink' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
},
},
&CFGOPT_REPO_LOCAL =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_INTERNAL => true,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_START => {},
&CFGCMD_STOP => {},
},
},
&CFGOPT_REPO_HOST =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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],
},
},
&CFGOPT_REPO_HOST_CMD =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_START => {},
&CFGCMD_STOP => {},
},
&CFGDEF_DEPEND =>
{
&CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST
},
},
&CFGOPT_REPO_HOST_CONFIG =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG,
&CFGDEF_NAME_ALT =>
{
'backup-config' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&CFGDEF_COMMAND => CFGOPT_REPO_HOST_CMD,
&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 => CFGDEF_DEFAULT_CONFIG_PATH,
},
&CFGOPT_REPO_HOST_CONFIG_INCLUDE_PATH =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_INHERIT => CFGOPT_REPO_HOST_CONFIG,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG_INCLUDE_PATH,
},
&CFGOPT_REPO_HOST_PORT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_DEPEND =>
{
&CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST
}
},
&CFGOPT_REPO_HOST_USER =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => PROJECT_EXE,
&CFGDEF_NAME_ALT =>
{
'backup-user' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&CFGDEF_COMMAND => CFGOPT_REPO_HOST_CMD,
&CFGDEF_REQUIRED => false,
&CFGDEF_DEPEND =>
{
&CFGDEF_DEPEND_OPTION => CFGOPT_REPO_HOST
}
},
&CFGOPT_REPO_PATH =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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 => {},
}
},
&CFGOPT_REPO_RETENTION_ARCHIVE_TYPE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => CFGOPTVAL_BACKUP_TYPE_FULL,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
&CFGCMD_EXPIRE => {},
},
&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_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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 => {},
}
},
&CFGOPT_REPO_RETENTION_FULL =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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,
},
&CFGOPT_REPO_RETENTION_FULL_TYPE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => 'count',
&CFGDEF_ALLOW_LIST =>
[
'count',
'time',
],
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
&CFGCMD_EXPIRE => {},
}
},
&CFGOPT_REPO_AZURE_ACCOUNT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_CA_FILE =>
{
&CFGDEF_INHERIT => CFGOPT_REPO_AZURE_HOST,
},
&CFGOPT_REPO_AZURE_CA_PATH =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_INHERIT => CFGOPT_REPO_AZURE_HOST,
},
&CFGOPT_REPO_AZURE_CONTAINER =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_DEPEND => CFGOPT_REPO_AZURE_ACCOUNT,
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&CFGOPT_REPO_AZURE_HOST =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_REQUIRED => false,
&CFGDEF_DEPEND => CFGOPT_REPO_AZURE_ACCOUNT,
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&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_AZURE_PORT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => 443,
&CFGDEF_ALLOW_RANGE => [1, 65535],
&CFGDEF_DEPEND => CFGOPT_REPO_AZURE_ACCOUNT,
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&CFGOPT_REPO_AZURE_VERIFY_TLS =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => true,
&CFGDEF_DEPEND => CFGOPT_REPO_AZURE_ACCOUNT,
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&CFGOPT_REPO_S3_BUCKET =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_CA_FILE =>
{
&CFGDEF_INHERIT => CFGOPT_REPO_S3_HOST,
&CFGDEF_NAME_ALT =>
{
'repo-s3-ca-file' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
},
&CFGOPT_REPO_S3_CA_PATH =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_INHERIT => CFGOPT_REPO_S3_HOST,
&CFGDEF_NAME_ALT =>
{
'repo-s3-ca-path' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
},
&CFGOPT_REPO_S3_KEY =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_SECURE => true,
&CFGDEF_REQUIRED => true,
&CFGDEF_DEPEND =>
{
&CFGDEF_DEPEND_OPTION => CFGOPT_REPO_TYPE,
&CFGDEF_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_S3],
},
&CFGDEF_NAME_ALT =>
{
'repo-s3-key' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&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_START => {},
&CFGCMD_STOP => {},
},
},
&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_HOST =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_REQUIRED => false,
&CFGDEF_DEPEND => CFGOPT_REPO_S3_BUCKET,
&CFGDEF_NAME_ALT =>
{
'repo-s3-host' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&CFGOPT_REPO_S3_PORT =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => 443,
&CFGDEF_ALLOW_RANGE => [1, 65535],
&CFGDEF_DEPEND => CFGOPT_REPO_S3_BUCKET,
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&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_TOKEN =>
{
&CFGDEF_INHERIT => CFGOPT_REPO_S3_KEY,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
},
&CFGOPT_REPO_S3_URI_STYLE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&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_S3_VERIFY_TLS =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => true,
&CFGDEF_NAME_ALT =>
{
'repo-s3-verify-ssl' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
'repo?-s3-verify-ssl' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&CFGDEF_COMMAND => CFGOPT_REPO_TYPE,
&CFGDEF_DEPEND => CFGOPT_REPO_S3_BUCKET,
},
&CFGOPT_REPO_TYPE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_REPO,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_REPO,
&CFGDEF_DEFAULT => CFGOPTVAL_REPO_TYPE_POSIX,
&CFGDEF_ALLOW_LIST =>
[
&CFGOPTVAL_REPO_TYPE_AZURE,
&CFGOPTVAL_REPO_TYPE_CIFS,
&CFGOPTVAL_REPO_TYPE_POSIX,
&CFGOPTVAL_REPO_TYPE_S3,
],
&CFGDEF_NAME_ALT =>
{
'repo-type' => {&CFGDEF_INDEX => 1, &CFGDEF_RESET => false},
},
&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_START => {},
&CFGCMD_STOP => {},
},
},
&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],
},
},
},
},
&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 => {},
}
},
# 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),
],
&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_START => {},
&CFGCMD_STOP => {},
}
},
&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,
&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_START => {},
&CFGCMD_STOP => {},
}
},
&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,
&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_START => {},
&CFGCMD_STOP => {},
}
},
&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_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_START => {},
&CFGCMD_STOP => {},
}
},
&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 => {},
},
},
&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 => {},
},
},
# 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 => {},
},
},
&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],
}
}
}
},
&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 => {},
},
},
&CFGOPT_CHECKSUM_PAGE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
}
},
&CFGOPT_EXCLUDE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_LIST,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
},
},
&CFGOPT_EXPIRE_AUTO =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => true,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
}
},
&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 => {},
}
},
&CFGOPT_RESUME =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => true,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
}
},
&CFGOPT_START_FAST =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
}
},
&CFGOPT_STOP_AUTO =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
}
},
# Restore options
#-------------------------------------------------------------------------------------------------------------------------------
&CFGOPT_DB_INCLUDE =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_LIST,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_RESTORE => {},
},
},
&CFGOPT_LINK_ALL =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_RESTORE => {},
}
},
&CFGOPT_LINK_MAP =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_HASH,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_RESTORE => {},
},
},
&CFGOPT_TABLESPACE_MAP_ALL =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_RESTORE => {},
}
},
&CFGOPT_TABLESPACE_MAP =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_HASH,
&CFGDEF_REQUIRED => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_RESTORE => {},
},
},
&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,
],
},
},
# Stanza options
#-------------------------------------------------------------------------------------------------------------------------------
&CFGOPT_PG_LOCAL =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_STANZA,
&CFGDEF_INTERNAL => true,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_PREFIX => CFGDEF_PREFIX_PG,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG,
&CFGDEF_DEFAULT => false,
&CFGDEF_COMMAND =>
{
&CFGCMD_ARCHIVE_GET =>
{
&CFGDEF_INTERNAL => true,
},
&CFGCMD_ARCHIVE_PUSH =>
{
&CFGDEF_INTERNAL => true,
},
&CFGCMD_BACKUP => {},
&CFGCMD_CHECK => {},
&CFGCMD_EXPIRE => {},
&CFGCMD_RESTORE =>
{
&CFGDEF_INTERNAL => true,
},
&CFGCMD_STANZA_CREATE => {},
&CFGCMD_STANZA_DELETE => {},
&CFGCMD_STANZA_UPGRADE => {},
&CFGCMD_START => {},
&CFGCMD_STOP => {},
},
},
&CFGOPT_PG_HOST =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_STANZA,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_PG,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG,
&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_DEPEND =>
{
&CFGDEF_DEPEND_OPTION => CFGOPT_PG_LOCAL,
&CFGDEF_DEPEND_LIST => [false],
},
},
&CFGOPT_PG_HOST_CMD =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_STANZA,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_PG,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG,
&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_EXPIRE => {},
&CFGCMD_STANZA_CREATE => {},
&CFGCMD_STANZA_DELETE => {},
&CFGCMD_STANZA_UPGRADE => {},
&CFGCMD_START => {},
&CFGCMD_STOP => {},
},
&CFGDEF_DEPEND =>
{
&CFGDEF_DEPEND_OPTION => CFGOPT_PG_HOST
},
},
&CFGOPT_PG_HOST_CONFIG =>
{
&CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG,
&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 => CFGDEF_DEFAULT_CONFIG_PATH,
},
&CFGOPT_PG_HOST_CONFIG_INCLUDE_PATH =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_INHERIT => CFGOPT_PG_HOST_CMD,
&CFGDEF_DEFAULT => CFGDEF_DEFAULT_CONFIG_INCLUDE_PATH,
},
&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_PATH =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_STANZA,
&CFGDEF_TYPE => CFGDEF_TYPE_PATH,
&CFGDEF_PREFIX => CFGDEF_PREFIX_PG,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG,
&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_SECTION => CFGDEF_SECTION_STANZA,
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_PREFIX => CFGDEF_PREFIX_PG,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG,
&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},
},
},
2019-12-19 23:20:11 +02:00
&CFGOPT_PG_USER =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_STANZA,
&CFGDEF_TYPE => CFGDEF_TYPE_STRING,
&CFGDEF_PREFIX => CFGDEF_PREFIX_PG,
&CFGDEF_INDEX_TOTAL => CFGDEF_INDEX_PG,
&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
},
},
);
####################################################################################################################################
# Process command define defaults
####################################################################################################################################
foreach my $strCommand (sort(keys(%{$rhCommandDefine})))
{
# Commands are external by default
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_INTERNAL}))
{
$rhCommandDefine->{$strCommand}{&CFGDEF_INTERNAL} = false;
}
# Log files are created by default
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_LOG_FILE}))
{
$rhCommandDefine->{$strCommand}{&CFGDEF_LOG_FILE} = true;
}
# Default log level is INFO
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_LOG_LEVEL_DEFAULT}))
{
$rhCommandDefine->{$strCommand}{&CFGDEF_LOG_LEVEL_DEFAULT} = INFO;
}
# Default lock required is false
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_REQUIRED}))
{
$rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_REQUIRED} = false;
}
# Default lock remote required is false
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_REMOTE_REQUIRED}))
{
$rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_REMOTE_REQUIRED} = false;
}
# Lock type must be set if a lock is required
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_TYPE}))
{
# Is a lock type required?
if ($rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_REQUIRED})
{
confess &log(ERROR, "lock type is required for command '${strCommand}'");
}
$rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_TYPE} = CFGDEF_LOCK_TYPE_NONE;
}
else
{
if ($rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_REQUIRED} &&
$rhCommandDefine->{$strCommand}{&CFGDEF_LOCK_TYPE} eq CFGDEF_LOCK_TYPE_NONE)
{
confess &log(ERROR, "lock type is required for command '${strCommand}' and cannot be 'none'");
}
}
# Default parameter allowed is false
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_PARAMETER_ALLOWED}))
{
$rhCommandDefine->{$strCommand}{&CFGDEF_PARAMETER_ALLOWED} = false;
}
}
####################################################################################################################################
# Process option define defaults
####################################################################################################################################
foreach my $strKey (sort(keys(%hConfigDefine)))
{
# Error if prefix and index total are not both defined
if ((defined($hConfigDefine{$strKey}{&CFGDEF_PREFIX}) && !defined($hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL})) ||
(!defined($hConfigDefine{$strKey}{&CFGDEF_PREFIX}) && defined($hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL})))
{
confess &log(ASSERT, "CFGDEF_PREFIX and CFGDEF_INDEX_TOTAL must both be defined (or neither) for option '${strKey}'");
}
# If the define is a scalar then copy the entire define from the referenced option
if (defined($hConfigDefine{$strKey}{&CFGDEF_INHERIT}))
{
# Make a copy in case there are overrides that need to be applied after inheriting
my $hConfigDefineOverride = dclone($hConfigDefine{$strKey});
# Copy the option being inherited from
$hConfigDefine{$strKey} = dclone($hConfigDefine{$hConfigDefine{$strKey}{&CFGDEF_INHERIT}});
# No need to copy the inheritance key
delete($hConfigDefine{$strKey}{&CFGDEF_INHERIT});
# It makes no sense to inherit alt names - they must be specified for each option
delete($hConfigDefine{$strKey}{&CFGDEF_NAME_ALT});
# Apply overrides
foreach my $strOptionDef (sort(keys(%{$hConfigDefineOverride})))
{
$hConfigDefine{$strKey}{$strOptionDef} = $hConfigDefineOverride->{$strOptionDef};
}
}
# If the command section is a scalar then copy the section from the referenced option
if (defined($hConfigDefine{$strKey}{&CFGDEF_COMMAND}) && !ref($hConfigDefine{$strKey}{&CFGDEF_COMMAND}))
{
$hConfigDefine{$strKey}{&CFGDEF_COMMAND} =
dclone($hConfigDefine{$hConfigDefine{$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}))
{
$hConfigDefine{$strKey}{&CFGDEF_DEPEND} =
dclone($hConfigDefine{$hConfigDefine{$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}))
{
$hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST} =
dclone($hConfigDefine{$hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST}}{&CFGDEF_ALLOW_LIST});
}
# Default type is string
if (!defined($hConfigDefine{$strKey}{&CFGDEF_TYPE}))
{
&log(ASSERT, "type is required for option '${strKey}'");
}
# Default required is true
if (!defined($hConfigDefine{$strKey}{&CFGDEF_REQUIRED}))
{
$hConfigDefine{$strKey}{&CFGDEF_REQUIRED} = true;
}
# Default internal is false
if (!defined($hConfigDefine{$strKey}{&CFGDEF_INTERNAL}))
{
$hConfigDefine{$strKey}{&CFGDEF_INTERNAL} = false;
}
# Set index total for any option where it has not been explicitly defined
if (!defined($hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL}))
{
$hConfigDefine{$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}))
{
$hConfigDefine{$strKey}{&CFGDEF_NEGATE} = true;
}
# Default for negation is false
if (!defined($hConfigDefine{$strKey}{&CFGDEF_NEGATE}))
{
$hConfigDefine{$strKey}{&CFGDEF_NEGATE} = false;
}
# All config options can be reset
if (defined($hConfigDefine{$strKey}{&CFGDEF_SECTION}))
{
$hConfigDefine{$strKey}{&CFGDEF_RESET} = true;
}
elsif (!defined($hConfigDefine{$strKey}{&CFGDEF_RESET}))
{
$hConfigDefine{$strKey}{&CFGDEF_RESET} = false;
}
# By default options are not secure
if (!defined($hConfigDefine{$strKey}{&CFGDEF_SECURE}))
{
$hConfigDefine{$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}))
{
$hConfigDefine{$strKey}{&CFGDEF_INDEX_TOTAL} = 1;
}
# All int and float options must have an allow range
if (($hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_INTEGER ||
$hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_FLOAT ||
$hConfigDefine{$strKey}{&CFGDEF_TYPE} eq CFGDEF_TYPE_SIZE) &&
!(defined($hConfigDefine{$strKey}{&CFGDEF_ALLOW_RANGE}) || defined($hConfigDefine{$strKey}{&CFGDEF_ALLOW_LIST})))
{
confess &log(ASSERT, "int/float option '${strKey}' must have allow range or list");
}
# Ensure all commands are valid
foreach my $strCommand (sort(keys(%{$hConfigDefine{$strKey}{&CFGDEF_COMMAND}})))
{
if (!defined($rhCommandDefine->{$strCommand}))
{
confess &log(ASSERT, "invalid command '${strCommand}'");
}
}
}
####################################################################################################################################
# Get option definition
####################################################################################################################################
sub cfgDefine
{
return dclone(\%hConfigDefine);
}
push @EXPORT, qw(cfgDefine);
####################################################################################################################################
# Get command definition
####################################################################################################################################
sub cfgDefineCommand
{
return dclone($rhCommandDefine);
}
push @EXPORT, qw(cfgDefineCommand);
####################################################################################################################################
# Get list of all commands
####################################################################################################################################
sub cfgDefineCommandList
{
# Return sorted list
return (sort(keys(%{$rhCommandDefine})));
}
push @EXPORT, qw(cfgDefineCommandList);
####################################################################################################################################
# Get list of all option types
####################################################################################################################################
sub cfgDefineOptionTypeList
{
my $rhOptionTypeMap;
# Get unique list of types
foreach my $strOption (sort(keys(%hConfigDefine)))
{
my $strOptionType = $hConfigDefine{$strOption}{&CFGDEF_TYPE};
if (!defined($rhOptionTypeMap->{$strOptionType}))
{
$rhOptionTypeMap->{$strOptionType} = true;
}
};
# Return sorted list
return (sort(keys(%{$rhOptionTypeMap})));
}
push @EXPORT, qw(cfgDefineOptionTypeList);
1;