Config packages: Catch active stage exceptions in rare cases

Typically this already is detected on startup.
This commit is contained in:
Michael Friedrich 2019-05-08 16:43:27 +02:00
parent 704aabcb63
commit 03324b2fb6
2 changed files with 29 additions and 4 deletions

View File

@ -16,6 +16,7 @@ using namespace icinga;
String ConfigObjectUtility::GetConfigDir() String ConfigObjectUtility::GetConfigDir()
{ {
/* This may throw an exception the caller above must handle. */
return ConfigPackageUtility::GetPackageDir() + "/_api/" + return ConfigPackageUtility::GetPackageDir() + "/_api/" +
ConfigPackageUtility::GetActiveStage("_api"); ConfigPackageUtility::GetActiveStage("_api");
} }
@ -25,7 +26,10 @@ String ConfigObjectUtility::GetObjectConfigPath(const Type::Ptr& type, const Str
String typeDir = type->GetPluralName(); String typeDir = type->GetPluralName();
boost::algorithm::to_lower(typeDir); boost::algorithm::to_lower(typeDir);
return GetConfigDir() + "/conf.d/" + typeDir + /* This may throw an exception the caller above must handle. */
String prefix = GetConfigDir();
return prefix + "/conf.d/" + typeDir +
"/" + EscapeName(fullName) + ".conf"; "/" + EscapeName(fullName) + ".conf";
} }
@ -102,7 +106,15 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full
return false; return false;
} }
String path = GetObjectConfigPath(type, fullName); String path;
try {
path = GetObjectConfigPath(type, fullName);
} catch (const std::exception& ex) {
errors->Add("Config package broken: " + DiagnosticInformation(ex, false));
return false;
}
Utility::MkDirP(Utility::DirName(path), 0700); Utility::MkDirP(Utility::DirName(path), 0700);
std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc); std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc);
@ -216,7 +228,14 @@ bool ConfigObjectUtility::DeleteObjectHelper(const ConfigObject::Ptr& object, bo
return false; return false;
} }
String path = GetObjectConfigPath(object->GetReflectionType(), name); String path;
try {
path = GetObjectConfigPath(object->GetReflectionType(), name);
} catch (const std::exception& ex) {
errors->Add("Config package broken: " + DiagnosticInformation(ex, false));
return false;
}
Utility::Remove(path); Utility::Remove(path);

View File

@ -66,10 +66,16 @@ void ConfigPackagesHandler::HandleGet(
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex()); boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex());
for (const String& package : packages) { for (const String& package : packages) {
String activeStage;
try {
activeStage = ConfigPackageUtility::GetActiveStage(package);
} catch (const std::exception&) { } /* Should never happen. */
results.emplace_back(new Dictionary({ results.emplace_back(new Dictionary({
{ "name", package }, { "name", package },
{ "stages", Array::FromVector(ConfigPackageUtility::GetStages(package)) }, { "stages", Array::FromVector(ConfigPackageUtility::GetStages(package)) },
{ "active-stage", ConfigPackageUtility::GetActiveStage(package) } { "active-stage", activeStage }
})); }));
} }
} }