summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris+github@qwirx.com>2015-06-28 19:36:37 +0000
committerChris Wilson <chris+github@qwirx.com>2015-06-28 19:36:37 +0000
commit0c41e85dbbaccf0ed07c0277d64d37f0af380be2 (patch)
tree828cde6ff3d3e62d734d1dd18fca2825ace6e50a
parent66031e625d512b82a2d9d1546773b9fc0f8645bd (diff)
Refactor to allow non-bbstored store configurations.
Make some keys not required in BackupDaemonConfigVerify, and verify them afterwards instead, when the rest of the configuration file has been read (and in future, the store type would be known.)
-rw-r--r--bin/bbackupd/BackupDaemon.cpp33
-rw-r--r--bin/bbackupd/BackupDaemon.h2
-rw-r--r--lib/backupclient/BackupDaemonConfigVerify.cpp24
-rw-r--r--lib/backupclient/ClientException.txt (renamed from bin/bbackupd/ClientException.txt)1
-rw-r--r--lib/backupclient/Makefile.extra (renamed from bin/bbackupd/Makefile.extra)0
-rw-r--r--lib/server/Daemon.cpp14
6 files changed, 51 insertions, 23 deletions
diff --git a/bin/bbackupd/BackupDaemon.cpp b/bin/bbackupd/BackupDaemon.cpp
index edd059af..fa55cdad 100644
--- a/bin/bbackupd/BackupDaemon.cpp
+++ b/bin/bbackupd/BackupDaemon.cpp
@@ -321,7 +321,6 @@ const ConfigurationVerify *BackupDaemon::GetConfigVerify() const
return &BackupDaemonConfigVerify;
}
-#ifdef PLATFORM_CANNOT_FIND_PEER_UID_OF_UNIX_SOCKET
// --------------------------------------------------------------------------
//
// Function
@@ -334,6 +333,36 @@ const ConfigurationVerify *BackupDaemon::GetConfigVerify() const
// --------------------------------------------------------------------------
void BackupDaemon::SetupInInitialProcess()
{
+ const Configuration& config(GetConfiguration());
+
+ // These keys may or may not be required, depending on the configured
+ // store type (e.g. not when using Amazon S3 stores), so they can't be
+ // verified by BackupDaemonConfigVerify.
+ std::vector<std::string> requiredKeys;
+ requiredKeys.push_back("StoreHostname");
+ requiredKeys.push_back("CertificateFile");
+ requiredKeys.push_back("PrivateKeyFile");
+ requiredKeys.push_back("TrustedCAsFile");
+ bool missingRequiredKeys = false;
+
+ for(std::vector<std::string>::const_iterator i = requiredKeys.begin();
+ i != requiredKeys.end(); i++)
+ {
+ if(!config.KeyExists(*i))
+ {
+ BOX_ERROR("Missing required configuration key: " << *i);
+ missingRequiredKeys = true;
+ }
+ }
+
+ if(missingRequiredKeys)
+ {
+ THROW_EXCEPTION_MESSAGE(ClientException, InvalidConfiguration,
+ "Some required configuration keys are missing in " <<
+ GetConfigFileName());
+ }
+
+#ifdef PLATFORM_CANNOT_FIND_PEER_UID_OF_UNIX_SOCKET
// Print a warning on this platform if the CommandSocket is used.
if(GetConfiguration().KeyExists("CommandSocket"))
{
@@ -346,8 +375,8 @@ void BackupDaemon::SetupInInitialProcess()
"==============================================================================\n"
);
}
-}
#endif
+}
// --------------------------------------------------------------------------
diff --git a/bin/bbackupd/BackupDaemon.h b/bin/bbackupd/BackupDaemon.h
index ba46dec2..ffe31247 100644
--- a/bin/bbackupd/BackupDaemon.h
+++ b/bin/bbackupd/BackupDaemon.h
@@ -187,10 +187,8 @@ private:
void DeleteUnusedRootDirEntries(BackupClientContext &rContext);
-#ifdef PLATFORM_CANNOT_FIND_PEER_UID_OF_UNIX_SOCKET
// For warning user about potential security hole
virtual void SetupInInitialProcess();
-#endif
int UseScriptToSeeIfSyncAllowed();
diff --git a/lib/backupclient/BackupDaemonConfigVerify.cpp b/lib/backupclient/BackupDaemonConfigVerify.cpp
index bc2cbcf8..0f23e5ea 100644
--- a/lib/backupclient/BackupDaemonConfigVerify.cpp
+++ b/lib/backupclient/BackupDaemonConfigVerify.cpp
@@ -16,7 +16,7 @@
#include "MemLeakFindOn.h"
-static const ConfigurationVerifyKey backuplocationkeys[] =
+static const ConfigurationVerifyKey backuplocationkeys[] =
{
ConfigurationVerifyKey("ExcludeFile", ConfigTest_MultiValueAllowed),
ConfigurationVerifyKey("ExcludeFilesRegex", ConfigTest_MultiValueAllowed),
@@ -29,7 +29,7 @@ static const ConfigurationVerifyKey backuplocationkeys[] =
ConfigurationVerifyKey("Path", ConfigTest_Exists | ConfigTest_LastEntry)
};
-static const ConfigurationVerify backuplocations[] =
+static const ConfigurationVerify backuplocations[] =
{
{
"*",
@@ -40,7 +40,7 @@ static const ConfigurationVerify backuplocations[] =
}
};
-static const ConfigurationVerifyKey verifyserverkeys[] =
+static const ConfigurationVerifyKey verifyserverkeys[] =
{
DAEMON_VERIFY_SERVER_KEYS
};
@@ -63,7 +63,7 @@ static const ConfigurationVerify verifyserver[] =
}
};
-static const ConfigurationVerifyKey verifyrootkeys[] =
+static const ConfigurationVerifyKey verifyrootkeys[] =
{
ConfigurationVerifyKey("AccountNumber",
ConfigTest_Exists | ConfigTest_IsUint32),
@@ -92,9 +92,6 @@ static const ConfigurationVerifyKey verifyrootkeys[] =
ConfigTest_Exists | ConfigTest_IsInt),
ConfigurationVerifyKey("DiffingUploadSizeThreshold",
ConfigTest_Exists | ConfigTest_IsInt),
- ConfigurationVerifyKey("StoreHostname", ConfigTest_Exists),
- ConfigurationVerifyKey("StorePort", ConfigTest_IsInt,
- BOX_PORT_BBSTORED),
ConfigurationVerifyKey("ExtendedLogging", ConfigTest_IsBool, false),
// extended log to syslog
ConfigurationVerifyKey("ExtendedLogFile", 0),
@@ -125,13 +122,16 @@ static const ConfigurationVerifyKey verifyrootkeys[] =
ConfigurationVerifyKey("TcpNice", ConfigTest_IsBool, false),
// optional enable of tcp nice/background mode
- ConfigurationVerifyKey("CertificateFile", ConfigTest_Exists),
- ConfigurationVerifyKey("PrivateKeyFile", ConfigTest_Exists),
- ConfigurationVerifyKey("TrustedCAsFile", ConfigTest_Exists),
ConfigurationVerifyKey("KeysFile", ConfigTest_Exists),
- ConfigurationVerifyKey("DataDirectory",
- ConfigTest_Exists | ConfigTest_LastEntry),
+ ConfigurationVerifyKey("DataDirectory", ConfigTest_Exists),
+ // These values are only required for bbstored stores:
+ ConfigurationVerifyKey("StoreHostname", 0),
+ ConfigurationVerifyKey("StorePort", ConfigTest_IsInt,
+ BOX_PORT_BBSTORED),
+ ConfigurationVerifyKey("CertificateFile", 0),
+ ConfigurationVerifyKey("PrivateKeyFile", 0),
+ ConfigurationVerifyKey("TrustedCAsFile", ConfigTest_LastEntry),
};
const ConfigurationVerify BackupDaemonConfigVerify =
diff --git a/bin/bbackupd/ClientException.txt b/lib/backupclient/ClientException.txt
index 04f88620..2e3b7a8a 100644
--- a/bin/bbackupd/ClientException.txt
+++ b/lib/backupclient/ClientException.txt
@@ -9,3 +9,4 @@ AssertFailed 1
ClockWentBackwards 2 Invalid (negative) sync period: perhaps your clock is going backwards?
FailedToDeleteStoreObjectInfoFile 3 Failed to delete the StoreObjectInfoFile, backup cannot continue safely.
CorruptStoreObjectInfoFile 4 The store object info file contained an invalid value and is probably corrupt. Try deleting it.
+InvalidConfiguration 5 Some required values are missing or incorrect in the configuration file.
diff --git a/bin/bbackupd/Makefile.extra b/lib/backupclient/Makefile.extra
index 25ceb1e7..25ceb1e7 100644
--- a/bin/bbackupd/Makefile.extra
+++ b/lib/backupclient/Makefile.extra
diff --git a/lib/server/Daemon.cpp b/lib/server/Daemon.cpp
index 995b04ce..836948bf 100644
--- a/lib/server/Daemon.cpp
+++ b/lib/server/Daemon.cpp
@@ -376,17 +376,17 @@ bool Daemon::Configure(const std::string& rConfigFileName)
BOX_ERROR("Failed to load or verify configuration file");
return false;
}
-
+
if(!Configure(*apConfig))
{
BOX_ERROR("Failed to verify configuration file");
- return false;
+ return false;
}
-
+
// Store configuration
mConfigFileName = rConfigFileName;
mLoadedConfigModifiedTime = GetConfigFileModifiedTime();
-
+
return true;
}
@@ -416,14 +416,14 @@ bool Daemon::Configure(const Configuration& rConfig)
BOX_ERROR("Configuration errors: " << errors);
return false;
}
-
+
// Store configuration
mapConfiguration = apConf;
-
+
// Let the derived class have a go at setting up stuff
// in the initial process
SetupInInitialProcess();
-
+
return true;
}