diff options
author | Chris Wilson <chris+github@qwirx.com> | 2015-12-13 23:39:18 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2015-12-13 23:50:06 +0000 |
commit | 403e7e2051ee3bd3e16a616cfca63b036481282b (patch) | |
tree | bd9d5c2ed3623990158727ffe76c49ffad92966c /bin/bbackupd/BackupClientContext.cpp | |
parent | e77de564aaacaed07075eaac1974d35d09dd2bce (diff) |
Move reusable code out of bin directories.
Allows tests to depend on lib/bbackupd instead of bin/bbackupd, which was
always a hack, and really doesn't work with CMake.
Diffstat (limited to 'bin/bbackupd/BackupClientContext.cpp')
-rw-r--r-- | bin/bbackupd/BackupClientContext.cpp | 578 |
1 files changed, 0 insertions, 578 deletions
diff --git a/bin/bbackupd/BackupClientContext.cpp b/bin/bbackupd/BackupClientContext.cpp deleted file mode 100644 index 4c0b01ce..00000000 --- a/bin/bbackupd/BackupClientContext.cpp +++ /dev/null @@ -1,578 +0,0 @@ -// -------------------------------------------------------------------------- -// -// File -// Name: BackupClientContext.cpp -// Purpose: Keep track of context -// Created: 2003/10/08 -// -// -------------------------------------------------------------------------- - -#include "Box.h" - -#ifdef HAVE_SIGNAL_H - #include <signal.h> -#endif - -#ifdef HAVE_SYS_TIME_H - #include <sys/time.h> -#endif - -#include "BoxPortsAndFiles.h" -#include "BoxTime.h" -#include "BackupClientContext.h" -#include "SocketStreamTLS.h" -#include "Socket.h" -#include "BackupStoreConstants.h" -#include "BackupStoreException.h" -#include "BackupDaemon.h" -#include "autogen_BackupProtocol.h" -#include "BackupStoreFile.h" -#include "Logging.h" -#include "TcpNice.h" - -#include "MemLeakFindOn.h" - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::BackupClientContext(BackupDaemon &, TLSContext &, const std::string &, int32_t, bool, bool, std::string) -// Purpose: Constructor -// Created: 2003/10/08 -// -// -------------------------------------------------------------------------- -BackupClientContext::BackupClientContext -( - LocationResolver &rResolver, - TLSContext &rTLSContext, - const std::string &rHostname, - int Port, - uint32_t AccountNumber, - bool ExtendedLogging, - bool ExtendedLogToFile, - std::string ExtendedLogFile, - ProgressNotifier& rProgressNotifier, - bool TcpNiceMode -) -: mExperimentalSnapshotMode(false), - mrResolver(rResolver), - mrTLSContext(rTLSContext), - mHostname(rHostname), - mPort(Port), - mAccountNumber(AccountNumber), - mExtendedLogging(ExtendedLogging), - mExtendedLogToFile(ExtendedLogToFile), - mExtendedLogFile(ExtendedLogFile), - mpExtendedLogFileHandle(NULL), - mClientStoreMarker(ClientStoreMarker_NotKnown), - mpDeleteList(0), - mpCurrentIDMap(0), - mpNewIDMap(0), - mStorageLimitExceeded(false), - mpExcludeFiles(0), - mpExcludeDirs(0), - mKeepAliveTimer(0, "KeepAliveTime"), - mbIsManaged(false), - mrProgressNotifier(rProgressNotifier), - mTcpNiceMode(TcpNiceMode), - mpNice(NULL) -{ -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::~BackupClientContext() -// Purpose: Destructor -// Created: 2003/10/08 -// -// -------------------------------------------------------------------------- -BackupClientContext::~BackupClientContext() -{ - CloseAnyOpenConnection(); - - // Delete delete list - if(mpDeleteList != 0) - { - delete mpDeleteList; - mpDeleteList = 0; - } -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::GetConnection() -// Purpose: Returns the connection, making the connection and logging into -// the backup store if necessary. -// Created: 2003/10/08 -// -// -------------------------------------------------------------------------- -BackupProtocolCallable &BackupClientContext::GetConnection() -{ - // Already got it? Just return it. - if(mapConnection.get()) - { - return *mapConnection; - } - - // Defensive. Must close connection before releasing any old socket. - mapConnection.reset(); - - std::auto_ptr<SocketStream> apSocket(new SocketStreamTLS); - - try - { - // Defensive. - mapConnection.reset(); - - // Log intention - BOX_INFO("Opening connection to server '" << mHostname << - "'..."); - - // Connect! - ((SocketStreamTLS *)(apSocket.get()))->Open(mrTLSContext, - Socket::TypeINET, mHostname, mPort); - - if(mTcpNiceMode) - { - // Pass control of apSocket to NiceSocketStream, - // which will take care of destroying it for us. - // But we need to hang onto a pointer to the nice - // socket, so we can enable and disable nice mode. - // This is scary, it could be deallocated under us. - mpNice = new NiceSocketStream(apSocket); - apSocket.reset(mpNice); - } - - // We need to call some methods that aren't defined in - // BackupProtocolCallable, so we need to hang onto a more - // strongly typed pointer (to avoid far too many casts). - BackupProtocolClient *pClient = new BackupProtocolClient(apSocket); - mapConnection.reset(pClient); - - // Set logging option - pClient->SetLogToSysLog(mExtendedLogging); - - if (mExtendedLogToFile) - { - ASSERT(mpExtendedLogFileHandle == NULL); - - mpExtendedLogFileHandle = fopen( - mExtendedLogFile.c_str(), "a+"); - - if (!mpExtendedLogFileHandle) - { - BOX_LOG_SYS_ERROR("Failed to open extended " - "log file: " << mExtendedLogFile); - } - else - { - pClient->SetLogToFile(mpExtendedLogFileHandle); - } - } - - // Handshake - pClient->Handshake(); - - // Check the version of the server - { - std::auto_ptr<BackupProtocolVersion> serverVersion( - mapConnection->QueryVersion(BACKUP_STORE_SERVER_VERSION)); - if(serverVersion->GetVersion() != BACKUP_STORE_SERVER_VERSION) - { - THROW_EXCEPTION(BackupStoreException, WrongServerVersion) - } - } - - // Login -- if this fails, the Protocol will exception - std::auto_ptr<BackupProtocolLoginConfirmed> loginConf( - mapConnection->QueryLogin(mAccountNumber, 0 /* read/write */)); - - // Check that the client store marker is the one we expect - if(mClientStoreMarker != ClientStoreMarker_NotKnown) - { - if(loginConf->GetClientStoreMarker() != mClientStoreMarker) - { - // Not good... finish the connection, abort, etc, ignoring errors - try - { - mapConnection->QueryFinished(); - } - catch(...) - { - // IGNORE - } - - // Then throw an exception about this - THROW_EXCEPTION_MESSAGE(BackupStoreException, - ClientMarkerNotAsExpected, - "Expected " << mClientStoreMarker << - " but found " << loginConf->GetClientStoreMarker() << - ": is someone else writing to the " - "same account?"); - } - } - else // mClientStoreMarker == ClientStoreMarker_NotKnown - { - // Yes, choose one, the current time will do - box_time_t marker = GetCurrentBoxTime(); - - // Set it on the store - mapConnection->QuerySetClientStoreMarker(marker); - - // Record it so that it can be picked up later. - mClientStoreMarker = marker; - } - - // Log success - BOX_INFO("Connection made, login successful"); - - // Check to see if there is any space available on the server - if(loginConf->GetBlocksUsed() >= loginConf->GetBlocksHardLimit()) - { - // no -- flag so only things like deletions happen - mStorageLimitExceeded = true; - // Log - BOX_WARNING("Exceeded storage hard-limit on server, " - "not uploading changes to files"); - } - } - catch(...) - { - // Clean up. - mapConnection.reset(); - throw; - } - - return *mapConnection; -} - -BackupProtocolCallable* BackupClientContext::GetOpenConnection() const -{ - return mapConnection.get(); -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::CloseAnyOpenConnection() -// Purpose: Closes a connection, if it's open -// Created: 2003/10/08 -// -// -------------------------------------------------------------------------- -void BackupClientContext::CloseAnyOpenConnection() -{ - BackupProtocolCallable* pConnection(GetOpenConnection()); - if(pConnection) - { - try - { - // Quit nicely - pConnection->QueryFinished(); - } - catch(...) - { - // Ignore errors here - } - - // Delete it anyway. - mapConnection.reset(); - } - - // Delete any pending list - if(mpDeleteList != 0) - { - delete mpDeleteList; - mpDeleteList = 0; - } - - if (mpExtendedLogFileHandle != NULL) - { - fclose(mpExtendedLogFileHandle); - mpExtendedLogFileHandle = NULL; - } -} - - - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::GetTimeout() -// Purpose: Gets the current timeout time. -// Created: 2003/10/08 -// -// -------------------------------------------------------------------------- -int BackupClientContext::GetTimeout() const -{ - BackupProtocolCallable* pConnection(GetOpenConnection()); - if(pConnection) - { - return pConnection->GetTimeout(); - } - - return (15*60*1000); -} - - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::GetDeleteList() -// Purpose: Returns the delete list, creating one if necessary -// Created: 10/11/03 -// -// -------------------------------------------------------------------------- -BackupClientDeleteList &BackupClientContext::GetDeleteList() -{ - // Already created? - if(mpDeleteList == 0) - { - mpDeleteList = new BackupClientDeleteList; - } - - // Return reference to object - return *mpDeleteList; -} - - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::PerformDeletions() -// Purpose: Perform any pending file deletions. -// Created: 10/11/03 -// -// -------------------------------------------------------------------------- -void BackupClientContext::PerformDeletions() -{ - // Got a list? - if(mpDeleteList == 0) - { - // Nothing to do - return; - } - - // Delegate to the delete list object - mpDeleteList->PerformDeletions(*this); - - // Delete the object - delete mpDeleteList; - mpDeleteList = 0; -} - - - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::GetCurrentIDMap() const -// Purpose: Return a (const) reference to the current ID map -// Created: 11/11/03 -// -// -------------------------------------------------------------------------- -const BackupClientInodeToIDMap &BackupClientContext::GetCurrentIDMap() const -{ - ASSERT(mpCurrentIDMap != 0); - if(mpCurrentIDMap == 0) - { - THROW_EXCEPTION(CommonException, Internal) - } - return *mpCurrentIDMap; -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::GetNewIDMap() const -// Purpose: Return a reference to the new ID map -// Created: 11/11/03 -// -// -------------------------------------------------------------------------- -BackupClientInodeToIDMap &BackupClientContext::GetNewIDMap() const -{ - ASSERT(mpNewIDMap != 0); - if(mpNewIDMap == 0) - { - THROW_EXCEPTION(CommonException, Internal) - } - return *mpNewIDMap; -} - - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::FindFilename(int64_t, int64_t, std::string &, bool &) const -// Purpose: Attempts to find the pathname of an object with a given ID on the server. -// Returns true if it can be found, in which case rPathOut is the local filename, -// and rIsDirectoryOut == true if the local object is a directory. -// Created: 12/11/03 -// -// -------------------------------------------------------------------------- -bool BackupClientContext::FindFilename(int64_t ObjectID, int64_t ContainingDirectory, std::string &rPathOut, bool &rIsDirectoryOut, - bool &rIsCurrentVersionOut, box_time_t *pModTimeOnServer, box_time_t *pAttributesHashOnServer, BackupStoreFilenameClear *pLeafname) -{ - // Make a connection to the server - BackupProtocolCallable &connection(GetConnection()); - - // Request filenames from the server, in a "safe" manner to ignore errors properly - { - BackupProtocolGetObjectName send(ObjectID, ContainingDirectory); - connection.Send(send); - } - std::auto_ptr<BackupProtocolMessage> preply(connection.Receive()); - - // Is it of the right type? - if(preply->GetType() != BackupProtocolObjectName::TypeID) - { - // Was an error or something - return false; - } - - // Cast to expected type. - BackupProtocolObjectName *names = (BackupProtocolObjectName *)(preply.get()); - - // Anything found? - int32_t numElements = names->GetNumNameElements(); - if(numElements <= 0) - { - // No. - return false; - } - - // Get the stream containing all the names - std::auto_ptr<IOStream> nameStream(connection.ReceiveStream()); - - // Path - std::string path; - - // Remember this is in reverse order! - for(int l = 0; l < numElements; ++l) - { - BackupStoreFilenameClear elementName; - elementName.ReadFromStream(*nameStream, GetTimeout()); - - // Store leafname for caller? - if(l == 0 && pLeafname) - { - *pLeafname = elementName; - } - - // Is it part of the filename in the location? - if(l < (numElements - 1)) - { - // Part of filename within - path = (path.empty())?(elementName.GetClearFilename()):(elementName.GetClearFilename() + DIRECTORY_SEPARATOR_ASCHAR + path); - } - else - { - // Location name -- look up in daemon's records - std::string locPath; - if(!mrResolver.FindLocationPathName(elementName.GetClearFilename(), locPath)) - { - // Didn't find the location... so can't give the local filename - return false; - } - - // Add in location path - path = (path.empty())?(locPath):(locPath + DIRECTORY_SEPARATOR_ASCHAR + path); - } - } - - // Is it a directory? - rIsDirectoryOut = ((names->GetFlags() & BackupProtocolListDirectory::Flags_Dir) == BackupProtocolListDirectory::Flags_Dir); - - // Is it the current version? - rIsCurrentVersionOut = ((names->GetFlags() & (BackupProtocolListDirectory::Flags_OldVersion | BackupProtocolListDirectory::Flags_Deleted)) == 0); - - // And other information which may be required - if(pModTimeOnServer) *pModTimeOnServer = names->GetModificationTime(); - if(pAttributesHashOnServer) *pAttributesHashOnServer = names->GetAttributesHash(); - - // Tell caller about the pathname - rPathOut = path; - - // Found - return true; -} - -void BackupClientContext::SetMaximumDiffingTime(int iSeconds) -{ - mMaximumDiffingTime = iSeconds < 0 ? 0 : iSeconds; - BOX_TRACE("Set maximum diffing time to " << mMaximumDiffingTime << - " seconds"); -} - -void BackupClientContext::SetKeepAliveTime(int iSeconds) -{ - mKeepAliveTime = iSeconds < 0 ? 0 : iSeconds; - BOX_TRACE("Set keep-alive time to " << mKeepAliveTime << " seconds"); - mKeepAliveTimer.Reset(mKeepAliveTime * MILLI_SEC_IN_SEC); -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::ManageDiffProcess() -// Purpose: Initiates a file diff control timer -// Created: 04/19/2005 -// -// -------------------------------------------------------------------------- -void BackupClientContext::ManageDiffProcess() -{ - ASSERT(!mbIsManaged); - mbIsManaged = true; -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::UnManageDiffProcess() -// Purpose: suspends file diff control timer -// Created: 04/19/2005 -// -// -------------------------------------------------------------------------- -void BackupClientContext::UnManageDiffProcess() -{ - // ASSERT(mbIsManaged); - mbIsManaged = false; -} - -// -------------------------------------------------------------------------- -// -// Function -// Name: BackupClientContext::DoKeepAlive() -// Purpose: Check whether it's time to send a KeepAlive -// message over the SSL link, and if so, send it. -// Created: 04/19/2005 -// -// -------------------------------------------------------------------------- -void BackupClientContext::DoKeepAlive() -{ - BackupProtocolCallable* pConnection(GetOpenConnection()); - if (!pConnection) - { - return; - } - - if (mKeepAliveTime == 0) - { - return; - } - - if (!mKeepAliveTimer.HasExpired()) - { - return; - } - - BOX_TRACE("KeepAliveTime reached, sending keep-alive message"); - pConnection->QueryGetIsAlive(); - - mKeepAliveTimer.Reset(mKeepAliveTime * MILLI_SEC_IN_SEC); -} - -int BackupClientContext::GetMaximumDiffingTime() -{ - return mMaximumDiffingTime; -} |