From: Michael Friedrich Date: Thu, 31 Mar 2016 11:29:08 +0000 (+0200) Subject: Remove commentsand downtimes with reference to deleted checkable objects X-Git-Tag: v2.5.0~349 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2faf121ff459cddd1715cce881fba13dc7c26a47;p=icinga2 Remove commentsand downtimes with reference to deleted checkable objects Silence the warning message and change the log level to notice as well. fixes #10717 --- diff --git a/lib/cli/daemonutility.cpp b/lib/cli/daemonutility.cpp index a6fe4555f..84470cfab 100644 --- a/lib/cli/daemonutility.cpp +++ b/lib/cli/daemonutility.cpp @@ -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& 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; diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 03ff2596a..59e58ce1d 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -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::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(); +} diff --git a/lib/config/configitem.hpp b/lib/config/configitem.hpp index 3bfb95334..b9c23d075 100644 --- a/lib/config/configitem.hpp +++ b/lib/config/configitem.hpp @@ -75,6 +75,8 @@ public: static std::vector 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 ItemList; static ItemList m_UnnamedItems; - static ItemList m_CommittedItems; + + typedef std::vector IgnoredItemList; + static IgnoredItemList m_IgnoredItems; static ConfigItem::Ptr GetObjectUnlocked(const String& type, const String& name);