- WinPerf improvements
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 5 Oct 2004 15:57:25 +0000 (15:57 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 5 Oct 2004 15:57:25 +0000 (15:57 +0000)
ChangeLog
configure.ac
doc/admin_guide.doc
include/netxms-version.h
include/nms_agent.h
src/agent/core/messages.mc
src/agent/core/subagent.cpp
src/agent/subagents/skeleton/skeleton.cpp
src/agent/subagents/winperf/winperf.cpp
src/agent/subagents/winperf/winperf.dsp
src/agent/subagents/winperf/winperf.h

index 57ef32c..9be3838 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+*
+* 0.1.4
+*
+
+- Created performance subagent for Windows (winperf.nsm)
+
+
 *
 * 0.1.3
 *
@@ -5,6 +12,7 @@
 - Added 64-bit string-to-binary conversion
 - Added MAC address property to interface objects
 - Added Template and TemplateGroup object classes
+- It's now possible to configure data collection items for templates
 
 
 *
index d3c5097..9416fb2 100644 (file)
@@ -1,9 +1,9 @@
-# $Id: configure.ac,v 1.26 2004-09-30 14:33:20 victor Exp $
+# $Id: configure.ac,v 1.27 2004-10-05 15:57:13 victor Exp $
 #
 # Process this file with autoconf to produce a configure script.
 #
 
-AC_INIT([NetXMS], [0.1.3], [NetXMS Team <bugs@netxms.org>])
+AC_INIT([NetXMS], [0.1.4], [NetXMS Team <bugs@netxms.org>])
 AC_CONFIG_AUX_DIR([config])
 AM_CONFIG_HEADER([config.h])
 AM_INIT_AUTOMAKE
index e7c5d8f..99124bc 100644 (file)
Binary files a/doc/admin_guide.doc and b/doc/admin_guide.doc differ
index 7deb226..70f48f3 100644 (file)
@@ -30,8 +30,8 @@
 
 #define NETXMS_VERSION_MAJOR      0
 #define NETXMS_VERSION_MINOR      1
-#define NETXMS_VERSION_BUILD      
-#define NETXMS_VERSION_STRING     "0.1.3"
+#define NETXMS_VERSION_BUILD      4
+#define NETXMS_VERSION_STRING     "0.1.4"
 
 
 #endif
index 7463cef..49020e5 100644 (file)
@@ -115,10 +115,13 @@ typedef struct
 // Subagent initialization structure
 //
 
+#define NETXMS_SUBAGENT_INFO_MAGIC     ((DWORD)0x0E782501)
+
 typedef struct
 {
+   DWORD dwMagic;    // Magic number to check if subagent uses correct version of this structure
    TCHAR szName[MAX_SUBAGENT_NAME];
-   DWORD dwVersion;
+   TCHAR szVersion[16];
    void (* pUnloadHandler)(void);   // Called at subagent unload. Can be NULL.
    DWORD dwNumParameters;
    NETXMS_SUBAGENT_PARAM *pParamList;
index 1ac52a9..a25fe5d 100644 (file)
@@ -146,4 +146,10 @@ Language=English
 %1
 .
 
+MessageId=
+SymbolicName=MSG_SUBAGENT_BAD_MAGIC
+Language=English
+Subagent "%1" has invalid magic number - probably it was compiled for different agent version
+.
+
 ;#endif
index 4257b9e..ebfc398 100644 (file)
@@ -78,31 +78,41 @@ BOOL LoadSubAgent(char *szModuleName)
 
          if (SubAgentInit(&pInfo, g_szConfigFile))
          {
-            DWORD i;
-
-            // Add subagent to subagent's list
-            m_pSubAgentList = (SUBAGENT *)realloc(m_pSubAgentList, 
-                                                  sizeof(SUBAGENT) * (m_dwNumSubAgents + 1));
-            m_pSubAgentList[m_dwNumSubAgents].hModule = hModule;
-            strncpy(m_pSubAgentList[m_dwNumSubAgents].szName, szModuleName, MAX_PATH - 1);
-            m_pSubAgentList[m_dwNumSubAgents].pInfo = pInfo;
-            m_dwNumSubAgents++;
-
-            // Add parameters provided by this subagent to common list
-            for(i = 0; i < pInfo->dwNumParameters; i++)
-               AddParameter(pInfo->pParamList[i].szName, 
-                            pInfo->pParamList[i].fpHandler,
-                            pInfo->pParamList[i].pArg);
-
-            // Add enums provided by this subagent to common list
-            for(i = 0; i < pInfo->dwNumEnums; i++)
-               AddEnum(pInfo->pEnumList[i].szName, 
-                       pInfo->pEnumList[i].fpHandler,
-                       pInfo->pEnumList[i].pArg);
-
-            WriteLog(MSG_SUBAGENT_LOADED, EVENTLOG_INFORMATION_TYPE,
-                     "s", szModuleName);
-            bSuccess = TRUE;
+            // Check if information structure is valid
+            if (pInfo->dwMagic == NETXMS_SUBAGENT_INFO_MAGIC)
+            {
+               DWORD i;
+
+               // Add subagent to subagent's list
+               m_pSubAgentList = (SUBAGENT *)realloc(m_pSubAgentList, 
+                                                     sizeof(SUBAGENT) * (m_dwNumSubAgents + 1));
+               m_pSubAgentList[m_dwNumSubAgents].hModule = hModule;
+               strncpy(m_pSubAgentList[m_dwNumSubAgents].szName, szModuleName, MAX_PATH - 1);
+               m_pSubAgentList[m_dwNumSubAgents].pInfo = pInfo;
+               m_dwNumSubAgents++;
+
+               // Add parameters provided by this subagent to common list
+               for(i = 0; i < pInfo->dwNumParameters; i++)
+                  AddParameter(pInfo->pParamList[i].szName, 
+                               pInfo->pParamList[i].fpHandler,
+                               pInfo->pParamList[i].pArg);
+
+               // Add enums provided by this subagent to common list
+               for(i = 0; i < pInfo->dwNumEnums; i++)
+                  AddEnum(pInfo->pEnumList[i].szName, 
+                          pInfo->pEnumList[i].fpHandler,
+                          pInfo->pEnumList[i].pArg);
+
+               WriteLog(MSG_SUBAGENT_LOADED, EVENTLOG_INFORMATION_TYPE,
+                        "s", szModuleName);
+               bSuccess = TRUE;
+            }
+            else
+            {
+               WriteLog(MSG_SUBAGENT_BAD_MAGIC, EVENTLOG_ERROR_TYPE,
+                        "s", szModuleName);
+               DLClose(hModule);
+            }
          }
          else
          {
@@ -157,8 +167,9 @@ LONG H_SubAgentList(char *cmd, char *arg, NETXMS_VALUES_LIST *value)
 
    for(i = 0; i < m_dwNumSubAgents; i++)
    {
-      _sntprintf(szBuffer, MAX_PATH + 32, "%s 0x%08X %s", m_pSubAgentList[i].pInfo->szName,
-               m_pSubAgentList[i].hModule, m_pSubAgentList[i].szName);
+      _sntprintf(szBuffer, MAX_PATH + 32, _T("%s %s 0x%08X %s"), 
+                 m_pSubAgentList[i].pInfo->szName, m_pSubAgentList[i].pInfo->szVersion,
+                 m_pSubAgentList[i].hModule, m_pSubAgentList[i].szName);
       NxAddResultString(value, szBuffer);
    }
    return SYSINFO_RC_SUCCESS;
index 432b16f..1f98950 100644 (file)
@@ -90,7 +90,8 @@ static NETXMS_SUBAGENT_ENUM m_enums[] =
 
 static NETXMS_SUBAGENT_INFO m_info =
 {
-       "SKELETON", 0x01000000, UnloadHandler,
+   NETXMS_SUBAGENT_INFO_MAGIC,
+       _T("SKELETON"), _T("1.0"), UnloadHandler,
        sizeof(m_parameters) / sizeof(NETXMS_SUBAGENT_PARAM),
        m_parameters,
        sizeof(m_enums) / sizeof(NETXMS_SUBAGENT_ENUM),
index 312d778..927a466 100644 (file)
@@ -266,6 +266,17 @@ static LONG H_PdhObjectItems(TCHAR *pszParam, TCHAR *pArg, NETXMS_VALUES_LIST *p
 }
 
 
+//
+// Value of specific performance parameter, which is mapped one-to-one to
+// performance counter. Actually, it's an alias for PDH.CounterValue(xxx) parameter.
+//
+
+static LONG H_CounterAlias(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
+{
+   return H_PdhCounterValue(pArg, NULL, pValue);
+}
+
+
 //
 // Handler for subagent unload
 //
@@ -285,7 +296,9 @@ static void OnUnload(void)
 static NETXMS_SUBAGENT_PARAM m_parameters[] =
 {
    { _T("PDH.CounterValue(*)"), H_PdhCounterValue, NULL },
-   { _T("PDH.Version"), H_PdhVersion, NULL }
+   { _T("PDH.Version"), H_PdhVersion, NULL },
+   { _T("System.Threads"), H_CounterAlias, _T("(\\System\\Threads)") },
+   { _T("System.Uptime"), H_CounterAlias, _T("(\\System\\System Up Time)") }
 };
 static NETXMS_SUBAGENT_ENUM m_enums[] =
 {
@@ -296,7 +309,8 @@ static NETXMS_SUBAGENT_ENUM m_enums[] =
 
 static NETXMS_SUBAGENT_INFO m_info =
 {
-       "WinPerf", 0x01000000, OnUnload,
+   NETXMS_SUBAGENT_INFO_MAGIC,
+       _T("WinPerf"), _T(NETXMS_VERSION_STRING) _T(DEBUG_SUFFIX), OnUnload,
        0, NULL,
        sizeof(m_enums) / sizeof(NETXMS_SUBAGENT_ENUM),
        m_enums
index 16c6d03..db204e7 100644 (file)
@@ -54,6 +54,11 @@ BSC32=bscmake.exe
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnetxms.lib pdh.lib /nologo /dll /machine:I386 /out:"Release/winperf.nsm" /libpath:"..\..\..\libnetxms\Release"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy files
+PostBuild_Cmds=copy Release\winperf.nsm C:\NetXMS\bin
+# End Special Build Tool
 
 !ELSEIF  "$(CFG)" == "winperf - Win32 Debug"
 
index e8bb914..cb88d0b 100644 (file)
 #include <pdh.h>
 #include <pdhmsg.h>
 
+#ifdef _DEBUG
+#define DEBUG_SUFFIX    "-debug"
+#else
+#define DEBUG_SUFFIX    ""
+#endif
+
 
 //
 // Counter types