From 19afcd894a15b6b5ba4d162a73db1b7895eef3cc Mon Sep 17 00:00:00 2001 From: Gerd von Egidy Date: Sun, 13 Apr 2014 21:12:18 +0200 Subject: [PATCH] Split ConfigItem::ActivateItems() into ConfigItem::ValidateItems() and ConfigItem::ActivateItems(). Also removes the -Z commandline parameter: won't be needed when this feature is done. Refs #5788 --- etc/init.d/icinga2.cmake | 2 +- icinga-app/icinga.cpp | 31 ++++++++++----------- lib/config/configitem.cpp | 57 +++++++++++++++++---------------------- lib/config/configitem.h | 10 ++----- 4 files changed, 42 insertions(+), 58 deletions(-) diff --git a/etc/init.d/icinga2.cmake b/etc/init.d/icinga2.cmake index 82d922095..33419bb13 100644 --- a/etc/init.d/icinga2.cmake +++ b/etc/init.d/icinga2.cmake @@ -62,7 +62,7 @@ start() { chmod 2755 $ICINGA2_STATE_DIR/run/icinga2/cmd echo "Starting Icinga 2: " - $DAEMON -c $ICINGA2_CONFIG_FILE -Z -d -e $ICINGA2_ERROR_LOG -u $ICINGA2_USER -g $ICINGA2_GROUP + $DAEMON -c $ICINGA2_CONFIG_FILE -d -e $ICINGA2_ERROR_LOG -u $ICINGA2_USER -g $ICINGA2_GROUP echo "Done" echo diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 4e34019e2..0c538f822 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -67,7 +67,7 @@ static String LoadAppType(const String& typeSpec) return typeSpec.SubStr(index + 1); } -static bool LoadConfigFiles(const String& appType, ValidationType validate) +static bool LoadConfigFiles(const String& appType) { ConfigCompilerContext::GetInstance()->Reset(); @@ -88,7 +88,7 @@ static bool LoadConfigFiles(const String& appType, ValidationType validate) ConfigItem::Ptr item = builder->Compile(); item->Register(); - bool result = ConfigItem::ActivateItems(validate); + bool result = ConfigItem::ValidateItems(); int warnings = 0, errors = 0; @@ -250,7 +250,6 @@ int Main(void) ("config,c", po::value >(), "parse a configuration file") ("no-config,z", "start without a configuration file") ("validate,C", "exit after validating the configuration") - ("no-validate,Z", "skip validating the configuration") ("debug,x", "enable debugging") ("errorlog,e", po::value(), "log fatal errors to the specified log file (only works in combination with --daemonize)") #ifndef _WIN32 @@ -406,6 +405,14 @@ int Main(void) return EXIT_FAILURE; } + if (!LoadConfigFiles(appType)) + return EXIT_FAILURE; + + if (g_AppParams.count("validate")) { + Log(LogInformation, "icinga-app", "Finished validating the configuration file(s)."); + return EXIT_SUCCESS; + } + if (g_AppParams.count("daemonize")) { String errorLog; @@ -416,22 +423,12 @@ int Main(void) Logger::DisableConsoleLog(); } - ValidationType validate = ValidateStart; - - if (g_AppParams.count("validate")) - validate = ValidateOnly; - - if (g_AppParams.count("no-validate")) - validate = ValidateNone; - - if (!LoadConfigFiles(appType, validate)) + // activate config only after daemonization: it starts threads and that is not compatible with fork() + if (!ConfigItem::ActivateItems()) { + Log(LogCritical, "icinga-app", "Error activating configuration."); return EXIT_FAILURE; - - if (validate == ValidateOnly) { - Log(LogInformation, "icinga-app", "Finished validating the configuration file(s)."); - return EXIT_SUCCESS; } - + #ifndef _WIN32 struct sigaction sa; memset(&sa, 0, sizeof(sa)); diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index c1fb97e72..28bf248c9 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -274,29 +274,23 @@ void ConfigItem::ValidateItem(void) m_Validated = true; } -bool ConfigItem::ActivateItems(ValidationType validate) +bool ConfigItem::ValidateItems(void) { if (ConfigCompilerContext::GetInstance()->HasErrors()) return false; - if (ConfigCompilerContext::GetInstance()->HasErrors()) - return false; - ParallelWorkQueue upq; - if (validate != ValidateNone) { - Log(LogInformation, "config", "Validating config items (step 1)..."); + Log(LogInformation, "config", "Validating config items (step 1)..."); - BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) { - upq.Enqueue(boost::bind(&ConfigItem::ValidateItem, kv.second)); - } + BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) { + upq.Enqueue(boost::bind(&ConfigItem::ValidateItem, kv.second)); + } - upq.Join(); + upq.Join(); - if (ConfigCompilerContext::GetInstance()->HasErrors()) - return false; - } else - Log(LogInformation, "config", "Skipping validating config items (step 1)..."); + if (ConfigCompilerContext::GetInstance()->HasErrors()) + return false; Log(LogInformation, "config", "Committing config items"); @@ -328,35 +322,32 @@ bool ConfigItem::ActivateItems(ValidationType validate) Log(LogInformation, "config", "Evaluating 'object' rules..."); ObjectRule::EvaluateRules(); - if (validate != ValidateNone) { - Log(LogInformation, "config", "Validating config items (step 2)..."); + Log(LogInformation, "config", "Validating config items (step 2)..."); - BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) { - upq.Enqueue(boost::bind(&ConfigItem::ValidateItem, kv.second)); - } + BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) { + upq.Enqueue(boost::bind(&ConfigItem::ValidateItem, kv.second)); + } - upq.Join(); - } else - Log(LogInformation, "config", "Skipping validating config items (step 2)..."); + upq.Join(); ConfigItem::DiscardItems(); ConfigType::DiscardTypes(); - if (validate != ValidateNone) { - /* log stats for external parsers */ - BOOST_FOREACH(const DynamicType::Ptr& type, DynamicType::GetTypes()) { - int count = std::distance(type->GetObjects().first, type->GetObjects().second); - if (count > 0) - Log(LogInformation, "config", "Checked " + Convert::ToString(count) + " " + type->GetName() + "(s)."); - } + /* log stats for external parsers */ + BOOST_FOREACH(const DynamicType::Ptr& type, DynamicType::GetTypes()) { + int count = std::distance(type->GetObjects().first, type->GetObjects().second); + if (count > 0) + Log(LogInformation, "config", "Checked " + Convert::ToString(count) + " " + type->GetName() + "(s)."); } + return !ConfigCompilerContext::GetInstance()->HasErrors(); +} + +bool ConfigItem::ActivateItems(void) +{ if (ConfigCompilerContext::GetInstance()->HasErrors()) return false; - if (validate == ValidateOnly) - return true; - /* restore the previous program state */ try { DynamicObject::RestoreObjects(Application::GetStatePath()); @@ -366,6 +357,8 @@ bool ConfigItem::ActivateItems(ValidationType validate) Log(LogInformation, "config", "Triggering Start signal for config items"); + ParallelWorkQueue upq; + BOOST_FOREACH(const DynamicType::Ptr& type, DynamicType::GetTypes()) { BOOST_FOREACH(const DynamicObject::Ptr& object, type->GetObjects()) { if (object->IsActive()) diff --git a/lib/config/configitem.h b/lib/config/configitem.h index 09f1c33d8..370195ec8 100644 --- a/lib/config/configitem.h +++ b/lib/config/configitem.h @@ -27,13 +27,6 @@ namespace icinga { -enum ValidationType -{ - ValidateNone, - ValidateOnly, - ValidateStart -}; - /** * A configuration item. Non-abstract configuration items can be used to * create configuration objects at runtime. @@ -70,7 +63,8 @@ public: void ValidateItem(void); - static bool ActivateItems(ValidationType validate); + static bool ValidateItems(void); + static bool ActivateItems(void); static void DiscardItems(void); private: