2014-03-06 03:53:13 +03:00
|
|
|
#!/usr/bin/perl
|
2014-03-30 01:16:08 +03:00
|
|
|
####################################################################################################################################
|
2015-07-02 16:05:13 +02:00
|
|
|
# pgBackRest - Simple PostgreSQL Backup and Restore
|
2014-03-30 01:16:08 +03:00
|
|
|
####################################################################################################################################
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2014-03-30 01:16:08 +03:00
|
|
|
####################################################################################################################################
|
|
|
|
# Perl includes
|
|
|
|
####################################################################################################################################
|
2014-03-06 03:53:13 +03:00
|
|
|
use strict;
|
2015-03-03 07:57:20 +02:00
|
|
|
use warnings FATAL => qw(all);
|
|
|
|
use Carp qw(confess);
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2015-08-29 20:20:46 +02:00
|
|
|
# Convert die to confess to capture the stack trace
|
2015-06-14 00:25:49 +02:00
|
|
|
$SIG{__DIE__} = sub { Carp::confess @_ };
|
|
|
|
|
|
|
|
use File::Basename qw(dirname);
|
2015-06-21 18:06:13 +02:00
|
|
|
use Scalar::Util qw(blessed);
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2014-09-14 22:55:27 +03:00
|
|
|
use lib dirname($0) . '/../lib';
|
2015-06-14 00:25:49 +02:00
|
|
|
use BackRest::Archive;
|
2015-08-29 20:20:46 +02:00
|
|
|
use BackRest::Backup;
|
|
|
|
use BackRest::Common::Exception;
|
|
|
|
use BackRest::Common::Lock;
|
|
|
|
use BackRest::Common::Log;
|
2014-12-16 00:20:42 +02:00
|
|
|
use BackRest::Config;
|
2015-08-29 20:20:46 +02:00
|
|
|
use BackRest::Expire;
|
2014-06-22 17:30:17 +03:00
|
|
|
use BackRest::File;
|
2015-06-14 00:25:49 +02:00
|
|
|
use BackRest::Info;
|
2015-08-05 14:43:41 +02:00
|
|
|
use BackRest::Protocol::RemoteMinion;
|
2015-08-29 20:20:46 +02:00
|
|
|
use BackRest::Protocol::ThreadGroup;
|
2015-04-01 21:58:33 +02:00
|
|
|
use BackRest::Restore;
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2014-07-13 02:03:39 +03:00
|
|
|
####################################################################################################################################
|
2015-08-29 20:20:46 +02:00
|
|
|
# Operation constants
|
|
|
|
####################################################################################################################################
|
|
|
|
use constant OP_MAIN => 'Main';
|
|
|
|
|
|
|
|
use constant OP_MAIN_SAFE_EXIT => OP_MAIN . '::safeExit';
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# safeExit
|
|
|
|
#
|
|
|
|
# Terminate all threads and SSH connections when the script is terminated.
|
2014-07-13 02:03:39 +03:00
|
|
|
####################################################################################################################################
|
2015-08-29 20:20:46 +02:00
|
|
|
sub safeExit
|
2014-07-13 02:03:39 +03:00
|
|
|
{
|
2015-08-29 20:20:46 +02:00
|
|
|
# Assign function parameters, defaults, and log debug info
|
|
|
|
my
|
|
|
|
(
|
|
|
|
$strOperation,
|
|
|
|
$iExitCode
|
|
|
|
) =
|
|
|
|
logDebugParam
|
|
|
|
(
|
|
|
|
OP_MAIN_SAFE_EXIT, \@_,
|
|
|
|
{name => 'iExitCode', required => false}
|
|
|
|
);
|
2015-03-03 03:36:12 +02:00
|
|
|
|
2015-08-29 20:20:46 +02:00
|
|
|
commandStop();
|
2015-04-11 21:02:04 +02:00
|
|
|
|
2015-04-07 13:34:37 +02:00
|
|
|
my $iTotal = threadGroupDestroy();
|
2015-06-17 17:26:07 +02:00
|
|
|
protocolDestroy();
|
2015-04-07 13:34:37 +02:00
|
|
|
|
2015-04-01 21:58:33 +02:00
|
|
|
if (defined($iExitCode))
|
2015-03-03 03:36:12 +02:00
|
|
|
{
|
2015-04-01 21:58:33 +02:00
|
|
|
exit $iExitCode;
|
2014-07-13 02:03:39 +03:00
|
|
|
}
|
|
|
|
|
2015-04-01 21:58:33 +02:00
|
|
|
&log(ERROR, "process terminated on signal or exception, ${iTotal} threads stopped");
|
2014-03-06 03:53:13 +03:00
|
|
|
}
|
|
|
|
|
2015-08-29 20:20:46 +02:00
|
|
|
$SIG{TERM} = \&safeExit;
|
|
|
|
$SIG{HUP} = \&safeExit;
|
|
|
|
$SIG{INT} = \&safeExit;
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2014-07-28 01:13:23 +03:00
|
|
|
####################################################################################################################################
|
|
|
|
# START EVAL BLOCK TO CATCH ERRORS AND STOP THREADS
|
|
|
|
####################################################################################################################################
|
2015-06-14 00:25:49 +02:00
|
|
|
eval
|
2014-07-13 02:03:39 +03:00
|
|
|
{
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# Load command line parameters and config
|
|
|
|
################################################################################################################################
|
|
|
|
configLoad();
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2015-06-17 17:26:07 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# Process remote commands
|
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
if (commandTest(CMD_REMOTE))
|
2015-06-17 17:26:07 +02:00
|
|
|
{
|
2015-06-18 21:39:30 +02:00
|
|
|
# Turn all logging off
|
2015-08-29 20:20:46 +02:00
|
|
|
logLevelSet(OFF, OFF);
|
2015-06-18 21:39:30 +02:00
|
|
|
|
|
|
|
# Create the remote object
|
2015-08-05 14:43:41 +02:00
|
|
|
my $oRemote = new BackRest::Protocol::RemoteMinion
|
2015-06-18 21:39:30 +02:00
|
|
|
(
|
|
|
|
optionGet(OPTION_BUFFER_SIZE),
|
|
|
|
optionGet(OPTION_COMPRESS_LEVEL),
|
|
|
|
optionGet(OPTION_COMPRESS_LEVEL_NETWORK)
|
|
|
|
);
|
|
|
|
|
|
|
|
# Process remote requests
|
2015-08-29 20:20:46 +02:00
|
|
|
safeExit($oRemote->process());
|
2015-06-17 17:26:07 +02:00
|
|
|
}
|
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
# Set the log levels
|
2015-08-29 20:20:46 +02:00
|
|
|
logLevelSet(optionGet(OPTION_LOG_LEVEL_FILE), optionGet(OPTION_LOG_LEVEL_CONSOLE));
|
2015-04-22 22:39:53 +02:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
# Set test options
|
2015-08-29 20:20:46 +02:00
|
|
|
!optionGet(OPTION_TEST) or testSet(optionGet(OPTION_TEST), optionGet(OPTION_TEST_DELAY));
|
|
|
|
|
|
|
|
# Log the command start
|
|
|
|
commandStart();
|
2015-04-07 13:34:37 +02:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# Process archive commands
|
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
if (commandTest(CMD_ARCHIVE_PUSH) || commandTest(CMD_ARCHIVE_GET))
|
2015-06-14 00:25:49 +02:00
|
|
|
{
|
2015-08-29 20:20:46 +02:00
|
|
|
safeExit(new BackRest::Archive()->process());
|
2015-06-14 00:25:49 +02:00
|
|
|
}
|
2014-12-19 19:49:56 +02:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# Process info command
|
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
if (commandTest(CMD_INFO))
|
2014-12-19 19:49:56 +02:00
|
|
|
{
|
2015-08-29 20:20:46 +02:00
|
|
|
safeExit(new BackRest::Info()->process());
|
2014-12-19 19:49:56 +02:00
|
|
|
}
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
# Acquire the command lock
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
lockAcquire(commandGet());
|
2015-06-14 00:25:49 +02:00
|
|
|
|
|
|
|
################################################################################################################################
|
|
|
|
# Open the log file
|
|
|
|
################################################################################################################################
|
2015-08-29 20:20:46 +02:00
|
|
|
logFileSet(optionGet(OPTION_REPO_PATH) . '/log/' . optionGet(OPTION_STANZA) . '-' . lc(commandGet()));
|
2015-06-14 00:25:49 +02:00
|
|
|
|
|
|
|
################################################################################################################################
|
|
|
|
# Create the thread group that will be used for parallel processing
|
|
|
|
################################################################################################################################
|
|
|
|
threadGroupCreate();
|
|
|
|
|
|
|
|
################################################################################################################################
|
|
|
|
# Initialize the default file object
|
|
|
|
################################################################################################################################
|
|
|
|
my $oFile = new BackRest::File
|
2014-12-19 19:49:56 +02:00
|
|
|
(
|
2015-03-08 19:26:09 +02:00
|
|
|
optionGet(OPTION_STANZA),
|
2015-06-14 00:25:49 +02:00
|
|
|
optionRemoteTypeTest(BACKUP) ? optionGet(OPTION_REPO_REMOTE_PATH) : optionGet(OPTION_REPO_PATH),
|
|
|
|
optionRemoteType(),
|
2015-06-17 17:26:07 +02:00
|
|
|
protocolGet()
|
2015-06-14 00:25:49 +02:00
|
|
|
);
|
2014-12-19 19:49:56 +02:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# RESTORE
|
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
if (commandTest(CMD_RESTORE))
|
2015-06-14 00:25:49 +02:00
|
|
|
{
|
|
|
|
if (optionRemoteTypeTest(DB))
|
|
|
|
{
|
2015-06-18 22:55:09 +02:00
|
|
|
confess &log(ASSERT, 'restore command must be performed locally on the db server');
|
2015-06-14 00:25:49 +02:00
|
|
|
}
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
# Do the restore
|
|
|
|
new BackRest::Restore
|
|
|
|
(
|
2015-08-29 20:20:46 +02:00
|
|
|
$oFile
|
|
|
|
)->process;
|
|
|
|
|
|
|
|
safeExit(0);
|
2015-06-14 00:25:49 +02:00
|
|
|
}
|
2014-06-22 17:30:17 +03:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
# Make sure backup and expire command happen on the backup side
|
2015-08-05 18:32:12 +02:00
|
|
|
################################################################################################################################
|
2015-06-14 00:25:49 +02:00
|
|
|
if (optionRemoteTypeTest(BACKUP))
|
|
|
|
{
|
2015-06-18 22:55:09 +02:00
|
|
|
confess &log(ERROR, 'backup and expire commands must run on the backup host');
|
2015-06-14 00:25:49 +02:00
|
|
|
}
|
2014-09-20 00:51:51 +03:00
|
|
|
|
2015-08-05 18:32:12 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# BACKUP
|
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
if (commandTest(CMD_BACKUP))
|
2015-03-18 00:31:05 +02:00
|
|
|
{
|
2015-08-29 20:20:46 +02:00
|
|
|
new BackRest::Backup
|
2015-06-14 00:25:49 +02:00
|
|
|
(
|
2015-08-29 20:20:46 +02:00
|
|
|
$oFile
|
|
|
|
)->process();
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2015-06-18 22:55:09 +02:00
|
|
|
commandSet(CMD_EXPIRE);
|
2015-06-14 00:25:49 +02:00
|
|
|
}
|
2014-03-06 03:53:13 +03:00
|
|
|
|
2015-06-14 00:25:49 +02:00
|
|
|
################################################################################################################################
|
|
|
|
# EXPIRE
|
|
|
|
################################################################################################################################
|
2015-06-18 22:55:09 +02:00
|
|
|
if (commandTest(CMD_EXPIRE))
|
2015-03-18 00:31:05 +02:00
|
|
|
{
|
2015-08-29 20:20:46 +02:00
|
|
|
new BackRest::Expire
|
2015-08-05 18:32:12 +02:00
|
|
|
(
|
|
|
|
$oFile
|
2015-08-29 20:20:46 +02:00
|
|
|
)->process();
|
2015-03-18 00:31:05 +02:00
|
|
|
}
|
|
|
|
|
2015-06-18 22:55:09 +02:00
|
|
|
# Release the command lock
|
2015-06-14 00:25:49 +02:00
|
|
|
lockRelease();
|
2015-04-22 22:39:53 +02:00
|
|
|
|
2015-08-29 20:20:46 +02:00
|
|
|
safeExit(0);
|
2014-08-10 22:02:14 +03:00
|
|
|
};
|
2014-07-28 01:13:23 +03:00
|
|
|
|
|
|
|
####################################################################################################################################
|
2014-08-10 22:02:14 +03:00
|
|
|
# CHECK FOR ERRORS AND STOP THREADS
|
2014-07-28 01:13:23 +03:00
|
|
|
####################################################################################################################################
|
|
|
|
if ($@)
|
|
|
|
{
|
2015-01-24 01:28:39 +02:00
|
|
|
my $oMessage = $@;
|
|
|
|
|
|
|
|
# If a backrest exception then return the code - don't confess
|
2015-08-29 20:20:46 +02:00
|
|
|
if (blessed($oMessage) && $oMessage->isa('BackRest::Common::Exception'))
|
2015-01-24 01:28:39 +02:00
|
|
|
{
|
2015-08-29 20:20:46 +02:00
|
|
|
safeExit($oMessage->code());
|
2015-01-24 01:28:39 +02:00
|
|
|
}
|
|
|
|
|
2015-08-29 20:20:46 +02:00
|
|
|
safeExit();
|
2015-05-29 17:41:19 +02:00
|
|
|
confess $oMessage;
|
2014-07-28 01:13:23 +03:00
|
|
|
}
|