diff --git a/doc/xml/reference.xml b/doc/xml/reference.xml index 271c8cae3..966376bea 100644 --- a/doc/xml/reference.xml +++ b/doc/xml/reference.xml @@ -626,7 +626,9 @@ - A stanza defines the backup configuration for a specific database cluster. The stanza section must define the database cluster path and host/user if the database cluster is remote. Also, any global configuration sections can be overridden to define stanza-specific settings. + A stanza defines the backup configuration for a specific database cluster. The stanza section must define the database cluster path and host/user if the database cluster is remote. Also, any global configuration sections can be overridden to define stanza-specific settings. + + Indexing: All db- options can be indexed for configuring standby replicas. For example if a single standby replica is configured then index the db- options as db2- (e.g. db2-host, db2-path, etc). If an index is not specified (e.g. db-host) it will be aliased to db1- (e.g. db1-host). diff --git a/doc/xml/release.xml b/doc/xml/release.xml index 6fc46a41a..a787f7d5c 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -30,6 +30,16 @@

Fixed an issue with keep-alives not being sent to the remote from the local process.

+ + + + + + + +

Up to seven standbys can be configured for backup from standby.

+
+
diff --git a/doc/xml/user-guide.xml b/doc/xml/user-guide.xml index 52b4fdd8b..f67f1add6 100644 --- a/doc/xml/user-guide.xml +++ b/doc/xml/user-guide.xml @@ -2209,7 +2209,7 @@
Backup from a Standby -

can perform backups on a standby instead of the master. Standby backups require the db-standby host to be configured and the backup-standby option enabled.

+

can perform backups on a standby instead of the master. Standby backups require the db-standby host to be configured and the backup-standby option enabled. If more than one standby is configured then the first running standby found will be used for the backup.

