|
|
@@ -35,20 +35,20 @@
|
|
|
prog: archiving backup
|
|
|
%% Beschreibung Parameter
|
|
|
% symbolischerName, Art, Typ, Variablenname, Erklärung, Default-Wert
|
|
|
- para: vault_or_group, required, string, vault, Vault to backup
|
|
|
+ para: vault_or_group, required, string, vault_or_group, Vault to backup
|
|
|
%% Beschreibung der Optionen
|
|
|
% kurz-Option, lang-Option, Typ, Variablenname, Erklärung, Default-Wert
|
|
|
opt: c, masterconfig, string, masterConfig, Master config file, ""
|
|
|
opt2: if not given or empty kind looks for
|
|
|
+ opt2: /etc/kind.master
|
|
|
opt2: /etc/kind/master.conf
|
|
|
- opt2: /ffp/etc/kind/master.conf
|
|
|
opt: f, full, void, fullImage, Force full image == initial backup, false
|
|
|
opt: B, backup, void, doBackup, Backup, false
|
|
|
opt: E, expire, void, doExpire, Expire, false
|
|
|
opt: C, listconfig, void, listConfig, Show configuration, false
|
|
|
opt: I, listimages, void, listImages, List data of images, false
|
|
|
- opt2: if none of backup, expire, listconfig and listimages is specified,
|
|
|
- opt2: backup and expire is assumed.
|
|
|
+ opt: V, vaultlist, void, listVault, List vault director[y|ies], false
|
|
|
+ opt2: if no action is given, backup and expire is assumed.
|
|
|
opt2: listconfig and listimages cannot be combined with other actions
|
|
|
opt: D, dryrun, Void, dryRun, Dry run (no real backup), false
|
|
|
opt: F, forcebackup, string, forcedBackupSet, Create image for specified backup set, ""
|
|
|
@@ -122,22 +122,21 @@ void debugPrint(const string& text)
|
|
|
cout << " " << text << endl;
|
|
|
}
|
|
|
|
|
|
-void readMasterConfig1(const string& fn, KindConfig& conf)
|
|
|
-{
|
|
|
- verbosePrint("reading master config " + fn);
|
|
|
- conf.addFile(fn);
|
|
|
-}
|
|
|
-
|
|
|
-void readMasterConfig(const string& fn, KindConfig& conf)
|
|
|
+void readMasterConfig(string fn, KindConfig& conf)
|
|
|
{
|
|
|
if (!fn.empty()) // master config given by user on commandline
|
|
|
- readMasterConfig1(fn, conf);
|
|
|
- else if (fileExists("/etc/kind/master.conf"))
|
|
|
- readMasterConfig1("/etc/kind/master.conf", conf);
|
|
|
- else if (fileExists("/ffp/etc/kind/master.conf"))
|
|
|
- readMasterConfig1("/ffp/etc/kind/master.conf", conf);
|
|
|
+ conf.addFile(fn);
|
|
|
else
|
|
|
- throw Exception("MasterConfig", "no file");
|
|
|
+ {
|
|
|
+ vector<string> fns
|
|
|
+ {
|
|
|
+ "/etc/kind/master.conf",
|
|
|
+ "/etc/kind.master"
|
|
|
+ };
|
|
|
+ int i = conf.addOneFile(fns);
|
|
|
+ fn = fns[i];
|
|
|
+ }
|
|
|
+ verbosePrint("Read master config " + fn);
|
|
|
}
|
|
|
|
|
|
string findVault(const string& v)
|
|
|
@@ -161,10 +160,14 @@ void readVaultConfig(const string& vault, KindConfig& conf)
|
|
|
{
|
|
|
string vaultPath = findVault(vault);
|
|
|
|
|
|
- const string& vaultConfigName = vaultPath + '/' + conf.getString("vaultConfigName");
|
|
|
- verbosePrint("reading vault config:");
|
|
|
- verbosePrint(" " + vaultConfigName);
|
|
|
- conf.addFile(vaultConfigName);
|
|
|
+ Strings configNames = conf.getStrings("vaultConfigName");
|
|
|
+
|
|
|
+ vector<string> vaultConfigNames;
|
|
|
+ for (auto name : configNames)
|
|
|
+ vaultConfigNames.push_back(vaultPath + '/' + name);
|
|
|
+
|
|
|
+ int i = conf.addOneFile(vaultConfigNames);
|
|
|
+ verbosePrint("Read vault config " + vaultConfigNames[i]);
|
|
|
|
|
|
// postprocessing
|
|
|
|
|
|
@@ -251,7 +254,7 @@ Images findImages(const string& vaultpath, const KindConfig& conf, bool alsoInva
|
|
|
}
|
|
|
|
|
|
void listImageInfo(const string& vault,
|
|
|
- KindConfig conf /*Copy!*/ ,
|
|
|
+ KindConfig conf /*Copy!*/,
|
|
|
const DateTime& imageTime,
|
|
|
const string& backupSet)
|
|
|
{
|
|
|
@@ -329,7 +332,7 @@ void doBackup(const string& vault,
|
|
|
if (!dryRun)
|
|
|
{
|
|
|
ofstream error(errorfile);
|
|
|
- error << "failed" << endl;
|
|
|
+ error << "rsync not successfully completed" << endl;
|
|
|
error.close();
|
|
|
}
|
|
|
|
|
|
@@ -383,8 +386,8 @@ void doBackup(const string& vault,
|
|
|
int rc;
|
|
|
backupResult = localExec(rsyncCmd, rc, debug, imageFullName + "/rsync-log");
|
|
|
if (rc == 0 || // "no error"
|
|
|
- rc == 24 || // "vanished source files" (ignored)
|
|
|
- rc == 6144) // workaround for wrong exit code ??!!
|
|
|
+ rc == 24 // "vanished source files" (ignored)
|
|
|
+ )
|
|
|
{
|
|
|
unlink(errorfile.c_str());
|
|
|
double st = 0;
|
|
|
@@ -406,7 +409,7 @@ void doBackup(const string& vault,
|
|
|
}
|
|
|
|
|
|
bool backupVault(const string& vault,
|
|
|
- KindConfig conf /*Copy!*/ ,
|
|
|
+ KindConfig conf /*Copy!*/,
|
|
|
const DateTime& imageTime,
|
|
|
bool fullImage,
|
|
|
const string& forcedBackupSet)
|
|
|
@@ -425,6 +428,9 @@ bool backupVault(const string& vault,
|
|
|
|
|
|
bool backupNow = true;
|
|
|
|
|
|
+ if (conf.getString("path").empty()) // empty path string disables backup
|
|
|
+ backupNow = false;
|
|
|
+
|
|
|
// existing images
|
|
|
Images validImageList = findImages(vaultPath, conf, false);
|
|
|
string currentSet = "expire"; // we are not using backupSets
|
|
|
@@ -435,7 +441,7 @@ bool backupVault(const string& vault,
|
|
|
vector<SetRule> backupSetRule;
|
|
|
int setRuleIdx = -1;
|
|
|
|
|
|
- if (conf.getBool("useBackupSet"))
|
|
|
+ if (conf.getBool("useBackupSet") && backupNow)
|
|
|
{
|
|
|
readSetRules(conf, setIdx, backupSetRule);
|
|
|
if (!setIdx.empty())
|
|
|
@@ -579,7 +585,7 @@ bool backupVault(const string& vault,
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- cerr << "Exception in vault " << vault << ": " << ex.what() << endl;
|
|
|
+ cerr << EXCEPTION + " in vault " << vault << ": " << ex.what() << endl;
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -642,7 +648,7 @@ void expireVault(const string& vault, KindConfig conf, DateTime now)
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- cerr << "Exception: " << ex.what() << endl;
|
|
|
+ cerr << EXCEPTION + ": " << ex.what() << endl;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -676,6 +682,7 @@ int main(int argc, char* argv[])
|
|
|
// default-values
|
|
|
conf.addString("imageName", "image");
|
|
|
conf.addString("vaultConfigName", "kind/vault.conf");
|
|
|
+ conf.addString("vaultConfigName", "vault.conf");
|
|
|
conf.addString("expireFailedImage", "3 days");
|
|
|
conf.addString("expireRule", "* * * * 1 month");
|
|
|
conf.addString("ping", "ping -c 1 -W 5 %host");
|
|
|
@@ -702,22 +709,22 @@ int main(int argc, char* argv[])
|
|
|
throw Exception("read master configuration", "no banks defined");
|
|
|
|
|
|
vector<string> vaults;
|
|
|
- string groupname = "group_" + vault;
|
|
|
+ string groupname = "group_" + vault_or_group;
|
|
|
if (conf.hasKey(groupname))
|
|
|
{
|
|
|
vaults = conf.getStrings(groupname);
|
|
|
- vault.clear(); // no single vault but group
|
|
|
+ vault_or_group.clear(); // no single vault but group
|
|
|
}
|
|
|
else
|
|
|
- vaults.push_back(vault);
|
|
|
+ vaults.push_back(vault_or_group);
|
|
|
|
|
|
if (listConfig)
|
|
|
{
|
|
|
cout << "global config:" << endl;
|
|
|
conf.print(". ");
|
|
|
- if (!vault.empty())
|
|
|
+ if (!vault_or_group.empty())
|
|
|
{
|
|
|
- readVaultConfig(vault, conf);
|
|
|
+ readVaultConfig(vault_or_group, conf);
|
|
|
cout << "vault config:" << endl;
|
|
|
conf.print(". ");
|
|
|
}
|
|
|
@@ -735,6 +742,16 @@ int main(int argc, char* argv[])
|
|
|
exit(0);
|
|
|
}
|
|
|
|
|
|
+ if (listVault)
|
|
|
+ {
|
|
|
+ sort(vaults.begin(), vaults.end());
|
|
|
+ for (string vault : vaults)
|
|
|
+ {
|
|
|
+ string vaultPath = findVault(vault);
|
|
|
+ cout << vaultPath << endl;
|
|
|
+ }
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
// previous actions do not need locking
|
|
|
lockFile = conf.getString("lockfile");
|
|
|
createLock(lockFile);
|
|
|
@@ -769,17 +786,17 @@ int main(int argc, char* argv[])
|
|
|
}
|
|
|
catch (const Exception& ex)
|
|
|
{
|
|
|
- cerr << "Exception: " << ex.what() << endl;
|
|
|
+ cerr << EXCEPTION + ": " << ex.what() << endl;
|
|
|
exitCode = 1;
|
|
|
}
|
|
|
catch (const char* msg)
|
|
|
{
|
|
|
- cerr << "Exception(char*): " << msg << endl;
|
|
|
+ cerr << EXCEPTION + ": " << msg << endl;
|
|
|
exitCode = 1;
|
|
|
}
|
|
|
catch (const string& msg)
|
|
|
{
|
|
|
- cerr << "Exception(string): " << msg << endl;
|
|
|
+ cerr << EXCEPTION + ": " << msg << endl;
|
|
|
exitCode = 1;
|
|
|
}
|
|
|
removeLock(lockFile);
|