1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-14 10:13:05 +02:00

Add command and exit modules.

This commit is contained in:
David Steele 2018-01-17 09:15:51 -05:00
parent 39cb971afb
commit 7c73f4f6c9
10 changed files with 265 additions and 4 deletions

View File

@ -62,7 +62,7 @@
</release-item>
<release-item>
<p>Add <code>log</code> and <code>time</code> modules.</p>
<p>Add <code>command</code>, <code>exit</code>, <code>log</code>, and <code>time</code> modules.</p>
</release-item>
<release-item>

View File

@ -3,8 +3,10 @@ CFLAGS=-I. -Wfatal-errors -Wall -Wextra -Wwrite-strings -Wno-clobbered -std=c99
DESTDIR=
pgbackrest: \
command/command.o \
common/error.o \
common/errorType.o \
common/exit.o \
common/ini.o \
common/log.o \
common/memContext.o \
@ -27,8 +29,10 @@ pgbackrest: \
storage/storage.o \
main.o
$(CC) $(CFLAGS) -o pgbackrest \
command/command.o \
common/error.o \
common/errorType.o \
common/exit.o \
common/ini.o \
common/log.o \
common/memContext.o \

83
src/command/command.c Normal file
View File

@ -0,0 +1,83 @@
/***********************************************************************************************************************************
Common Command Routines
***********************************************************************************************************************************/
#include <string.h>
#include "common/log.h"
#include "common/memContext.h"
#include "config/config.h"
#include "version.h"
/***********************************************************************************************************************************
Begin the command
***********************************************************************************************************************************/
void cmdBegin()
{
MEM_CONTEXT_TEMP_BEGIN()
{
// Basic info on command start
String *info = strNewFmt("%s command begin %s:", cfgCommandName(cfgCommand()), PGBACKREST_VERSION);
// Loop though options and add the ones that are interesting
for (ConfigOption optionId = 0; optionId < CFG_OPTION_TOTAL; optionId++)
{
const Variant *option = cfgOption(optionId);
// Skip the option if it is not valid, or default, or not set
if (!cfgOptionValid(optionId) ||
cfgOptionSource(optionId) == cfgSourceDefault ||
(option == NULL && !cfgOptionNegate(optionId)))
{
continue;
}
// If option was negated
if (cfgOptionNegate(optionId))
strCatFmt(info, " --no-%s", cfgOptionName(optionId));
// Else not negated
else
{
ConfigDefineOption optionDefId = cfgOptionDefIdFromId(optionId);
strCatFmt(info, " --%s", cfgOptionName(optionId));
if (cfgDefOptionType(optionDefId) != cfgDefOptTypeBoolean)
{
if (cfgDefOptionSecure(optionDefId))
strCat(info, "=<redacted>");
else
{
const String *optionStr = varStrForce(option);
if (strchr(strPtr(optionStr), ' ') != NULL)
optionStr = strNewFmt("\"%s\"", strPtr(optionStr));
strCatFmt(info, "=%s", strPtr(optionStr));
}
}
}
}
LOG_INFO(strPtr(info));
}
MEM_CONTEXT_TEMP_END();
}
/***********************************************************************************************************************************
End the command
***********************************************************************************************************************************/
void cmdEnd(int code)
{
MEM_CONTEXT_TEMP_BEGIN()
{
// Basic info on command end
String *info = strNewFmt("%s command end: ", cfgCommandName(cfgCommand()));
if (code == 0)
strCat(info, "completed successfully");
else
strCatFmt(info, "aborted with exception [%03d]", code);
LOG_INFO(strPtr(info));
}
MEM_CONTEXT_TEMP_END();
}

13
src/command/command.h Normal file
View File

@ -0,0 +1,13 @@
/***********************************************************************************************************************************
Common Command Routines
***********************************************************************************************************************************/
#ifndef COMMAND_H
#define COMMAND_H
/***********************************************************************************************************************************
Functions
***********************************************************************************************************************************/
void cmdBegin();
void cmdEnd(int code);
#endif

28
src/common/exit.c Normal file
View File

@ -0,0 +1,28 @@
/***********************************************************************************************************************************
Exit Routines
***********************************************************************************************************************************/
#include "command/command.h"
#include "common/exit.h"
#include "common/log.h"
/***********************************************************************************************************************************
Do cleanup and return result code
***********************************************************************************************************************************/
int
exitSafe(bool error)
{
int result = 0;
// Report error if one was thrown
if (error)
{
LOG_ERROR(errorCode(), errorMessage());
result = errorCode();
}
// Log command end
cmdEnd(result);
// Return result - caller should immediate pass this result to exit()
return result;
}

14
src/common/exit.h Normal file
View File

@ -0,0 +1,14 @@
/***********************************************************************************************************************************
Exit Routines
***********************************************************************************************************************************/
#ifndef COMMON_EXIT_H
#define COMMON_EXIT_H
#include "common/error.h"
/***********************************************************************************************************************************
Functions
***********************************************************************************************************************************/
int exitSafe(bool error);
#endif

