Remove commentsand downtimes with reference to deleted checkable objects

Silence the warning message and change the log level to notice as well.

fixes #10717
This commit is contained in:
Michael Friedrich 2016-03-31 13:29:08 +02:00 committed by Gunnar Beutner
parent e0d1c2f020
commit 7c7a4c3a65
3 changed files with 42 additions and 5 deletions

View File

@ -24,6 +24,7 @@
#include "config/configcompiler.hpp"
#include "config/configcompilercontext.hpp"
#include "config/configitembuilder.hpp"
#include "remote/configobjectutility.hpp"
using namespace icinga;
@ -168,6 +169,9 @@ bool DaemonUtility::LoadConfigFiles(const std::vector<std::string>& configs,
WorkQueue upq(25000, Application::GetConcurrency());
bool result = ConfigItem::CommitItems(ascope.GetContext(), upq, newItems);
/* Remove ignored Downtime/Comment objects. */
ConfigItem::RemoveIgnoredItems(ConfigObjectUtility::GetConfigDir());
if (!result)
return false;

View File

@ -44,6 +44,7 @@ using namespace icinga;
boost::mutex ConfigItem::m_Mutex;
ConfigItem::TypeMap ConfigItem::m_Items;
ConfigItem::ItemList ConfigItem::m_UnnamedItems;
ConfigItem::IgnoredItemList ConfigItem::m_IgnoredItems;
REGISTER_SCRIPTFUNCTION(__run_with_activation_context, &ConfigItem::RunWithActivationContext);
@ -190,9 +191,11 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard)
m_Expression->Evaluate(frame, &debugHints);
} catch (const std::exception& ex) {
if (m_IgnoreOnError) {
Log(LogWarning, "ConfigObject")
Log(LogNotice, "ConfigObject")
<< "Ignoring config object '" << m_Name << "' of type '" << m_Type << "' due to errors: " << DiagnosticInformation(ex);
m_IgnoredItems.push_back(m_DebugInfo.Path);
return ConfigObject::Ptr();
}
@ -234,9 +237,11 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard)
dobj->Validate(FAConfig, utils);
} catch (ValidationError& ex) {
if (m_IgnoreOnError) {
Log(LogWarning, "ConfigObject")
Log(LogNotice, "ConfigObject")
<< "Ignoring config object '" << m_Name << "' of type '" << m_Type << "' due to errors: " << DiagnosticInformation(ex);
m_IgnoredItems.push_back(m_DebugInfo.Path);
return ConfigObject::Ptr();
}
@ -248,9 +253,11 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard)
dobj->OnConfigLoaded();
} catch (const std::exception& ex) {
if (m_IgnoreOnError) {
Log(LogWarning, "ConfigObject")
Log(LogNotice, "ConfigObject")
<< "Ignoring config object '" << m_Name << "' of type '" << m_Type << "' due to errors: " << DiagnosticInformation(ex);
m_IgnoredItems.push_back(m_DebugInfo.Path);
return ConfigObject::Ptr();
}
@ -359,11 +366,13 @@ void ConfigItem::OnAllConfigLoadedHelper(void)
m_Object->OnAllConfigLoaded();
} catch (const std::exception& ex) {
if (m_IgnoreOnError) {
Log(LogWarning, "ConfigObject")
Log(LogNotice, "ConfigObject")
<< "Ignoring config object '" << m_Name << "' of type '" << m_Type << "' due to errors: " << DiagnosticInformation(ex);
Unregister();
m_IgnoredItems.push_back(m_DebugInfo.Path);
return;
}
@ -630,3 +639,23 @@ std::vector<ConfigItem::Ptr> ConfigItem::GetItems(const String& type)
return items;
}
void ConfigItem::RemoveIgnoredItems(const String& allowedConfigPath)
{
BOOST_FOREACH(const String& path, m_IgnoredItems) {
if (path.Find(allowedConfigPath) == String::NPos)
continue;
Log(LogNotice, "ConfigItem")
<< "Removing ignored item path '" << path << "'.";
if (unlink(path.CStr()) < 0) {
BOOST_THROW_EXCEPTION(posix_error()
<< boost::errinfo_api_function("unlink")
<< boost::errinfo_errno(errno)
<< boost::errinfo_file_name(path));
}
}
m_IgnoredItems.clear();
}

View File

@ -75,6 +75,8 @@ public:
static std::vector<ConfigItem::Ptr> GetItems(const String& type);
static void RemoveIgnoredItems(const String& allowedConfigPath);
private:
String m_Type; /**< The object type. */
String m_Name; /**< The name. */
@ -99,7 +101,9 @@ private:
typedef std::vector<ConfigItem::Ptr> ItemList;
static ItemList m_UnnamedItems;
static ItemList m_CommittedItems;
typedef std::vector<String> IgnoredItemList;
static IgnoredItemList m_IgnoredItems;
static ConfigItem::Ptr GetObjectUnlocked(const String& type,
const String& name);