]> granicus.if.org Git - icinga2/commitdiff
Add --no-validate option and skip duplicate validation on (re)start.
authorMichael Friedrich <Michael.Friedrich@netways.de>
Wed, 19 Mar 2014 19:59:18 +0000 (20:59 +0100)
committerMichael Friedrich <Michael.Friedrich@netways.de>
Wed, 19 Mar 2014 19:59:18 +0000 (20:59 +0100)
Fixes #5800

doc/2.6-running-icinga-2.md
etc/init.d/icinga2.cmake
icinga-app/icinga.cpp
lib/config/configitem.cpp
lib/config/configitem.h

index 0c3eca0bf051b6fb5c8ff1c4b0776e0bd0be30ed..211c8657ad0672437e5c68632f600bed0089c1c0 100644 (file)
@@ -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
index 33419bb13be29cc228d785ebaae8eb74399a1272..82d9220951d6bedccb442b21dadb297c32637a8d 100644 (file)
@@ -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
index 37d0b45943fc9e505b4a8d530af7351c82342b54..9c81d1269df266df309cf20e148b61db6c4b5057 100644 (file)
@@ -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<std::vector<String> >(), "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<String>(), "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;
        }
index 841075dffc859a89abbe95053cf61ffab447c216..edca199f266666ee6ff1af8f076646f7d42b831e 100644 (file)
@@ -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 */
index 4efe17f0bc3e0c80cf0f9ee814f72287aab7fa22..415879a871ec75857e4a1e85f093961bb129896f 100644 (file)
 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;