Added repeat count to returned parameters form log parser
authorzev <zev@radensolutions.com>
Fri, 3 Jun 2016 09:05:08 +0000 (12:05 +0300)
committerzev <zev@radensolutions.com>
Fri, 3 Jun 2016 09:05:08 +0000 (12:05 +0300)
include/nxlpapi.h
src/agent/subagents/logwatch/logwatch.cpp
src/libnxlp/rule.cpp
src/server/core/syslogd.cpp

index 6ff0a88..06addae 100644 (file)
@@ -78,7 +78,7 @@
  *    number of capture groups, list of capture groups,
  *    object id, user arg
  */
-typedef void (* LogParserCallback)(UINT32, const TCHAR *, const TCHAR *, const TCHAR *, UINT32, UINT32, int, TCHAR **, UINT32, void *);
+typedef void (* LogParserCallback)(UINT32, const TCHAR *, const TCHAR *, const TCHAR *, UINT32, UINT32, int, TCHAR **, UINT32, void *, int matchRepeatCount);
 
 class LIBNXLP_EXPORTABLE LogParser;
 
index 98297b1..7dbaf22 100644 (file)
@@ -134,29 +134,34 @@ static void SubagentShutdown()
  */
 static void LogParserMatch(UINT32 eventCode, const TCHAR *eventName, const TCHAR *text,
                            const TCHAR *source, UINT32 eventId, UINT32 severity,
-                           int cgCount, TCHAR **cgList, UINT32 objectId, void *userArg)
+                           int cgCount, TCHAR **cgList, UINT32 objectId, void *userArg,
+                           int matchRepeatCount)
 {
+   int count = cgCount + 1;
+   TCHAR eventIdText[16], severityText[16], repeatCount[16];
+   _sntprintf(repeatCount, 16, _T("%d"), matchRepeatCount);
    if (source != NULL)
    {
-      TCHAR eventIdText[16], severityText[16];
       _sntprintf(eventIdText, 16, _T("%u"), eventId);
       _sntprintf(severityText, 16, _T("%u"), severity);
+      count += 4;
+   }
+
+   TCHAR **list = (TCHAR **)malloc(sizeof(TCHAR *) * count);
+   int i;
+   for(i = 0; i < cgCount; i++)
+      list[i] = cgList[i];
 
-      int count = cgCount + 3;
-      TCHAR **list = (TCHAR **)malloc(sizeof(TCHAR *) * count);
-      int i;
-      for(i = 0; i < cgCount; i++)
-         list[i] = cgList[i];
+   if (source != NULL)
+   {
       list[i++] = (TCHAR *)source;
       list[i++] = eventIdText;
       list[i++] = severityText;
-          AgentSendTrap2(eventCode, eventName, count, list);
-      free(list);
-   }
-   else
-   {
-          AgentSendTrap2(eventCode, eventName, cgCount, cgList);
    }
+   list[i++] = repeatCount;
+
+   AgentSendTrap2(eventCode, eventName, count, list);
+   free(list);
 }
 
 /**
index 4e594d7..c1c8b18 100644 (file)
@@ -155,7 +155,7 @@ bool LogParserRule::matchInternal(bool extMode, const TCHAR *source, UINT32 even
                {
                        m_parser->trace(6, _T("  matched"));
                        if ((cb != NULL) && ((m_eventCode != 0) || (m_eventName != NULL)))
-                               cb(m_eventCode, m_eventName, line, source, eventId, level, 0, NULL, objectId, userArg);
+                               cb(m_eventCode, m_eventName, line, source, eventId, level, 0, NULL, objectId, userArg, getAppearanceCount());
                        return true;
                }
        }
@@ -193,7 +193,7 @@ bool LogParserRule::matchInternal(bool extMode, const TCHAR *source, UINT32 even
                                        }
                                }
 
-                               cb(m_eventCode, m_eventName, line, source, eventId, level, m_numParams, params, objectId, userArg);
+                               cb(m_eventCode, m_eventName, line, source, eventId, level, m_numParams, params, objectId, userArg, getAppearanceCount());
 
                                for(i = 0; i < m_numParams; i++)
                                        free(params[i]);
index 3e2dae6..10a90fb 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
 ** NetXMS - Network Management System
 ** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
@@ -113,7 +113,7 @@ static BOOL ParseTimeStamp(char **ppStart, int nMsgSize, int *pnPos, time_t *ptm
    {
       timestamp.tm_mday = *pCurr - '0';
    }
-   else 
+   else
    {
       if (*pCurr != ' ')
          return FALSE;  // Invalid day of month
@@ -481,18 +481,26 @@ static void QueueSyslogMessage(char *msg, int msgLen, const InetAddress& sourceA
 /**
  * Callback for syslog parser
  */
-static void SyslogParserCallback(UINT32 eventCode, const TCHAR *eventName, const TCHAR *line, 
+static void SyslogParserCallback(UINT32 eventCode, const TCHAR *eventName, const TCHAR *line,
                                  const TCHAR *source, UINT32 facility, UINT32 severity,
-                                 int paramCount, TCHAR **params, UINT32 objectId, void *userArg)
+                                 int paramCount, TCHAR **params, UINT32 objectId, void *userArg,
+                                 int matchRepeatCount)
 {
        char format[] = "ssssssssssssssssssssssssssssssss";
        TCHAR *plist[32];
        int i, count;
+       TCHAR repeatCount[16];
 
        count = min(paramCount, 32);
        format[count] = 0;
        for(i = 0; i < count; i++)
                plist[i] = params[i];
+   if(count < 32)
+   {
+      _sntprintf(repeatCount, 16, _T("%d"), matchRepeatCount);
+      plist[count] = repeatCount;
+      count++;
+   }
        PostEvent(eventCode, objectId, format,
                  plist[0], plist[1], plist[2], plist[3],
                  plist[4], plist[5], plist[6], plist[7],