1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-07-13 01:00:23 +02:00

Multiple repository support.

Up to four repositories may be configured. A potential benefit is the ability to have a local repository for fast restores and a remote repository for redundancy.

Some commands, e.g. stanza-create/stanza-update, will automatically work with all configured repositories while others, e.g. stanza-delete, will require a repository to be specified using the repo option. See the command reference for details on which commands require the repository to be specified.

Note that the repo option is not required when only repo1 is configured in order to maintain backward compatibility. However, the repo option is required when a single repo is configured as, e.g. repo2. This is to prevent command breakage if a new repository is added later.

The archive-push command will always push WAL to the archive in all configured repositories but backups will need to be scheduled individually for each repository. In many cases this is desirable since backup types and retention will vary by repository. Likewise, restores must specify a repository. It is generally better to specify a repository for restores that has low latency/cost even if that means more recovery time. Only restore testing can determine which repository will be most efficient.
For single repository configurations there should be no change in behavior.
This commit is contained in:
David Steele
2021-03-08 13:31:13 -05:00
committed by GitHub
parent 8b87e66448
commit 1dbb3bf50b
11 changed files with 531 additions and 175 deletions

View File

@ -1706,7 +1706,6 @@ my %hConfigDefine =
&CFGOPT_REPO =>
{
&CFGDEF_TYPE => CFGDEF_TYPE_INTEGER,
&CFGDEF_INTERNAL => true,
&CFGDEF_REQUIRED => false,
&CFGDEF_ALLOW_RANGE => [1, CFGDEF_INDEX_REPO],
&CFGDEF_COMMAND =>

View File

@ -52,6 +52,12 @@
<p>A custom protocol allows <backrest/> to backup, restore, and archive locally or remotely via SSH with minimal configuration. An interface to query <postgres/> is also provided via the protocol layer so that remote access to <postgres/> is never required, which enhances security.</p>
</section>
<section id="multi-repo">
<title>Multiple Repositories</title>
<p>Multiple repositories allow, for example, a local repository with minimal retention for fast restores and a remote repository with a longer retention for redundancy and access across the enterprise.</p>
</section>
<section id="backup-types">
<title>Full, Incremental, &amp; Differential Backups</title>

View File

@ -305,9 +305,9 @@
<config-section id="repository" name="Repository">
<text>The <setting>repository</setting> section defines options used to configure the repository.
<b>Indexing</b>: All <setting>repo-</setting> options are indexed to allow for configuring multiple repositories, though only a single repository is currently supported. For example, the repository is configured with the <setting>repo1-path</setting>, <setting>repo1-host</setting>, etc. options.
<b>Indexing</b>: All <setting>repo-</setting> options are indexed to allow for configuring multiple repositories. For example, a single repository is configured with the <setting>repo1-path</setting>, <setting>repo1-host</setting>, etc. options. If there is more than one repository configured and the <br-option>{[dash]}-repo</br-option> option is not specified for a command, the repositories will be acted upon in highest priority order (e.g. repo1 then repo2).
The <setting>repo-retention-*</setting> options define how long backups will be retained. Expiration only occurs when the count of complete backups exceeds the allowed retention. In other words, if <setting>repo-retention-full-type</setting> is set to <setting>count</setting> (default) and <setting>repo-retention-full</setting> is set to 2, then there must be 3 complete backups before the oldest will be expired. If <setting>repo-retention-full-type</setting> is set to <setting>time</setting> then <setting>repo-retention-full</setting> represents days so there must be at least that many days worth of full backups before expiration can occur. Make sure you always have enough space for retention + 1 backups.</text>
The <setting>repo-retention-*</setting> options define how long backups will be retained. Expiration only occurs when the count of complete backups exceeds the allowed retention. In other words, if <setting>repo1-retention-full-type</setting> is set to <setting>count</setting> (default) and <setting>repo1-retention-full</setting> is set to 2, then there must be 3 complete backups before the oldest will be expired. If <setting>repo1-retention-full-type</setting> is set to <setting>time</setting> then <setting>repo1-retention-full</setting> represents days so there must be at least that many days worth of full backups before expiration can occur. Make sure you always have enough space for retention + 1 backups.</text>
<config-key-list>
<!-- ======================================================================================================= -->
@ -1119,7 +1119,7 @@
<text>Commands are used to execute the various <backrest/> functions. Here the command options are listed exhaustively, that is, each option applicable to a command is listed with that command even if it applies to one or more other commands. This includes all the options that may also configured in <file>pgbackrest.conf</file>.
Non-boolean options configured in <file>pgbackrest.conf</file> can be reset to default on the command-line by using the <id>reset-</id> prefix. This feature may be used to restore a backup directly on a repository host. Normally, <backrest/> will error because it can see that the database host is remote and restores cannot be done remotely. By adding <br-option>--reset-pg1-host</br-option> on the command-line, <backrest/> will ignore the remote database host and restore locally. It may be necessary to pass a new <br-option>--pg-path</br-option> to force the restore to happen in a specific path, i.e. not the path used on the database host.
Non-boolean options configured in <file>pgbackrest.conf</file> can be reset to default on the command-line by using the <id>reset-</id> prefix. This feature may be used to restore a backup directly on a repository host. Normally, <backrest/> will error because it can see that the database host is remote and restores cannot be done remotely. By adding <br-option>--reset-pg1-host</br-option> on the command-line, <backrest/> will ignore the remote database host and restore locally. It may be necessary to pass a new <br-option>--pg1-path</br-option> to force the restore to happen in a specific path, i.e. not the path used on the database host.
The <id>no-</id> prefix may be used to set a boolean option to false on the command-line.
@ -1187,6 +1187,17 @@
<example>y</example>
</option>
<!-- =========================================================================================================== -->
<option id="repo" section="repository" name="Set Repository">
<summary>Set repository.</summary>
<text>Set the repository for a command to operate on.
For example, this option may be used to perform a restore from a specific repository, rather than letting <backrest/> choose.</text>
<example>1</example>
</option>
<!-- OPERATION - GENERAL - STANZA OPTION -->
<option id="stanza" name="Stanza">
<summary>Defines the stanza.</summary>
@ -1205,7 +1216,9 @@
<command id="backup" name="Backup">
<summary>Backup a database cluster.</summary>
<text><backrest/> does not have a built-in scheduler so it's best to run it from cron or some other scheduling mechanism.</text>
<text>When multiple repositories are configured, <backrest/> will backup to the highest priority repository (e.g. <id>repo1</id>) unless the <br-option>{[dash]}-repo</br-option> option is specified.
<backrest/> does not have a built-in scheduler so it's best to run it from cron or some other scheduling mechanism.</text>
<option-list>
<!-- OPERATION - BACKUP COMMAND - TYPE OPTION -->
@ -1259,7 +1272,7 @@
<command id="archive-push" name="Archive Push">
<summary>Push a WAL segment to the archive.</summary>
<text>The WAL segment may be pushed immediately to the archive or stored locally depending on the value of <setting>archive-async</setting></text>
<text>The WAL segment may be pushed immediately to the archive or stored locally depending on the value of <setting>archive-async</setting>. With multiple repositories configured, <cmd>archive-push</cmd> will attempt to push to as many repositories as possible.</text>
<command-example-list>
<command-example>
@ -1275,7 +1288,9 @@
<command id="archive-get" name="Archive Get">
<summary>Get a WAL segment from the archive.</summary>
<text>WAL segments are required for <postgres/> recovery or to maintain a replica.</text>
<text>WAL segments are required for <postgres/> recovery or to maintain a replica.
When multiple repositories are configured, WAL will be fetched from the repositories in priority order (e.g. <id>repo1</id>, <id>repo2</id>, etc.). In general it is better if faster/cheaper storage has higher priority. If a repository is specified with the <br-option>{[dash]}-repo</br-option> option then only that repository will be searched.</text>
<command-example-list>
<command-example>
@ -1291,7 +1306,7 @@
<command id="check" name="Check">
<summary>Check the configuration.</summary>
<text>The <cmd>check</cmd> command validates that <backrest/> and the <pg-setting>archive_command</pg-setting> setting are configured correctly for archiving and backups. It detects misconfigurations, particularly in archiving, that result in incomplete backups because required WAL segments did not reach the archive. The command can be run on the database or the repository host. The command may also be run on the standby host, however, since <code>pg_switch_xlog()</code>/<code>pg_switch_wal()</code> cannot be performed on the standby, the command will only test the repository configuration.
<text>The <cmd>check</cmd> command validates that <backrest/> and the <pg-setting>archive_command</pg-setting> setting are configured correctly for archiving and backups. It will attempt to check all repositories and databases that are configured for the system on which the command is run. It detects misconfigurations, particularly in archiving, that result in incomplete backups because required WAL segments did not reach the archive. The command can be run on the database or the repository host. The command may also be run on the standby host, however, since <code>pg_switch_xlog()</code>/<code>pg_switch_wal()</code> cannot be performed on the standby, the command will only test the repository configuration.
Note that <code>pg_create_restore_point('pgBackRest Archive Check')</code> and <code>pg_switch_xlog()</code>/<code>pg_switch_wal()</code> are called to force <postgres/> to archive a WAL segment. Restore points are only supported in <postgres/> &gt;= 9.1 so for older versions the <cmd>check</cmd> command may fail if there has been no write activity since the last log rotation, therefore it is recommended that activity be generated by the user if there have been no writes since the last WAL switch before running the <cmd>check</cmd> command.</text>
@ -1311,7 +1326,7 @@
<text><backrest/> does full backup rotation based on the retention type which can be a count or a time period. When a count is specified, then expiration is not concerned with when the backups were created but with how many must be retained. Differential and Incremental backups are count-based but will always be expired when the backup they depend on is expired. See sections <link page="user-guide" section="/retention/full">Full Backup Retention</link> and <link page="user-guide" section="/retention/diff">Differential Backup Retention</link> for details and examples. Archived WAL is retained by default for backups that have not expired, however, although not recommended, this schedule can be modified per repository with the retention-archive options. See section <link page="user-guide" section="/retention/archive">Archive Retention</link> for details and examples.
The <cmd>expire</cmd> command is run automatically after each successful backup and can also be run by the user. When run by the user, expiration will occur as defined by the retention settings for each configured repository. Expiration can also be limited by the user to a specific backup set with the <br-option>--set</br-option> option. It should be noted that the archive retention schedule will be checked and performed any time the <cmd>expire</cmd> command is run.</text>
The <cmd>expire</cmd> command is run automatically after each successful backup and can also be run by the user. When run by the user, expiration will occur as defined by the retention settings for each configured repository. If the <br-option>{[dash]}-repo</br-option> option is provided, expiration will occur only on the specified repository. Expiration can also be limited by the user to a specific backup set with the <br-option>--set</br-option> option and, unless the <br-option>{[dash]}-repo</br-option> option is specified, all repositories will be searched and any matching the set criteria will be expired. It should be noted that the archive retention schedule will be checked and performed any time the <cmd>expire</cmd> command is run.</text>
<option-list>
<!-- OPERATION - EXPIRE COMMAND - SET OPTION -->
@ -1358,7 +1373,9 @@
<text>Similar to the unix <cmd>cat</cmd> command but works on any supported repository type. This command is primarily for administration, investigation, and testing. It is not a required part of a normal <backrest/> setup.
If the repository is encrypted then <cmd>repo-get</cmd> will automatically decrypt the file. Files are not automatically decompressed but the output can be piped through the appropriate decompression command, e.g. <id>gzip -d</id>.</text>
If the repository is encrypted then <cmd>repo-get</cmd> will automatically decrypt the file. Files are not automatically decompressed but the output can be piped through the appropriate decompression command, e.g. <id>gzip -d</id>.
If more than one repository is configured, the command will default to the highest priority repository (e.g. <id>repo1</id>) unless the <br-option>{[dash]}-repo</br-option> option is specified.</text>
<option-list>
<!-- OPERATION - REPO-GET COMMAND - IGNORE-MISSING OPTION -->
@ -1388,7 +1405,9 @@
<text>Similar to the unix <cmd>ls</cmd> command but works on any supported repository type. This command is primarily for administration, investigation, and testing. It is not a required part of a normal <backrest/> setup.
The default text output prints one file name per line. JSON output is available by specifying <br-option>--output=json</br-option>.</text>
The default text output prints one file name per line. JSON output is available by specifying <br-option>--output=json</br-option>.
If more than one repository is configured, the command will default to the highest priority repository (e.g. <id>repo1</id>) unless the <br-option>{[dash]}-repo</br-option> option is specified.</text>
<option-list>
<!-- OPERATION - LS COMMAND - FILTER OPTION -->
@ -1508,7 +1527,9 @@
<command id="restore" name="Restore">
<summary>Restore a database cluster.</summary>
<text>This command is generally run manually, but there are instances where it might be automated.</text>
<text>The restore command automatically defaults to selecting the latest backup from the first repository where backups exist. The order in which the repositories are checked is dictated by the <file>pgbackrest.conf</file> (e.g. repo1 will be checked before repo2). To select from a specific repository, the <br-option>{[dash]}-repo</br-option> option can be passed (e.g. <br-option>{[dash]}-repo=1</br-option>). The <br-option>{[dash]}-set</br-option> option can be passed if a backup other than the latest is desired.
For PITR, <br-option>{[dash]}-type=time</br-option> must be provided and the target time specified with the <br-option>{[dash]}-target</br-option> option. If a backup is not specified via the <br-option>{[dash]}-set</br-option> option, then the configured repositories will be checked, in order, for a backup that contains the requested time. If no backup can be found, the latest backup from the first repository containing backups will be used. See <link page="user-guide" section="/pitr">Point-in-Time Recovery</link> for more details and examples.</text>
<option-list>
<!-- OPERATION - RESTORE COMMAND - SET OPTION -->
@ -1607,7 +1628,7 @@
For machine-readable output use <br-option>--output=json</br-option>. The JSON output contains far more information than the text output and is kept stable unless a bug is found.
Each stanza has a separate section and it is possible to limit output to a single stanza with the <br-option>--stanza</br-option> option. The stanza '<id>status</id>' gives a brief indication of the stanza's health. If this is '<id>ok</id>' then <backrest/> is functioning normally. The '<id>wal archive min/max</id>' shows the minimum and maximum WAL currently stored in the archive. Note that there may be gaps due to archive retention policies or other reasons.
Each stanza has a separate section and it is possible to limit output to a single stanza with the <br-option>--stanza</br-option> option. The stanza '<id>status</id>' gives a brief indication of the stanza's health. If this is '<id>ok</id>' then <backrest/> is functioning normally. If there are multiple repositories, then a status of '<id>mixed</id>' indicates that the stanza is not in a healthy state on one or more of the repositories. In this case the state of the stanza will be detailed on additional lines per repository. The '<id>wal archive min/max</id>' shows the minimum and maximum WAL currently stored in the archive and, in the case of multiple repositories, will be reported across all repositories unless the <br-option>{[dash]}-repo</br-option> option is set. Note that there may be gaps due to archive retention policies or other reasons.
The '<id>backup/expire running</id>' message will appear beside the '<id>status</id>' information if one of those commands is currently running on the host.
@ -1783,7 +1804,7 @@
<command id="stanza-create" name="Stanza Create">
<summary>Create the required stanza data.</summary>
<text>The <cmd>stanza-create</cmd> command must be run on the host where the repository is located after the stanza has been configured in <file>pgbackrest.conf</file>.</text>
<text>The <cmd>stanza-create</cmd> command must be run on the host where the repository is located after the stanza has been configured in <file>pgbackrest.conf</file>. If there is more than one repository configured locally on the host, the stanza will be created on each.</text>
<option-list>
<!-- OPERATION - STANZA-CREATE COMMAND - FORCE OPTION -->
@ -1820,7 +1841,7 @@
<command id="stanza-upgrade" name="Stanza Upgrade">
<summary>Upgrade a stanza.</summary>
<text>Immediately after upgrading <postgres/> to a newer major version, the <br-option>pg-path</br-option> for all <backrest/> configurations must be set to the new database location and the <cmd>stanza-upgrade</cmd> run on the repository host. If the database is offline use the <br-option>--no-online</br-option> option.</text>
<text>Immediately after upgrading <postgres/> to a newer major version, the <br-option>pg-path</br-option> for all <backrest/> configurations must be set to the new database location and the <cmd>stanza-upgrade</cmd> run on the repository host. If there is more than one repository configured locally on the host, the stanza will be created on each. If the database is offline use the <br-option>--no-online</br-option> option.</text>
<option-list>
<!-- ======================================================================================================= -->
@ -1854,7 +1875,9 @@
<li>Shut down the <postgres/> cluster associated with the stanza (or use --force to override).</li>
<li>Run the <cmd>stop</cmd> command on the repository host.</li>
<li>Run the <cmd>stanza-delete</cmd> command on the repository host.</li>
</ul>Once the command successfully completes, it is the responsibility of the user to remove the stanza from all <backrest/> configuration files and/or environment variables.</text>
</ul>Once the command successfully completes, it is the responsibility of the user to remove the stanza from all <backrest/> configuration files and/or environment variables.
A stanza may only be deleted from one repository at a time. To delete the stanza from multiple repositories, repeat the <cmd>stanza-delete</cmd> command for each repository while specifying the <br-option>{[dash]}-repo</br-option> option.</text>
<option-list>
<!-- OPERATION - STANZA-CREATE COMMAND - FORCE OPTION -->

View File

@ -37,6 +37,17 @@
</release-bug-list>
<release-feature-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="cynthia.shang"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stefan.fercot"/>
<release-item-reviewer id="stephen.frost"/>
</release-item-contributor-list>
<p>Multiple repository support.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-reviewer id="cynthia.shang"/>

View File

@ -176,6 +176,9 @@
<variable key="s3-key">accessKey1</variable>
<variable key="s3-key-secret">verySecretKey1</variable>
<!-- Is any object store being used to build all the documentation? -->
<variable key="object-any-all">('{[azure-all]}' eq 'y' || '{[gcs-all]}' eq 'y' || '{[s3-all]}' eq 'y')</variable>
<!-- Hosts -->
<variable key="host-image">pgbackrest/doc:{[os-type]}</variable>
@ -623,13 +626,14 @@
<backrest-config host="{[azure-setup-host]}" file="{[backrest-config-demo]}" owner="{[azure-setup-config-owner]}">
<title>Configure <proper>Azure</proper></title>
<backrest-config-option section="global" key="repo1-type">azure</backrest-config-option>
<backrest-config-option section="global" key="repo1-path">/{[azure-repo]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-azure-account">{[azure-account]}</backrest-config-option>
<backrest-config-option if="'{[azure-key-type]}' ne 'shared'" section="global" key="repo1-azure-key-type">{[azure-key-type]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-azure-key">{[azure-key]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-azure-container">{[azure-container]}</backrest-config-option>
<backrest-config-option if="'{[azure-local]}' eq 'y'" section="global" key="repo1-storage-host">blob.core.windows.net</backrest-config-option>
<backrest-config-option section="global" key="repo{[azure-setup-repo-id]}-type">azure</backrest-config-option>
<backrest-config-option section="global" key="repo{[azure-setup-repo-id]}-path">/{[azure-repo]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[azure-setup-repo-id]}-azure-account">{[azure-account]}</backrest-config-option>
<backrest-config-option if="'{[azure-key-type]}' ne 'shared'" section="global" key="repo{[azure-setup-repo-id]}-azure-key-type">{[azure-key-type]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[azure-setup-repo-id]}-azure-key">{[azure-key]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[azure-setup-repo-id]}-azure-container">{[azure-container]}</backrest-config-option>
<backrest-config-option if="'{[azure-local]}' eq 'y'" section="global" key="repo{[azure-setup-repo-id]}-storage-host">blob.core.windows.net</backrest-config-option>
<backrest-config-option if="'{[azure-all]}' ne 'y'" section="global" key="repo{[azure-setup-repo-id]}-retention-full">4</backrest-config-option>
<backrest-config-option section="global" key="process-max">4</backrest-config-option>
</backrest-config>
@ -643,11 +647,11 @@
</execute>
<execute user="{[azure-setup-user]}" if="'{[azure-setup-create-container]}' eq 'y'" show='n'>
<exe-cmd>{[project-exe]} repo-create</exe-cmd>
<exe-cmd>{[project-exe]} --repo={[azure-setup-repo-id]} repo-create</exe-cmd>
</execute>
</execute-list>
<p>Shared access signatures may be used by setting the <br-option>repo1-azure-key-type</br-option> option to <id>sas</id> and the <br-option>repo1-azure-key</br-option> option to the shared access signature token.</p>
<p>Shared access signatures may be used by setting the <br-option>repo{[azure-setup-repo-id]}-azure-key-type</br-option> option to <id>sas</id> and the <br-option>repo{[azure-setup-repo-id]}-azure-key</br-option> option to the shared access signature token.</p>
</block-define>
<!-- ======================================================================================================================= -->
@ -657,11 +661,11 @@
<backrest-config host="{[gcs-setup-host]}" file="{[backrest-config-demo]}" owner="{[gcs-setup-config-owner]}">
<title>Configure <proper>GCS</proper></title>
<backrest-config-option section="global" key="repo1-type">gcs</backrest-config-option>
<backrest-config-option section="global" key="repo1-path">/{[gcs-repo]}</backrest-config-option>
<backrest-config-option if="'{[gcs-key-type]}' ne 'service'" section="global" key="repo1-gcs-key-type">{[gcs-key-type]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-gcs-key">{[gcs-key]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-gcs-bucket">{[gcs-bucket]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[gcs-setup-repo-id]}-type">gcs</backrest-config-option>
<backrest-config-option section="global" key="repo{[gcs-setup-repo-id]}-path">/{[gcs-repo]}</backrest-config-option>
<backrest-config-option if="'{[gcs-key-type]}' ne 'service'" section="global" key="repo{[gcs-setup-repo-id]}-gcs-key-type">{[gcs-key-type]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[gcs-setup-repo-id]}-gcs-key">{[gcs-key]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[gcs-setup-repo-id]}-gcs-bucket">{[gcs-bucket]}</backrest-config-option>
<backrest-config-option section="global" key="process-max">4</backrest-config-option>
</backrest-config>
@ -674,14 +678,15 @@
<backrest-config host="{[s3-setup-host]}" file="{[backrest-config-demo]}" owner="{[s3-setup-config-owner]}">
<title>Configure <proper>S3</proper></title>
<backrest-config-option section="global" key="repo1-type">s3</backrest-config-option>
<backrest-config-option section="global" key="repo1-path">/{[s3-repo]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-s3-key">{[s3-key]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-s3-key-secret">{[s3-key-secret]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-s3-bucket">{[s3-bucket]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-s3-endpoint">{[s3-endpoint]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-s3-region">{[s3-region]}</backrest-config-option>
<backrest-config-option section="global" key="repo1-storage-host" remove="y"/>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-type">s3</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-path">/{[s3-repo]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-s3-key">{[s3-key]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-s3-key-secret">{[s3-key-secret]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-s3-bucket">{[s3-bucket]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-s3-endpoint">{[s3-endpoint]}</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-s3-region">{[s3-region]}</backrest-config-option>
<backrest-config-option if="'{[s3-all]}' ne 'y'" section="global" key="repo{[s3-setup-repo-id]}-retention-full">4</backrest-config-option>
<backrest-config-option section="global" key="repo{[s3-setup-repo-id]}-storage-host" remove="y"/>
<backrest-config-option section="global" key="process-max">4</backrest-config-option>
</backrest-config>
@ -695,7 +700,7 @@
</execute>
<execute user="{[s3-setup-user]}" if="'{[s3-setup-create-bucket]}' eq 'y'" show='n'>
<exe-cmd>{[project-exe]} repo-create</exe-cmd>
<exe-cmd>{[project-exe]} --repo={[s3-setup-repo-id]} repo-create</exe-cmd>
</execute>
</execute-list>
@ -1030,6 +1035,8 @@
<backrest-config-option section="global" key="repo1-path">{[backrest-repo-path]}</backrest-config-option>
</backrest-config>
<p if="!{[object-any-all]}">Multiple repositories may also be configured. See <link section="/multi-repo">Multiple Repositories</link> for details.</p>
</section>
<!-- =================================================================================================================== -->
@ -1037,6 +1044,7 @@
<title>Azure-Compatible Object Store Support</title>
<block id="azure-setup">
<block-variable-replace key="azure-setup-repo-id">1</block-variable-replace>
<block-variable-replace key="azure-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="azure-setup-user">postgres</block-variable-replace>
<block-variable-replace key="azure-setup-config-owner">postgres:postgres</block-variable-replace>
@ -1049,6 +1057,7 @@
<title>GCS-Compatible Object Store Support</title>
<block id="gcs-setup">
<block-variable-replace key="gcs-setup-repo-id">1</block-variable-replace>
<block-variable-replace key="gcs-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="gcs-setup-user">postgres</block-variable-replace>
<block-variable-replace key="gcs-setup-config-owner">postgres:postgres</block-variable-replace>
@ -1060,6 +1069,7 @@
<title>S3-Compatible Object Store Support</title>
<block id="s3-setup">
<block-variable-replace key="s3-setup-repo-id">1</block-variable-replace>
<block-variable-replace key="s3-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="s3-setup-user">postgres</block-variable-replace>
<block-variable-replace key="s3-setup-config-owner">postgres:postgres</block-variable-replace>
@ -1693,7 +1703,9 @@
<section id="restore" depend="quickstart/perform-backup">
<title>Restore</title>
<p>The Restore section introduces additional <cmd>restore</cmd> command features.</p>
<cmd-description key="restore"/>
<p>The following sections introduce additional <cmd>restore</cmd> command features.</p>
<!-- ******************************************************************************************************************* -->
<section id="ownership">
@ -2147,10 +2159,24 @@
</section>
<!-- ======================================================================================================================= -->
<section id="azure-support" if="'{[azure-all]}' ne 'y'" depend="/quickstart/configure-archiving">
<section id="multi-repo" if="!{[object-any-all]}">
<title>Multiple Repositories</title>
<p>Multiple repositories may be configured as demonstrated in <link section="/s3-support">S3 Support</link>. A potential benefit is the ability to have a local repository for fast restores and a remote repository for redundancy.</p>
<p>Some commands, e.g. <cmd>stanza-create</cmd>/<cmd>stanza-update</cmd>, will automatically work with all configured repositories while others, e.g. <link section="/delete-stanza">stanza-delete</link>, will require a repository to be specified using the <br-option>repo</br-option> option. See the <link url="command.html">command reference</link> for details on which commands require the repository to be specified.</p>
<p>Note that the <br-option>repo</br-option> option is not required when only <br-option>repo1</br-option> is configured in order to maintain backward compatibility. However, the <br-option>repo</br-option> option <i>is</i> required when a single repo is configured as, e.g. <br-option>repo2</br-option>. This is to prevent command breakage if a new repository is added later.</p>
<p>The <cmd>archive-push</cmd> command will always push WAL to the archive in all configured repositories but backups will need to be scheduled individually for each repository. In many cases this is desirable since backup types and retention will vary by repository. Likewise, restores must specify a repository. It is generally better to specify a repository for restores that has low latency/cost even if that means more recovery time. Only restore testing can determine which repository will be most efficient.</p>
</section>
<!-- ======================================================================================================================= -->
<section id="azure-support" if="!{[object-any-all]}" depend="/quickstart/configure-archiving">
<title>Azure-Compatible Object Store Support</title>
<block id="azure-setup">
<block-variable-replace key="azure-setup-repo-id">2</block-variable-replace>
<block-variable-replace key="azure-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="azure-setup-user">postgres</block-variable-replace>
<block-variable-replace key="azure-setup-config-owner">postgres:postgres</block-variable-replace>
@ -2174,40 +2200,28 @@
<title>Backup the {[postgres-cluster-demo]} cluster</title>
<execute user="postgres" output="y">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]}
--log-level-console=info backup</exe-cmd>
<exe-cmd>
{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --repo=2
--log-level-console=info backup
</exe-cmd>
<exe-highlight>no prior backup exists|full backup size</exe-highlight>
</execute>
</execute-list>
</section>
<!-- ======================================================================================================================= -->
<section id="gcs-support" if="'{[gcs-all]}' ne 'y'" depend="/quickstart/configure-archiving">
<title>GCS-Compatible Object Store Support</title>
<block id="gcs-setup">
<block-variable-replace key="gcs-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="gcs-setup-user">postgres</block-variable-replace>
<block-variable-replace key="gcs-setup-config-owner">postgres:postgres</block-variable-replace>
</block>
<p>Commands are run exactly as if the repository were stored on a local disk.</p>
<p>File creation time in object stores is relatively slow so commands benefit by increasing <br-option>process-max</br-option> to parallelize file creation.</p>
</section>
<!-- SECTION => S3-SUPPORT -->
<section id="s3-support" if="'{[s3-all]}' ne 'y'" depend="/quickstart/configure-archiving">
<section id="s3-support" if="!{[object-any-all]}" depend="/azure-support">
<title>S3-Compatible Object Store Support</title>
<block id="s3-setup">
<block-variable-replace key="s3-setup-repo-id">3</block-variable-replace>
<block-variable-replace key="s3-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="s3-setup-user">postgres</block-variable-replace>
<block-variable-replace key="s3-setup-config-owner">postgres:postgres</block-variable-replace>
<block-variable-replace key="s3-setup-create-bucket">y</block-variable-replace>
</block>
<p>A role should be created to run <backrest/> and the bucket permissions should be set as restrictively as possible. If the role is associated with an instance in <proper>AWS</proper> then <backrest/> will automatically retrieve temporary credentials when <br-option>repo1-s3-key-type=auto</br-option>, which means that keys do not need to be explicitly set in <file>{[backrest-config-demo]}</file>.</p>
<p>A role should be created to run <backrest/> and the bucket permissions should be set as restrictively as possible. If the role is associated with an instance in <proper>AWS</proper> then <backrest/> will automatically retrieve temporary credentials when <br-option>repo3-s3-key-type=auto</br-option>, which means that keys do not need to be explicitly set in <file>{[backrest-config-demo]}</file>.</p>
<p>This sample <proper>Amazon S3</proper> policy will restrict all reads and writes to the bucket and repository path.</p>
@ -2283,15 +2297,31 @@
<title>Backup the {[postgres-cluster-demo]} cluster</title>
<execute user="postgres" output="y">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]}
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --repo=3
--log-level-console=info backup</exe-cmd>
<exe-highlight>no prior backup exists|full backup size</exe-highlight>
</execute>
</execute-list>
</section>
<!-- SECTION => REPOSITORY HOST -->
<section id="delete-stanza" depend="/quickstart/create-stanza">
<!-- ======================================================================================================================= -->
<section id="gcs-support" if="!{[object-any-all]}" depend="/quickstart/configure-archiving">
<title>GCS-Compatible Object Store Support</title>
<block id="gcs-setup">
<block-variable-replace key="gcs-setup-repo-id">4</block-variable-replace>
<block-variable-replace key="gcs-setup-host">{[host-pg1]}</block-variable-replace>
<block-variable-replace key="gcs-setup-user">postgres</block-variable-replace>
<block-variable-replace key="gcs-setup-config-owner">postgres:postgres</block-variable-replace>
</block>
<p>Commands are run exactly as if the repository were stored on a local disk.</p>
<p>File creation time in object stores is relatively slow so commands benefit by increasing <br-option>process-max</br-option> to parallelize file creation.</p>
</section>
<!-- ======================================================================================================================= -->
<section id="delete-stanza" if="!{[object-any-all]}" depend="/quickstart">
<title>Delete a Stanza</title>
<cmd-description key="stanza-delete"/>
@ -2314,10 +2344,13 @@
</execute-list>
<execute-list host="{[host-pg1]}">
<title>Delete the stanza</title>
<title>Delete the stanza from one repository</title>
<execute user="postgres" output="y">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-log-level-console=info stanza-delete</exe-cmd>
<exe-cmd>
{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --repo=1
{[dash]}-log-level-console=info stanza-delete
</exe-cmd>
<exe-highlight>completed successfully</exe-highlight>
</execute>
@ -2470,6 +2503,7 @@
<p if="'{[azure-all]}' eq 'y'">Configure Azure-compatible object store if required.</p>
<block id="azure-setup" if="'{[azure-all]}' eq 'y'">
<block-variable-replace key="azure-setup-repo-id">1</block-variable-replace>
<block-variable-replace key="azure-setup-host">{[host-repo1]}</block-variable-replace>
<block-variable-replace key="azure-setup-user">{[br-user]}</block-variable-replace>
<block-variable-replace key="azure-setup-config-owner">{[br-user]}:{[br-group]}</block-variable-replace>
@ -2479,6 +2513,7 @@
<p if="'{[gcs-all]}' eq 'y'">Configure GCS-compatible object store if required.</p>
<block id="gcs-setup" if="'{[gcs-all]}' eq 'y'">
<block-variable-replace key="gcs-setup-repo-id">1</block-variable-replace>
<block-variable-replace key="gcs-setup-host">{[host-repo1]}</block-variable-replace>
<block-variable-replace key="gcs-setup-user">{[br-user]}</block-variable-replace>
<block-variable-replace key="gcs-setup-config-owner">{[br-user]}:{[br-group]}</block-variable-replace>
@ -2487,30 +2522,18 @@
<p if="'{[s3-all]}' eq 'y'">Configure S3-compatible object store if required.</p>
<block id="s3-setup" if="'{[s3-all]}' eq 'y'">
<block-variable-replace key="s3-setup-repo-id">1</block-variable-replace>
<block-variable-replace key="s3-setup-host">{[host-repo1]}</block-variable-replace>
<block-variable-replace key="s3-setup-user">{[br-user]}</block-variable-replace>
<block-variable-replace key="s3-setup-config-owner">{[br-user]}:{[br-group]}</block-variable-replace>
<block-variable-replace key="s3-setup-create-bucket">n</block-variable-replace>
</block>
<p>Create the stanza in the new repository.</p>
<p if="!{[object-any-all]}">Create the stanza in the new repository.</p>
<execute-list host="{[host-repo1]}">
<execute-list host="{[host-repo1]}" if="!{[object-any-all]}">
<title>Create the stanza</title>
<!-- Delete the azure stanza so the server can be reused -->
<execute if="'{[azure-all]}' eq 'y'" user="{[br-user]}" output="n" show="n">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} stop</exe-cmd>
</execute>
<execute if="'{[azure-all]}' eq 'y'" user="{[br-user]}" output="n" show="n">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-force stanza-delete</exe-cmd>
</execute>
<execute if="'{[azure-all]}' eq 'y'" user="{[br-user]}" output="n" show="n">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} start</exe-cmd>
</execute>
<!-- Create the stanza -->
<execute user="{[br-user]}" output="y" filter="n">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} stanza-create</exe-cmd>

View File

@ -18,31 +18,60 @@ static const unsigned char helpDataPack[] =
pckTypeStr << 4 | 0x09, 0x23, // Summary
0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x57, 0x41, 0x4C, 0x20, 0x73, 0x65, 0x67, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x66, 0x72,
0x6F, 0x6D, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2E,
pckTypeStr << 4 | 0x08, 0x4B, // Description
pckTypeStr << 4 | 0x08, 0xF5, 0x02, // Description
0x57, 0x41, 0x4C, 0x20, 0x73, 0x65, 0x67, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71,
0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x50, 0x6F, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4C,
0x20, 0x72, 0x65, 0x63, 0x6F, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6F, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x61, 0x69, 0x6E,
0x74, 0x61, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x2E,
0x74, 0x61, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x2E, 0x0A, 0x0A,
0x57, 0x68, 0x65, 0x6E, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69,
0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65,
0x64, 0x2C, 0x20, 0x57, 0x41, 0x4C, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68,
0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F,
0x72, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x70, 0x72, 0x69, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6F, 0x72, 0x64,
0x65, 0x72, 0x20, 0x28, 0x65, 0x2E, 0x67, 0x2E, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x31, 0x2C, 0x20, 0x72, 0x65, 0x70, 0x6F,
0x32, 0x2C, 0x20, 0x65, 0x74, 0x63, 0x2E, 0x29, 0x2E, 0x20, 0x49, 0x6E, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x6C,
0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x66, 0x61, 0x73,
0x74, 0x65, 0x72, 0x2F, 0x63, 0x68, 0x65, 0x61, 0x70, 0x65, 0x72, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x20,
0x68, 0x61, 0x73, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x69, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x2E,
0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20,
0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D,
0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x6E, 0x20, 0x6F, 0x6E,
0x6C, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x77,
0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x64, 0x2E,
// archive-push command
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x09, 0x22, // Summary
0x50, 0x75, 0x73, 0x68, 0x20, 0x61, 0x20, 0x57, 0x41, 0x4C, 0x20, 0x73, 0x65, 0x67, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x74,
0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2E,
pckTypeStr << 4 | 0x08, 0x72, // Description
pckTypeStr << 4 | 0x08, 0xE1, 0x01, // Description
0x54, 0x68, 0x65, 0x20, 0x57, 0x41, 0x4C, 0x20, 0x73, 0x65, 0x67, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x6D, 0x61, 0x79, 0x20,
0x62, 0x65, 0x20, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x20, 0x69, 0x6D, 0x6D, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6C,
0x79, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x6F, 0x72, 0x20,
0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6E,
0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x6F, 0x66,
0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2D, 0x61, 0x73, 0x79, 0x6E, 0x63,
0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2D, 0x61, 0x73, 0x79, 0x6E, 0x63, 0x2E, 0x20, 0x57, 0x69, 0x74, 0x68,
0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69,
0x65, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x2C, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69,
0x76, 0x65, 0x2D, 0x70, 0x75, 0x73, 0x68, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6D, 0x70, 0x74,
0x20, 0x74, 0x6F, 0x20, 0x70, 0x75, 0x73, 0x68, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x73, 0x20, 0x6D, 0x61, 0x6E, 0x79, 0x20,
0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6F, 0x73, 0x73,
0x69, 0x62, 0x6C, 0x65, 0x2E,
// backup command
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x09, 0x1A, // Summary
0x42, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x63, 0x6C,
0x75, 0x73, 0x74, 0x65, 0x72, 0x2E,
pckTypeStr << 4 | 0x08, 0x72, // Description
pckTypeStr << 4 | 0x08, 0x8C, 0x02, // Description
0x57, 0x68, 0x65, 0x6E, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69,
0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65,
0x64, 0x2C, 0x20, 0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62,
0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74,
0x20, 0x70, 0x72, 0x69, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79,
0x20, 0x28, 0x65, 0x2E, 0x67, 0x2E, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x31, 0x29, 0x20, 0x75, 0x6E, 0x6C, 0x65, 0x73, 0x73,
0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69,
0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2E, 0x0A, 0x0A,
0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x74, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20,
0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x2D, 0x69, 0x6E, 0x20, 0x73, 0x63, 0x68, 0x65,
0x64, 0x75, 0x6C, 0x65, 0x72, 0x20, 0x73, 0x6F, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x74,
@ -55,14 +84,20 @@ static const unsigned char helpDataPack[] =
pckTypeStr << 4 | 0x09, 0x18, // Summary
0x43, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6F, 0x6E, 0x2E,
pckTypeStr << 4 | 0x08, 0xF2, 0x07, // Description
pckTypeStr << 4 | 0x08, 0xEA, 0x08, // Description
0x54, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x76, 0x61,
0x6C, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52,
0x65, 0x73, 0x74, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x5F,
0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x72, 0x65, 0x20,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x63, 0x6F, 0x72, 0x72, 0x65, 0x63, 0x74, 0x6C, 0x79,
0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x62,
0x61, 0x63, 0x6B, 0x75, 0x70, 0x73, 0x2E, 0x20, 0x49, 0x74, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6D,
0x61, 0x63, 0x6B, 0x75, 0x70, 0x73, 0x2E, 0x20, 0x49, 0x74, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x61, 0x74, 0x74, 0x65,
0x6D, 0x70, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x61, 0x6C, 0x6C, 0x20, 0x72, 0x65, 0x70,
0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75,
0x72, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x20, 0x6F,
0x6E, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20,
0x69, 0x73, 0x20, 0x72, 0x75, 0x6E, 0x2E, 0x20, 0x49, 0x74, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6D,
0x69, 0x73, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2C, 0x20, 0x70, 0x61,
0x72, 0x74, 0x69, 0x63, 0x75, 0x6C, 0x61, 0x72, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76,
0x69, 0x6E, 0x67, 0x2C, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x20, 0x69, 0x6E, 0x20,
@ -113,7 +148,7 @@ static const unsigned char helpDataPack[] =
pckTypeStr << 4 | 0x09, 0x25, // Summary
0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x20, 0x72, 0x65, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x2E,
pckTypeStr << 4 | 0x08, 0xE3, 0x08, // Description
pckTypeStr << 4 | 0x08, 0xBD, 0x0A, // Description
0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x74, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x66, 0x75, 0x6C, 0x6C,
0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x72, 0x6F, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x62, 0x61, 0x73,
0x65, 0x64, 0x20, 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x20,
@ -159,18 +194,29 @@ static const unsigned char helpDataPack[] =
0x6F, 0x63, 0x63, 0x75, 0x72, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6E,
0x67, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72,
0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x2E, 0x20, 0x45, 0x78, 0x70, 0x69, 0x72,
0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x62, 0x65, 0x20, 0x6C, 0x69,
0x6D, 0x69, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6F,
0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x73,
0x65, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x73, 0x65, 0x74, 0x20, 0x6F, 0x70,
0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x49, 0x74, 0x20, 0x73, 0x68, 0x6F, 0x75, 0x6C, 0x64, 0x20, 0x62, 0x65, 0x20, 0x6E,
0x6F, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76,
0x65, 0x20, 0x72, 0x65, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6C, 0x65,
0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x64,
0x20, 0x70, 0x65, 0x72, 0x66, 0x6F, 0x72, 0x6D, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x69,
0x73, 0x20, 0x72, 0x75, 0x6E, 0x2E,
0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68,
0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x70,
0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2C, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20,
0x77, 0x69, 0x6C, 0x6C, 0x20, 0x6F, 0x63, 0x63, 0x75, 0x72, 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x6F, 0x6E, 0x20, 0x74,
0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74,
0x6F, 0x72, 0x79, 0x2E, 0x20, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x61, 0x6E, 0x20,
0x61, 0x6C, 0x73, 0x6F, 0x20, 0x62, 0x65, 0x20, 0x6C, 0x69, 0x6D, 0x69, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74,
0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
0x63, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x73, 0x65, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
0x65, 0x20, 0x2D, 0x2D, 0x73, 0x65, 0x74, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x64, 0x2C, 0x20,
0x75, 0x6E, 0x6C, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70,
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2C, 0x20, 0x61,
0x6C, 0x6C, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6C, 0x6C,
0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x61, 0x6E, 0x79,
0x20, 0x6D, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x63, 0x72,
0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72,
0x65, 0x64, 0x2E, 0x20, 0x49, 0x74, 0x20, 0x73, 0x68, 0x6F, 0x75, 0x6C, 0x64, 0x20, 0x62, 0x65, 0x20, 0x6E, 0x6F, 0x74,
0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20,
0x72, 0x65, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6C, 0x65, 0x20, 0x77,
0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x70,
0x65, 0x72, 0x66, 0x6F, 0x72, 0x6D, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 0x74, 0x68,
0x65, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x69, 0x73, 0x20,
0x72, 0x75, 0x6E, 0x2E,
// help command
// -------------------------------------------------------------------------------------------------------------------------
@ -201,7 +247,7 @@ static const unsigned char helpDataPack[] =
pckTypeStr << 4 | 0x09, 0x23, // Summary
0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E,
0x20, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x73, 0x2E,
pckTypeStr << 4 | 0x08, 0xC0, 0x12, // Description
pckTypeStr << 4 | 0x08, 0xA3, 0x15, // Description
0x54, 0x68, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x6F, 0x70, 0x65,
0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6F, 0x6E, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x73, 0x74,
0x61, 0x6E, 0x7A, 0x61, 0x20, 0x6F, 0x72, 0x20, 0x61, 0x6C, 0x6C, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x73, 0x2E,
@ -233,15 +279,33 @@ static const unsigned char helpDataPack[] =
0x74, 0x68, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x27, 0x6F, 0x6B, 0x27, 0x20,
0x74, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x66,
0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x6C, 0x79, 0x2E,
0x20, 0x54, 0x68, 0x65, 0x20, 0x27, 0x77, 0x61, 0x6C, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x6D, 0x69,
0x6E, 0x2F, 0x6D, 0x61, 0x78, 0x27, 0x20, 0x73, 0x68, 0x6F, 0x77, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x69, 0x6E,
0x69, 0x6D, 0x75, 0x6D, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x57, 0x41, 0x4C,
0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E,
0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2E, 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x74,
0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x67, 0x61, 0x70,
0x73, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x72, 0x65, 0x74,
0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x6F, 0x6C, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x6F, 0x72, 0x20, 0x6F,
0x74, 0x68, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x73, 0x2E, 0x0A, 0x0A,
0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70,
0x6C, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x2C, 0x20, 0x74, 0x68, 0x65,
0x6E, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x27, 0x6D, 0x69, 0x78, 0x65, 0x64,
0x27, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65,
0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20,
0x68, 0x65, 0x61, 0x6C, 0x74, 0x68, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6F, 0x6E, 0x20, 0x6F, 0x6E, 0x65,
0x20, 0x6F, 0x72, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F,
0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x2E, 0x20, 0x49, 0x6E, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61,
0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69,
0x6C, 0x65, 0x64, 0x20, 0x6F, 0x6E, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x6C, 0x69,
0x6E, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x2E, 0x20,
0x54, 0x68, 0x65, 0x20, 0x27, 0x77, 0x61, 0x6C, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x6D, 0x69, 0x6E,
0x2F, 0x6D, 0x61, 0x78, 0x27, 0x20, 0x73, 0x68, 0x6F, 0x77, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x69, 0x6E, 0x69,
0x6D, 0x75, 0x6D, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x57, 0x41, 0x4C, 0x20,
0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20,
0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x61, 0x6E, 0x64, 0x2C, 0x20, 0x69, 0x6E, 0x20,
0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65,
0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x2C, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20,
0x62, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x72, 0x6F, 0x73, 0x73, 0x20, 0x61,
0x6C, 0x6C, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x75, 0x6E, 0x6C, 0x65,
0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E,
0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x2E, 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74,
0x68, 0x65, 0x72, 0x65, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x67, 0x61, 0x70, 0x73, 0x20, 0x64, 0x75, 0x65,
0x20, 0x74, 0x6F, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x72, 0x65, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F,
0x6E, 0x20, 0x70, 0x6F, 0x6C, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x6F, 0x72, 0x20, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x20,
0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x73, 0x2E, 0x0A, 0x0A,
0x54, 0x68, 0x65, 0x20, 0x27, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x2F, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x20, 0x72,
0x75, 0x6E, 0x6E, 0x69, 0x6E, 0x67, 0x27, 0x20, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6C, 0x6C,
0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x62, 0x65, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x27,
@ -344,7 +408,7 @@ static const unsigned char helpDataPack[] =
pckTypeStr << 4 | 0x09, 0x1C, // Summary
0x47, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70,
0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x2E,
pckTypeStr << 4 | 0x08, 0xA2, 0x03, // Description
pckTypeStr << 4 | 0x08, 0xBE, 0x04, // Description
0x53, 0x69, 0x6D, 0x69, 0x6C, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6E, 0x69, 0x78, 0x20,
0x63, 0x61, 0x74, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x6F, 0x72, 0x6B,
0x73, 0x20, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x20, 0x72,
@ -366,14 +430,22 @@ static const unsigned char helpDataPack[] =
0x6E, 0x20, 0x62, 0x65, 0x20, 0x70, 0x69, 0x70, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72, 0x6F, 0x75, 0x67, 0x68, 0x20, 0x74,
0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6F, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6F, 0x6D,
0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x2C, 0x20, 0x65, 0x2E,
0x67, 0x2E, 0x20, 0x67, 0x7A, 0x69, 0x70, 0x20, 0x2D, 0x64, 0x2E,
0x67, 0x2E, 0x20, 0x67, 0x7A, 0x69, 0x70, 0x20, 0x2D, 0x64, 0x2E, 0x0A, 0x0A,
0x49, 0x66, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E, 0x65, 0x20, 0x72, 0x65, 0x70,
0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65,
0x64, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20,
0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65,
0x73, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F,
0x72, 0x79, 0x20, 0x28, 0x65, 0x2E, 0x67, 0x2E, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x31, 0x29, 0x20, 0x75, 0x6E, 0x6C, 0x65,
0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E,
0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2E,
// repo-ls command
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x09, 0x1B, // Summary
0x4C, 0x69, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70, 0x6F,
0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x2E,
pckTypeStr << 4 | 0x08, 0xBA, 0x02, // Description
pckTypeStr << 4 | 0x08, 0xD6, 0x03, // Description
0x53, 0x69, 0x6D, 0x69, 0x6C, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6E, 0x69, 0x78, 0x20,
0x6C, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x6F, 0x72, 0x6B, 0x73,
0x20, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65,
@ -390,7 +462,15 @@ static const unsigned char helpDataPack[] =
0x6E, 0x61, 0x6D, 0x65, 0x20, 0x70, 0x65, 0x72, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x2E, 0x20, 0x4A, 0x53, 0x4F, 0x4E, 0x20,
0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x20,
0x62, 0x79, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x2D, 0x2D, 0x6F, 0x75, 0x74, 0x70,
0x75, 0x74, 0x3D, 0x6A, 0x73, 0x6F, 0x6E, 0x2E,
0x75, 0x74, 0x3D, 0x6A, 0x73, 0x6F, 0x6E, 0x2E, 0x0A, 0x0A,
0x49, 0x66, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E, 0x65, 0x20, 0x72, 0x65, 0x70,
0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65,
0x64, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20,
0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65,
0x73, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F,
0x72, 0x79, 0x20, 0x28, 0x65, 0x2E, 0x67, 0x2E, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x31, 0x29, 0x20, 0x75, 0x6E, 0x6C, 0x65,
0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E,
0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2E,
// repo-put command
// -------------------------------------------------------------------------------------------------------------------------
@ -428,32 +508,75 @@ static const unsigned char helpDataPack[] =
pckTypeStr << 4 | 0x09, 0x1B, // Summary
0x52, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x63,
0x6C, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2E,
pckTypeStr << 4 | 0x08, 0x5C, // Description
0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x69, 0x73, 0x20, 0x67, 0x65, 0x6E, 0x65,
0x72, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x6D, 0x61, 0x6E, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x2C, 0x20,
0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E,
0x63, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x6D, 0x69, 0x67, 0x68, 0x74, 0x20, 0x62,
0x65, 0x20, 0x61, 0x75, 0x74, 0x6F, 0x6D, 0x61, 0x74, 0x65, 0x64, 0x2E,
pckTypeStr << 4 | 0x08, 0xBA, 0x06, // Description
0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20,
0x61, 0x75, 0x74, 0x6F, 0x6D, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C,
0x74, 0x73, 0x20, 0x74, 0x6F, 0x20, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20,
0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x74,
0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20,
0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x73, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x2E,
0x20, 0x54, 0x68, 0x65, 0x20, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6E, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65,
0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x65, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x63, 0x74, 0x61, 0x74, 0x65, 0x64,
0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x67, 0x62, 0x61, 0x63, 0x6B, 0x72, 0x65, 0x73, 0x74, 0x2E, 0x63,
0x6F, 0x6E, 0x66, 0x20, 0x28, 0x65, 0x2E, 0x67, 0x2E, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x31, 0x20, 0x77, 0x69, 0x6C, 0x6C,
0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, 0x65, 0x20, 0x72,
0x65, 0x70, 0x6F, 0x32, 0x29, 0x2E, 0x20, 0x54, 0x6F, 0x20, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x66, 0x72, 0x6F,
0x6D, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74,
0x6F, 0x72, 0x79, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69,
0x6F, 0x6E, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x28, 0x65, 0x2E,
0x67, 0x2E, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x3D, 0x31, 0x29, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, 0x2D, 0x2D,
0x73, 0x65, 0x74, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61,
0x73, 0x73, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x6F, 0x74, 0x68,
0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69,
0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x2E, 0x0A, 0x0A,
0x46, 0x6F, 0x72, 0x20, 0x50, 0x49, 0x54, 0x52, 0x2C, 0x20, 0x2D, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x74, 0x69, 0x6D,
0x65, 0x20, 0x6D, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x61,
0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 0x73,
0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D,
0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20,
0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
0x69, 0x65, 0x64, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D, 0x73, 0x65, 0x74, 0x20, 0x6F, 0x70,
0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x77,
0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x65, 0x64, 0x2C, 0x20, 0x69, 0x6E, 0x20, 0x6F,
0x72, 0x64, 0x65, 0x72, 0x2C, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x74,
0x68, 0x61, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x6E, 0x6F, 0x20, 0x62,
0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6F, 0x75, 0x6E, 0x64, 0x2C, 0x20,
0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x20, 0x66, 0x72,
0x6F, 0x6D, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74,
0x6F, 0x72, 0x79, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x75,
0x70, 0x73, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2E, 0x20, 0x53, 0x65, 0x65,
0x20, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x2D, 0x69, 0x6E, 0x2D, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x52, 0x65, 0x63, 0x6F, 0x76,
0x65, 0x72, 0x79, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6C, 0x73,
0x20, 0x61, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x73, 0x2E,
// stanza-create command
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x09, 0x20, // Summary
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20,
0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2E,
pckTypeStr << 4 | 0x08, 0x8A, 0x01, // Description
pckTypeStr << 4 | 0x08, 0xF3, 0x01, // Description
0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x2D, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6F,
0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x6F, 0x6E,
0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6F, 0x73, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x65,
0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x20, 0x68,
0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x69,
0x6E, 0x20, 0x70, 0x67, 0x62, 0x61, 0x63, 0x6B, 0x72, 0x65, 0x73, 0x74, 0x2E, 0x63, 0x6F, 0x6E, 0x66, 0x2E,
0x6E, 0x20, 0x70, 0x67, 0x62, 0x61, 0x63, 0x6B, 0x72, 0x65, 0x73, 0x74, 0x2E, 0x63, 0x6F, 0x6E, 0x66, 0x2E, 0x20, 0x49,
0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E,
0x20, 0x6F, 0x6E, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x63, 0x6F, 0x6E, 0x66,
0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x6F, 0x6E, 0x20, 0x74, 0x68,
0x65, 0x20, 0x68, 0x6F, 0x73, 0x74, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x20, 0x77,
0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6F, 0x6E, 0x20, 0x65, 0x61,
0x63, 0x68, 0x2E,
// stanza-delete command
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x09, 0x10, // Summary
0x44, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x2E,
pckTypeStr << 4 | 0x08, 0xED, 0x04, // Description
pckTypeStr << 4 | 0x08, 0xB4, 0x06, // Description
0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x2D, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6F,
0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x6D, 0x6F, 0x76, 0x65, 0x73, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69,
0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x61, 0x73, 0x73,
@ -488,13 +611,23 @@ static const unsigned char helpDataPack[] =
0x72, 0x6F, 0x6D, 0x20, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x74, 0x20, 0x63,
0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x61,
0x6E, 0x64, 0x2F, 0x6F, 0x72, 0x20, 0x65, 0x6E, 0x76, 0x69, 0x72, 0x6F, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x76, 0x61,
0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x73, 0x2E,
0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x73, 0x2E, 0x0A, 0x0A,
0x41, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x62, 0x65,
0x20, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x6F, 0x6E, 0x65, 0x20, 0x72, 0x65,
0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x20,
0x54, 0x6F, 0x20, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61,
0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73,
0x69, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x2C, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x2D, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E,
0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72,
0x79, 0x20, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x74,
0x68, 0x65, 0x20, 0x2D, 0x2D, 0x72, 0x65, 0x70, 0x6F, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x2E,
// stanza-upgrade command
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x09, 0x11, // Summary
0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x2E,
pckTypeStr << 4 | 0x08, 0x81, 0x02, // Description
pckTypeStr << 4 | 0x08, 0xEA, 0x02, // Description
0x49, 0x6D, 0x6D, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6C, 0x79, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x75, 0x70,
0x67, 0x72, 0x61, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x50, 0x6F, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4C, 0x20, 0x74,
0x6F, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x77, 0x65, 0x72, 0x20, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73,
@ -505,9 +638,15 @@ static const unsigned char helpDataPack[] =
0x73, 0x65, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
0x73, 0x74, 0x61, 0x6E, 0x7A, 0x61, 0x2D, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x6F,
0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x68, 0x6F, 0x73,
0x74, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x69,
0x73, 0x20, 0x6F, 0x66, 0x66, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2D, 0x2D,
0x6E, 0x6F, 0x2D, 0x6F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x2E,
0x74, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20,
0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x6F,
0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6F, 0x73, 0x74, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E,
0x7A, 0x61, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6F,
0x6E, 0x20, 0x65, 0x61, 0x63, 0x68, 0x2E, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62,
0x61, 0x73, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6F, 0x66, 0x66, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74,
0x68, 0x65, 0x20, 0x2D, 0x2D, 0x6E, 0x6F, 0x2D, 0x6F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x6F, 0x70, 0x74, 0x69, 0x6F,
0x6E, 0x2E,
// start command
// -------------------------------------------------------------------------------------------------------------------------
@ -2303,11 +2442,25 @@ static const unsigned char helpDataPack[] =
// repo option
// -------------------------------------------------------------------------------------------------------------------------
pckTypeBool << 4 | 0x0D, 0x01, // Internal
pckTypeStr << 4 | 0x0E, 0x01, 0x0A, // Section
0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79,
pckTypeStr << 4 | 0x08, 0x0F, // Summary
0x53, 0x65, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x2E,
pckTypeStr << 4 | 0x08, 0xAD, 0x01, // Description
0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x66,
0x6F, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6F, 0x70, 0x65, 0x72,
0x61, 0x74, 0x65, 0x20, 0x6F, 0x6E, 0x2E, 0x0A, 0x0A,
0x46, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2C, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6F, 0x70,
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20,
0x70, 0x65, 0x72, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x66, 0x72,
0x6F, 0x6D, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69,
0x74, 0x6F, 0x72, 0x79, 0x2C, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6C, 0x65,
0x74, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x67, 0x42, 0x61, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, 0x6F,
0x6F, 0x73, 0x65, 0x2E,
// repo-azure-account option
// -------------------------------------------------------------------------------------------------------------------------
pckTypeStr << 4 | 0x0E, 0x01, 0x0A, // Section
pckTypeStr << 4 | 0x0B, 0x0A, // Section
0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79,
pckTypeStr << 4 | 0x08, 0x19, // Summary
0x41, 0x7A, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63,

View File

@ -373,13 +373,6 @@ cfgLoad(unsigned int argListSize, const char *argList[])
// Parse config from command line and config file
configParse(storageLocal(), argListSize, argList, true);
// Check that only repo1 is configured. This is temporary until the multi-repo support is finalized.
if (cfgCommandRole() == cfgCmdRoleDefault && cfgOptionGroupValid(cfgOptGrpRepo) &&
(cfgOptionGroupIdxTotal(cfgOptGrpRepo) > 1 || cfgOptionGroupIdxToKey(cfgOptGrpRepo, 0) != 1))
{
THROW_FMT(OptionInvalidValueError, "only repo1 may be configured");
}
// Initialize dry-run mode for storage when valid for the current command
storageHelperDryRunInit(cfgOptionValid(cfgOptDryRun) && cfgOptionBool(cfgOptDryRun));

View File

@ -47,6 +47,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
@ -75,6 +79,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
@ -114,6 +122,118 @@ log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
repo2-path=[TEST_PATH]/backup/repo2
[global:backup]
archive-copy=y
start-fast=y
full backup - repo2 (backup host)
> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --repo=2 --type=full --stanza=db backup
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/pgbackrest.conf
-----------------------------------------------------------
[db]
pg1-path=[TEST_PATH]/db-primary/db/base
pg1-port=6543
pg1-socket-path=[TEST_PATH]/db-primary/db
[global]
buffer-size=[BUFFER-SIZE]
compress-level=3
compress-level-network=1
compress-type=none
db-timeout=45
job-retry=0
lock-path=[TEST_PATH]/db-primary/lock
log-level-console=detail
log-level-file=[LOG-LEVEL-FILE]
log-level-stderr=off
log-path=[TEST_PATH]/db-primary/log
log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
-----------------------------------------------------------
[db]
pg1-path=[TEST_PATH]/db-standby/db/base
pg1-port=6544
pg1-socket-path=[TEST_PATH]/db-standby/db
[global]
buffer-size=[BUFFER-SIZE]
compress-level=3
compress-level-network=1
compress-type=none
db-timeout=45
job-retry=0
lock-path=[TEST_PATH]/db-standby/lock
log-level-console=detail
log-level-file=[LOG-LEVEL-FILE]
log-level-stderr=off
log-path=[TEST_PATH]/db-standby/log
log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
-------------------------------------------------------
[db]
pg1-host=db-primary
pg1-host-cmd=[BACKREST-BIN]
pg1-host-config=[TEST_PATH]/db-primary/pgbackrest.conf
pg1-host-user=[USER-1]
pg1-path=[TEST_PATH]/db-primary/db/base
pg1-port=6543
pg2-host=bogus
pg2-host-cmd=[BACKREST-BIN]
pg2-host-config=[TEST_PATH]/db-standby/pgbackrest.conf
pg2-host-user=[USER-1]
pg2-path=[TEST_PATH]/db-standby/db/base
pg8-host=db-standby
pg8-host-cmd=[BACKREST-BIN]
pg8-host-config=[TEST_PATH]/db-standby/pgbackrest.conf
pg8-host-user=[USER-1]
pg8-path=[TEST_PATH]/db-standby/db/base
pg8-port=6544
[global]
buffer-size=[BUFFER-SIZE]
compress-level=3
compress-level-network=1
compress-type=none
db-timeout=45
job-retry=0
lock-path=[TEST_PATH]/backup/lock
log-level-console=detail
log-level-file=[LOG-LEVEL-FILE]
log-level-stderr=off
log-path=[TEST_PATH]/backup/log
log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
repo2-path=[TEST_PATH]/backup/repo2
[global:backup]
archive-copy=y
@ -149,6 +269,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
@ -177,6 +301,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
@ -216,6 +344,7 @@ log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
repo2-path=[TEST_PATH]/backup/repo2
[global:backup]
archive-copy=y
@ -270,6 +399,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
@ -300,6 +433,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
@ -340,6 +477,7 @@ log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
repo2-path=[TEST_PATH]/backup/repo2
[global:backup]
archive-copy=y
@ -379,6 +517,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
@ -409,6 +551,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
@ -449,6 +595,7 @@ log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
repo2-path=[TEST_PATH]/backup/repo2
[global:backup]
archive-copy=y
@ -475,7 +622,7 @@ expire --set=[BACKUP-DIFF-1] (backup host)
------------------------------------------------------------------------------------------------------------------------------------
incr backup - delta (backup host)
> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stop-auto --buffer-size=[BUFFER-SIZE] --delta --repo=1 --stanza=db backup
> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stop-auto --buffer-size=[BUFFER-SIZE] --delta --repo=2 --stanza=db backup
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/pgbackrest.conf
@ -504,6 +651,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
@ -534,6 +685,10 @@ repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
repo2-host=backup
repo2-host-cmd=[BACKREST-BIN]
repo2-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo2-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
@ -574,6 +729,7 @@ log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
repo2-path=[TEST_PATH]/backup/repo2
[global:backup]
archive-copy=y
@ -592,13 +748,13 @@ restore, type 'default', expect exit 40 - path not empty (db-primary host)
------------------------------------------------------------------------------------------------------------------------------------
restore, type 'default' (db-primary host)
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --db-include=test2 --db-include=test3 --buffer-size=[BUFFER-SIZE] --link-all --repo=1 --stanza=db restore
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --db-include=test2 --db-include=test3 --buffer-size=[BUFFER-SIZE] --link-all --repo=2 --stanza=db restore
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/db/base/recovery.conf
-----------------------------------------------------------------
# Recovery settings generated by pgBackRest restore on [TIMESTAMP]
restore_command = '[BACKREST-BIN] --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=1 --stanza=db archive-get %f "%p"'
restore_command = '[BACKREST-BIN] --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=2 --stanza=db archive-get %f "%p"'
restore, force, backup '[BACKUP-FULL-1]', type 'immediate', target-action=promote (db-primary host)
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --force --set=[BACKUP-FULL-1] --type=immediate --link-all --target-action=promote --stanza=db restore
@ -612,13 +768,13 @@ recovery_target = 'immediate'
recovery_target_action = 'promote'
restore, force, backup '[BACKUP-INCR-1]', type 'xid', target '[XID-TARGET-1]', target-action=promote (db-primary host)
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --force --set=[BACKUP-INCR-1] --tablespace-map-all=../../tablespace --type=xid --target="[XID-TARGET-1]" --link-all --target-action=promote --repo=1 --stanza=db restore
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --force --set=[BACKUP-INCR-1] --tablespace-map-all=../../tablespace --type=xid --target="[XID-TARGET-1]" --link-all --target-action=promote --repo=2 --stanza=db restore
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/db/base/recovery.conf
-----------------------------------------------------------------
# Recovery settings generated by pgBackRest restore on [TIMESTAMP]
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=1 --stanza=db archive-get %f "%p"'
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=2 --stanza=db archive-get %f "%p"'
recovery_target_xid = '[XID-TARGET-1]'
recovery_target_action = 'promote'
@ -629,7 +785,7 @@ restore, type 'preserve' (db-primary host)
+ supplemental file: [TEST_PATH]/db-primary/db/base/recovery.conf
-----------------------------------------------------------------
# Recovery settings generated by pgBackRest restore on [TIMESTAMP]
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=1 --stanza=db archive-get %f "%p"'
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=2 --stanza=db archive-get %f "%p"'
recovery_target_xid = '[XID-TARGET-1]'
recovery_target_action = 'promote'
@ -645,13 +801,13 @@ recovery_target_time = '[TIMESTAMP-TARGET-1]'
recovery_target_action = 'promote'
restore delta, backup '[BACKUP-INCR-1]', type 'xid', target '[XID-TARGET-1]', exclusive, target-action=promote (db-primary host)
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --delta --set=[BACKUP-INCR-1] --type=xid --target="[XID-TARGET-1]" --target-exclusive --link-all --target-action=promote --repo=1 --stanza=db restore
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --delta --set=[BACKUP-INCR-1] --type=xid --target="[XID-TARGET-1]" --target-exclusive --link-all --target-action=promote --repo=2 --stanza=db restore
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/db/base/recovery.conf
-----------------------------------------------------------------
# Recovery settings generated by pgBackRest restore on [TIMESTAMP]
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=1 --stanza=db archive-get %f "%p"'
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=2 --stanza=db archive-get %f "%p"'
recovery_target_xid = '[XID-TARGET-1]'
recovery_target_inclusive = 'false'
recovery_target_action = 'promote'
@ -668,13 +824,13 @@ recovery_target_name = 'backrest'
recovery_target_action = 'promote'
restore delta, backup '[BACKUP-INCR-1]', type 'standby', timeline '4' (db-primary host)
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --delta --set=[BACKUP-INCR-1] --type=standby --target-timeline="4" --link-all --repo=1 --stanza=db restore
> [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --delta --set=[BACKUP-INCR-1] --type=standby --target-timeline="4" --link-all --repo=2 --stanza=db restore
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/db/base/recovery.conf
-----------------------------------------------------------------
# Recovery settings generated by pgBackRest restore on [TIMESTAMP]
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=1 --stanza=db archive-get %f "%p"'
restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo=2 --stanza=db archive-get %f "%p"'
standby_mode = 'on'
recovery_target_timeline = '4'

View File

@ -52,17 +52,17 @@ sub run
foreach my $rhRun
(
{pg => PG_VERSION_83, repoDest => HOST_DB_PRIMARY, storage => POSIX, encrypt => false, compress => NONE, repo => 1},
{pg => PG_VERSION_83, repoDest => HOST_DB_PRIMARY, storage => POSIX, encrypt => false, compress => NONE, repo => 2},
{pg => PG_VERSION_84, repoDest => HOST_BACKUP, storage => AZURE, encrypt => true, compress => GZ, repo => 1},
{pg => PG_VERSION_90, repoDest => HOST_DB_PRIMARY, storage => GCS, encrypt => true, compress => BZ2, repo => 1},
{pg => PG_VERSION_90, repoDest => HOST_DB_PRIMARY, storage => GCS, encrypt => true, compress => BZ2, repo => 2},
{pg => PG_VERSION_91, repoDest => HOST_DB_STANDBY, storage => GCS, encrypt => false, compress => GZ, repo => 1},
{pg => PG_VERSION_92, repoDest => HOST_DB_STANDBY, storage => POSIX, encrypt => true, compress => NONE, repo => 1},
{pg => PG_VERSION_93, repoDest => HOST_BACKUP, storage => AZURE, encrypt => false, compress => NONE, repo => 1},
{pg => PG_VERSION_93, repoDest => HOST_BACKUP, storage => AZURE, encrypt => false, compress => NONE, repo => 2},
{pg => PG_VERSION_94, repoDest => HOST_DB_STANDBY, storage => POSIX, encrypt => true, compress => LZ4, repo => 1},
{pg => PG_VERSION_95, repoDest => HOST_BACKUP, storage => S3, encrypt => false, compress => BZ2, repo => 1},
{pg => PG_VERSION_96, repoDest => HOST_BACKUP, storage => POSIX, encrypt => false, compress => NONE, repo => 1},
{pg => PG_VERSION_10, repoDest => HOST_DB_STANDBY, storage => S3, encrypt => true, compress => GZ, repo => 1},
{pg => PG_VERSION_11, repoDest => HOST_BACKUP, storage => AZURE, encrypt => false, compress => ZST, repo => 1},
{pg => PG_VERSION_96, repoDest => HOST_BACKUP, storage => POSIX, encrypt => false, compress => NONE, repo => 2},
{pg => PG_VERSION_10, repoDest => HOST_DB_STANDBY, storage => S3, encrypt => true, compress => GZ, repo => 2},
{pg => PG_VERSION_11, repoDest => HOST_BACKUP, storage => AZURE, encrypt => false, compress => ZST, repo => 2},
{pg => PG_VERSION_12, repoDest => HOST_BACKUP, storage => S3, encrypt => true, compress => LZ4, repo => 1},
{pg => PG_VERSION_13, repoDest => HOST_DB_STANDBY, storage => GCS, encrypt => false, compress => ZST, repo => 1},
)

View File

@ -123,8 +123,19 @@ testRun(void)
"\n"
"Restore a database cluster.\n"
"\n"
"This command is generally run manually, but there are instances where it might\n"
"be automated.\n"
"The restore command automatically defaults to selecting the latest backup from\n"
"the first repository where backups exist. The order in which the repositories\n"
"are checked is dictated by the pgbackrest.conf (e.g. repo1 will be checked\n"
"before repo2). To select from a specific repository, the --repo option can be\n"
"passed (e.g. --repo=1). The --set option can be passed if a backup other than\n"
"the latest is desired.\n"
"\n"
"For PITR, --type=time must be provided and the target time specified with the\n"
"--target option. If a backup is not specified via the --set option, then the\n"
"configured repositories will be checked, in order, for a backup that contains\n"
"the requested time. If no backup can be found, the latest backup from the first\n"
"repository containing backups will be used. See Point-in-Time Recovery for more\n"
"details and examples.\n"
"\n"
"Command Options:\n"
"\n"
@ -188,6 +199,7 @@ testRun(void)
"\n",
"Repository Options:\n"
"\n"
" --repo set repository\n"
" --repo-azure-account azure repository account\n"
" --repo-azure-container azure repository container\n"
" --repo-azure-endpoint azure repository endpoint\n"

View File

@ -507,26 +507,6 @@ testRun(void)
storageRepoWrite(), AssertError, "unable to get writable storage in dry-run mode or before dry-run is initialized");
lockRelease(true);
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("error on multi-repo");
argList = strLstNew();
strLstAddZ(argList, PROJECT_BIN);
hrnCfgArgRawZ(argList, cfgOptStanza, "db");
hrnCfgArgKeyRawZ(argList, cfgOptRepoPath, 1, "/repo1");
hrnCfgArgKeyRawZ(argList, cfgOptRepoPath, 2, "/repo2");
strLstAddZ(argList, CFGCMD_EXPIRE);
TEST_ERROR(cfgLoad(strLstSize(argList), strLstPtr(argList)), OptionInvalidValueError, "only repo1 may be configured");
argList = strLstNew();
strLstAddZ(argList, PROJECT_BIN);
hrnCfgArgRawZ(argList, cfgOptStanza, "db");
hrnCfgArgKeyRawZ(argList, cfgOptRepoPath, 2, "/repo2");
strLstAddZ(argList, CFGCMD_EXPIRE);
TEST_ERROR(cfgLoad(strLstSize(argList), strLstPtr(argList)), OptionInvalidValueError, "only repo1 may be configured");
// Command does not have umask and disables keep-alives
// -------------------------------------------------------------------------------------------------------------------------
argList = strLstNew();