From 1d32c5b2d3b732d59b50adc4b98b0ee5d4ae221d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 19 Mar 2014 20:59:18 +0100 Subject: [PATCH] Add --no-validate option and skip duplicate validation on (re)start. Fixes #5800 --- doc/2.6-running-icinga-2.md | 1 + etc/init.d/icinga2.cmake | 2 +- icinga-app/icinga.cpp | 17 ++++++++++---- lib/config/configitem.cpp | 46 ++++++++++++++++++++++--------------- lib/config/configitem.h | 13 ++++++++--- 5 files changed, 51 insertions(+), 28 deletions(-) diff --git a/doc/2.6-running-icinga-2.md b/doc/2.6-running-icinga-2.md index 0c3eca0bf..211c8657a 100644 --- a/doc/2.6-running-icinga-2.md +++ b/doc/2.6-running-icinga-2.md @@ -35,6 +35,7 @@ Icinga 2's init script is installed in `/etc/init.d/icinga2` by default: -D [ --define] args define a constant -c [ --config ] arg parse a configuration file -C [ --validate ] exit after validating the configuration + -Z [ --no-validate ] skip validating the configuration -x [ --debug ] enable debugging -d [ --daemonize ] detach from the controlling terminal -e [ --errorlog ] arg log fatal errors to the specified log file (only works diff --git a/etc/init.d/icinga2.cmake b/etc/init.d/icinga2.cmake index 33419bb13..82d922095 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 -d -e $ICINGA2_ERROR_LOG -u $ICINGA2_USER -g $ICINGA2_GROUP + $DAEMON -c $ICINGA2_CONFIG_FILE -Z -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 37d0b4594..9c81d1269 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -62,7 +62,7 @@ static String LoadAppType(const String& typeSpec) return typeSpec.SubStr(index + 1); } -static bool LoadConfigFiles(const String& appType, bool validateOnly) +static bool LoadConfigFiles(const String& appType, ValidationType validate) { CONTEXT("Loading configuration files"); @@ -85,7 +85,7 @@ static bool LoadConfigFiles(const String& appType, bool validateOnly) ConfigItem::Ptr item = builder->Compile(); item->Register(); - bool result = ConfigItem::ActivateItems(validateOnly); + bool result = ConfigItem::ActivateItems(validate); int warnings = 0, errors = 0; @@ -213,6 +213,7 @@ int main(int argc, char **argv) ("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") ("daemonize,d", "detach from the controlling terminal") ("errorlog,e", po::value(), "log fatal errors to the specified log file (only works in combination with --daemonize)") @@ -372,12 +373,18 @@ int main(int argc, char **argv) Logger::DisableConsoleLog(); } - bool validateOnly = g_AppParams.count("validate"); + ValidationType validate = ValidateStart; - if (!LoadConfigFiles(appType, validateOnly)) + if(g_AppParams.count("validate")) + validate = ValidateOnly; + + if(g_AppParams.count("no-validate")) + validate = ValidateNone; + + if (!LoadConfigFiles(appType, validate)) return EXIT_FAILURE; - if (validateOnly) { + if (validate == ValidateOnly) { Log(LogInformation, "icinga-app", "Finished validating the configuration file(s)."); return EXIT_SUCCESS; } diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 841075dff..edca199f2 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -259,7 +259,7 @@ void ConfigItem::ValidateItem(void) m_Validated = true; } -bool ConfigItem::ActivateItems(bool validateOnly) +bool ConfigItem::ActivateItems(ValidationType validate) { if (ConfigCompilerContext::GetInstance()->HasErrors()) return false; @@ -267,18 +267,21 @@ bool ConfigItem::ActivateItems(bool validateOnly) if (ConfigCompilerContext::GetInstance()->HasErrors()) return false; - Log(LogInformation, "config", "Validating config items (step 1)..."); - ParallelWorkQueue upq; - BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) { - upq.Enqueue(boost::bind(&ConfigItem::ValidateItem, kv.second)); - } + if (validate != ValidateNone) { + Log(LogInformation, "config", "Validating config items (step 1)..."); - upq.Join(); + BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) { + upq.Enqueue(boost::bind(&ConfigItem::ValidateItem, kv.second)); + } - if (ConfigCompilerContext::GetInstance()->HasErrors()) - return false; + upq.Join(); + + if (ConfigCompilerContext::GetInstance()->HasErrors()) + return false; + } else + Log(LogInformation, "config", "Skipping validating config items (step 1)..."); Log(LogInformation, "config", "Committing config items"); @@ -307,27 +310,32 @@ bool ConfigItem::ActivateItems(bool validateOnly) Log(LogInformation, "config", "Evaluating 'apply' rules..."); ApplyRule::EvaluateRules(); - Log(LogInformation, "config", "Validating config items (step 2)..."); + if (validate != ValidateNone) { + 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(); + upq.Join(); + } else + Log(LogInformation, "config", "Skipping validating config items (step 2)..."); ConfigItem::DiscardItems(); ConfigType::DiscardTypes(); - /* log stats for external parsers */ - BOOST_FOREACH(const DynamicType::Ptr& type, DynamicType::GetTypes()) { - if (type->GetObjects().size() > 0) - Log(LogInformation, "config", "Checked " + Convert::ToString(type->GetObjects().size()) + " " + type->GetName() + "(s)."); + if (validate != ValidateNone) { + /* log stats for external parsers */ + BOOST_FOREACH(const DynamicType::Ptr& type, DynamicType::GetTypes()) { + if (type->GetObjects().size() > 0) + Log(LogInformation, "config", "Checked " + Convert::ToString(type->GetObjects().size()) + " " + type->GetName() + "(s)."); + } } if (ConfigCompilerContext::GetInstance()->HasErrors()) return false; - if (validateOnly) + if (validate == ValidateOnly) return true; /* restore the previous program state */ diff --git a/lib/config/configitem.h b/lib/config/configitem.h index 4efe17f0b..415879a87 100644 --- a/lib/config/configitem.h +++ b/lib/config/configitem.h @@ -27,6 +27,13 @@ namespace icinga { +enum ValidationType +{ + ValidateNone, + ValidateOnly, + ValidateStart +}; + /** * A configuration item. Non-abstract configuration items can be used to * create configuration objects at runtime. @@ -60,8 +67,8 @@ public: static bool HasObject(const String& type, const String& name); void ValidateItem(void); - - static bool ActivateItems(bool validateOnly); + + static bool ActivateItems(ValidationType validate); static void DiscardItems(void); private: @@ -78,7 +85,7 @@ private: DebugInfo m_DebugInfo; /**< Debug information. */ ExpressionList::Ptr m_LinkedExpressionList; - + DynamicObject::Ptr m_Object; static boost::mutex m_Mutex; -- 2.40.0