View File

@ -5,7 +5,7 @@ Main
#include <stdlib.h>
#include "common/error.h"
#include "common/log.h"
#include "common/exit.h"
#include "config/config.h"
#include "config/load.h"
#include "perl/exec.h"
@ -29,12 +29,14 @@ int main(int argListSize, const char *argList[])
}
// Execute Perl for commands not implemented in C
// -------------------------------------------------------------------------------------------------------------------------
perlExec(perlCommand());
}
CATCH_ANY()
{
LOG_ERROR(errorCode(), errorMessage());
exit(errorCode());
exit(exitSafe(true));
}
TRY_END();
exit(exitSafe(false));
}

View File

@ -152,6 +152,16 @@ my $oTestDef =
'common/log' => TESTDEF_COVERAGE_FULL,
},
},
{
&TESTDEF_NAME => 'exit',
&TESTDEF_TOTAL => 1,
&TESTDEF_C => true,
&TESTDEF_COVERAGE =>
{
'common/exit' => TESTDEF_COVERAGE_FULL,
},
},
{
&TESTDEF_NAME => 'wait',
&TESTDEF_TOTAL => 1,
@ -633,6 +643,25 @@ my $oTestDef =
},
]
},
# Command tests
{
&TESTDEF_NAME => 'command',
&TESTDEF_CONTAINER => true,
&TESTDEF_TEST =>
[
{
&TESTDEF_NAME => 'command',
&TESTDEF_TOTAL => 1,
&TESTDEF_C => true,
&TESTDEF_COVERAGE =>
{
'command/command' => TESTDEF_COVERAGE_FULL,
},
},
]
},
# Archive tests
{
&TESTDEF_NAME => 'archive',

View File

@ -0,0 +1,54 @@
/***********************************************************************************************************************************
Test Common Command Routines
***********************************************************************************************************************************/
#include <fcntl.h>
#include <unistd.h>
#include "storage/storage.h"
#include "version.h"
/***********************************************************************************************************************************
Test Run
***********************************************************************************************************************************/
void testRun()
{
// *****************************************************************************************************************************
if (testBegin("cmdBegin() and cmdEnd()"))
{
// -------------------------------------------------------------------------------------------------------------------------
cfgInit();
cfgCommandSet(cfgCmdArchiveGet);
cfgOptionValidSet(cfgOptCompress, true);
cfgOptionSet(cfgOptCompress, cfgSourceParam, varNewBool(true));
cfgOptionValidSet(cfgOptConfig, true);
cfgOptionNegateSet(cfgOptConfig, true);
cfgOptionSet(cfgOptConfig, cfgSourceParam, NULL);
cfgOptionValidSet(cfgOptDbHost, true);
cfgOptionSet(cfgOptDbHost, cfgSourceConfig, NULL);
cfgOptionValidSet(cfgOptBackupHost, true);
cfgOptionSet(cfgOptBackupHost, cfgSourceConfig, varNewStr(strNew("backup1")));
cfgOptionValidSet(cfgOptRepoPath, true);
cfgOptionSet(cfgOptRepoPath, cfgSourceConfig, varNewStr(strNew("/path/to the/repo")));
cfgOptionValidSet(cfgOptRepoS3Key, true);
cfgOptionSet(cfgOptRepoS3Key, cfgSourceConfig, varNewStr(strNew("SECRET-STUFF")));
cmdBegin();
testLogResult(
"P00 INFO: archive-get command begin " PGBACKREST_VERSION ": --backup-host=backup1 --compress --no-config "
"--repo-path=\"/path/to the/repo\" --repo-s3-key=<redacted>");
// -------------------------------------------------------------------------------------------------------------------------
cmdEnd(0);
testLogResult("P00 INFO: archive-get command end: completed successfully");
// -------------------------------------------------------------------------------------------------------------------------
cmdEnd(25);
testLogResult("P00 INFO: archive-get command end: aborted with exception [025]");
}
}

View File

@ -0,0 +1,34 @@
/***********************************************************************************************************************************
Test Exit Routines
***********************************************************************************************************************************/
#include "config/config.h"
/***********************************************************************************************************************************
Test Run
***********************************************************************************************************************************/
void testRun()
{
// *****************************************************************************************************************************
if (testBegin("exitSafe()"))
{
cfgInit();
cfgCommandSet(cfgCmdArchivePush);
TEST_RESULT_INT(exitSafe(NULL), 0, "exit with no error")
testLogResult("P00 INFO: archive-push command end: completed successfully");
// -------------------------------------------------------------------------------------------------------------------------
TRY_BEGIN()
{
THROW(RuntimeError, "test error message");
}
CATCH_ANY()
{
exitSafe(true);
testLogResult(
"P00 ERROR: [125]: test error message\n"
"P00 INFO: archive-push command end: aborted with exception [125]");
}
TRY_END();
}
}