####################################################################################################################################
# Configuration Definition
####################################################################################################################################

####################################################################################################################################
# Commands
#
# Define valid commands.
#
# log-file:
#   Does this command log to a file? This is the default behavior, but it can be overridden in code by calling logFileInit(). The
#   default is true.
#
# log-level-default:
#   Defines the log level to use for default messages that are output for every command. For example, the log message that lists
#   all the options passed is usually output at the info level, but that might not be appropriate for some commands, such as info,
#   Allow the log level to be lowered so these common messages will not be emitted where they might be distracting.
#
# lock-required:
#   Does the command require a lock? This doesn't mean a lock can't be taken explicitly later, just controls whether a lock will be
#   acquired as soon as the command starts.
#
# lock-remote-required:
#   Does the command require a lock on the remote? The lock will only be acquired for process id 0.
#
# lock-type:
#   What type of lock is required (archive, backup, or all)?
#
# parameter-allowed
#   Does the command allow parameters? If not then the config parser will automatically error out if parameters are detected. If so,
#   then the command is responsible for ensuring that the parameters are valid.
####################################################################################################################################
command:
  annotate:
    command-role:
      remote: {}
    lock-remote-required: true
    lock-required: true
    lock-type: backup
    log-file: false

  archive-get:
    command-role:
      async: {}
      local: {}
      remote: {}
    lock-type: archive
    log-file: false
    parameter-allowed: true

  archive-push:
    command-role:
      async: {}
      local: {}
      remote: {}
    lock-remote-required: true
    lock-type: archive
    log-file: false
    parameter-allowed: true

  backup:
    command-role:
      local: {}
      remote: {}
    lock-remote-required: true
    lock-required: true
    lock-type: backup

  check:
    command-role:
      remote: {}
    log-file: false

  expire:
    lock-required: true
    lock-type: backup

  help:
    log-file: false
    log-level-default: DEBUG
    parameter-allowed: true

  info:
    command-role:
      remote: {}
    log-file: false
    log-level-default: DEBUG

  manifest:
    command-role:
      remote: {}
    internal: true
    log-file: false
    log-level-default: DEBUG

  repo-create:
    command-role:
      remote: {}
    internal: true
    log-file: false

  repo-get:
    command-role:
      remote: {}
    log-file: false
    log-level-default: DEBUG
    parameter-allowed: true

  repo-ls:
    command-role:
      remote: {}
    log-file: false
    log-level-default: DEBUG
    parameter-allowed: true

  repo-put:
    command-role:
      remote: {}
    internal: true
    log-file: false
    log-level-default: DEBUG
    parameter-allowed: true

  repo-rm:
    command-role:
      remote: {}
    internal: true
    log-file: false
    log-level-default: DEBUG
    parameter-allowed: true

  restore:
    command-role:
      local: {}
      remote: {}

  server: {}

  server-ping:
    log-file: false
    parameter-allowed: true

  stanza-create:
    command-role:
      remote: {}
    lock-required: true
    lock-type: all

  stanza-delete:
    command-role:
      remote: {}
    lock-required: true
    lock-type: all

  stanza-upgrade:
    command-role:
      remote: {}
    lock-required: true
    lock-type: all

  start: {}

  stop: {}

  verify:
    command-role:
      local: {}
      remote: {}

  version:
    log-file: false
    log-level-default: DEBUG

####################################################################################################################################
# Option Groups
#
# Options groups allow related options to be grouped together so, e.g. test and valid, operations can be run across all options in
# the group.
####################################################################################################################################
optionGroup:
  pg: {}
  repo: {}

