diff options
Diffstat (limited to 'bin/bbackupd')
-rw-r--r-- | bin/bbackupd/BackupClientContext.cpp | 6 | ||||
-rw-r--r-- | bin/bbackupd/BackupClientContext.h | 22 | ||||
-rw-r--r-- | bin/bbackupd/BackupClientDirectoryRecord.cpp | 4 | ||||
-rw-r--r-- | bin/bbackupd/BackupClientDirectoryRecord.h | 63 | ||||
-rw-r--r-- | bin/bbackupd/BackupDaemon.cpp | 59 | ||||
-rw-r--r-- | bin/bbackupd/BackupDaemon.h | 48 |
6 files changed, 165 insertions, 37 deletions
diff --git a/bin/bbackupd/BackupClientContext.cpp b/bin/bbackupd/BackupClientContext.cpp index 47826211..bf923ce3 100644 --- a/bin/bbackupd/BackupClientContext.cpp +++ b/bin/bbackupd/BackupClientContext.cpp @@ -41,7 +41,7 @@ // -------------------------------------------------------------------------- BackupClientContext::BackupClientContext ( - BackupDaemon &rDaemon, + LocationResolver &rResolver, TLSContext &rTLSContext, const std::string &rHostname, int Port, @@ -51,7 +51,7 @@ BackupClientContext::BackupClientContext std::string ExtendedLogFile, ProgressNotifier& rProgressNotifier ) - : mrDaemon(rDaemon), + : mrResolver(rResolver), mrTLSContext(rTLSContext), mHostname(rHostname), mPort(Port), @@ -470,7 +470,7 @@ bool BackupClientContext::FindFilename(int64_t ObjectID, int64_t ContainingDirec { // Location name -- look up in daemon's records std::string locPath; - if(!mrDaemon.FindLocationPathName(elementName.GetClearFilename(), locPath)) + if(!mrResolver.FindLocationPathName(elementName.GetClearFilename(), locPath)) { // Didn't find the location... so can't give the local filename return false; diff --git a/bin/bbackupd/BackupClientContext.h b/bin/bbackupd/BackupClientContext.h index 0e82cf24..e25c7244 100644 --- a/bin/bbackupd/BackupClientContext.h +++ b/bin/bbackupd/BackupClientContext.h @@ -29,6 +29,24 @@ class BackupStoreFilenameClear; // -------------------------------------------------------------------------- // // Class +// Name: LocationResolver +// Purpose: Interface for classes that can resolve locations to paths, +// like BackupDaemon +// Created: 2003/10/08 +// +// -------------------------------------------------------------------------- +class LocationResolver +{ +public: + virtual ~LocationResolver() { } + virtual bool FindLocationPathName(const std::string &rLocationName, + std::string &rPathOut) const = 0; +}; + + +// -------------------------------------------------------------------------- +// +// Class // Name: BackupClientContext // Purpose: // Created: 2003/10/08 @@ -39,7 +57,7 @@ class BackupClientContext : public DiffTimer public: BackupClientContext ( - BackupDaemon &rDaemon, + LocationResolver &rResolver, TLSContext &rTLSContext, const std::string &rHostname, int32_t Port, @@ -207,7 +225,7 @@ public: } private: - BackupDaemon &mrDaemon; + LocationResolver &mrResolver; TLSContext &mrTLSContext; std::string mHostname; int mPort; diff --git a/bin/bbackupd/BackupClientDirectoryRecord.cpp b/bin/bbackupd/BackupClientDirectoryRecord.cpp index ea5ee973..7e3cc550 100644 --- a/bin/bbackupd/BackupClientDirectoryRecord.cpp +++ b/bin/bbackupd/BackupClientDirectoryRecord.cpp @@ -1482,7 +1482,9 @@ int64_t BackupClientDirectoryRecord::UploadFile( // Prepare to upload, getting a stream which will encode the file as we go along std::auto_ptr<IOStream> upload( BackupStoreFile::EncodeFile(rFilename.c_str(), - mObjectID, rStoreFilename)); + mObjectID, rStoreFilename, NULL, + &rParams, + &(rParams.mrRunStatusProvider))); // Send to store std::auto_ptr<BackupProtocolClientSuccess> stored( diff --git a/bin/bbackupd/BackupClientDirectoryRecord.h b/bin/bbackupd/BackupClientDirectoryRecord.h index 472005b6..9a9cd2cb 100644 --- a/bin/bbackupd/BackupClientDirectoryRecord.h +++ b/bin/bbackupd/BackupClientDirectoryRecord.h @@ -13,10 +13,12 @@ #include <string> #include <map> -#include "BoxTime.h" #include "BackupClientFileAttributes.h" #include "BackupStoreDirectory.h" +#include "BoxTime.h" #include "MD5Digest.h" +#include "ReadLoggingStream.h" +#include "RunStatusProvider.h" class Archive; class BackupClientContext; @@ -25,6 +27,21 @@ class BackupDaemon; // -------------------------------------------------------------------------- // // Class +// Name: SysadminNotifier +// Purpose: Provides a NotifySysadmin() method to send mail to the sysadmin +// Created: 2005/11/15 +// +// -------------------------------------------------------------------------- +class SysadminNotifier +{ + public: + virtual ~SysadminNotifier() { } + virtual void NotifySysadmin(int Event) = 0; +}; + +// -------------------------------------------------------------------------- +// +// Class // Name: ProgressNotifier // Purpose: Provides methods for the backup library to inform the user // interface about its progress with the backup @@ -37,6 +54,7 @@ class ProgressNotifier { public: virtual ~ProgressNotifier() { } + virtual void NotifyIDMapsSetup(BackupClientContext& rContext) = 0; virtual void NotifyScanDirectory( const BackupClientDirectoryRecord* pDirRecord, const std::string& rLocalPath) = 0; @@ -102,6 +120,11 @@ class ProgressNotifier virtual void NotifyFileDeleted( int64_t ObjectID, const std::string& rRemotePath) = 0; + virtual void NotifyReadProgress(int64_t readSize, int64_t offset, + int64_t length, box_time_t elapsed, box_time_t finish) = 0; + virtual void NotifyReadProgress(int64_t readSize, int64_t offset, + int64_t length) = 0; + virtual void NotifyReadProgress(int64_t readSize, int64_t offset) = 0; }; // -------------------------------------------------------------------------- @@ -138,11 +161,13 @@ public: // Created: 8/3/04 // // -------------------------------------------------------------------------- - class SyncParams + class SyncParams : public ReadLoggingStream::Logger { public: SyncParams( - BackupDaemon &rDaemon, + RunStatusProvider &rRunStatusProvider, + SysadminNotifier &rSysadminNotifier, + ProgressNotifier &rProgressNotifier, BackupClientContext &rContext); ~SyncParams(); private: @@ -158,13 +183,43 @@ public: box_time_t mMaxFileTimeInFuture; int32_t mFileTrackingSizeThreshold; int32_t mDiffingUploadSizeThreshold; - BackupDaemon &mrDaemon; + RunStatusProvider &mrRunStatusProvider; + SysadminNotifier &mrSysadminNotifier; + ProgressNotifier &mrProgressNotifier; BackupClientContext &mrContext; bool mReadErrorsOnFilesystemObjects; // Member variables modified by syncing process box_time_t mUploadAfterThisTimeInTheFuture; bool mHaveLoggedWarningAboutFutureFileTimes; + + bool StopRun() { return mrRunStatusProvider.StopRun(); } + void NotifySysadmin(int Event) + { + mrSysadminNotifier.NotifySysadmin(Event); + } + ProgressNotifier& GetProgressNotifier() const + { + return mrProgressNotifier; + } + + /* ReadLoggingStream::Logger implementation */ + virtual void Log(int64_t readSize, int64_t offset, + int64_t length, box_time_t elapsed, box_time_t finish) + { + mrProgressNotifier.NotifyReadProgress(readSize, offset, + length, elapsed, finish); + } + virtual void Log(int64_t readSize, int64_t offset, + int64_t length) + { + mrProgressNotifier.NotifyReadProgress(readSize, offset, + length); + } + virtual void Log(int64_t readSize, int64_t offset) + { + mrProgressNotifier.NotifyReadProgress(readSize, offset); + } }; void SyncDirectory(SyncParams &rParams, diff --git a/bin/bbackupd/BackupDaemon.cpp b/bin/bbackupd/BackupDaemon.cpp index fe5fa35f..06e23728 100644 --- a/bin/bbackupd/BackupDaemon.cpp +++ b/bin/bbackupd/BackupDaemon.cpp @@ -49,34 +49,33 @@ #include "SSLLib.h" -#include "BackupDaemon.h" -#include "BackupDaemonConfigVerify.h" +#include "autogen_BackupProtocolClient.h" +#include "autogen_ClientException.h" +#include "autogen_ConversionException.h" +#include "Archive.h" #include "BackupClientContext.h" +#include "BackupClientCryptoKeys.h" #include "BackupClientDirectoryRecord.h" -#include "BackupStoreDirectory.h" #include "BackupClientFileAttributes.h" -#include "BackupStoreFilenameClear.h" #include "BackupClientInodeToIDMap.h" -#include "autogen_BackupProtocolClient.h" -#include "autogen_ConversionException.h" -#include "BackupClientCryptoKeys.h" -#include "BannerText.h" +#include "BackupClientMakeExcludeList.h" +#include "BackupDaemon.h" +#include "BackupDaemonConfigVerify.h" +#include "BackupStoreConstants.h" +#include "BackupStoreDirectory.h" +#include "BackupStoreException.h" #include "BackupStoreFile.h" -#include "Random.h" +#include "BackupStoreFilenameClear.h" +#include "BannerText.h" +#include "Conversion.h" #include "ExcludeList.h" -#include "BackupClientMakeExcludeList.h" -#include "IOStreamGetLine.h" -#include "Utils.h" #include "FileStream.h" -#include "BackupStoreException.h" -#include "BackupStoreConstants.h" -#include "LocalProcessStream.h" #include "IOStreamGetLine.h" -#include "Conversion.h" -#include "Archive.h" -#include "Timer.h" +#include "LocalProcessStream.h" #include "Logging.h" -#include "autogen_ClientException.h" +#include "Random.h" +#include "Timer.h" +#include "Utils.h" #ifdef WIN32 #include "Win32ServiceFunctions.h" @@ -122,13 +121,23 @@ unsigned int WINAPI HelperThread(LPVOID lpParam) // -------------------------------------------------------------------------- BackupDaemon::BackupDaemon() : mState(BackupDaemon::State_Initialising), + mDeleteRedundantLocationsAfter(0), mpCommandSocketInfo(0), mDeleteUnusedRootDirEntriesAfter(0), mClientStoreMarker(BackupClientContext::ClientStoreMarker_NotKnown), mStorageLimitExceeded(false), mReadErrorsOnFilesystemObjects(false), mLastSyncTime(0), - mLogAllFileAccess(false) + mNextSyncTime(0), + mCurrentSyncStartTime(0), + mUpdateStoreInterval(0), + mDeleteStoreObjectInfoFile(false), + mDoSyncForcedByPreviousSyncError(false), + mLogAllFileAccess(false), + mpProgressNotifier(this), + mpLocationResolver(this), + mpRunStatusProvider(this), + mpSysadminNotifier(this) #ifdef WIN32 , mInstallService(false), mRemoveService(false), @@ -1078,14 +1087,14 @@ void BackupDaemon::RunSyncNow() // just connect, as this may be unnecessary) BackupClientContext clientContext ( - *this, + *mpLocationResolver, mTlsContext, conf.GetKeyValue("StoreHostname"), conf.GetKeyValueInt("StorePort"), conf.GetKeyValueInt("AccountNumber"), conf.GetKeyValueBool("ExtendedLogging"), conf.KeyExists("ExtendedLogFile"), - extendedLogFile, *this + extendedLogFile, *mpProgressNotifier ); // The minimum age a file needs to be before it will be @@ -1158,8 +1167,8 @@ void BackupDaemon::RunSyncNow() } // Set up the sync parameters - BackupClientDirectoryRecord::SyncParams params( - *this, clientContext); + BackupClientDirectoryRecord::SyncParams params(*mpRunStatusProvider, + *mpSysadminNotifier, *mpProgressNotifier, clientContext); params.mSyncPeriodStart = syncPeriodStart; params.mSyncPeriodEnd = syncPeriodEndExtended; // use potentially extended end time @@ -1214,6 +1223,8 @@ void BackupDaemon::RunSyncNow() SetupLocations(clientContext, locations); } + mpProgressNotifier->NotifyIDMapsSetup(clientContext); + // Get some ID maps going SetupIDMapsForSync(); diff --git a/bin/bbackupd/BackupDaemon.h b/bin/bbackupd/BackupDaemon.h index ff1839db..f7d61838 100644 --- a/bin/bbackupd/BackupDaemon.h +++ b/bin/bbackupd/BackupDaemon.h @@ -14,6 +14,7 @@ #include <string> #include <memory> +#include "BackupClientContext.h" #include "BackupClientDirectoryRecord.h" #include "BoxTime.h" #include "Daemon.h" @@ -45,7 +46,8 @@ class Archive; // Created: 2003/10/08 // // -------------------------------------------------------------------------- -class BackupDaemon : public Daemon, ProgressNotifier +class BackupDaemon : public Daemon, ProgressNotifier, LocationResolver, +RunStatusProvider, SysadminNotifier { public: BackupDaemon(); @@ -153,7 +155,7 @@ private: int UseScriptToSeeIfSyncAllowed(); -private: +public: class Location { public: @@ -173,7 +175,11 @@ private: ExcludeList *mpExcludeFiles; ExcludeList *mpExcludeDirs; }; - + + typedef const std::vector<Location *> Locations; + Locations GetLocations() { return mLocations; } + +private: int mState; // what the daemon is currently doing std::vector<Location *> mLocations; @@ -229,8 +235,26 @@ public: private: bool mLogAllFileAccess; +public: + ProgressNotifier* GetProgressNotifier() { return mpProgressNotifier; } + LocationResolver* GetLocationResolver() { return mpLocationResolver; } + RunStatusProvider* GetRunStatusProvider() { return mpRunStatusProvider; } + SysadminNotifier* GetSysadminNotifier() { return mpSysadminNotifier; } + void SetProgressNotifier (ProgressNotifier* p) { mpProgressNotifier = p; } + void SetLocationResolver (LocationResolver* p) { mpLocationResolver = p; } + void SetRunStatusProvider(RunStatusProvider* p) { mpRunStatusProvider = p; } + void SetSysadminNotifier (SysadminNotifier* p) { mpSysadminNotifier = p; } + +private: + ProgressNotifier* mpProgressNotifier; + LocationResolver* mpLocationResolver; + RunStatusProvider* mpRunStatusProvider; + SysadminNotifier* mpSysadminNotifier; + /* ProgressNotifier implementation */ public: + virtual void NotifyIDMapsSetup(BackupClientContext& rContext) { } + virtual void NotifyScanDirectory( const BackupClientDirectoryRecord* pDirRecord, const std::string& rLocalPath) @@ -467,6 +491,24 @@ public: ")"); } } + virtual void NotifyReadProgress(int64_t readSize, int64_t offset, + int64_t length, box_time_t elapsed, box_time_t finish) + { + BOX_TRACE("Read " << readSize << " bytes at " << offset << + ", " << (length - offset) << " remain, eta " << + BoxTimeToSeconds(finish - elapsed) << "s"); + } + virtual void NotifyReadProgress(int64_t readSize, int64_t offset, + int64_t length) + { + BOX_TRACE("Read " << readSize << " bytes at " << offset << + ", " << (length - offset) << " remain"); + } + virtual void NotifyReadProgress(int64_t readSize, int64_t offset) + { + BOX_TRACE("Read " << readSize << " bytes at " << offset << + ", unknown bytes remaining"); + } #ifdef WIN32 public: |