2015-09-08 07:31:24 -04:00
|
|
|
####################################################################################################################################
|
|
|
|
# DOC CONFIG MODULE
|
|
|
|
####################################################################################################################################
|
2020-03-10 15:41:56 -04:00
|
|
|
package pgBackRestDoc::Common::DocConfig;
|
2015-09-08 07:31:24 -04:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings FATAL => qw(all);
|
|
|
|
use Carp qw(confess);
|
|
|
|
|
|
|
|
use Exporter qw(import);
|
|
|
|
our @EXPORT = qw();
|
|
|
|
use File::Basename qw(dirname);
|
|
|
|
|
2020-03-10 15:41:56 -04:00
|
|
|
use pgBackRestDoc::Common::Log;
|
|
|
|
use pgBackRestDoc::Common::String;
|
2021-09-08 18:16:06 -04:00
|
|
|
use pgBackRestDoc::Custom::DocConfigData;
|
2020-03-10 17:57:02 -04:00
|
|
|
use pgBackRestDoc::ProjectInfo;
|
2020-03-10 15:12:44 -04:00
|
|
|
|
2015-10-28 10:10:36 +01:00
|
|
|
####################################################################################################################################
|
|
|
|
# Help types
|
|
|
|
####################################################################################################################################
|
2017-08-25 16:47:47 -04:00
|
|
|
use constant CONFIG_HELP_COMMAND => 'command';
|
|
|
|
push @EXPORT, qw(CONFIG_HELP_COMMAND);
|
|
|
|
use constant CONFIG_HELP_DESCRIPTION => 'description';
|
|
|
|
push @EXPORT, qw(CONFIG_HELP_DESCRIPTION);
|
2020-06-29 15:07:17 -04:00
|
|
|
use constant CONFIG_HELP_INTERNAL => 'internal';
|
2017-08-25 16:47:47 -04:00
|
|
|
use constant CONFIG_HELP_OPTION => 'option';
|
|
|
|
push @EXPORT, qw(CONFIG_HELP_OPTION);
|
|
|
|
use constant CONFIG_HELP_SECTION => 'section';
|
2018-01-23 13:34:24 -05:00
|
|
|
push @EXPORT, qw(CONFIG_HELP_SECTION);
|
2017-08-25 16:47:47 -04:00
|
|
|
use constant CONFIG_HELP_SUMMARY => 'summary';
|
2018-01-23 13:34:24 -05:00
|
|
|
push @EXPORT, qw(CONFIG_HELP_SUMMARY);
|
2017-08-25 16:47:47 -04:00
|
|
|
|
|
|
|
use constant CONFIG_HELP_SOURCE => 'source';
|
2018-01-23 13:34:24 -05:00
|
|
|
push @EXPORT, qw(CONFIG_HELP_SOURCE);
|
2017-08-25 16:47:47 -04:00
|
|
|
use constant CONFIG_HELP_SOURCE_DEFAULT => 'default';
|
|
|
|
use constant CONFIG_HELP_SOURCE_SECTION => CONFIG_HELP_SECTION;
|
|
|
|
use constant CONFIG_HELP_SOURCE_COMMAND => CONFIG_HELP_COMMAND;
|
2018-01-23 13:34:24 -05:00
|
|
|
push @EXPORT, qw(CONFIG_HELP_SOURCE_COMMAND);
|
2017-08-25 16:47:47 -04:00
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# Config Section Types
|
|
|
|
####################################################################################################################################
|
|
|
|
use constant CFGDEF_COMMAND => 'command';
|
|
|
|
use constant CFGDEF_GENERAL => 'general';
|
|
|
|
use constant CFGDEF_LOG => 'log';
|
|
|
|
use constant CFGDEF_REPOSITORY => 'repository';
|
2015-09-08 07:31:24 -04:00
|
|
|
|
2017-11-02 08:14:13 -04:00
|
|
|
####################################################################################################################################
|
|
|
|
# Option define hash
|
|
|
|
####################################################################################################################################
|
|
|
|
my $rhConfigDefine = cfgDefine();
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# Returns the option defines based on the command.
|
|
|
|
####################################################################################################################################
|
|
|
|
sub docConfigCommandDefine
|
|
|
|
{
|
|
|
|
my $strOption = shift;
|
|
|
|
my $strCommand = shift;
|
|
|
|
|
|
|
|
if (defined($strCommand))
|
|
|
|
{
|
|
|
|
return defined($rhConfigDefine->{$strOption}{&CFGDEF_COMMAND}) &&
|
|
|
|
defined($rhConfigDefine->{$strOption}{&CFGDEF_COMMAND}{$strCommand}) &&
|
|
|
|
ref($rhConfigDefine->{$strOption}{&CFGDEF_COMMAND}{$strCommand}) eq 'HASH' ?
|
|
|
|
$rhConfigDefine->{$strOption}{&CFGDEF_COMMAND}{$strCommand} : undef;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# Does the option have a default for this command?
|
|
|
|
####################################################################################################################################
|
|
|
|
sub docConfigOptionDefault
|
|
|
|
{
|
|
|
|
my $strOption = shift;
|
|
|
|
my $strCommand = shift;
|
|
|
|
|
|
|
|
# Get the command define
|
|
|
|
my $oCommandDefine = docConfigCommandDefine($strOption, $strCommand);
|
|
|
|
|
|
|
|
# Check for default in command
|
|
|
|
my $strDefault = defined($oCommandDefine) ? $$oCommandDefine{&CFGDEF_DEFAULT} : undef;
|
|
|
|
|
|
|
|
# If defined return, else try to grab the global default
|
|
|
|
return defined($strDefault) ? $strDefault : $rhConfigDefine->{$strOption}{&CFGDEF_DEFAULT};
|
|
|
|
}
|
|
|
|
|
|
|
|
push @EXPORT, qw(docConfigOptionDefault);
|
|
|
|
|
2015-09-08 07:31:24 -04:00
|
|
|
####################################################################################################################################
|
|
|
|
# CONSTRUCTOR
|
|
|
|
####################################################################################################################################
|
|
|
|
sub new
|
|
|
|
{
|
|
|
|
my $class = shift; # Class name
|
|
|
|
|
|
|
|
# Create the class hash
|
|
|
|
my $self = {};
|
|
|
|
bless $self, $class;
|
|
|
|
|
|
|
|
# Assign function parameters, defaults, and log debug info
|
|
|
|
(
|
|
|
|
my $strOperation,
|
|
|
|
$self->{oDoc},
|
|
|
|
$self->{oDocRender}
|
|
|
|
) =
|
|
|
|
logDebugParam
|
|
|
|
(
|
2016-05-26 09:09:42 -04:00
|
|
|
__PACKAGE__ . '->new', \@_,
|
2015-09-08 07:31:24 -04:00
|
|
|
{name => 'oDoc'},
|
2017-08-25 16:47:47 -04:00
|
|
|
{name => 'oDocRender', required => false}
|
2015-09-08 07:31:24 -04:00
|
|
|
);
|
|
|
|
|
|
|
|
$self->process();
|
|
|
|
|
|
|
|
# Return from function and log return values if any
|
|
|
|
return logDebugReturn
|
|
|
|
(
|
|
|
|
$strOperation,
|
|
|
|
{name => 'self', value => $self}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# process
|
|
|
|
#
|
|
|
|
# Parse the xml doc into commands and options.
|
|
|
|
####################################################################################################################################
|
|
|
|
sub process
|
|
|
|
{
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
# Assign function parameters, defaults, and log debug info
|
2016-05-26 09:09:42 -04:00
|
|
|
my $strOperation = logDebugParam(__PACKAGE__ . '->process');
|
2015-09-08 07:31:24 -04:00
|
|
|
|
|
|
|
# Iterate through all commands
|
|
|
|
my $oDoc = $self->{oDoc};
|
|
|
|
my $oConfigHash = {};
|
|
|
|
|
2017-11-02 08:14:13 -04:00
|
|
|
foreach my $strCommand (cfgDefineCommandList())
|
2015-09-08 07:31:24 -04:00
|
|
|
{
|
|
|
|
my $oCommandDoc = $oDoc->nodeGet('operation')->nodeGet('command-list')->nodeGetById('command', $strCommand);
|
|
|
|
|
|
|
|
$$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand} = {};
|
|
|
|
my $oCommand = $$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand};
|
|
|
|
|
|
|
|
$$oCommand{&CONFIG_HELP_SUMMARY} = $oCommandDoc->nodeGet('summary')->textGet();
|
|
|
|
$$oCommand{&CONFIG_HELP_DESCRIPTION} = $oCommandDoc->textGet();
|
2020-06-29 15:07:17 -04:00
|
|
|
$oCommand->{&CONFIG_HELP_INTERNAL} = cfgDefineCommand()->{$strCommand}{&CFGDEF_INTERNAL};
|
2015-09-08 07:31:24 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
# Iterate through all options
|
2017-11-02 08:14:13 -04:00
|
|
|
my $oOptionDefine = cfgDefine();
|
2015-09-08 07:31:24 -04:00
|
|
|
|
2017-11-02 08:14:13 -04:00
|
|
|
foreach my $strOption (sort(keys(%{$oOptionDefine})))
|
2015-09-08 07:31:24 -04:00
|
|
|
{
|
|
|
|
# Iterate through all commands
|
2017-11-02 08:14:13 -04:00
|
|
|
my @stryCommandList = sort(keys(%{defined($$oOptionDefine{$strOption}{&CFGDEF_COMMAND}) ?
|
|
|
|
$$oOptionDefine{$strOption}{&CFGDEF_COMMAND} : $$oConfigHash{&CONFIG_HELP_COMMAND}}));
|
2015-09-08 07:31:24 -04:00
|
|
|
|
|
|
|
foreach my $strCommand (@stryCommandList)
|
|
|
|
{
|
|
|
|
if (!defined($$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand}))
|
|
|
|
{
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
|
2021-03-05 12:57:07 -05:00
|
|
|
# Skip the option if it is not valid for this command and the default role. Only options valid for the default role are
|
|
|
|
# show in help because that is the only role available to a user.
|
2021-05-20 14:39:47 -04:00
|
|
|
if (!defined($oOptionDefine->{$strOption}{&CFGDEF_COMMAND}{$strCommand}{&CFGDEF_COMMAND_ROLE}{&CFGCMD_ROLE_MAIN}))
|
2015-09-09 15:40:54 -04:00
|
|
|
{
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
|
2015-09-08 07:31:24 -04:00
|
|
|
my $oCommandDoc = $oDoc->nodeGet('operation')->nodeGet('command-list')->nodeGetById('command', $strCommand);
|
|
|
|
|
|
|
|
# First check if the option is documented in the command
|
|
|
|
my $oOptionDoc;
|
|
|
|
my $strOptionSource;
|
|
|
|
my $oCommandOptionList = $oCommandDoc->nodeGet('option-list', false);
|
|
|
|
|
|
|
|
if (defined($oCommandOptionList))
|
|
|
|
{
|
|
|
|
$oOptionDoc = $oCommandOptionList->nodeGetById('option', $strOption, false);
|
|
|
|
|
|
|
|
$strOptionSource = CONFIG_HELP_SOURCE_COMMAND if (defined($oOptionDoc));
|
|
|
|
}
|
|
|
|
|
|
|
|
# If the option wasn't found keep looking
|
|
|
|
my $strSection;
|
|
|
|
|
|
|
|
if (!defined($oOptionDoc))
|
|
|
|
{
|
|
|
|
# Next see if it's documented in the section
|
2017-11-02 08:14:13 -04:00
|
|
|
if (defined($$oOptionDefine{$strOption}{&CFGDEF_SECTION}))
|
2015-09-08 07:31:24 -04:00
|
|
|
{
|
2016-04-14 09:30:54 -04:00
|
|
|
# &log(INFO, " trying section ${strSection}");
|
|
|
|
foreach my $oSectionNode ($oDoc->nodeGet('config')->nodeGet('config-section-list')->nodeList())
|
2015-09-08 07:31:24 -04:00
|
|
|
{
|
2016-04-14 09:30:54 -04:00
|
|
|
my $oOptionDocCheck = $oSectionNode->nodeGetById('config-key-list')
|
|
|
|
->nodeGetById('config-key', $strOption, false);
|
|
|
|
|
|
|
|
if ($oOptionDocCheck)
|
2015-09-08 07:31:24 -04:00
|
|
|
{
|
2016-04-14 09:30:54 -04:00
|
|
|
if (defined($oOptionDoc))
|
|
|
|
{
|
|
|
|
confess 'option exists in more than one section';
|
|
|
|
}
|
|
|
|
|
|
|
|
$oOptionDoc = $oOptionDocCheck;
|
|
|
|
$strOptionSource = CONFIG_HELP_SOURCE_SECTION;
|
|
|
|
$strSection = $oSectionNode->paramGet('id');
|
2015-09-08 07:31:24 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
# If no section is defined then look in the default command option list
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$oOptionDoc = $oDoc->nodeGet('operation')->nodeGet('operation-general')->nodeGet('option-list')
|
|
|
|
->nodeGetById('option', $strOption, false);
|
2021-03-05 12:57:07 -05:00
|
|
|
$strOptionSource = CONFIG_HELP_SOURCE_DEFAULT if (defined($oOptionDoc));
|
2015-09-08 07:31:24 -04:00
|
|
|
|
2021-03-05 12:57:07 -05:00
|
|
|
# If a section is specified then use it, otherwise the option should be general since it is not for a specific
|
|
|
|
# command
|
2021-04-23 11:46:03 -04:00
|
|
|
if (defined($oOptionDoc))
|
2021-03-05 12:57:07 -05:00
|
|
|
{
|
2021-04-23 11:46:03 -04:00
|
|
|
$strSection = $oOptionDoc->paramGet('section', false);
|
|
|
|
|
|
|
|
if (!defined($strSection))
|
|
|
|
{
|
|
|
|
$strSection = "general";
|
|
|
|
}
|
2021-03-05 12:57:07 -05:00
|
|
|
}
|
2015-09-08 07:31:24 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# If the option wasn't found then error
|
|
|
|
if (!defined($oOptionDoc))
|
|
|
|
{
|
|
|
|
confess &log(ERROR, "unable to find option '${strOption}' for command '${strCommand}'")
|
|
|
|
}
|
|
|
|
|
2016-04-14 09:30:54 -04:00
|
|
|
# if the option is documented in the command then it should be accessible from the command line only.
|
|
|
|
if (!defined($strSection))
|
|
|
|
{
|
2017-11-02 08:14:13 -04:00
|
|
|
if (defined($$oOptionDefine{$strOption}{&CFGDEF_SECTION}))
|
2016-04-14 09:30:54 -04:00
|
|
|
{
|
2017-08-25 16:47:47 -04:00
|
|
|
&log(ERROR,
|
2017-11-02 08:14:13 -04:00
|
|
|
"option ${strOption} defined in command ${strCommand} must not have " . CFGDEF_SECTION .
|
2017-08-25 16:47:47 -04:00
|
|
|
" defined");
|
2016-04-14 09:30:54 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-08 07:31:24 -04:00
|
|
|
# Store the option in the command
|
2017-08-25 16:47:47 -04:00
|
|
|
$$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_OPTION}{$strOption}{&CONFIG_HELP_SOURCE} =
|
|
|
|
$strOptionSource;
|
2015-09-08 07:31:24 -04:00
|
|
|
|
|
|
|
my $oCommandOption = $$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_OPTION}{$strOption};
|
|
|
|
|
|
|
|
$$oCommandOption{&CONFIG_HELP_SUMMARY} = $oOptionDoc->nodeGet('summary')->textGet();
|
|
|
|
$$oCommandOption{&CONFIG_HELP_DESCRIPTION} = $oOptionDoc->textGet();
|
2021-04-23 11:46:03 -04:00
|
|
|
$oCommandOption->{&CONFIG_HELP_INTERNAL} =
|
|
|
|
cfgDefineCommand()->{$strCommand}{&CFGDEF_INTERNAL} ? true : $oOptionDefine->{$strOption}{&CFGDEF_INTERNAL};
|
2015-10-28 10:10:36 +01:00
|
|
|
|
2022-05-31 12:36:21 -04:00
|
|
|
# If internal is defined for the option/command it overrides everthing else
|
|
|
|
if (defined($oOptionDefine->{$strOption}{&CFGDEF_COMMAND}{$strCommand}{&CFGDEF_INTERNAL}))
|
|
|
|
{
|
|
|
|
$oCommandOption->{&CONFIG_HELP_INTERNAL} =
|
|
|
|
$oOptionDefine->{$strOption}{&CFGDEF_COMMAND}{$strCommand}{&CFGDEF_INTERNAL};
|
|
|
|
}
|
|
|
|
|
2015-09-08 07:31:24 -04:00
|
|
|
# If the option did not come from the command also store in global option list. This prevents duplication of commonly
|
|
|
|
# used options.
|
|
|
|
if ($strOptionSource ne CONFIG_HELP_SOURCE_COMMAND)
|
|
|
|
{
|
|
|
|
$$oConfigHash{&CONFIG_HELP_OPTION}{$strOption}{&CONFIG_HELP_SUMMARY} = $$oCommandOption{&CONFIG_HELP_SUMMARY};
|
|
|
|
|
|
|
|
my $oOption = $$oConfigHash{&CONFIG_HELP_OPTION}{$strOption};
|
|
|
|
|
|
|
|
if (defined($strSection))
|
|
|
|
{
|
|
|
|
$$oOption{&CONFIG_HELP_SECTION} = $strSection;
|
|
|
|
}
|
|
|
|
|
|
|
|
$$oOption{&CONFIG_HELP_DESCRIPTION} = $$oCommandOption{&CONFIG_HELP_DESCRIPTION};
|
2021-04-23 11:46:03 -04:00
|
|
|
$oOption->{&CONFIG_HELP_INTERNAL} = $oOptionDefine->{$strOption}{&CFGDEF_INTERNAL};
|
2015-09-08 07:31:24 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Store the config hash
|
|
|
|
$self->{oConfigHash} = $oConfigHash;
|
|
|
|
|
|
|
|
# Return from function and log return values if any
|
|
|
|
logDebugReturn($strOperation);
|
|
|
|
}
|
|
|
|
|
2015-10-28 10:10:36 +01:00
|
|
|
####################################################################################################################################
|
2016-06-02 09:25:12 -04:00
|
|
|
# manGet
|
|
|
|
#
|
|
|
|
# Generate the man page.
|
|
|
|
####################################################################################################################################
|
|
|
|
sub manGet
|
|
|
|
{
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
# Assign function parameters, defaults, and log debug info
|
|
|
|
my
|
|
|
|
(
|
|
|
|
$strOperation,
|
|
|
|
$oManifest
|
|
|
|
) =
|
|
|
|
logDebugParam
|
|
|
|
(
|
|
|
|
__PACKAGE__ . '->manGet', \@_,
|
|
|
|
{name => 'oManifest'}
|
|
|
|
);
|
|
|
|
|
|
|
|
# Get index.xml to pull various text from
|
|
|
|
my $oIndexDoc = ${$oManifest->sourceGet('index')}{doc};
|
|
|
|
|
|
|
|
# Write the header
|
|
|
|
my $strManPage =
|
|
|
|
"NAME\n" .
|
2018-11-24 19:05:03 -05:00
|
|
|
' ' . PROJECT_NAME . ' - ' . $oManifest->variableReplace($oIndexDoc->paramGet('subtitle')) . "\n\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"SYNOPSIS\n" .
|
2018-11-24 19:05:03 -05:00
|
|
|
' ' . PROJECT_EXE . ' [options] [command]';
|
2016-06-02 09:25:12 -04:00
|
|
|
|
|
|
|
# Output the description (first two paragraphs of index.xml introduction)
|
|
|
|
my $iParaTotal = 0;
|
|
|
|
|
|
|
|
$strManPage .= "\n\n" .
|
|
|
|
"DESCRIPTION";
|
|
|
|
|
|
|
|
foreach my $oPara ($oIndexDoc->nodeGetById('section', 'introduction')->nodeList('p'))
|
|
|
|
{
|
|
|
|
$strManPage .= ($iParaTotal == 0 ? "\n" : "\n\n") . ' ' .
|
|
|
|
manGetFormatText($oManifest->variableReplace($self->{oDocRender}->processText($oPara->textGet())), 80, 2);
|
|
|
|
|
2018-09-19 18:26:12 -04:00
|
|
|
last;
|
2016-06-02 09:25:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
# Build command and config hashes
|
2017-11-02 08:14:13 -04:00
|
|
|
my $hConfigDefine = cfgDefine();
|
2016-06-02 09:25:12 -04:00
|
|
|
my $hConfig = $self->{oConfigHash};
|
|
|
|
my $hCommandList = {};
|
|
|
|
my $iCommandMaxLen = 0;
|
|
|
|
my $hOptionList = {};
|
|
|
|
my $iOptionMaxLen = 0;
|
|
|
|
|
|
|
|
foreach my $strCommand (sort(keys(%{$$hConfig{&CONFIG_HELP_COMMAND}})))
|
|
|
|
{
|
2020-06-29 15:07:17 -04:00
|
|
|
# Skip internal commands
|
|
|
|
next if $hConfig->{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_INTERNAL};
|
|
|
|
|
2016-06-02 09:25:12 -04:00
|
|
|
my $hCommand = $$hConfig{&CONFIG_HELP_COMMAND}{$strCommand};
|
|
|
|
$iCommandMaxLen = length($strCommand) > $iCommandMaxLen ? length($strCommand) : $iCommandMaxLen;
|
|
|
|
|
|
|
|
$$hCommandList{$strCommand}{summary} = $$hCommand{&CONFIG_HELP_SUMMARY};
|
|
|
|
|
|
|
|
if (defined($$hCommand{&CONFIG_HELP_OPTION}))
|
|
|
|
{
|
|
|
|
foreach my $strOption (sort(keys(%{$$hCommand{&CONFIG_HELP_OPTION}})))
|
|
|
|
{
|
|
|
|
my $hOption = $$hCommand{&CONFIG_HELP_OPTION}{$strOption};
|
|
|
|
|
|
|
|
if ($$hOption{&CONFIG_HELP_SOURCE} eq CONFIG_HELP_SOURCE_COMMAND)
|
|
|
|
{
|
2022-05-31 12:36:21 -04:00
|
|
|
# Skip internal options
|
|
|
|
next if $hOption->{&CONFIG_HELP_INTERNAL};
|
|
|
|
|
2016-06-02 09:25:12 -04:00
|
|
|
$iOptionMaxLen = length($strOption) > $iOptionMaxLen ? length($strOption) : $iOptionMaxLen;
|
|
|
|
|
|
|
|
$$hOptionList{$strCommand}{$strOption}{&CONFIG_HELP_SUMMARY} = $$hOption{&CONFIG_HELP_SUMMARY};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $strOption (sort(keys(%{$$hConfig{&CONFIG_HELP_OPTION}})))
|
|
|
|
{
|
2021-04-23 11:46:03 -04:00
|
|
|
# Skip internal options
|
|
|
|
next if $hConfig->{&CONFIG_HELP_OPTION}{$strOption}{&CONFIG_HELP_INTERNAL};
|
|
|
|
|
2016-06-02 09:25:12 -04:00
|
|
|
my $hOption = $$hConfig{&CONFIG_HELP_OPTION}{$strOption};
|
|
|
|
$iOptionMaxLen = length($strOption) > $iOptionMaxLen ? length($strOption) : $iOptionMaxLen;
|
2017-08-25 16:47:47 -04:00
|
|
|
my $strSection = defined($$hOption{&CONFIG_HELP_SECTION}) ? $$hOption{&CONFIG_HELP_SECTION} : CFGDEF_GENERAL;
|
2016-06-02 09:25:12 -04:00
|
|
|
|
|
|
|
$$hOptionList{$strSection}{$strOption}{&CONFIG_HELP_SUMMARY} = $$hOption{&CONFIG_HELP_SUMMARY};
|
|
|
|
}
|
|
|
|
|
|
|
|
# Output Commands
|
|
|
|
$strManPage .= "\n\n" .
|
|
|
|
'COMMANDS';
|
|
|
|
|
|
|
|
foreach my $strCommand (sort(keys(%{$hCommandList})))
|
|
|
|
{
|
|
|
|
# Construct the summary
|
|
|
|
my $strSummary = $oManifest->variableReplace($self->{oDocRender}->processText($$hCommandList{$strCommand}{summary}));
|
|
|
|
# $strSummary = lcfirst(substr($strSummary, 0, length($strSummary) - 1));
|
|
|
|
|
|
|
|
# Output the summary
|
|
|
|
$strManPage .=
|
|
|
|
"\n " . "${strCommand}" . (' ' x ($iCommandMaxLen - length($strCommand))) . ' ' .
|
|
|
|
manGetFormatText($strSummary, 80, $iCommandMaxLen + 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
# Output options
|
|
|
|
my $bFirst = true;
|
|
|
|
$strManPage .= "\n\n" .
|
|
|
|
'OPTIONS';
|
|
|
|
|
|
|
|
foreach my $strSection (sort(keys(%{$hOptionList})))
|
|
|
|
{
|
|
|
|
$strManPage .= ($bFirst ?'' : "\n") . "\n " . ucfirst($strSection) . ' Options:';
|
|
|
|
|
|
|
|
foreach my $strOption (sort(keys(%{$$hOptionList{$strSection}})))
|
|
|
|
{
|
|
|
|
my $hOption = $$hOptionList{$strSection}{$strOption};
|
|
|
|
|
2019-08-26 12:05:36 -04:00
|
|
|
# Construct the default
|
2017-11-02 08:14:13 -04:00
|
|
|
my $strCommand = grep(/$strSection/i, cfgDefineCommandList()) ? $strSection : undef;
|
|
|
|
my $strDefault = docConfigOptionDefault($strOption, $strCommand);
|
2016-06-02 09:25:12 -04:00
|
|
|
|
|
|
|
if (defined($strDefault))
|
|
|
|
{
|
2018-02-03 18:27:38 -05:00
|
|
|
if ($strOption eq CFGOPT_REPO_HOST_CMD || $strOption eq CFGOPT_PG_HOST_CMD)
|
2016-08-29 09:43:22 -04:00
|
|
|
{
|
2018-11-24 19:05:03 -05:00
|
|
|
$strDefault = PROJECT_EXE;
|
2016-08-29 09:43:22 -04:00
|
|
|
}
|
2017-11-02 08:14:13 -04:00
|
|
|
elsif ($$hConfigDefine{$strOption}{&CFGDEF_TYPE} eq &CFGDEF_TYPE_BOOLEAN)
|
2016-06-02 09:25:12 -04:00
|
|
|
{
|
|
|
|
$strDefault = $strDefault ? 'y' : 'n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#
|
|
|
|
# use Data::Dumper; confess Dumper($$hOption{&CONFIG_HELP_SUMMARY});
|
|
|
|
|
|
|
|
# Construct the summary
|
|
|
|
my $strSummary = $oManifest->variableReplace($self->{oDocRender}->processText($$hOption{&CONFIG_HELP_SUMMARY}));
|
|
|
|
|
|
|
|
$strSummary = $strSummary . (defined($strDefault) ? " [default=${strDefault}]" : '');
|
|
|
|
|
|
|
|
# Output the summary
|
|
|
|
$strManPage .=
|
|
|
|
"\n " . "--${strOption}" . (' ' x ($iOptionMaxLen - length($strOption))) . ' ' .
|
|
|
|
manGetFormatText($strSummary, 80, $iOptionMaxLen + 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
$bFirst = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Write files, examples, and references
|
|
|
|
$strManPage .= "\n\n" .
|
|
|
|
"FILES\n" .
|
|
|
|
"\n" .
|
2017-11-02 08:14:13 -04:00
|
|
|
' ' . docConfigOptionDefault(CFGOPT_CONFIG) . "\n" .
|
|
|
|
' ' . docConfigOptionDefault(CFGOPT_REPO_PATH) . "\n" .
|
|
|
|
' ' . docConfigOptionDefault(CFGOPT_LOG_PATH) . "\n" .
|
|
|
|
' ' . docConfigOptionDefault(CFGOPT_SPOOL_PATH) . "\n" .
|
|
|
|
' ' . docConfigOptionDefault(CFGOPT_LOCK_PATH) . "\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"\n" .
|
|
|
|
"EXAMPLES\n" .
|
|
|
|
"\n" .
|
|
|
|
" * Create a backup of the PostgreSQL `main` cluster:\n" .
|
|
|
|
"\n" .
|
2018-11-24 19:05:03 -05:00
|
|
|
' $ ' . PROJECT_EXE . ' --' . CFGOPT_STANZA . "=main backup\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"\n" .
|
2017-11-02 08:14:13 -04:00
|
|
|
' The `main` cluster should be configured in `' . docConfigOptionDefault(CFGOPT_CONFIG) . "`\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"\n" .
|
|
|
|
" * Show all available backups:\n" .
|
|
|
|
"\n" .
|
2018-11-24 19:05:03 -05:00
|
|
|
' $ ' . PROJECT_EXE . ' ' . CFGCMD_INFO . "\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"\n" .
|
|
|
|
" * Show all available backups for a specific cluster:\n" .
|
|
|
|
"\n" .
|
2018-11-24 19:05:03 -05:00
|
|
|
' $ ' . PROJECT_EXE . ' --' . CFGOPT_STANZA . '=main ' . CFGCMD_INFO . "\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"\n" .
|
|
|
|
" * Show backup specific options:\n" .
|
|
|
|
"\n" .
|
2018-11-24 19:05:03 -05:00
|
|
|
' $ ' . PROJECT_EXE . ' ' . CFGCMD_HELP . ' ' . CFGCMD_BACKUP . "\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
"\n" .
|
|
|
|
"SEE ALSO\n" .
|
|
|
|
"\n" .
|
2019-12-19 16:25:46 -05:00
|
|
|
' /usr/share/doc/' . PROJECT_EXE . "-doc/html/index.html\n" .
|
2016-06-02 09:25:12 -04:00
|
|
|
' ' . $oManifest->variableReplace('{[backrest-url-base]}') . "\n";
|
|
|
|
|
|
|
|
return $strManPage;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Helper function for manGet() used to format text by indenting and splitting
|
|
|
|
sub manGetFormatText
|
|
|
|
{
|
|
|
|
my $strLine = shift;
|
|
|
|
my $iLength = shift;
|
|
|
|
my $iIndentRest = shift;
|
|
|
|
|
|
|
|
my $strPart;
|
|
|
|
my $strResult;
|
|
|
|
my $bFirst = true;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
my $iIndent = $bFirst ? 0 : $iIndentRest;
|
|
|
|
|
|
|
|
($strPart, $strLine) = stringSplit($strLine, ' ', $iLength - $iIndentRest);
|
|
|
|
|
|
|
|
$strResult .= ($bFirst ? '' : "\n") . (' ' x $iIndent) . trim($strPart);
|
|
|
|
|
|
|
|
$bFirst = false;
|
|
|
|
}
|
|
|
|
while (defined($strLine));
|
|
|
|
|
|
|
|
return $strResult;
|
|
|
|
}
|
|
|
|
|
2015-09-08 07:31:24 -04:00
|
|
|
1;
|