From 0c41e85dbbaccf0ed07c0277d64d37f0af380be2 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 28 Jun 2015 19:36:37 +0000 Subject: 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.) --- bin/bbackupd/BackupDaemon.cpp | 33 +++++++++++++++++++++++++-- bin/bbackupd/BackupDaemon.h | 2 -- bin/bbackupd/ClientException.txt | 11 --------- bin/bbackupd/Makefile.extra | 7 ------ lib/backupclient/BackupDaemonConfigVerify.cpp | 24 +++++++++---------- lib/backupclient/ClientException.txt | 12 ++++++++++ lib/backupclient/Makefile.extra | 7 ++++++ lib/server/Daemon.cpp | 14 ++++++------ 8 files changed, 69 insertions(+), 41 deletions(-) delete mode 100644 bin/bbackupd/ClientException.txt delete mode 100644 bin/bbackupd/Makefile.extra create mode 100644 lib/backupclient/ClientException.txt create mode 100644 lib/backupclient/Makefile.extra 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 requiredKeys; + requiredKeys.push_back("StoreHostname"); + requiredKeys.push_back("CertificateFile"); + requiredKeys.push_back("PrivateKeyFile"); + requiredKeys.push_back("TrustedCAsFile"); + bool missingRequiredKeys = false; + + for(std::vector::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/bin/bbackupd/ClientException.txt b/bin/bbackupd/ClientException.txt deleted file mode 100644 index 04f88620..00000000 --- a/bin/bbackupd/ClientException.txt +++ /dev/null @@ -1,11 +0,0 @@ - -# NOTE: Exception descriptions are for public distributions of Box Backup only -- do not rely for other applications. - - -EXCEPTION Client 13 - -Internal 0 -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. diff --git a/bin/bbackupd/Makefile.extra b/bin/bbackupd/Makefile.extra deleted file mode 100644 index 25ceb1e7..00000000 --- a/bin/bbackupd/Makefile.extra +++ /dev/null @@ -1,7 +0,0 @@ - -MAKEEXCEPTION = ../../lib/common/makeexception.pl - -# AUTOGEN SEEDING -autogen_ClientException.h autogen_ClientException.cpp: $(MAKEEXCEPTION) ClientException.txt - $(_PERL) $(MAKEEXCEPTION) ClientException.txt - 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/lib/backupclient/ClientException.txt b/lib/backupclient/ClientException.txt new file mode 100644 index 00000000..2e3b7a8a --- /dev/null +++ b/lib/backupclient/ClientException.txt @@ -0,0 +1,12 @@ + +# NOTE: Exception descriptions are for public distributions of Box Backup only -- do not rely for other applications. + + +EXCEPTION Client 13 + +Internal 0 +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/lib/backupclient/Makefile.extra b/lib/backupclient/Makefile.extra new file mode 100644 index 00000000..25ceb1e7 --- /dev/null +++ b/lib/backupclient/Makefile.extra @@ -0,0 +1,7 @@ + +MAKEEXCEPTION = ../../lib/common/makeexception.pl + +# AUTOGEN SEEDING +autogen_ClientException.h autogen_ClientException.cpp: $(MAKEEXCEPTION) ClientException.txt + $(_PERL) $(MAKEEXCEPTION) ClientException.txt + 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; } -- cgit v1.2.3