agent config dump with -C option
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 26 Mar 2015 10:53:09 +0000 (12:53 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 26 Mar 2015 10:53:46 +0000 (12:53 +0200)
configure.ac
include/nxconfig.h
src/agent/core/nxagentd.cpp
src/libnetxms/config.cpp

index 4fd0f12..fe0c7b3 100644 (file)
@@ -1615,7 +1615,7 @@ AC_CHECK_FUNCS([gettimeofday memmove memset bcopy strchr strcspn strdup strerror
 AC_CHECK_FUNCS([strrchr strlwr strtol strtoul strtoll strtoull setlocale])
 AC_CHECK_FUNCS([if_nametoindex daemon mmap strerror_r scandir uname poll])
 AC_CHECK_FUNCS([usleep nanosleep gmtime_r localtime_r stat64 fstat64 lstat64])
-AC_CHECK_FUNCS([fopen64 strptime timegm gethostbyname2_r itoa _itoa])
+AC_CHECK_FUNCS([fopen64 strptime timegm gethostbyname2_r itoa _itoa isatty])
 
 AC_CHECK_DECLS([nanosleep])
 
index ea89354..ba90100 100644 (file)
@@ -106,7 +106,7 @@ public:
        ObjectArray<ConfigEntry> *getOrderedSubEntries(const TCHAR *mask);
        void unlinkEntry(ConfigEntry *entry);
 
-       void print(FILE *file, int level);
+       void print(FILE *file, int level, TCHAR *prefix);
        void createXml(String &xml, int level = 0);
 };
 
index 6fc3d52..316a0e3 100644 (file)
@@ -260,7 +260,7 @@ static TCHAR m_szHelpText[] =
    _T("Usage: nxagentd [options]\n")
    _T("Where valid options are:\n")
    _T("   -c <file>  : Use configuration file <file> (default ") AGENT_DEFAULT_CONFIG _T(")\n")
-   _T("   -C         : Check configuration file and exit\n")
+   _T("   -C         : Load configuration file, dump resulting configuration, and exit\n")
    _T("   -d         : Run as daemon/service\n")
        _T("   -D <level> : Set debug level (0..9)\n")
 #ifdef _WIN32
@@ -1690,12 +1690,16 @@ int main(int argc, char *argv[])
                if (dir != NULL)
                {
                   validConfig = g_config->loadConfigDirectory(dir, _T("agent"), false);
-                  ConsolePrintf(_T("Error reading additional configuration files from \"%s\"\n"), dir);
+                  if (!validConfig)
+                  {
+                     ConsolePrintf(_T("Error reading additional configuration files from \"%s\"\n"), dir);
+                  }
                }
             }
 
             if (validConfig)
             {
+               g_config->print(stdout);
                validConfig = g_config->parseTemplate(_T("agent"), m_cfgTemplate);
             }
 
index 6e504d0..36550b7 100644 (file)
 #include <expat.h>
 #include <nxstat.h>
 
+#if defined(_WIN32)
+#define isatty _isatty
+#elif !HAVE_ISATTY
+#define isatty(x) (true)
+#endif
+
 /**
  * Expand value
  */
@@ -570,14 +576,37 @@ void ConfigEntry::setAttribute(const TCHAR *name, bool value)
 /**
  * Print config entry
  */
-void ConfigEntry::print(FILE *file, int level)
+void ConfigEntry::print(FILE *file, int level, TCHAR *prefix)
 {
-   _tprintf(_T("%*s%s\n"), level * 4, _T(""), m_name);
-   for(ConfigEntry *e = m_first; e != NULL; e = e->getNext())
-      e->print(file, level + 1);
+   if (isatty(fileno(file)))
+      WriteToTerminalEx(_T("%s\x1b[32;1m%s\x1b[0m\n"), prefix, m_name);
+   else
+      _tprintf(_T("%s%s\n"), prefix, m_name);
+
+   if (level > 0)
+   {
+      prefix[(level - 1) * 4 + 1] = (m_next == NULL) ? _T(' ') : _T('|');
+      prefix[(level - 1) * 4 + 2] = _T(' ');
+   }
+
+   // Do not print empty values for non-leaf nodes
+   if ((m_first == NULL) || ((m_valueCount > 0) && (m_values[0][0] != 0)))
+   {
+      for(int i = 0, len = 0; i < m_valueCount; i++)
+      {
+         if (isatty(fileno(file)))
+            WriteToTerminalEx(_T("%s  value: \x1b[1m%s\x1b[0m\n"), prefix, m_values[i]);
+         else
+            _tprintf(_T("%s  value: %s\n"), prefix, m_values[i]);
+      }
+   }
 
-   for(int i = 0, len = 0; i < m_valueCount; i++)
-      _tprintf(_T("%*svalue: %s\n"), level * 4 + 2, _T(""), m_values[i]);
+   for(ConfigEntry *e = m_first; e != NULL; e = e->getNext())
+   {
+      _tcscat(prefix, _T(" +- "));
+      e->print(file, level + 1, prefix);
+      prefix[level * 4] = 0;
+   }
 }
 
 /**
@@ -1440,8 +1469,9 @@ bool Config::loadConfigDirectory(const TCHAR *path, const TCHAR *defaultIniSecti
 
 void Config::print(FILE *file)
 {
+   TCHAR prefix[256] = _T("");
    if (m_root != NULL)
-      m_root->print(file, 0);
+      m_root->print(file, 0, prefix);
 }
 
 /**