Configure <br-option>db2-host</br-option>/<br-option>db2-user</br-option> and <br-option>db2-path</br-option> diff --git a/lib/pgBackRest/Backup/Backup.pm b/lib/pgBackRest/Backup/Backup.pm index efd91f10f..467594a0a 100644 --- a/lib/pgBackRest/Backup/Backup.pm +++ b/lib/pgBackRest/Backup/Backup.pm @@ -452,8 +452,8 @@ sub process $self->{iCopyRemoteIdx} = $self->{iMasterRemoteIdx}; } - # If backup from standby option is set but we could not get the standby object then, turn off CFGOPT_BACKUP_STANDBY & warn that - # backups will be performed from the master. + # If backup from standby option is set but a standby was not configured in the config file or on the command line, then turn off + # CFGOPT_BACKUP_STANDBY & warn that backups will be performed from the master. if (!defined($oDbStandby) && cfgOption(CFGOPT_BACKUP_STANDBY)) { cfgOptionSet(CFGOPT_BACKUP_STANDBY, false); diff --git a/lib/pgBackRest/Check/Check.pm b/lib/pgBackRest/Check/Check.pm index 246245769..513fcf45d 100644 --- a/lib/pgBackRest/Check/Check.pm +++ b/lib/pgBackRest/Check/Check.pm @@ -55,8 +55,9 @@ sub process # Assign function parameters, defaults, and log debug info my $strOperation = logDebugParam(__PACKAGE__ . '->process'); - # Initialize the database object - my $oDb = dbMasterGet(); + # Initialize the database object. This will also check the configured replicas and throw an error if at least one is not + # able to be connected to and warnings for any that cannot be properly connected to. + my ($oDb) = dbObjectGet(); # Validate the database configuration $oDb->configValidate(); diff --git a/lib/pgBackRest/Common/Log.pm b/lib/pgBackRest/Common/Log.pm index eecb4f552..f4da9d3b6 100644 --- a/lib/pgBackRest/Common/Log.pm +++ b/lib/pgBackRest/Common/Log.pm @@ -81,6 +81,9 @@ my $bLogFileFirst; # Allow log to be globally enabled or disabled with logEnable() and logDisable() my $bLogDisable = 0; +# Allow errors to be logged as warnings +my $bLogWarnOnError = 0; + # Test globals my $bTest = false; my $fTestDelay; @@ -231,6 +234,26 @@ sub logEnable push @EXPORT, qw(logEnable); +#################################################################################################################################### +# logWarnOnErrorDisable +#################################################################################################################################### +sub logWarnOnErrorDisable +{ + $bLogWarnOnError--; +} + +push @EXPORT, qw(logWarnOnErrorDisable); + +#################################################################################################################################### +# logWarnOnErrorEnable - when an error is thrown, log it as a warning instead +#################################################################################################################################### +sub logWarnOnErrorEnable +{ + $bLogWarnOnError++; +} + +push @EXPORT, qw(logWarnOnErrorEnable); + #################################################################################################################################### # logDebugParam # @@ -598,7 +621,7 @@ sub log # Set operational variables my $strMessageFormat = $strMessage; - my $iLogLevelRank = $oLogLevelRank{"${strLevel}"}{rank}; + my $iLogLevelRank = $oLogLevelRank{$strLevel}{rank}; # If test message if ($strLevel eq TEST) @@ -664,27 +687,32 @@ sub log # Format the message text my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); + # If logging warnings as errors then change the display level and rank. These will be used to determine if the message will be + # displayed or not. + my $strDisplayLevel = (!$bLogWarnOnError ? $strLevel : WARN); + my $iLogDisplayLevelRank = (!$bLogWarnOnError ? $iLogLevelRank : $oLogLevelRank{$strDisplayLevel}{rank}); + $strMessageFormat = ($bLogTimestamp ? timestampFormat() . sprintf('.%03d ', (gettimeofday() - int(gettimeofday())) * 1000) : '') . sprintf('P%02d', defined($iProcessId) ? $iProcessId : 0) . - (' ' x (7 - length($strLevel))) . "${strLevel}: ${strMessageFormat}\n"; + (' ' x (7 - length($strDisplayLevel))) . "${strDisplayLevel}: ${strMessageFormat}\n"; # Skip output if disabled if (!$bLogDisable) { - # Output to stderr depending on log level - if (!$rExtra->{bLogConsole} && $iLogLevelRank <= $oLogLevelRank{$strLogLevelStdErr}{rank}) + # Output to stderr if configured log level setting rank is greater than the display level rank. + if (!$rExtra->{bLogConsole} && $iLogDisplayLevelRank <= $oLogLevelRank{$strLogLevelStdErr}{rank}) { if ($strLogLevelStdErr ne PROTOCOL) { - syswrite(*STDERR, $strLevel . (defined($iCode) ? sprintf(' [%03d]: ', $iCode) : '') . ': '); + syswrite(*STDERR, $strDisplayLevel . (defined($iCode) ? sprintf(' [%03d]: ', $iCode) : '') . ': '); } syswrite(*STDERR, "${strMessage}\n"); $rExtra->{bLogConsole} = true; } - # Else output to stdout depending on log level and test flag - elsif (!$rExtra->{bLogConsole} && $iLogLevelRank <= $oLogLevelRank{$strLogLevelConsole}{rank} || + # Else output to stdout if configured log level setting rank is greater than the display level rank or test flag is set. + elsif (!$rExtra->{bLogConsole} && $iLogDisplayLevelRank <= $oLogLevelRank{$strLogLevelConsole}{rank} || $bTest && $strLevel eq TEST) { if (!$bSuppressLog) @@ -709,8 +737,8 @@ sub log $rExtra->{bLogConsole} = true; } - # Output to file depending on log level and test flag - if (!$rExtra->{bLogLogFile} && $iLogLevelRank <= $oLogLevelRank{$strLogLevelFile}{rank}) + # Output to file if configured log level setting rank is greater than the display level rank or test flag is set. + if (!$rExtra->{bLogLogFile} && $iLogDisplayLevelRank <= $oLogLevelRank{$strLogLevelFile}{rank}) { if (defined($hLogFile) || (defined($strLogLevelFile) && $strLogLevelFile ne OFF)) { @@ -726,8 +754,8 @@ sub log $strLogFileCache .= $strMessageFormat; } - if ($strLevel eq ASSERT || - ($strLevel eq ERROR && ($strLogLevelFile eq DEBUG || $strLogLevelFile eq TRACE))) + if ($strDisplayLevel eq ASSERT || + ($strDisplayLevel eq ERROR && ($strLogLevelFile eq DEBUG || $strLogLevelFile eq TRACE))) { my $strStackTrace = longmess() . "\n"; $strStackTrace =~ s/\n/\n /g; diff --git a/lib/pgBackRest/Config/Data.pm b/lib/pgBackRest/Config/Data.pm index 163ae753b..c033a6e1e 100644 --- a/lib/pgBackRest/Config/Data.pm +++ b/lib/pgBackRest/Config/Data.pm @@ -6,7 +6,7 @@ # section meaning the rules defined there apply to all commands listed for the option. # # CFGBLDDEF_RULE_COMMAND: -# List of commands the option can be used with this option. An empty hash signifies that the command does no deviate from the +# 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 @@ -284,7 +284,7 @@ use constant CFGOPT_RECOVERY_OPTION => 'recovery # Stanza options #----------------------------------------------------------------------------------------------------------------------------------- # Determines how many databases can be configured -use constant CFGDEF_INDEX_DB => 2; +use constant CFGDEF_INDEX_DB => 8; # Prefix that must be used by all db options that allow multiple configurations use constant CFGDEF_PREFIX_DB => 'db'; diff --git a/lib/pgBackRest/Db.pm b/lib/pgBackRest/Db.pm index 0bc999b26..777e2c6ed 100644 --- a/lib/pgBackRest/Db.pm +++ b/lib/pgBackRest/Db.pm @@ -962,7 +962,15 @@ sub replayWait sub dbObjectGet { # Assign function parameters, defaults, and log debug info - my ($strOperation) = logDebugParam(__PACKAGE__ . '::dbObjectGet'); + my ( + $strOperation, + $bMasterOnly, + ) = + logDebugParam + ( + __PACKAGE__ . '::dbObjectGet', \@_, + {name => 'bMasterOnly', optional => true, default => false}, + ); my $iStandbyIdx = undef; my $iMasterRemoteIdx = 1; @@ -971,7 +979,7 @@ sub dbObjectGet # Only iterate databases if online and more than one is defined. It might be better to check the version of each database but # this is simple and works. - if (cfgOptionTest(CFGOPT_ONLINE) && cfgOption(CFGOPT_ONLINE) && cfgOptionTest(cfgOptionIndex(CFGOPT_DB_PATH, 2))) + if (!$bMasterOnly && cfgOptionTest(CFGOPT_ONLINE) && cfgOption(CFGOPT_ONLINE) && multipleDb()) { for (my $iRemoteIdx = 1; $iRemoteIdx <= cfgOptionIndexTotal(CFGOPT_DB_HOST); $iRemoteIdx++) { @@ -980,37 +988,50 @@ sub dbObjectGet cfgOptionTest(cfgOptionIndex(CFGOPT_DB_HOST, $iRemoteIdx))) { # Create the db object - my $oDb = new pgBackRest::Db($iRemoteIdx); + my $oDb; + + logWarnOnErrorEnable(); + eval + { + $oDb = new pgBackRest::Db($iRemoteIdx); + return true; + } + or do {}; + + logWarnOnErrorDisable(); my $bAssigned = false; - # If able to connect then test if the database is a master or a standby. It's OK if some databases cannot be - # reached as long as the databases required for the backup type are present. - if ($oDb->connect(true)) + if (defined($oDb)) { - # If this db is a standby - if ($oDb->isStandby()) + # If able to connect then test if the database is a master or a standby. It's OK if some databases cannot be + # reached as long as the databases required for the backup type are present. + if ($oDb->connect(true)) { - # If standby backup is requested then use the first standby found - if (cfgOption(CFGOPT_BACKUP_STANDBY) && !defined($oDbStandby)) + # If this db is a standby + if ($oDb->isStandby()) { - $oDbStandby = $oDb; - $iStandbyIdx = $iRemoteIdx; + # If standby backup is requested then use the first standby found + if (cfgOption(CFGOPT_BACKUP_STANDBY) && !defined($oDbStandby)) + { + $oDbStandby = $oDb; + $iStandbyIdx = $iRemoteIdx; + $bAssigned = true; + } + } + # Else this db is a master + else + { + # Error if more than one master is found + if (defined($oDbMaster)) + { + confess &log(ERROR, 'more than one master database found'); + } + + $oDbMaster = $oDb; + $iMasterRemoteIdx = $iRemoteIdx; $bAssigned = true; } } - # Else this db is a master - else - { - # Error if more than one master is found - if (defined($oDbMaster)) - { - confess &log(ERROR, 'more than one master database found'); - } - - $oDbMaster = $oDb; - $iMasterRemoteIdx = $iRemoteIdx; - $bAssigned = true; - } } # If the db was not used then destroy the protocol object underneath it @@ -1021,16 +1042,18 @@ sub dbObjectGet } } - # Make sure the standby database is defined when backup from standby requested + # Make sure a standby database is defined when backup from standby option is set if (cfgOption(CFGOPT_BACKUP_STANDBY) && !defined($oDbStandby)) { - confess &log(ERROR, 'unable to find standby database - cannot proceed'); + # Throw an error that is distinct from connecting to the master for testing purposes + confess &log(ERROR, 'unable to find standby database - cannot proceed', ERROR_HOST_CONNECT); } # A master database is always required if (!defined($oDbMaster)) { - confess &log(ERROR, 'unable to find master database - cannot proceed'); + # Throw an error that is distinct from connecting to a standy for testing purposes + confess &log(ERROR, 'unable to find master database - cannot proceed', ERROR_DB_CONNECT); } } @@ -1064,7 +1087,7 @@ sub dbMasterGet # Assign function parameters, defaults, and log debug info my ($strOperation) = logDebugParam(__PACKAGE__ . '::dbMasterGet'); - my ($oDbMaster) = dbObjectGet(); + my ($oDbMaster) = dbObjectGet({bMasterOnly => true}); # Return from function and log return values if any return logDebugReturn @@ -1076,4 +1099,23 @@ sub dbMasterGet push @EXPORT, qw(dbMasterGet); +#################################################################################################################################### +# multipleDb +# +# Helper function to determine if there is more than one database defined. +#################################################################################################################################### +sub multipleDb +{ + for (my $iDbPathIdx = 2; $iDbPathIdx <= cfgOptionIndexTotal(CFGOPT_DB_PATH); $iDbPathIdx++) + { + # If an index exists above 1 then return true + if (cfgOptionTest(cfgOptionIndex(CFGOPT_DB_PATH, $iDbPathIdx))) + { + return true; + } + } + + return false; +} + 1; diff --git a/lib/pgBackRest/Stanza.pm b/lib/pgBackRest/Stanza.pm index 377f0254d..64bd40157 100644 --- a/lib/pgBackRest/Stanza.pm +++ b/lib/pgBackRest/Stanza.pm @@ -46,7 +46,7 @@ sub new my $strOperation = logDebugParam(__PACKAGE__ . '->new'); # Initialize the database object - $self->{oDb} = dbMasterGet(); + ($self->{oDb}) = dbObjectGet(); $self->dbInfoGet(); # Return from function and log return values if any diff --git a/libc/t/config.t b/libc/t/config.t index ac2a4186d..750be5d0d 100644 --- a/libc/t/config.t +++ b/libc/t/config.t @@ -59,7 +59,7 @@ ok (!cfgRuleOptionDependValueValid(CFGCMD_RESTORE, CFGOPT_TARGET, 'bogus')); ok (cfgRuleOptionHint(CFGCMD_BACKUP, CFGOPT_DB1_PATH) eq 'does this stanza exist?'); -ok (cfgOptionIndexTotal(CFGOPT_DB_PATH) == 2); +ok (cfgOptionIndexTotal(CFGOPT_DB_PATH) == 8); ok (cfgOptionIndexTotal(CFGOPT_REPO_PATH) == 1); ok (cfgRuleOptionNameAlt(CFGOPT_DB1_HOST) eq 'db-host'); diff --git a/src/config/config.auto.md b/src/config/config.auto.md index 1ebe2f70c..8a6a51bff 100644 --- a/src/config/config.auto.md +++ b/src/config/config.auto.md @@ -10,19 +10,67 @@ This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that r | Function | uiOptionId | Result | | -------- | ---------- | ------ | -| cfgOptionIndexTotal | `CFGOPT_DB1_CMD` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_CONFIG` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_HOST` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_PATH` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_PORT` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_SOCKET_PATH` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_SSH_PORT` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB1_USER` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_CMD` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_CONFIG` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_HOST` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_PATH` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_PORT` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_SOCKET_PATH` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_SSH_PORT` | `2` | -| cfgOptionIndexTotal | `CFGOPT_DB2_USER` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB1_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB2_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB3_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB4_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB5_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB6_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB7_USER` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_CMD` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_CONFIG` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_HOST` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_SOCKET_PATH` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_SSH_PORT` | `8` | +| cfgOptionIndexTotal | `CFGOPT_DB8_USER` | `8` | diff --git a/src/config/configRule.auto.md b/src/config/configRule.auto.md index 55eb5100d..8464fd40c 100644 --- a/src/config/configRule.auto.md +++ b/src/config/configRule.auto.md @@ -203,6 +203,24 @@ This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that r | cfgRuleOptionDefault | _\_ | `CFGOPT_DB2_CONFIG` | `"/etc/pgbackrest.conf"` | | cfgRuleOptionDefault | _\_ | `CFGOPT_DB2_PORT` | `"5432"` | | cfgRuleOptionDefault | _\_ | `CFGOPT_DB2_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB3_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB3_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB3_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB4_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB4_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB4_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB5_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB5_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB5_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB6_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB6_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB6_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB7_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB7_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB7_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB8_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB8_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB8_USER` | `"postgres"` | | cfgRuleOptionDefault | _\_ | `CFGOPT_DELTA` | `"0"` | | cfgRuleOptionDefault | _\_ | `CFGOPT_FORCE` | `"0"` | | cfgRuleOptionDefault | _\_ | `CFGOPT_HARDLINK` | `"0"` | @@ -258,6 +276,30 @@ This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that r | cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_CONFIG` | `true` | | cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_SSH_PORT` | `true` | | cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB3_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB4_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB5_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB6_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB7_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB8_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB8_USER` | `true` | | cfgRuleOptionDepend | _\_ | `CFGOPT_RECOVERY_OPTION` | `true` | | cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_BUCKET` | `true` | | cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_CA_FILE` | `true` | @@ -300,6 +342,30 @@ This function is valid when `cfgRuleOptionDepend()` = `true`. | cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_CONFIG` | `CFGOPT_DB2_HOST` | | cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_SSH_PORT` | `CFGOPT_DB2_HOST` | | cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_USER` | `CFGOPT_DB2_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB3_CMD` | `CFGOPT_DB3_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB3_CONFIG` | `CFGOPT_DB3_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB3_SSH_PORT` | `CFGOPT_DB3_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB3_USER` | `CFGOPT_DB3_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB4_CMD` | `CFGOPT_DB4_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB4_CONFIG` | `CFGOPT_DB4_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB4_SSH_PORT` | `CFGOPT_DB4_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB4_USER` | `CFGOPT_DB4_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB5_CMD` | `CFGOPT_DB5_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB5_CONFIG` | `CFGOPT_DB5_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB5_SSH_PORT` | `CFGOPT_DB5_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB5_USER` | `CFGOPT_DB5_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB6_CMD` | `CFGOPT_DB6_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB6_CONFIG` | `CFGOPT_DB6_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB6_SSH_PORT` | `CFGOPT_DB6_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB6_USER` | `CFGOPT_DB6_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB7_CMD` | `CFGOPT_DB7_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB7_CONFIG` | `CFGOPT_DB7_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB7_SSH_PORT` | `CFGOPT_DB7_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB7_USER` | `CFGOPT_DB7_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB8_CMD` | `CFGOPT_DB8_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB8_CONFIG` | `CFGOPT_DB8_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB8_SSH_PORT` | `CFGOPT_DB8_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB8_USER` | `CFGOPT_DB8_HOST` | | cfgRuleOptionDependOption | _\_ | `CFGOPT_FORCE` | `CFGOPT_ONLINE` | | cfgRuleOptionDependOption | _\_ | `CFGOPT_RECOVERY_OPTION` | `CFGOPT_TYPE` | | cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_BUCKET` | `CFGOPT_REPO_TYPE` | @@ -385,6 +451,30 @@ This function is valid when `cfgRuleOptionDepend()` = `true`. | cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_CONFIG` | `0` | | cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_SSH_PORT` | `0` | | cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB3_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB3_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB3_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB3_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB4_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB4_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB4_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB4_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB5_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB5_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB5_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB5_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB6_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB6_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB6_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB6_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB7_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB7_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB7_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB7_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB8_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB8_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB8_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB8_USER` | `0` | | cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_FORCE` | `1` | | cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_RECOVERY_OPTION` | `4` | | cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_BUCKET` | `1` | @@ -416,6 +506,12 @@ This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that r | -------- | ----------- | ---------- | ------ | | cfgRuleOptionHint | _\_ | `CFGOPT_DB1_PATH` | `"does this stanza exist?"` | | cfgRuleOptionHint | _\_ | `CFGOPT_DB2_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB3_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB4_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB5_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB6_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB7_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB8_PATH` | `"does this stanza exist?"` | ## cfgRuleOptionNameAlt @@ -490,6 +586,54 @@ Permutations that return `NULL` are excluded for brevity. | cfgRuleOptionPrefix | `CFGOPT_DB2_SOCKET_PATH` | `"db"` | | cfgRuleOptionPrefix | `CFGOPT_DB2_SSH_PORT` | `"db"` | | cfgRuleOptionPrefix | `CFGOPT_DB2_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB3_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB4_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB5_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB6_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB7_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB8_USER` | `"db"` | ## cfgRuleOptionRequired @@ -614,6 +758,54 @@ Permutations that return `NULL` are excluded for brevity. | cfgRuleOptionSection | `CFGOPT_DB2_SOCKET_PATH` | `"stanza"` | | cfgRuleOptionSection | `CFGOPT_DB2_SSH_PORT` | `"stanza"` | | cfgRuleOptionSection | `CFGOPT_DB2_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB3_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB3_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB3_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB3_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB3_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB3_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB3_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB3_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB4_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB4_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB4_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB4_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB4_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB4_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB4_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB4_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB5_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB5_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB5_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB5_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB5_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB5_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB5_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB5_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB6_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB6_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB6_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB6_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB6_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB6_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB6_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB6_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB7_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB7_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB7_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB7_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB7_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB7_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB7_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB7_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB8_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB8_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB8_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB8_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB8_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB8_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB8_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB8_USER` | `"stanza"` | | cfgRuleOptionSection | `CFGOPT_HARDLINK` | `"global"` | | cfgRuleOptionSection | `CFGOPT_LINK_ALL` | `"global"` | | cfgRuleOptionSection | `CFGOPT_LINK_MAP` | `"global"` | @@ -709,6 +901,54 @@ Secure options can never be passed on the commmand-line. | cfgRuleOptionType | `CFGOPT_DB2_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | | cfgRuleOptionType | `CFGOPT_DB2_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | | cfgRuleOptionType | `CFGOPT_DB2_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB3_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB3_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB3_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB3_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB3_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB3_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB3_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB3_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB4_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB4_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB4_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB4_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB4_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB4_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB4_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB4_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB5_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB5_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB5_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB5_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB5_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB5_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB5_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB5_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB6_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB6_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB6_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB6_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB6_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB6_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB6_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB6_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB7_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB7_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB7_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB7_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB7_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB7_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB7_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB7_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB8_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB8_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB8_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB8_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB8_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB8_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB8_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB8_USER` | `CFGOPTDEF_TYPE_STRING` | | cfgRuleOptionType | `CFGOPT_DELTA` | `CFGOPTDEF_TYPE_BOOLEAN` | | cfgRuleOptionType | `CFGOPT_FORCE` | `CFGOPTDEF_TYPE_BOOLEAN` | | cfgRuleOptionType | `CFGOPT_HARDLINK` | `CFGOPTDEF_TYPE_BOOLEAN` | @@ -785,6 +1025,12 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB_TIMEOUT` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB1_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB8_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_LEVEL_FILE` | `true` | @@ -827,6 +1073,24 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB2_HOST` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB2_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB8_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | | cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_LEVEL_FILE` | `true` | @@ -880,6 +1144,54 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_SOCKET_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB3_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB4_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB5_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB6_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB7_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB8_USER` | `true` | | cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_FORCE` | `true` | | cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_HARDLINK` | `true` | | cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOCK_PATH` | `true` | @@ -946,6 +1258,54 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_SOCKET_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB3_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB4_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB5_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB6_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB7_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB8_USER` | `true` | | cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | | cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_LEVEL_FILE` | `true` | | cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | @@ -977,6 +1337,30 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_CONFIG` | `true` | | cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_HOST` | `true` | | cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB8_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | | cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_LEVEL_FILE` | `true` | @@ -1056,6 +1440,48 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_SOCKET_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB3_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB4_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB5_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB6_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB7_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB8_USER` | `true` | | cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_HOST_ID` | `true` | | cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | @@ -1088,6 +1514,24 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB2_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB2_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB3_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB3_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB4_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB4_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB5_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB5_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB6_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB6_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB7_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB7_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB8_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB8_SOCKET_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | | cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_LOG_PATH` | `true` | @@ -1121,6 +1565,12 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB_INCLUDE` | `true` | | cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB1_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB8_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DELTA` | `true` | | cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_FORCE` | `true` | | cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LINK_ALL` | `true` | @@ -1183,6 +1633,54 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_SOCKET_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB3_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB4_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB5_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB6_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB7_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB8_USER` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_FORCE` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | @@ -1232,6 +1730,54 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_SOCKET_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB3_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB4_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB5_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB6_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB7_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB8_USER` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | | cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOG_LEVEL_FILE` | `true` | @@ -1267,6 +1813,30 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_CONFIG` | `true` | | cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_HOST` | `true` | | cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB8_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | | cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_LEVEL_FILE` | `true` | @@ -1301,6 +1871,30 @@ Permutations that return `false` are excluded for brevity. | cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_CONFIG` | `true` | | cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_HOST` | `true` | | cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB3_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB3_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB3_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB4_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB4_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB4_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB4_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB5_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB5_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB5_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB5_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB6_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB6_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB6_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB6_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB7_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB7_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB7_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB7_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB8_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB8_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB8_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB8_SSH_PORT` | `true` | | cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_FORCE` | `true` | | cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOCK_PATH` | `true` | | cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | diff --git a/test/expect/mock-all-001.log b/test/expect/mock-all-001.log index af73b641d..f5138c50f 100644 --- a/test/expect/mock-all-001.log +++ b/test/expect/mock-all-001.log @@ -88,6 +88,7 @@ P00 DEBUG: Backup::Common::backupRegExpGet(): bAnchor = , bDifferenti P00 DEBUG: Backup::Common::backupRegExpGet=>: strRegExp = ^[0-9]{8}\-[0-9]{6}F(\_[0-9]{8}\-[0-9]{6}(D|I)){0,1}$ P00 DEBUG: Storage::Local->list(): bIgnoreMissing = , strExpression = ^[0-9]{8}\-[0-9]{6}F(\_[0-9]{8}\-[0-9]{6}(D|I)){0,1}$, strPathExp = [TEST_PATH]/db-master/repo/backup/db, strSortOrder = P00 DEBUG: Storage::Local->list=>: stryFileList = () +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [undef], lBufferMax = 16384, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/db/base, strTempExtension = pgbackrest.tmp @@ -468,6 +469,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/db-master P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/db-master/repo/backup/db/[BACKUP-FULL-1]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [undef], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/db/base, strTempExtension = pgbackrest.tmp @@ -635,6 +637,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/db-master P00 DEBUG: Storage::Local->pathExists=>: bExists = false P00 WARN: backup [BACKUP-FULL-1] missing in repository removed from backup.info P00 DEBUG: Backup::Info->delete(): strBackupLabel = [BACKUP-FULL-1] +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [undef], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/db/base, strTempExtension = pgbackrest.tmp @@ -1530,6 +1533,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/db-master P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/db-master/repo/backup/db/[BACKUP-FULL-2]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [undef], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/db/base, strTempExtension = pgbackrest.tmp @@ -1834,6 +1838,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/db-master P00 DEBUG: Storage::Local->pathExists=>: bExists = false P00 WARN: backup [BACKUP-INCR-1] missing in repository removed from backup.info P00 DEBUG: Backup::Info->delete(): strBackupLabel = [BACKUP-INCR-1] +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [undef], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/db/base, strTempExtension = pgbackrest.tmp diff --git a/test/expect/mock-all-002.log b/test/expect/mock-all-002.log index bb7925127..d83fb57c6 100644 --- a/test/expect/mock-all-002.log +++ b/test/expect/mock-all-002.log @@ -88,6 +88,7 @@ P00 DEBUG: Backup::Common::backupRegExpGet(): bAnchor = , bDifferenti P00 DEBUG: Backup::Common::backupRegExpGet=>: strRegExp = ^[0-9]{8}\-[0-9]{6}F(\_[0-9]{8}\-[0-9]{6}(D|I)){0,1}$ P00 DEBUG: Storage::Local->list(): bIgnoreMissing = , strExpression = ^[0-9]{8}\-[0-9]{6}F(\_[0-9]{8}\-[0-9]{6}(D|I)){0,1}$, strPathExp = [TEST_PATH]/backup/repo/backup/db, strSortOrder = P00 DEBUG: Storage::Local->list=>: stryFileList = () +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -467,6 +468,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/backup/repo/backup/db/[BACKUP-FULL-1]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -564,6 +566,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/backup/repo/backup/db/[BACKUP-FULL-1]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -648,6 +651,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/backup/repo/backup/db/[BACKUP-FULL-1]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -718,6 +722,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/backup/repo/backup/db/[BACKUP-FULL-1]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -810,6 +815,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/backup/repo/backup/db/[BACKUP-FULL-1]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -919,6 +925,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = false P00 WARN: backup [BACKUP-FULL-1] missing in repository removed from backup.info P00 DEBUG: Backup::Info->delete(): strBackupLabel = [BACKUP-FULL-1] +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -1630,6 +1637,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Storage::Local->exists(): strFileExp = [TEST_PATH]/backup/repo/backup/db/[BACKUP-FULL-2]/backup.manifest P00 DEBUG: Storage::Local->exists=>: bExists = true +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -1960,6 +1968,7 @@ P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/backup/re P00 DEBUG: Storage::Local->pathExists=>: bExists = false P00 WARN: backup [BACKUP-INCR-1] missing in repository removed from backup.info P00 DEBUG: Backup::Info->delete(): strBackupLabel = [BACKUP-INCR-1] +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol diff --git a/test/expect/mock-archive-001.log b/test/expect/mock-archive-001.log index d7af2ee77..a3cf34ddf 100644 --- a/test/expect/mock-archive-001.log +++ b/test/expect/mock-archive-001.log @@ -103,6 +103,7 @@ P00 INFO: get WAL segment 000000010000000100000001 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000001 P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp P00 DEBUG: Archive::Base->getCheck(): strDbVersion = [undef], strWalFile = 000000010000000100000001, ullDbSysId = [undef] +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Db->info(): strDbPath = <[TEST_PATH]/db-master/db/base> diff --git a/test/expect/mock-archive-002.log b/test/expect/mock-archive-002.log index a32cfc669..fc462341e 100644 --- a/test/expect/mock-archive-002.log +++ b/test/expect/mock-archive-002.log @@ -103,6 +103,7 @@ P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompress P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-get --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote P00 DEBUG: Protocol::Storage::Remote->new(): oProtocol = [object] P00 DEBUG: Archive::Base->getCheck(): strDbVersion = [undef], strWalFile = 000000010000000100000001, ullDbSysId = [undef] +P00 DEBUG: Db::dbObjectGet(): bMasterOnly = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Db->info(): strDbPath = <[TEST_PATH]/db-master/db/base> diff --git a/test/expect/real-all-002.log b/test/expect/real-all-002.log index 071381083..e0351e468 100644 --- a/test/expect/real-all-002.log +++ b/test/expect/real-all-002.log @@ -17,9 +17,14 @@ db-port=[PORT-1] db-socket-path=[TEST_PATH]/db-master/db db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-standby/pgbackrest.conf -db2-host=db-standby +db2-host=bogus db2-path=[TEST_PATH]/db-standby/db/base db2-user=[USER-1] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-standby/pgbackrest.conf +db8-host=db-standby +db8-path=[TEST_PATH]/db-standby/db/base +db8-user=[USER-1] [global] compress=n @@ -69,6 +74,10 @@ primary_conninfo = 'host=db-master port=6543 user=replicator' standby_mode = 'on' restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf --stanza=db archive-get %f "%p"' +full backup - backup from standby, failure to access at least one standby (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --db8-host=bogus --backup-standby --type=full --stanza=db backup +------------------------------------------------------------------------------------------------------------------------------------ + full backup - backup from standby (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --retention-full=1 --backup-standby --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ @@ -81,9 +90,14 @@ db-port=[PORT-1] db-socket-path=[TEST_PATH]/db-master/db db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-standby/pgbackrest.conf -db2-host=db-standby +db2-host=bogus db2-path=[TEST_PATH]/db-standby/db/base db2-user=[USER-1] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-standby/pgbackrest.conf +db8-host=db-standby +db8-path=[TEST_PATH]/db-standby/db/base +db8-user=[USER-1] [global] archive-async=y @@ -142,9 +156,14 @@ db-port=[PORT-1] db-socket-path=[TEST_PATH]/db-master/db db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-standby/pgbackrest.conf -db2-host=db-standby +db2-host=bogus db2-path=[TEST_PATH]/db-standby/db/base db2-user=[USER-1] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-standby/pgbackrest.conf +db8-host=db-standby +db8-path=[TEST_PATH]/db-standby/db/base +db8-user=[USER-1] [global] archive-async=y diff --git a/test/expect/real-all-003.log b/test/expect/real-all-003.log index c9ae67789..e4f21b446 100644 --- a/test/expect/real-all-003.log +++ b/test/expect/real-all-003.log @@ -39,9 +39,14 @@ db-port=[PORT-2] db-socket-path=[TEST_PATH]/db-standby/db db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-master/pgbackrest.conf -db2-host=db-master +db2-host=bogus db2-path=[TEST_PATH]/db-master/db/base db2-user=[USER-1] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-master/pgbackrest.conf +db8-host=db-master +db8-path=[TEST_PATH]/db-master/db/base +db8-user=[USER-1] [global] compress=n @@ -69,6 +74,10 @@ primary_conninfo = 'host=db-master port=6543 user=replicator' standby_mode = 'on' restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf --stanza=db archive-get %f "%p"' +full backup - backup from standby, failure to reach master (db-standby host) +> [CONTAINER-EXEC] db-standby [BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf --db8-host=bogus --backup-standby --type=full --stanza=db backup +------------------------------------------------------------------------------------------------------------------------------------ + full backup - backup from standby (db-standby host) > [CONTAINER-EXEC] db-standby [BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf --retention-full=1 --backup-standby --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ @@ -103,9 +112,14 @@ db-port=[PORT-2] db-socket-path=[TEST_PATH]/db-standby/db db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-master/pgbackrest.conf -db2-host=db-master +db2-host=bogus db2-path=[TEST_PATH]/db-master/db/base db2-user=[USER-1] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-master/pgbackrest.conf +db8-host=db-master +db8-path=[TEST_PATH]/db-master/db/base +db8-user=[USER-1] [db:restore] @@ -164,9 +178,14 @@ db-port=[PORT-2] db-socket-path=[TEST_PATH]/db-standby/db db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-master/pgbackrest.conf -db2-host=db-master +db2-host=bogus db2-path=[TEST_PATH]/db-master/db/base db2-user=[USER-1] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-master/pgbackrest.conf +db8-host=db-master +db8-path=[TEST_PATH]/db-master/db/base +db8-user=[USER-1] [db:restore] diff --git a/test/expect/real-all-005.log b/test/expect/real-all-005.log index 30d0b7905..7258167fb 100644 --- a/test/expect/real-all-005.log +++ b/test/expect/real-all-005.log @@ -64,10 +64,15 @@ db1-port=[PORT-1] db1-user=[USER-2] db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-standby/pgbackrest.conf -db2-host=db-standby +db2-host=bogus db2-path=[TEST_PATH]/db-standby/db/base -db2-port=[PORT-2] db2-user=[USER-2] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-standby/pgbackrest.conf +db8-host=db-standby +db8-path=[TEST_PATH]/db-standby/db/base +db8-port=[PORT-2] +db8-user=[USER-2] [global] compress=n @@ -94,6 +99,10 @@ primary_conninfo = 'host=db-master port=6543 user=replicator' standby_mode = 'on' restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf --stanza=db archive-get %f "%p"' +full backup - backup from standby, failure to access at least one standby (backup host) +> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --db8-host=bogus --backup-standby --type=full --stanza=db backup +------------------------------------------------------------------------------------------------------------------------------------ + full backup - backup from standby (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --retention-full=1 --backup-standby --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ @@ -155,10 +164,15 @@ db1-port=[PORT-1] db1-user=[USER-2] db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-standby/pgbackrest.conf -db2-host=db-standby +db2-host=bogus db2-path=[TEST_PATH]/db-standby/db/base -db2-port=[PORT-2] db2-user=[USER-2] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-standby/pgbackrest.conf +db8-host=db-standby +db8-path=[TEST_PATH]/db-standby/db/base +db8-port=[PORT-2] +db8-user=[USER-2] [global] archive-async=y @@ -241,10 +255,15 @@ db1-port=[PORT-1] db1-user=[USER-2] db2-cmd=[BACKREST-BIN] db2-config=[TEST_PATH]/db-standby/pgbackrest.conf -db2-host=db-standby +db2-host=bogus db2-path=[TEST_PATH]/db-standby/db/base -db2-port=[PORT-2] db2-user=[USER-2] +db8-cmd=[BACKREST-BIN] +db8-config=[TEST_PATH]/db-standby/pgbackrest.conf +db8-host=db-standby +db8-path=[TEST_PATH]/db-standby/db/base +db8-port=[PORT-2] +db8-user=[USER-2] [global] archive-async=y diff --git a/test/lib/pgBackRestTest/Common/DefineTest.pm b/test/lib/pgBackRestTest/Common/DefineTest.pm index 7f7f48772..69ab5ef14 100644 --- a/test/lib/pgBackRestTest/Common/DefineTest.pm +++ b/test/lib/pgBackRestTest/Common/DefineTest.pm @@ -124,6 +124,15 @@ my $oTestDef = 'Common/Io/Process' => TESTDEF_COVERAGE_PARTIAL, }, }, + { + &TESTDEF_NAME => 'log', + &TESTDEF_TOTAL => 1, + + &TESTDEF_COVERAGE => + { + 'Common/Log' => TESTDEF_COVERAGE_PARTIAL, + }, + }, ] }, # Help tests diff --git a/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm b/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm index a7c7c1844..9a7682ae2 100644 --- a/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm +++ b/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm @@ -1036,16 +1036,27 @@ sub configCreate if (defined($oHostDb2)) { - $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_HOST, 2)} = $oHostDb2->nameGet(); - $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_USER, 2)} = $oHostDb2->userGet(); - $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CMD, 2)} = $oHostDb2->backrestExe(); - $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CONFIG, 2)} = $oHostDb2->backrestConfig(); - $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, 2)} = $oHostDb2->dbBasePath(); + # Add an invalid replica to simulate more than one replica. A warning should be thrown by dbObjectGet when a stanza is + # created and a valid replica should be chosen. + my $iInvalidReplica = 2; + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_HOST, $iInvalidReplica)} = BOGUS; + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_USER, $iInvalidReplica)} = $oHostDb2->userGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CMD, $iInvalidReplica)} = $oHostDb2->backrestExe(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CONFIG, $iInvalidReplica)} = $oHostDb2->backrestConfig(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, $iInvalidReplica)} = $oHostDb2->dbBasePath(); + + # Set a valid replica to the last possible index to ensure skipping indexes does not make a difference. + my $iValidReplica = cfgOptionIndexTotal(CFGOPT_DB_PATH); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_HOST, $iValidReplica)} = $oHostDb2->nameGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_USER, $iValidReplica)} = $oHostDb2->userGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CMD, $iValidReplica)} = $oHostDb2->backrestExe(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CONFIG, $iValidReplica)} = $oHostDb2->backrestConfig(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, $iValidReplica)} = $oHostDb2->dbBasePath(); # Only test explicit ports on the backup server. This is so locally configured ports are also tested. if (!$self->synthetic() && $self->nameTest(HOST_BACKUP)) { - $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PORT, 2)} = $oHostDb2->pgPort(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PORT, $iValidReplica)} = $oHostDb2->pgPort(); } } } diff --git a/test/lib/pgBackRestTest/Module/Common/CommonLogTest.pm b/test/lib/pgBackRestTest/Module/Common/CommonLogTest.pm new file mode 100644 index 000000000..a2cef9454 --- /dev/null +++ b/test/lib/pgBackRestTest/Module/Common/CommonLogTest.pm @@ -0,0 +1,43 @@ +#################################################################################################################################### +# CommonLogTest.pm - Unit tests for Log module +#################################################################################################################################### +package pgBackRestTest::Module::Common::CommonLogTest; +use parent 'pgBackRestTest::Common::RunTest'; + +#################################################################################################################################### +# Perl includes +#################################################################################################################################### +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use pgBackRest::Common::Exception; +use pgBackRest::Common::Ini; +use pgBackRest::Common::Log; +use pgBackRest::Version; + +use pgBackRestTest::Common::ExecuteTest; +use pgBackRestTest::Common::RunTest; + +#################################################################################################################################### +# run +#################################################################################################################################### +sub run +{ + my $self = shift; + + ################################################################################################################################ + if ($self->begin("log()")) + { + logWarnOnErrorEnable(); + $self->testResult(sub {&log(ERROR, "my test log", 27)}, "[object]", 'log error as warning', + {strLogExpect => "WARN: [027]: my test log"}); + + logWarnOnErrorDisable(); + $self->testResult(sub {&log(ERROR, "my test log", 27)}, "[object]", 'log error', + {strLogExpect => "ERROR: [027]: my test log"}); + } +} + +1; diff --git a/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm b/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm index 0babddf49..7fb6059d2 100644 --- a/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm +++ b/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm @@ -461,6 +461,30 @@ sub run # Update message for standby $oHostDbMaster->sqlExecute("update test set message = '$strStandbyMessage'"); + if ($oHostDbStandby->pgVersion() >= PG_VERSION_BACKUP_STANDBY) + { + # If there is only a master and a replica and the replica is the backup destination, then if db2-host and db3-host + # are BOGUS, confirm failure to reach the master + if (!$bHostBackup && $bHostStandby && $strBackupDestination eq HOST_DB_STANDBY) + { + my $strStandbyBackup = $oHostBackup->backup( + CFGOPTVAL_BACKUP_TYPE_FULL, 'backup from standby, failure to reach master', + {bStandby => true, + iExpectedExitStatus => ERROR_DB_CONNECT, + strOptionalParam => '--' . + $oHostBackup->optionIndexName(CFGOPT_DB_HOST, cfgOptionIndexTotal(CFGOPT_DB_PATH)) . '=' . BOGUS}); + } + else + { + my $strStandbyBackup = $oHostBackup->backup( + CFGOPTVAL_BACKUP_TYPE_FULL, 'backup from standby, failure to access at least one standby', + {bStandby => true, + iExpectedExitStatus => ERROR_HOST_CONNECT, + strOptionalParam => '--' . + $oHostBackup->optionIndexName(CFGOPT_DB_HOST, cfgOptionIndexTotal(CFGOPT_DB_PATH)) . '=' . BOGUS}); + } + } + my $strStandbyBackup = $oHostBackup->backup( CFGOPTVAL_BACKUP_TYPE_FULL, 'backup from standby', {bStandby => true,