config check (nxagentd -C) extended to check configs from include directory also
authorAlex Kirhenshtein <alk@netxms.org>
Thu, 17 Jan 2013 14:43:31 +0000 (14:43 +0000)
committerAlex Kirhenshtein <alk@netxms.org>
Thu, 17 Jan 2013 14:43:31 +0000 (14:43 +0000)
include/nxconfig.h
src/agent/core/nxagentd.cpp
src/libnetxms/config.cpp

index 0378afb..c6b2dd5 100644 (file)
@@ -146,10 +146,10 @@ public:
 
        bool loadXmlConfig(const TCHAR *file, const char *topLevelTag = NULL);
        bool loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *name = NULL, const char *topLevelTag = NULL);
-       bool loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection);
-       bool loadConfig(const TCHAR *file, const TCHAR *defaultIniSection);
+       bool loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection, bool ignoreErrors = true);
+       bool loadConfig(const TCHAR *file, const TCHAR *defaultIniSection, bool ignoreErrors = true);
 
-       bool loadConfigDirectory(const TCHAR *path, const TCHAR *defaultIniSection);
+       bool loadConfigDirectory(const TCHAR *path, const TCHAR *defaultIniSection, bool ignoreErrors = true);
 
        void deleteEntry(const TCHAR *path);
 
index 96fb1e9..f7d95f0 100644 (file)
@@ -1501,10 +1501,27 @@ int main(int argc, char *argv[])
          }
          break;
       case ACTION_CHECK_CONFIG:
-                       if (!g_config->loadIniConfig(g_szConfigFile, _T("agent")) || !g_config->parseTemplate(_T("agent"), m_cfgTemplate))
          {
-            ConsolePrintf(_T("Configuration file check failed\n"));
-            iExitCode = 2;
+            bool validConfig = g_config->loadConfig(g_szConfigFile, _T("agent"), false);
+            if (validConfig)
+            {
+               const TCHAR *dir = g_config->getValue(_T("/agent/ConfigIncludeDir"));
+               if (dir != NULL)
+               {
+                  validConfig = g_config->loadConfigDirectory(g_szConfigIncludeDir, _T("agent"), false);
+               }
+            }
+
+            if (validConfig)
+            {
+               validConfig = g_config->parseTemplate(_T("agent"), m_cfgTemplate);
+            }
+
+            if (!validConfig)
+            {
+               ConsolePrintf(_T("Configuration file check failed\n"));
+               iExitCode = 2;
+            }
          }
          break;
                case ACTION_RUN_WATCHDOG:
index d5142fd..67e45e1 100644 (file)
@@ -828,12 +828,13 @@ static TCHAR *FindComment(TCHAR *str)
 // Load INI-style config
 //
 
-bool Config::loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection)
+bool Config::loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection, bool ignoreErrors)
 {
        FILE *cfg;
        TCHAR buffer[4096], *ptr;
        ConfigEntry *currentSection;
        int sourceLine = 0;
+   bool validConfig = true;
 
    cfg = _tfopen(file, _T("r"));
    if (cfg == NULL)
@@ -895,6 +896,7 @@ bool Config::loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection)
          if (ptr == NULL)
          {
             error(_T("Syntax error in configuration file %s at line %d"), file, sourceLine);
+            validConfig = false;
             continue;
          }
          *ptr = 0;
@@ -911,7 +913,7 @@ bool Config::loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection)
       }
    }
    fclose(cfg);
-       return true;
+       return ignoreErrors || validConfig;
 }
 
 
@@ -1067,7 +1069,7 @@ bool Config::loadXmlConfig(const TCHAR *file, const char *topLevelTag)
 // Load config file with format auto detection
 //
 
-bool Config::loadConfig(const TCHAR *file, const TCHAR *defaultIniSection)
+bool Config::loadConfig(const TCHAR *file, const TCHAR *defaultIniSection, bool ignoreErrors)
 {
        FILE *f;
        int ch;
@@ -1088,7 +1090,7 @@ bool Config::loadConfig(const TCHAR *file, const TCHAR *defaultIniSection)
        fclose(f);
 
        // If first non-space character is < assume XML format, otherwise assume INI format
-       return (ch == '<') ? loadXmlConfig(file) : loadIniConfig(file, defaultIniSection);
+       return (ch == '<') ? loadXmlConfig(file) : loadIniConfig(file, defaultIniSection, ignoreErrors);
 }
 
 
@@ -1096,7 +1098,7 @@ bool Config::loadConfig(const TCHAR *file, const TCHAR *defaultIniSection)
 // Load all files in given directory
 //
 
-bool Config::loadConfigDirectory(const TCHAR *path, const TCHAR *defaultIniSection)
+bool Config::loadConfigDirectory(const TCHAR *path, const TCHAR *defaultIniSection, bool ignoreErrors)
 {
        _TDIR *dir;
    struct _tdirent *file;
@@ -1124,7 +1126,10 @@ bool Config::loadConfigDirectory(const TCHAR *path, const TCHAR *defaultIniSecti
          _tcscat(fileName, FS_PATH_SEPARATOR);
          _tcscat(fileName, file->d_name);
 
-                       success = success && loadConfig(fileName, defaultIniSection);
+                       if (!loadConfig(fileName, defaultIniSection, ignoreErrors))
+         {
+            success = false;
+         }
       }
       _tclosedir(dir);
    }