- Added mechanism for subagents to write messages to master agent's log
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Oct 2004 16:52:09 +0000 (16:52 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Oct 2004 16:52:09 +0000 (16:52 +0000)
- Subagent initialization routine now receive config file name as second parameter

include/nms_agent.h
include/nms_util.h
src/agent/core/messages.mc
src/agent/core/nxagentd.cpp
src/agent/core/nxagentd.h
src/agent/core/subagent.cpp
src/agent/subagents/netware/netware.cpp
src/agent/subagents/skeleton/skeleton.cpp
src/libnetxms/tools.cpp

index fff589a..7463cef 100644 (file)
@@ -195,6 +195,7 @@ extern "C" {
 
 BOOL LIBNETXMS_EXPORTABLE NxGetParameterArg(TCHAR *param, int index, TCHAR *arg, int maxSize);
 void LIBNETXMS_EXPORTABLE NxAddResultString(NETXMS_VALUES_LIST *pList, TCHAR *pszString);
+void LIBNETXMS_EXPORTABLE NxWriteAgentLog(int iLevel, TCHAR *pszFormat, ...);
 
 #ifdef __cplusplus
 }
index b71ae85..9740e57 100644 (file)
@@ -181,6 +181,8 @@ extern "C"
    void LIBNETXMS_EXPORTABLE DLClose(HMODULE hModule);
    void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule, TCHAR *szSymbol, TCHAR *pszErrorText);
 
+   void LIBNETXMS_EXPORTABLE InitSubAgentsLogger(void (* pFunc)(int, TCHAR *));
+
 #ifdef _WIN32
    TCHAR LIBNETXMS_EXPORTABLE *GetSystemErrorText(DWORD dwError, TCHAR *pszBuffer, int iBufSize);
 #endif
index 6c38e66..1ac52a9 100644 (file)
@@ -140,4 +140,10 @@ Language=English
 Unable to create process "%1": %2
 .
 
+MessageId=
+SymbolicName=MSG_SUBAGENT_MSG
+Language=English
+%1
+.
+
 ;#endif
index fb08afe..92affdf 100644 (file)
@@ -71,6 +71,7 @@ THREAD_RESULT THREAD_CALL ListenerThread(void *);
 DWORD g_dwFlags = 0;
 char g_szLogFile[MAX_PATH] = AGENT_DEFAULT_LOG;
 char g_szSharedSecret[MAX_SECRET_LENGTH] = "admin";
+char g_szConfigFile[MAX_PATH] = AGENT_DEFAULT_CONFIG;
 WORD g_wListenPort = AGENT_LISTEN_PORT;
 DWORD g_dwServerAddr[MAX_SERVERS];
 DWORD g_dwServerCount = 0;
@@ -216,6 +217,16 @@ static void ImportSymbols(void)
 #endif   /* _WIN32 */
 
 
+//
+// This function writes message from subagent to agent's log
+//
+
+static void WriteSubAgentMsg(int iLevel, TCHAR *pszMsg)
+{
+   WriteLog(MSG_SUBAGENT_MSG, iLevel, "s", pszMsg);
+}
+
+
 //
 // Initialization routine
 //
@@ -236,6 +247,9 @@ BOOL Initialize(void)
    }
 #endif
 
+   // Initialize logger for subagents
+   InitSubAgentsLogger(WriteSubAgentMsg);
+
    // Initialize built-in parameters
    if (!InitParameterList())
       return FALSE;