####################################################################################################################################
# Options
#
# Contains the defines for options: which commands the option can/cannot be specified, for which commands it is required, default
# settings, types, ranges, whether the option may be negated, whether it has dependencies, etc. The initial section is the global
# section, meaning that the defines defined there apply to all commands listed for the option.
#
# inherit:
#   Inherit all definitions for the referenced option. Any definitions can be overridden.
#
# command:
#   List of commands the option can be used with. An empty hash signifies that the command does not deviate from the option
#   defaults. Otherwise, overrides can be specified.
#
#   If another option is referenced (e.g. command: repo-type) then the list of commands will be copied from the referenced option.
#
#   NOTE: If the option (A) has a dependency on another option (B) then the command must also be specified in the other option
#         (B), else it will still error on the option (A).
#
# command-role:
#   1) Define the command roles for a command. 'main' is valid for all commands and is therefore added programmatically.
#
#   2) Define the command roles for an option. If not defined, the option will be valid for all roles of all commands for which it
#      is valid. If command roles are defined for the option, then they override the roles for all commands for which the option is
#      valid. 'main' must be defined explicitly in this case. For example, if an option is only valid for the 'main' role and
#      the 'async' role for each command then command-role must list 'main' and 'async', meaning each command has a 'main' role
#      so the option is valid for that role and for commands that have the 'async' role, it is also valid for the 'async' role of
#      those commands.
#
#   3) Define the command roles for an option command override. If not defined, the option will be valid for all roles of the
#      command or the roles specified by rule 2) above. 'main' must be defined explicitly in this case. If command roles are
#      defined for the option command override, then they override command roles defined for the option (rule 2) above)
#      and all roles defined for the command (rule 1) above).
#
# required:
#   In global section:
#     true - if the option does not have a default, then setting required in the global section means all commands listed in
#            command require the user to set it.
#     false - no commands listed require it as an option but it can be set. This can be overridden for individual commands by
#             setting required in the command section.
#   In command section:
#       true - the option must be set somehow for the command, either by default or by the user, e.g.
#              check:
#                required: true
#       false - mainly used for overriding required in the global section.
#
# default:
#   Sets a default for the option for all commands if listed in the global section, or for specific commands if listed in the
#   command section. All boolean types require a default.
#
# default-literal:
#   If the default is a string output it as-is without quoting. This allows C defines to be used as defaults.
#
# negate:
#   All config file boolean options automatically may be negated. This setting is used to maintain backward compatibility with older
#   options and should not be used for new options. For instance --online would be named --offline if it were created now to avoid
#   the need for negation. --no-config is another special case that would now be implemented with a separate boolean option,
#   e.g. --config-ignore.
#
# reset:
#   The option can be reset to default even if the default is undefined.
#
# depend:
#   Specify the dependencies this option has on another option. All commands listed for this option must also be listed in the
#   dependent option(s).
#
#   'default' may be specified to be set when the dependency does not resolve. This can, and probably should be, different than
#   the standard default for the option.
#
#   'list' further defines the allowable settings for the depended option.
#
# allow-list:
#   Lists the allowable settings for the option.
#
# internal:
#   Option is used by the command internally but is not exposed in the documentation. This is useful for commands that need to know
#   where they are running by looking at other options in the config. Also good for test options.
####################################################################################################################################
option:
  # Command-line only options
  #---------------------------------------------------------------------------------------------------------------------------------
  config:
    type: string
    default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_FILE
    default-literal: true
    negate: true

  config-include-path:
    type: path
    default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_INCLUDE_PATH
    default-literal: true

  config-path:
    type: path
    default: CFGOPTDEF_CONFIG_PATH
    default-literal: true

  dry-run:
    type: boolean
    default: false
    command:
      expire: {}
    command-role:
      main: {}

  force:
    type: boolean
    default: false
    command:
      backup:
        depend:
          option: online
          list:
            - false
      restore: {}
      stanza-create:
        internal: true
      stanza-delete: {}
      stop: {}
    command-role:
      main: {}

  online:
    type: boolean
    default: true
    negate: true
    command:
      backup: {}
      stanza-create: {}
      stanza-upgrade: {}
    command-role:
      main: {}

  output:
    type: string-id
    default: text
    command:
      info: {}
      repo-ls: {}
      manifest: {}
      verify:
        default: none
        allow-list:
          - none
          - text
    allow-list:
      - text
      - json
    command-role:
      main: {}

  reference:
    type: string
    required: false
    command:
      manifest: {}
    command-role:
      main: {}

  set:
    type: string
    required: false
    command:
      annotate:
        required: true
      expire: {}
      info:
        depend:
          option: stanza
      manifest:
        default: latest
        required: true
      restore:
        default: latest
        required: true
      verify:
        internal: true
    command-role:
      main: {}

  report:
    type: boolean
    internal: true
    default: false
    command:
      check: {}
    command-role:
      main: {}

  stanza:
    type: string
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check:
        required: false
      expire: {}
      info:
        required: false
      manifest: {}
      repo-create:
        required: false
      repo-get:
        required: false
      repo-ls:
        required: false
      repo-put:
        required: false
      repo-rm:
        required: false
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      start:
        required: false
      stop:
        required: false
      verify: {}

  target:
    type: string
    command:
      restore: {}
    depend:
      option: type
      list:
        - lsn
        - name
        - time
        - xid
    command-role:
      main: {}

  target-action:
    type: string-id
    default: pause
    command:
      restore: {}
    allow-list:
      - pause
      - promote
      - shutdown
    depend:
      option: type
      list:
        - immediate
        - lsn
        - name
        - time
        - xid
    command-role:
      main: {}

  target-exclusive:
    type: boolean
    default: false
    command:
      restore: {}
    depend:
      option: type
      list:
        - lsn
        - time
        - xid
    command-role:
      main: {}

  target-timeline:
    type: string
    required: false
    command:
      restore: {}
    depend:
      option: type
      list:
        - default
        - lsn
        - name
        - standby
        - time
        - xid
    command-role:
      main: {}

  type:
    type: string-id
    command:
      backup:
        allow-list:
          - full
          - diff
          - incr
        default: incr
      info:
        required: false
        allow-list:
          - full
          - diff
          - incr
      restore:
        allow-list:
          - lsn
          - name
          - time
          - xid
          - preserve
          - none
          - immediate
          - default
          - standby
        default: default
    command-role:
      main: {}

  verbose:
    type: boolean
    default: false
    command:
     verify: {}
    command-role:
      main: {}

  # Command-line only local/remote options
  #---------------------------------------------------------------------------------------------------------------------------------
  exec-id:
    type: string
    internal: true
    required: false

  process:
    type: integer
    internal: true
    required: false
    allow-range: [0, 1024]
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}
    command-role:
      local: {}
      remote: {}

  remote-type:
    type: string-id
    internal: true
    required: false
    allow-list:
      - pg
      - repo
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}
    command-role:
      local: {}
      remote: {}

  # Command-line only storage options
  #---------------------------------------------------------------------------------------------------------------------------------
  cipher-pass:
    type: string
    internal: true
    required: false
    command:
      repo-get: {}
      repo-put: {}
    command-role:
      main: {}

  filter:
    type: string
    required: false
    command:
      manifest: {}
      repo-ls: {}
    command-role:
      main: {}

  ignore-missing:
    type: boolean
    default: false
    command:
      repo-get: {}
    command-role:
      main: {}

  raw:
    type: boolean
    default: false
    command:
      repo-get: {}
      repo-put: {}
    command-role:
      main: {}

  recurse:
    type: boolean
    default: false
    command:
      repo-ls: {}
      repo-rm: {}
    command-role:
      main: {}

  sort:
    type: string-id
    default: asc
    allow-list:
      - none
      - asc
      - desc
    command:
      repo-ls: {}
    command-role:
      main: {}

  # General options
  #---------------------------------------------------------------------------------------------------------------------------------
  archive-timeout:
    section: global
    type: time
    default: 60
    allow-range: [0.1, 86400]
    command:
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
    command-role:
      main: {}

  beta:
    section: global
    type: boolean
    default: false
    internal: true
    beta: true

  buffer-size:
    section: global
    type: size
    default: 1MiB
    allow-list:
      - 16KiB
      - 32KiB
      - 64KiB
      - 128KiB
      - 256KiB
      - 512KiB
      - 1MiB
      - 2MiB
      - 4MiB
      - 8MiB
      - 16MiB
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      expire: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      server: {}
      server-ping: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}

  cmd:
    section: global
    type: string
    required: false
    command:
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}
    command-role:
      async: {}
      main: {}
      local: {}

  cmd-ssh:
    inherit: cmd
    required: true
    default: ssh

  # Option is deprecated and should not be referenced outside of cfgLoadUpdateOption()
  compress:
    section: global
    type: boolean
    default: true
    command:
      archive-push: {}
      backup: {}
    command-role:
      main: {}

  compress-level:
    section: global
    type: integer
    required: false
    command: compress
    command-role:
      async: {}
      main: {}

  compress-level-network:
    section: global
    type: integer
    default: 3
    allow-range: [0, 9]
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      info: {}
      manifest: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}
    command-role:
      async: {}
      main: {}
      local: {}

  compress-type:
    section: global
    type: string-id
    default: gz
    allow-list:
      - none
      - bz2
      - gz
      - lz4: HAVE_LIBLZ4
      - zst: HAVE_LIBZST
    command: compress
    command-role:
      async: {}
      main: {}

  db-timeout:
    section: global
    type: time
    default: 1800
    allow-range: [0.1, 604800]
    command:
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}

  delta:
    section: global
    type: boolean
    default: false
    command:
      backup: {}
      restore: {}
    command-role:
      main: {}

  io-timeout:
    section: global
    type: time
    default: 60
    allow-range: [0.1, 3600]
    command: buffer-size

  job-retry:
    section: global
    type: integer
    internal: true
    default: 2
    allow-range: [0, 360]
    command:
      archive-get:
        default: 1
      archive-push:
        default: 1
      backup: {}
      restore: {}
      verify: {}
    command-role:
      async: {}
      main: {}
      local: {}

  job-retry-interval:
    inherit: job-retry
    type: time
    default: 15
    allow-range: [0, 900]

  lock-path:
    section: global
    type: path
    default: /tmp/pgbackrest
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      expire: {}
      info: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      start: {}
      stop: {}

  neutral-umask:
    section: global
    type: boolean
    default: true
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      expire: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      start: {}
      stop: {}
      verify: {}

  process-max:
    section: global
    type: integer
    default: 1
    allow-range: [1, 999]
    command:
      archive-get: {}
      archive-push: {}
      backup: {}
      restore: {}
      verify: {}
    command-role:
      async: {}
      main: {}

  protocol-timeout:
    section: global
    type: time
    default: 1830
    allow-range: [0.1, 604800]
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      server: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}

  sck-block:
    section: global
    type: boolean
    default: false
    internal: true
    command: buffer-size

  sck-keep-alive:
    type: boolean
    section: global
    default: true
    command: buffer-size

  spool-path:
    section: global
    type: path
    default: /var/spool/pgbackrest
    command:
      archive-get:
        depend:
          option: archive-async
          list:
            - true
      archive-push:
        depend:
          option: archive-async
          list:
            - true
      restore:
        internal: true
    command-role:
      async: {}
      main: {}
      local: {}

  tcp-keep-alive-count:
    section: global
    type: integer
    required: false
    allow-range: [1, 32]
    command: buffer-size
    depend:
      option: sck-keep-alive
      list:
        - true

  tcp-keep-alive-idle:
    section: global
    type: integer
    required: false
    allow-range: [1, 3600]
    command: buffer-size
    depend: tcp-keep-alive-count

  tcp-keep-alive-interval:
    section: global
    type: integer
    required: false
    allow-range: [1, 900]
    command: buffer-size
    depend: tcp-keep-alive-count

  tls-server-ca-file:
    section: global
    type: path
    command:
      server: {}

  tls-server-cert-file:
    section: global
    type: path
    command:
      server: {}

  tls-server-key-file:
    section: global
    type: path
    command:
      server: {}

  tls-server-auth:
    section: global
    type: hash
    command:
      server: {}

  tls-server-address:
    section: global
    type: string
    default: localhost
    command:
      server: {}
      server-ping: {}

  tls-server-port:
    section: global
    type: integer
    default: 8432
    allow-range: [1, 65535]
    command:
      server: {}
      server-ping: {}

  # Logging options
  #---------------------------------------------------------------------------------------------------------------------------------
  log-level-console:
    section: global
    type: string-id
    default: warn
    allow-list:
      - off
      - error
      - warn
      - info
      - detail
      - debug
      - trace

  log-level-file:
    section: global
    type: string-id
    default: info
    allow-list: log-level-console

  log-level-stderr:
    section: global
    type: string-id
    default: warn
    allow-list: log-level-console

  log-path:
    section: global
    type: path
    default: /var/log/pgbackrest

  log-subprocess:
    section: global
    type: boolean
    default: false
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}

  log-timestamp:
    section: global
    type: boolean
    default: true
    command: log-level-console

  # Archive options
  #---------------------------------------------------------------------------------------------------------------------------------
  archive-async:
    section: global
    type: boolean
    default: false
    command:
      archive-get: {}
      archive-push: {}

  archive-get-queue-max:
    section: global
    type: size
    default: 128MiB
    allow-range: [0, 4PiB]
    command:
      archive-get: {}
    command-role:
      async: {}
      main: {}

  archive-header-check:
    section: global
    type: boolean
    default: true
    command:
      archive-push: {}
    command-role:
      main: {}
      async: {}

  archive-missing-retry:
    section: global
    type: boolean
    default: true
    command:
      archive-get: {}
    command-role:
      main: {}

  archive-push-queue-max:
    section: global
    type: size
    required: false
    allow-range: [0, 4PiB]
    command:
      archive-push: {}
    command-role:
      async: {}
      main: {}
    deprecate:
      archive-queue-max: {}

  # Backup options
  #---------------------------------------------------------------------------------------------------------------------------------
  annotation:
    section: global
    type: hash
    required: false
    command:
      annotate:
        required: true
      backup: {}
    command-role:
      main: {}

  archive-check:
    section: global
    type: boolean
    default: true
    command:
      archive-push: {}
      backup:
        depend:
          option: online
          default: false
          list:
            - true
      check: {}
    command-role:
      async: {}
      main: {}

  archive-copy:
    section: global
    type: boolean
    default: false
    command:
      backup:
        depend:
          option: archive-check
          default: false
          list:
            - true
    command-role:
      main: {}

  archive-mode-check:
    section: global
    type: boolean
    default: true
    command:
      archive-push: {}
      backup: {}
      check: {}
    command-role:
      async: {}
      main: {}
    depend:
      option: archive-check
      default: false
      list:
        - true

  backup-standby:
    section: global
    type: boolean
    default: false
    command:
      backup: {}
      check: {}
    command-role:
      main: {}

  checksum-page:
    section: global
    type: boolean
    required: false
    command:
      backup: {}
    command-role:
      main: {}

  page-header-check:
    section: global
    type: boolean
    default: true
    command:
      backup: {}
    command-role:
      main: {}

  exclude:
    section: global
    type: list
    required: false
    command:
      backup: {}
    command-role:
      main: {}

  expire-auto:
    section: global
    type: boolean
    default: true
    command:
      backup: {}
    command-role:
      main: {}

  manifest-save-threshold:
    section: global
    type: size
    default: 1GiB
    allow-range: [1, 1TiB]
    command:
      backup: {}
    command-role:
      main: {}

  resume:
    section: global
    type: boolean
    default: true
    command:
      backup: {}
    command-role:
      main: {}

  start-fast:
    section: global
    type: boolean
    default: false
    command:
      backup: {}
    command-role:
      main: {}

  stop-auto:
    section: global
    type: boolean
    default: false
    command:
      backup: {}
    command-role:
      main: {}

  # Restore options
  #---------------------------------------------------------------------------------------------------------------------------------
  archive-mode:
    section: global
    type: string-id
    default: preserve
    allow-list:
      - off
      - preserve
    command:
      restore: {}
    command-role:
      main: {}

  db-exclude:
    section: global
    type: list
    required: false
    command:
      restore: {}
    command-role:
      main: {}

  db-include:
    section: global
    type: list
    required: false
    command:
      restore: {}
    command-role:
      main: {}

  link-all:
    section: global
    type: boolean
    default: false
    command:
      restore: {}
    command-role:
      main: {}

  link-map:
    section: global
    type: hash
    required: false
    command:
      restore: {}
    command-role:
      main: {}

  tablespace-map:
    section: global
    type: hash
    required: false
    command:
      restore: {}
    command-role:
      main: {}

  tablespace-map-all:
    section: global
    type: string
    required: false
    command:
      restore: {}
    command-role:
      main: {}

  recovery-option:
    section: global
    type: hash
    required: false
    command:
      restore: {}
    command-role:
      main: {}
    depend:
      option: type
      list:
        - default
        - immediate
        - lsn
        - name
        - time
        - standby
        - xid

  # Stanza options
  #---------------------------------------------------------------------------------------------------------------------------------
  pg:
    type: integer
    internal: true
    required: false
    allow-range: [1, 256]
    command:
      backup:
        command-role:
          local: {}
      manifest:
        command-role:
          main: {}

  pg-database:
    section: stanza
    group: pg
    type: string
    command:
      backup: {}
      check: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
    default: postgres
    depend:
      option: pg-path

  pg-local:
    section: stanza
    group: pg
    type: boolean
    internal: true
    default: false
    command:
      archive-get:
        internal: true
      archive-push:
        internal: true
      backup: {}
      check: {}
      manifest: {}
      restore:
        internal: true
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
    command-role:
      async: {}
      main: {}
      local: {}

  pg-host:
    section: stanza
    group: pg
    type: string
    required: false
    command: pg-local
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: pg-local
      list:
        - false
    deprecate:
      db-host: {}
      db?-host: {}

  pg-host-cert-file:
    section: global
    group: pg
    type: string
    command: pg-local
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: pg-host-type
      list:
        - tls

  pg-host-key-file:
    inherit: pg-host-cert-file

  pg-host-ca-file:
    inherit: pg-host-cert-file
    required: false

  pg-host-ca-path:
    inherit: pg-host-cert-file
    required: false

  pg-host-cmd:
    section: stanza
    group: pg
    type: string
    required: false
    command:
      backup: {}
      check: {}
      manifest: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: pg-host
    deprecate:
      db-cmd: {}
      db?-cmd: {}

  pg-host-config:
    inherit: pg-host-cmd
    default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_FILE
    default-literal: true
    required: true
    deprecate:
      db-config: {}
      db?-config: {}

  pg-host-config-include-path:
    inherit: pg-host-cmd
    type: path
    default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_INCLUDE_PATH
    default-literal: true

  pg-host-config-path:
    inherit: pg-host-cmd
    type: path
    default: CFGOPTDEF_CONFIG_PATH
    default-literal: true

  pg-host-port:
    inherit: pg-host-cmd
    type: integer
    required: false
    allow-range: [0, 65535]
    deprecate:
      db-ssh-port: {}
      db?-ssh-port: {}

  pg-host-user:
    inherit: pg-host-cmd
    default: postgres
    required: false
    deprecate:
      db-user: {}
      db?-user: {}

  pg-host-type:
    section: global
    group: pg
    type: string-id
    default: ssh
    allow-list:
      - ssh
      - tls
    command: pg-local
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: pg-local
      list:
        - false

  pg-path:
    section: stanza
    group: pg
    type: path
    command:
      archive-get: {}
      archive-push:
        required: false
      backup: {}
      check:
        depend:
          option: stanza
      manifest:
        required: false
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
    deprecate:
      db-path: {}
      db?-path: {}

  pg-port:
    section: stanza
    group: pg
    type: integer
    default: 5432
    allow-range: [0, 65535]
    command: pg-database
    depend: pg-database
    deprecate:
      db-port: {}
      db?-port: {}

  pg-socket-path:
    section: stanza
    group: pg
    type: path
    required: false
    command: pg-database
    depend: pg-database
    deprecate:
      db-socket-path: {}
      db?-socket-path: {}

  pg-user:
    section: stanza
    group: pg
    type: string
    required: false
    command:
      backup: {}
      check: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
    depend:
      option: pg-path

  pg-version-force:
    section: stanza
    type: string
    required: false
    command:
      archive-get: {}
      archive-push: {}
      backup: {}
      check: {}
      manifest: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}

  # Repository options
  #---------------------------------------------------------------------------------------------------------------------------------
  repo:
    type: integer
    required: false
    allow-range: [1, 256]
    command:
      annotate:
        command-role:
          main: {}
          remote: {}
      archive-get:
        command-role:
          async: {}
          main: {}
          local: {}
          remote: {}
      archive-push:
        command-role:
          remote: {}
      backup:
        command-role:
          main: {}
          local: {}
      check:
        command-role:
          remote: {}
      expire:
        command-role:
          main: {}
      info:
        command-role:
          main: {}
          remote: {}
      manifest:
        command-role:
          main: {}
          remote: {}
      repo-create:
        command-role:
          main: {}
          remote: {}
      repo-get:
        command-role:
          main: {}
          remote: {}
      repo-ls:
        command-role:
          main: {}
          remote: {}
      repo-put:
        command-role:
          main: {}
          remote: {}
      repo-rm:
        command-role:
          main: {}
          remote: {}
      restore:
        command-role:
          main: {}
          local: {}
          remote: {}
      stanza-create:
        command-role:
          remote: {}
      stanza-delete:
        command-role:
          main: {}
          remote: {}
      stanza-upgrade:
        command-role:
          remote: {}
      start:
        command-role: {}
      stop:
        command-role: {}
      verify:
        command-role:
          main: {}
          local: {}
          remote: {}

  repo-local:
    section: global
    group: repo
    type: boolean
    internal: true
    default: false
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      backup:
        internal: true
      check: {}
      expire:
        internal: true
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}
    command-role:
      async: {}
      main: {}
      local: {}

  repo-type:
    section: global
    group: repo
    type: string-id
    default: posix
    allow-list:
      - azure
      - cifs
      - gcs
      - posix
      - s3
      - sftp: HAVE_LIBSSH2
    command:
      annotate:
        command-role:
          main: {}
          remote: {}
      archive-get:
        command-role:
          async: {}
          main: {}
          local: {}
          remote: {}
      archive-push:
        command-role:
          async: {}
          main: {}
          local: {}
          remote: {}
      backup:
        command-role:
          main: {}
          local: {}
      check:
        command-role:
          main: {}
          remote: {}
      expire:
        command-role:
          main: {}
      info:
        command-role:
          main: {}
          remote: {}
      manifest:
        command-role:
          main: {}
          remote: {}
      repo-create:
        command-role:
          main: {}
          remote: {}
      repo-get:
        command-role:
          main: {}
          remote: {}
      repo-ls:
        command-role:
          main: {}
          remote: {}
      repo-put:
        command-role:
          main: {}
          remote: {}
      repo-rm:
        command-role:
          main: {}
          remote: {}
      restore:
        command-role:
          main: {}
          local: {}
          remote: {}
      stanza-create:
        command-role:
          main: {}
          remote: {}
      stanza-delete:
        command-role:
          main: {}
          remote: {}
      stanza-upgrade:
        command-role:
          main: {}
          remote: {}
      start:
        command-role: {}
      stop:
        command-role: {}
      verify:
        command-role:
          main: {}
          local: {}
          remote: {}
    deprecate:
      repo-type: {}

  repo-azure-account:
    section: global
    type: string
    group: repo
    secure: true
    command: repo-type
    depend:
      option: repo-type
      list:
        - azure

  repo-azure-container:
    section: global
    type: string
    group: repo
    command: repo-type
    depend: repo-azure-account

  repo-azure-endpoint:
    inherit: repo-azure-account
    default: blob.core.windows.net

  repo-azure-key:
    inherit: repo-azure-account

  repo-azure-key-type:
    inherit: repo-azure-container
    type: string-id
    default: shared
    allow-list:
      - shared
      - sas

  repo-azure-uri-style:
    section: global
    group: repo
    type: string-id
    default: host
    allow-list:
      - host
      - path
    command: repo-type
    depend: repo-azure-account

  repo-bundle:
    section: global
    group: repo
    type: boolean
    default: false
    command:
      backup: {}
    command-role:
      main: {}

  repo-bundle-size:
    section: global
    group: repo
    type: size
    default: 20MiB
    allow-range: [1MiB, 1PiB]
    command:
      backup: {}
    command-role:
      main: {}
    depend:
      option: repo-bundle
      list:
        - true

  repo-bundle-limit:
    inherit: repo-bundle-size
    default: 2MiB
    allow-range: [8KiB, 1PiB]

  repo-block:
    section: global
    group: repo
    type: boolean
    default: false
    command:
      backup: {}
    command-role:
      main: {}
    depend:
      option: repo-bundle
      default: false
      list:
        - true

  repo-block-size-map:
    section: global
    group: repo
    type: hash
    required: false
    internal: true
    command: repo-block
    command-role:
      main: {}
    depend:
      option: repo-block
      list:
        - true

  repo-block-age-map:
    inherit: repo-block-size-map

  repo-block-checksum-size-map:
    inherit: repo-block-size-map

  repo-block-size-super:
    section: global
    group: repo
    type: size
    default: 256KiB
    allow-range: [32KiB, 16MiB]
    internal: true
    command: repo-block
    command-role:
      main: {}
    depend:
      option: repo-block
      list:
        - true

  repo-block-size-super-full:
    inherit: repo-block-size-super
    default: 1MiB

  repo-cipher-pass:
    section: global
    type: string
    secure: true
    command: repo-type
    depend:
      option: repo-cipher-type
      list:
        - aes-256-cbc
    group: repo
    deprecate:
      repo-cipher-pass: {}

  repo-cipher-type:
    section: global
    type: string-id
    group: repo
    default: none
    allow-list:
      - none
      - aes-256-cbc
    command: repo-type
    deprecate:
      repo-cipher-type: {}

  repo-gcs-bucket:
    section: global
    type: string
    group: repo
    command: repo-type
    depend:
      option: repo-gcs-key-type

  repo-gcs-endpoint:
    section: global
    type: string
    group: repo
    default: storage.googleapis.com
    command: repo-type
    depend: repo-gcs-bucket

  repo-gcs-key:
    section: global
    type: string
    group: repo
    secure: true
    command: repo-type
    depend:
      option: repo-gcs-key-type
      list:
        - service
        - token

  repo-gcs-key-type:
    section: global
    type: string-id
    group: repo
    default: service
    allow-list:
      - auto
      - service
      - token
    command: repo-type
    depend:
      option: repo-type
      list:
        - gcs

  repo-hardlink:
    section: global
    group: repo
    type: boolean
    default: false
    command:
      backup: {}
    command-role:
      main: {}
    depend:
      option: repo-bundle
      default: false
      list:
        - false
    deprecate:
      hardlink: {}

  repo-host-type:
    section: global
    group: repo
    type: string-id
    default: ssh
    allow-list:
      - ssh
      - tls
    command: repo-local
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: repo-local
      list:
        - false

  repo-host:
    section: global
    group: repo
    type: string
    required: false
    command: repo-local
    command-role:
      async: {}
      main: {}
      local: {}
    depend: repo-host-type
    deprecate:
      backup-host: {}

  repo-host-cert-file:
    section: global
    group: repo
    type: string
    command: repo-local
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: repo-host-type
      list:
        - tls

  repo-host-key-file:
    inherit: repo-host-cert-file

  repo-host-ca-file:
    inherit: repo-host-cert-file
    required: false

  repo-host-ca-path:
    inherit: repo-host-cert-file
    required: false

  repo-host-cmd:
    section: global
    group: repo
    type: string
    required: false
    command:
      annotate: {}
      archive-get: {}
      archive-push: {}
      check: {}
      info: {}
      manifest: {}
      repo-create: {}
      repo-get: {}
      repo-ls: {}
      repo-put: {}
      repo-rm: {}
      restore: {}
      stanza-create: {}
      stanza-delete: {}
      stanza-upgrade: {}
      verify: {}
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: repo-host
    deprecate:
      backup-cmd: {}

  repo-host-config:
    section: global
    group: repo
    type: string
    command: repo-host-cmd
    command-role:
      async: {}
      main: {}
      local: {}
    default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_FILE
    default-literal: true
    depend:
      option: repo-host
    deprecate:
      backup-config: {}

  repo-host-config-include-path:
    inherit: repo-host-config
    type: path
    default: CFGOPTDEF_CONFIG_PATH "/" PROJECT_CONFIG_INCLUDE_PATH
    default-literal: true

  repo-host-config-path:
    inherit: repo-host-config
    type: path
    default: CFGOPTDEF_CONFIG_PATH
    default-literal: true

  repo-host-port:
    section: global
    group: repo
    type: integer
    required: false
    allow-range: [0, 65535]
    command: repo-host-cmd
    command-role:
      async: {}
      main: {}
      local: {}
    depend:
      option: repo-host
    deprecate:
      backup-ssh-port: {}

  repo-host-user:
    section: global
    group: repo
    type: string
    required: false
    command: repo-host-cmd
    command-role:
      async: {}
      main: {}
      local: {}
    default: pgbackrest
    depend:
      option: repo-host
    deprecate:
      backup-user: {}

  repo-path:
    section: global
    group: repo
    type: path
    default: /var/lib/pgbackrest
    command: repo-type
    deprecate:
      repo-path: {}

  repo-retention-archive:
    section: global
    group: repo
    type: integer
    required: false
    allow-range: [1, 9999999]
    command:
      backup: {}
      expire: {}
    command-role:
      main: {}
    deprecate:
      retention-archive: {}

  repo-retention-archive-type:
    section: global
    type: string-id
    group: repo
    default: full
    allow-list:
      - full
      - diff
      - incr
    command:
      backup: {}
      expire: {}
    command-role:
      main: {}
    deprecate:
      retention-archive-type: {}

  repo-retention-diff:
    section: global
    group: repo
    type: integer
    required: false
    allow-range: [1, 9999999]
    command:
      backup: {}
      expire: {}
    command-role:
      main: {}
    deprecate:
      retention-diff: {}

  repo-retention-full-type:
    section: global
    group: repo
    type: string-id
    default: count
    allow-list:
      - count
      - time
    command:
      backup: {}
      expire: {}
    command-role:
      main: {}

  repo-retention-full:
    section: global
    group: repo
    type: integer
    required: false
    allow-range: [1, 9999999]
    command: repo-retention-full-type
    command-role:
      main: {}
    deprecate:
      retention-full: {}

  repo-retention-history:
    section: global
    group: repo
    type: integer
    required: false
    allow-range: [0, 9999999]
    command:
      backup: {}
      expire: {}
    command-role:
      main: {}

  repo-s3-bucket:
    section: global
    group: repo
    type: string
    command: repo-type
    depend:
      option: repo-type
      list:
        - s3
    deprecate:
      repo-s3-bucket: {}

  repo-s3-endpoint:
    inherit: repo-s3-bucket
    deprecate:
      repo-s3-endpoint: {}

  repo-s3-key:
    section: global
    group: repo
    type: string
    secure: true
    command: repo-type
    depend:
      option: repo-s3-key-type
      list:
        - shared
    deprecate:
      repo-s3-key: {}

  repo-s3-key-secret:
    inherit: repo-s3-key
    deprecate:
      repo-s3-key-secret: {}

  repo-s3-key-type:
    inherit: repo-s3-bucket
    type: string-id
    default: shared
    allow-list:
      - shared
      - auto
      - web-id

  repo-s3-kms-key-id:
    inherit: repo-s3-bucket
    required: false

  repo-s3-region:
    inherit: repo-s3-bucket
    deprecate:
      repo-s3-region: {}

  repo-s3-role:
    inherit: repo-s3-bucket
    required: false
    depend:
      option: repo-s3-key-type
      list:
        - auto

  repo-s3-token:
    inherit: repo-s3-key
    required: false
    command: repo-type

  repo-s3-uri-style:
    section: global
    group: repo
    type: string-id
    default: host
    allow-list:
      - host
      - path
    command: repo-type
    depend: repo-s3-bucket

  repo-sftp-host:
    section: global
    group: repo
    type: string
    command: repo-type
    depend:
      option: repo-type
      list:
        - sftp

  repo-sftp-host-fingerprint:
    section: global
    group: repo
    type: string
    required: false
    command: repo-type
    depend:
      option: repo-sftp-host-key-check-type
      list:
        - fingerprint
        - strict

  repo-sftp-host-key-check-type:
    section: global
    group: repo
    type: string-id
    default: strict
    allow-list:
      - accept-new
      - fingerprint
      - none
      - strict
    command: repo-type
    depend: repo-sftp-host

  repo-sftp-host-key-hash-type:
    section: global
    group: repo
    type: string-id
    allow-list:
      - md5
      - sha1
      - sha256
    command: repo-type
    depend: repo-sftp-host

  repo-sftp-host-port:
    section: global
    group: repo
    type: integer
    default: 22
    allow-range: [1, 65535]
    command: repo-type
    depend: repo-sftp-host

  repo-sftp-host-user:
    section: global
    group: repo
    type: string
    command: repo-type
    depend: repo-sftp-host

  repo-sftp-known-host:
    section: global
    group: repo
    type: list
    required: false
    command: repo-type
    depend:
      option: repo-sftp-host-key-check-type
      list:
        - accept-new
        - strict

  repo-sftp-private-key-file:
    section: global
    group: repo
    type: string
    command: repo-type
    depend: repo-sftp-host

  repo-sftp-private-key-passphrase:
    section: global
    group: repo
    type: string
    required: false
    secure: true
    command: repo-type
    depend: repo-sftp-host

  repo-sftp-public-key-file:
    section: global
    group: repo
    type: string
    required: false
    command: repo-type
    depend: repo-sftp-host

  repo-storage-verify-tls:
    section: global
    group: repo
    type: boolean
    default: true
    command: repo-type
    depend:
      option: repo-type
      list:
        - azure
        - gcs
        - s3
    deprecate:
      repo-s3-verify-ssl: {}
      repo?-azure-verify-tls: {}
      repo?-s3-verify-ssl: {}
      repo?-s3-verify-tls: {}

  repo-storage-ca-file:
    section: global
    group: repo
    type: string
    required: false
    command: repo-type
    depend: repo-storage-verify-tls
    deprecate:
      repo-s3-ca-file: {}
      repo?-azure-ca-file: {}
      repo?-s3-ca-file: {}

  repo-storage-ca-path:
    inherit: repo-storage-ca-file
    type: path
    deprecate:
      repo-s3-ca-path: {}
      repo?-azure-ca-path: {}
      repo?-s3-ca-path: {}

  repo-storage-host:
    section: global
    group: repo
    type: string
    required: false
    command: repo-type
    depend:
      option: repo-type
      list:
        - azure
        - s3
    deprecate:
      repo-s3-host: {}
      repo?-azure-host: {}
      repo?-s3-host: {}

  repo-storage-port:
    section: global
    group: repo
    type: integer
    default: 443
    allow-range: [1, 65535]
    command: repo-type
    depend: repo-storage-host
    deprecate:
      repo?-azure-port: {}
      repo?-s3-port: {}

  repo-storage-tag:
    section: global
    group: repo
    type: hash
    required: false
    command: repo-type
    depend:
      option: repo-type
      list:
        - azure
        - gcs
        - s3

  repo-storage-upload-chunk-size:
    section: global
    group: repo
    type: size
    required: false
    allow-range: [64KiB, 1TiB]
    command: repo-type
    depend:
      option: repo-type
      list:
        - azure
        - gcs
        - s3
