summaryrefslogtreecommitdiff
path: root/lib/backupstore
diff options
context:
space:
mode:
authorChris Wilson <chris+github@qwirx.com>2015-06-28 19:36:47 +0000
committerChris Wilson <chris+github@qwirx.com>2015-06-28 19:36:47 +0000
commit66e4d036cea1eac39394c9064f50eee5c993926a (patch)
treeec47cc9ad7f593082c50e7ca83d8fa303dfdb1ec /lib/backupstore
parent0c41e85dbbaccf0ed07c0277d64d37f0af380be2 (diff)
Refactor store account control to allow other store types.
Move common code into a base class, leaving bbstored-specific code. Add skeleton of an S3 store type.
Diffstat (limited to 'lib/backupstore')
-rw-r--r--lib/backupstore/BackupAccountControl.cpp131
-rw-r--r--lib/backupstore/BackupAccountControl.h56
-rw-r--r--lib/backupstore/BackupStoreAccounts.cpp125
-rw-r--r--lib/backupstore/BackupStoreAccounts.h15
4 files changed, 198 insertions, 129 deletions
diff --git a/lib/backupstore/BackupAccountControl.cpp b/lib/backupstore/BackupAccountControl.cpp
new file mode 100644
index 00000000..6fbbc30e
--- /dev/null
+++ b/lib/backupstore/BackupAccountControl.cpp
@@ -0,0 +1,131 @@
+// --------------------------------------------------------------------------
+//
+// File
+// Name: BackupAccountControl.cpp
+// Purpose: Client-side account management for Amazon S3 stores
+// Created: 2015/06/27
+//
+// --------------------------------------------------------------------------
+
+#include "Box.h"
+
+#include <climits>
+#include <iostream>
+
+#include "BackupAccountControl.h"
+#include "BackupStoreInfo.h"
+#include "Configuration.h"
+
+#include "MemLeakFindOn.h"
+
+void BackupAccountControl::CheckSoftHardLimits(int64_t SoftLimit, int64_t HardLimit)
+{
+ if(SoftLimit > HardLimit)
+ {
+ BOX_FATAL("Soft limit must be less than the hard limit.");
+ exit(1);
+ }
+ if(SoftLimit > ((HardLimit * MAX_SOFT_LIMIT_SIZE) / 100))
+ {
+ BOX_WARNING("We recommend setting the soft limit below " <<
+ MAX_SOFT_LIMIT_SIZE << "% of the hard limit, or " <<
+ HumanReadableSize((HardLimit * MAX_SOFT_LIMIT_SIZE)
+ / 100) << " in this case.");
+ }
+}
+
+int64_t BackupAccountControl::SizeStringToBlocks(const char *string, int blockSize)
+{
+ // Get number
+ char *endptr = (char*)string;
+ int64_t number = strtol(string, &endptr, 0);
+ if(endptr == string || number == LONG_MIN || number == LONG_MAX)
+ {
+ BOX_FATAL("'" << string << "' is not a valid number.");
+ exit(1);
+ }
+
+ // Check units
+ switch(*endptr)
+ {
+ case 'M':
+ case 'm':
+ // Units: Mb
+ return (number * 1024*1024) / blockSize;
+ break;
+
+ case 'G':
+ case 'g':
+ // Units: Gb
+ return (number * 1024*1024*1024) / blockSize;
+ break;
+
+ case 'B':
+ case 'b':
+ // Units: Blocks
+ // Easy! Just return the number specified.
+ return number;
+ break;
+
+ default:
+ BOX_FATAL(string << " has an invalid units specifier "
+ "(use B for blocks, M for MB, G for GB, eg 2GB)");
+ exit(1);
+ break;
+ }
+}
+
+std::string BackupAccountControl::BlockSizeToString(int64_t Blocks, int64_t MaxBlocks, int BlockSize)
+{
+ return FormatUsageBar(Blocks, Blocks * BlockSize, MaxBlocks * BlockSize,
+ mMachineReadableOutput);
+}
+
+int BackupAccountControl::PrintAccountInfo(const BackupStoreInfo& info,
+ int BlockSize)
+{
+ // Then print out lots of info
+ std::cout << FormatUsageLineStart("Account ID", mMachineReadableOutput) <<
+ BOX_FORMAT_ACCOUNT(info.GetAccountID()) << std::endl;
+ std::cout << FormatUsageLineStart("Account Name", mMachineReadableOutput) <<
+ info.GetAccountName() << std::endl;
+ std::cout << FormatUsageLineStart("Last object ID", mMachineReadableOutput) <<
+ BOX_FORMAT_OBJECTID(info.GetLastObjectIDUsed()) << std::endl;
+ std::cout << FormatUsageLineStart("Used", mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksUsed(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Current files",
+ mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksInCurrentFiles(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Old files", mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksInOldFiles(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Deleted files", mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksInDeletedFiles(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Directories", mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksInDirectories(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Soft limit", mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksSoftLimit(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Hard limit", mMachineReadableOutput) <<
+ BlockSizeToString(info.GetBlocksHardLimit(),
+ info.GetBlocksHardLimit(), BlockSize) << std::endl;
+ std::cout << FormatUsageLineStart("Client store marker", mMachineReadableOutput) <<
+ info.GetClientStoreMarker() << std::endl;
+ std::cout << FormatUsageLineStart("Current Files", mMachineReadableOutput) <<
+ info.GetNumCurrentFiles() << std::endl;
+ std::cout << FormatUsageLineStart("Old Files", mMachineReadableOutput) <<
+ info.GetNumOldFiles() << std::endl;
+ std::cout << FormatUsageLineStart("Deleted Files", mMachineReadableOutput) <<
+ info.GetNumDeletedFiles() << std::endl;
+ std::cout << FormatUsageLineStart("Directories", mMachineReadableOutput) <<
+ info.GetNumDirectories() << std::endl;
+ std::cout << FormatUsageLineStart("Enabled", mMachineReadableOutput) <<
+ (info.IsAccountEnabled() ? "yes" : "no") << std::endl;
+
+ return 0;
+}
+
diff --git a/lib/backupstore/BackupAccountControl.h b/lib/backupstore/BackupAccountControl.h
new file mode 100644
index 00000000..27075c99
--- /dev/null
+++ b/lib/backupstore/BackupAccountControl.h
@@ -0,0 +1,56 @@
+// --------------------------------------------------------------------------
+//
+// File
+// Name: BackupAccountControl.h
+// Purpose: Client-side account management for Amazon S3 stores
+// Created: 2015/06/27
+//
+// --------------------------------------------------------------------------
+
+#ifndef BACKUPACCOUNTCONTROL__H
+#define BACKUPACCOUNTCONTROL__H
+
+#include <string>
+
+#include "BackupStoreAccountDatabase.h"
+#include "S3Client.h"
+#include "NamedLock.h"
+
+class BackupStoreInfo;
+class Configuration;
+
+class BackupAccountControl
+{
+protected:
+ const Configuration& mConfig;
+ bool mMachineReadableOutput;
+
+public:
+ BackupAccountControl(const Configuration& config,
+ bool machineReadableOutput = false)
+ : mConfig(config),
+ mMachineReadableOutput(machineReadableOutput)
+ { }
+ void CheckSoftHardLimits(int64_t SoftLimit, int64_t HardLimit);
+ int64_t SizeStringToBlocks(const char *string, int BlockSize);
+ std::string BlockSizeToString(int64_t Blocks, int64_t MaxBlocks, int BlockSize);
+ int PrintAccountInfo(const BackupStoreInfo& info, int BlockSize);
+};
+
+class S3BackupAccountControl : public BackupAccountControl
+{
+public:
+ S3BackupAccountControl(const Configuration& config,
+ bool machineReadableOutput = false)
+ : BackupAccountControl(config, machineReadableOutput)
+ { }
+ std::string GetStoreRootURL();
+ int CreateAccount(const std::string& name, int32_t SoftLimit, int32_t HardLimit);
+ int GetBlockSize() { return 4096; }
+};
+
+// max size of soft limit as percent of hard limit
+#define MAX_SOFT_LIMIT_SIZE 97
+
+#endif // BACKUPACCOUNTCONTROL__H
+
diff --git a/lib/backupstore/BackupStoreAccounts.cpp b/lib/backupstore/BackupStoreAccounts.cpp
index d1c7430f..6650b12a 100644
--- a/lib/backupstore/BackupStoreAccounts.cpp
+++ b/lib/backupstore/BackupStoreAccounts.cpp
@@ -209,28 +209,6 @@ void BackupStoreAccounts::LockAccount(int32_t ID, NamedLock& rNamedLock)
}
}
-BackupStoreAccountsControl::BackupStoreAccountsControl(
- const Configuration& config, bool machineReadableOutput)
-: mConfig(config),
- mMachineReadableOutput(machineReadableOutput)
-{ }
-
-void BackupStoreAccountsControl::CheckSoftHardLimits(int64_t SoftLimit, int64_t HardLimit)
-{
- if(SoftLimit > HardLimit)
- {
- BOX_FATAL("Soft limit must be less than the hard limit.");
- exit(1);
- }
- if(SoftLimit > ((HardLimit * MAX_SOFT_LIMIT_SIZE) / 100))
- {
- BOX_WARNING("We recommend setting the soft limit below " <<
- MAX_SOFT_LIMIT_SIZE << "% of the hard limit, or " <<
- HumanReadableSize((HardLimit * MAX_SOFT_LIMIT_SIZE)
- / 100) << " in this case.");
- }
-}
-
int BackupStoreAccountsControl::BlockSizeOfDiscSet(int discSetNum)
{
// Get controller, check disc set number
@@ -245,57 +223,6 @@ int BackupStoreAccountsControl::BlockSizeOfDiscSet(int discSetNum)
return controller.GetDiscSet(discSetNum).GetBlockSize();
}
-std::string BackupStoreAccountsControl::BlockSizeToString(int64_t Blocks, int64_t MaxBlocks, int discSetNum)
-{
- return FormatUsageBar(Blocks, Blocks * BlockSizeOfDiscSet(discSetNum),
- MaxBlocks * BlockSizeOfDiscSet(discSetNum),
- mMachineReadableOutput);
-}
-
-int64_t BackupStoreAccountsControl::SizeStringToBlocks(const char *string, int discSetNum)
-{
- // Find block size
- int blockSize = BlockSizeOfDiscSet(discSetNum);
-
- // Get number
- char *endptr = (char*)string;
- int64_t number = strtol(string, &endptr, 0);
- if(endptr == string || number == LONG_MIN || number == LONG_MAX)
- {
- BOX_FATAL("'" << string << "' is not a valid number.");
- exit(1);
- }
-
- // Check units
- switch(*endptr)
- {
- case 'M':
- case 'm':
- // Units: Mb
- return (number * 1024*1024) / blockSize;
- break;
-
- case 'G':
- case 'g':
- // Units: Gb
- return (number * 1024*1024*1024) / blockSize;
- break;
-
- case 'B':
- case 'b':
- // Units: Blocks
- // Easy! Just return the number specified.
- return number;
- break;
-
- default:
- BOX_FATAL(string << " has an invalid units specifier "
- "(use B for blocks, M for MB, G for GB, eg 2GB)");
- exit(1);
- break;
- }
-}
-
int BackupStoreAccountsControl::SetLimit(int32_t ID, const char *SoftLimitStr,
const char *HardLimitStr)
{
@@ -316,8 +243,9 @@ int BackupStoreAccountsControl::SetLimit(int32_t ID, const char *SoftLimitStr,
discSetNum, false /* Read/Write */));
// Change the limits
- int64_t softlimit = SizeStringToBlocks(SoftLimitStr, discSetNum);
- int64_t hardlimit = SizeStringToBlocks(HardLimitStr, discSetNum);
+ int blocksize = BlockSizeOfDiscSet(discSetNum);
+ int64_t softlimit = SizeStringToBlocks(SoftLimitStr, blocksize);
+ int64_t hardlimit = SizeStringToBlocks(HardLimitStr, blocksize);
CheckSoftHardLimits(softlimit, hardlimit);
info->ChangeLimits(softlimit, hardlimit);
@@ -377,50 +305,9 @@ int BackupStoreAccountsControl::PrintAccountInfo(int32_t ID)
// Load it in
std::auto_ptr<BackupStoreInfo> info(BackupStoreInfo::Load(ID,
rootDir, discSetNum, true /* ReadOnly */));
-
- // Then print out lots of info
- std::cout << FormatUsageLineStart("Account ID", mMachineReadableOutput) <<
- BOX_FORMAT_ACCOUNT(ID) << std::endl;
- std::cout << FormatUsageLineStart("Account Name", mMachineReadableOutput) <<
- info->GetAccountName() << std::endl;
- std::cout << FormatUsageLineStart("Last object ID", mMachineReadableOutput) <<
- BOX_FORMAT_OBJECTID(info->GetLastObjectIDUsed()) << std::endl;
- std::cout << FormatUsageLineStart("Used", mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksUsed(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Current files",
- mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksInCurrentFiles(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Old files", mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksInOldFiles(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Deleted files", mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksInDeletedFiles(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Directories", mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksInDirectories(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Soft limit", mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksSoftLimit(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Hard limit", mMachineReadableOutput) <<
- BlockSizeToString(info->GetBlocksHardLimit(),
- info->GetBlocksHardLimit(), discSetNum) << std::endl;
- std::cout << FormatUsageLineStart("Client store marker", mMachineReadableOutput) <<
- info->GetClientStoreMarker() << std::endl;
- std::cout << FormatUsageLineStart("Current Files", mMachineReadableOutput) <<
- info->GetNumCurrentFiles() << std::endl;
- std::cout << FormatUsageLineStart("Old Files", mMachineReadableOutput) <<
- info->GetNumOldFiles() << std::endl;
- std::cout << FormatUsageLineStart("Deleted Files", mMachineReadableOutput) <<
- info->GetNumDeletedFiles() << std::endl;
- std::cout << FormatUsageLineStart("Directories", mMachineReadableOutput) <<
- info->GetNumDirectories() << std::endl;
- std::cout << FormatUsageLineStart("Enabled", mMachineReadableOutput) <<
- (info->IsAccountEnabled() ? "yes" : "no") << std::endl;
-
- return 0;
+
+ return BackupAccountControl::PrintAccountInfo(*info,
+ BlockSizeOfDiscSet(discSetNum));
}
int BackupStoreAccountsControl::SetAccountEnabled(int32_t ID, bool enabled)
diff --git a/lib/backupstore/BackupStoreAccounts.h b/lib/backupstore/BackupStoreAccounts.h
index 3c2e4210..bcc3cf1c 100644
--- a/lib/backupstore/BackupStoreAccounts.h
+++ b/lib/backupstore/BackupStoreAccounts.h
@@ -13,6 +13,7 @@
#include <string>
#include "BackupStoreAccountDatabase.h"
+#include "BackupAccountControl.h"
#include "NamedLock.h"
// --------------------------------------------------------------------------
@@ -54,20 +55,14 @@ private:
class Configuration;
class UnixUser;
-class BackupStoreAccountsControl
+class BackupStoreAccountsControl : public BackupAccountControl
{
-private:
- const Configuration& mConfig;
- bool mMachineReadableOutput;
-
public:
BackupStoreAccountsControl(const Configuration& config,
- bool machineReadableOutput = false);
-
- void CheckSoftHardLimits(int64_t SoftLimit, int64_t HardLimit);
+ bool machineReadableOutput = false)
+ : BackupAccountControl(config, machineReadableOutput)
+ { }
int BlockSizeOfDiscSet(int discSetNum);
- std::string BlockSizeToString(int64_t Blocks, int64_t MaxBlocks, int discSetNum);
- int64_t SizeStringToBlocks(const char *string, int discSetNum);
bool OpenAccount(int32_t ID, std::string &rRootDirOut,
int &rDiscSetOut, std::auto_ptr<UnixUser> apUser, NamedLock* pLock);
int SetLimit(int32_t ID, const char *SoftLimitStr,