@@ -359,7 +373,6 @@ void Main(void)
 int main(int argc, char *argv[])
 {
    int ch, iExitCode = 0, iAction = ACTION_RUN_AGENT;
-   char szConfigFile[MAX_PATH] = AGENT_DEFAULT_CONFIG;
 #ifdef _WIN32
    char szModuleName[MAX_PATH];
 #endif
@@ -385,7 +398,7 @@ int main(int argc, char *argv[])
             g_dwFlags |= AF_DEBUG;
             break;
          case 'c':   // Configuration file
-            strncpy(szConfigFile, optarg, MAX_PATH - 1);
+            strncpy(g_szConfigFile, optarg, MAX_PATH - 1);
             break;
          case 'C':   // Configuration check only
             iAction = ACTION_CHECK_CONFIG;
@@ -421,7 +434,7 @@ int main(int argc, char *argv[])
    switch(iAction)
    {
       case ACTION_RUN_AGENT:
-         if (NxLoadConfig(szConfigFile, "", cfgTemplate, !(g_dwFlags & AF_DAEMON)) == NXCFG_ERR_OK)
+         if (NxLoadConfig(g_szConfigFile, "", cfgTemplate, !(g_dwFlags & AF_DAEMON)) == NXCFG_ERR_OK)
          {
             if ((!stricmp(g_szLogFile, "{syslog}")) || 
                 (!stricmp(g_szLogFile, "{eventlog}")))
@@ -479,7 +492,7 @@ int main(int argc, char *argv[])
          }
          break;
       case ACTION_CHECK_CONFIG:
-         if (NxLoadConfig(szConfigFile, "", cfgTemplate, !(g_dwFlags & AF_DAEMON)) != NXCFG_ERR_OK)
+         if (NxLoadConfig(g_szConfigFile, "", cfgTemplate, !(g_dwFlags & AF_DAEMON)) != NXCFG_ERR_OK)
          {
             ConsolePrintf("Configuration file check failed\n");
             iExitCode = 2;
@@ -488,7 +501,7 @@ int main(int argc, char *argv[])
 #ifdef _WIN32
       case ACTION_INSTALL_SERVICE:
          GetModuleFileName(GetModuleHandle(NULL), szModuleName, MAX_PATH);
-         InstallService(szModuleName, szConfigFile);
+         InstallService(szModuleName, g_szConfigFile);
          break;
       case ACTION_REMOVE_SERVICE:
          RemoveService();
index e30cf51..6b49800 100644 (file)
@@ -294,6 +294,7 @@ char *GetPdhErrorText(DWORD dwError, char *pszBuffer, int iBufSize);
 extern DWORD g_dwFlags;
 extern char g_szLogFile[];
 extern char g_szSharedSecret[];
+extern char g_szConfigFile[];
 extern WORD g_wListenPort;
 extern DWORD g_dwServerAddr[];
 extern DWORD g_dwServerCount;
index 9de2b9a..4257b9e 100644 (file)
@@ -48,7 +48,7 @@ BOOL LoadSubAgent(char *szModuleName)
    hModule = DLOpen(szModuleName, szErrorText);
    if (hModule != NULL)
    {
-      BOOL (* SubAgentInit)(NETXMS_SUBAGENT_INFO **);
+      BOOL (* SubAgentInit)(NETXMS_SUBAGENT_INFO **, TCHAR *pszConfigFile);
 
       // Under NetWare, we have slightly different subagent
       // initialization procedure. Because normally two NLMs
@@ -67,16 +67,16 @@ BOOL LoadSubAgent(char *szModuleName)
          *pExt = 0;
       strupr(szFileName);
       sprintf(szEntryPoint, "NxSubAgentInit_%s", szFileName);
-      SubAgentInit = (BOOL (*)(NETXMS_SUBAGENT_INFO **))DLGetSymbolAddr(hModule, szEntryPoint, szErrorText);
+      SubAgentInit = (BOOL (*)(NETXMS_SUBAGENT_INFO **, TCHAR *))DLGetSymbolAddr(hModule, szEntryPoint, szErrorText);
 #else
-      SubAgentInit = (BOOL (*)(NETXMS_SUBAGENT_INFO **))DLGetSymbolAddr(hModule, "NxSubAgentInit", szErrorText);
+      SubAgentInit = (BOOL (*)(NETXMS_SUBAGENT_INFO **, TCHAR *))DLGetSymbolAddr(hModule, "NxSubAgentInit", szErrorText);
 #endif
 
       if (SubAgentInit != NULL)
       {
          NETXMS_SUBAGENT_INFO *pInfo;
 
-         if (SubAgentInit(&pInfo))
+         if (SubAgentInit(&pInfo, g_szConfigFile))
          {
             DWORD i;
 
index 1571bbf..021a358 100644 (file)
@@ -225,7 +225,7 @@ static NETXMS_SUBAGENT_INFO m_info =
 // Entry point for NetXMS agent
 //
 
-extern "C" BOOL NxSubAgentInit_NETWARE(NETXMS_SUBAGENT_INFO **ppInfo)
+extern "C" BOOL NxSubAgentInit_NETWARE(NETXMS_SUBAGENT_INFO **ppInfo, TCHAR *pszConfigFile)
 {
    char szServerName[MAX_PATH];
 
index 05c8a06..432b16f 100644 (file)
@@ -103,9 +103,9 @@ static NETXMS_SUBAGENT_INFO m_info =
 //
 
 #ifdef _NETWARE
-extern "C" BOOL SKELETON_EXPORTABLE NxSubAgentInit_SKELETON(NETXMS_SUBAGENT_INFO **ppInfo)
+extern "C" BOOL SKELETON_EXPORTABLE NxSubAgentInit_SKELETON(NETXMS_SUBAGENT_INFO **ppInfo, TCHAR *pszConfigFile)
 #else
-extern "C" BOOL SKELETON_EXPORTABLE NxSubAgentInit(NETXMS_SUBAGENT_INFO **ppInfo)
+extern "C" BOOL SKELETON_EXPORTABLE NxSubAgentInit(NETXMS_SUBAGENT_INFO **ppInfo, TCHAR *pszConfigFile)
 #endif
 {
    *ppInfo = &m_info;
index 26cbfcb..ed743f2 100644 (file)
 #endif
 
 
+//
+// Static data
+//
+
+static void (* m_pLogFunction)(int, TCHAR *);
+
+
 //
 // Calculate number of bits in netmask
 //
@@ -458,3 +465,32 @@ DWORD LIBNETXMS_EXPORTABLE StrToBin(char *pStr, BYTE *pData, DWORD dwSize)
    }
    return i;
 }
+
+
+//
+// Initialize loggin for subagents
+//
+
+void LIBNETXMS_EXPORTABLE InitSubAgentsLogger(void (* pFunc)(int, TCHAR *))
+{
+   m_pLogFunction = pFunc;
+}
+
+
+//
+// Write message to agent's log
+//
+
+void LIBNETXMS_EXPORTABLE NxWriteAgentLog(int iLevel, TCHAR *pszFormat, ...)
+{
+   TCHAR szBuffer[4096];
+   va_list args;
+
+   if (m_pLogFunction != NULL)
+   {
+      va_start(args, pszFormat);
+      _vsntprintf(szBuffer, 4096, pszFormat, args);
+      va_end(args);
+      m_pLogFunction(iLevel, szBuffer);
+   }
+}