Added server configuration parameter to ignore syslog message timestamps and always...
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 29 May 2016 14:50:45 +0000 (17:50 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 29 May 2016 14:50:45 +0000 (17:50 +0300)
ChangeLog
include/netxmsdb.h
sql/setup.in
src/server/core/config.cpp
src/server/core/syslogd.cpp
src/server/include/nms_core.h
src/server/tools/nxdbmgr/upgrade.cpp

index ac52297..b0d9445 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -17,6 +17,7 @@
 - Fixed bugs in LLDP based network topology discovery
 - Correct notifications on threshold script errors
 - Option to use last known value for cluster data aggregation in case of data collecion failure
+- Added server configuration parameter to ignore syslog message timestamps and always use server time
 - NXSL: implemented compound assignment operators and prefix increment/decrement for array elements
 - NXSL: can access event parameters as event object attributes (like $event->$1 or $event->instance)
 - Management console
index 10c7bdc..b2b0457 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _netxmsdb_h
 #define _netxmsdb_h
 
-#define DB_FORMAT_VERSION   403
+#define DB_FORMAT_VERSION   404
 
 #endif
index 787ed69..de526bd 100644 (file)
@@ -154,6 +154,7 @@ INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('StrictAlarmStatusFlow','0',1,0);
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('SyncInterval','60',1,1);
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('SyncNodeNamesWithDNS','0',1,0);
+INSERT INTO config (var_name,var_value,is_visible,need_server_restart,data_type,description) VALUES ('SyslogIgnoreMessageTimestamp','0',1,0,'B','Ignore timestamp received in syslog messages and always use server time');
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('SyslogListenPort','514',1,1);
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('SyslogNodeMatchingPolicy','0',1,1);
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart) VALUES ('SyslogRetentionTime','90',1,0);
index 94508c5..73492e6 100644 (file)
@@ -305,6 +305,10 @@ static void OnConfigVariableChange(bool isCLOB, const TCHAR *name, const TCHAR *
    {
       NotifyClientSessions(NX_NOTIFY_ALARM_STATUS_FLOW_CHANGED, _tcstol(value, NULL, 0));
    }
+   else if (!_tcsncmp(name, _T("Syslog"), 6))
+   {
+      OnSyslogConfigurationChange(name, value);
+   }
 }
 
 /**
index 4a257d0..3e2dae6 100644 (file)
@@ -75,6 +75,7 @@ static MUTEX s_parserLock = INVALID_MUTEX_HANDLE;
 static NodeMatchingPolicy s_nodeMatchingPolicy = SOURCE_IP_THEN_HOSTNAME;
 static THREAD s_receiverThread = INVALID_THREAD_HANDLE;
 static bool s_running = true;
+static bool s_alwaysUseServerTime = false;
 
 /**
  * Parse timestamp field
@@ -209,20 +210,29 @@ static BOOL ParseSyslogMessage(char *psMsg, int nMsgLen, NX_SYSLOG_RECORD *pRec)
    // Parse HEADER part
    if (ParseTimeStamp(&pCurr, nMsgLen, &nPos, &pRec->tmTimeStamp))
    {
-      // Hostname
-      for(i = 0; (*pCurr >= 33) && (*pCurr <= 126) && (i < MAX_SYSLOG_HOSTNAME_LEN - 1) && (nPos < nMsgLen); i++, nPos++, pCurr++)
-         pRec->szHostName[i] = *pCurr;
-      if ((nPos >= nMsgLen) || (*pCurr != ' '))
+      // Use server time if configured
+      // We still had to parse timestamp to get correct start position for MSG part
+      if (!s_alwaysUseServerTime)
       {
-         // Not a valid hostname, assuming to be a part of message
-         pCurr -= i;
-         nPos -= i;
-                       pRec->szHostName[0] = 0;
+         // Hostname
+         for(i = 0; (*pCurr >= 33) && (*pCurr <= 126) && (i < MAX_SYSLOG_HOSTNAME_LEN - 1) && (nPos < nMsgLen); i++, nPos++, pCurr++)
+            pRec->szHostName[i] = *pCurr;
+         if ((nPos >= nMsgLen) || (*pCurr != ' '))
+         {
+            // Not a valid hostname, assuming to be a part of message
+            pCurr -= i;
+            nPos -= i;
+            pRec->szHostName[0] = 0;
+         }
+         else
+         {
+            pCurr++;
+            nPos++;
+         }
       }
       else
       {
-         pCurr++;
-         nPos++;
+         pRec->tmTimeStamp = time(NULL);
       }
    }
    else
@@ -773,6 +783,7 @@ static THREAD_RESULT THREAD_CALL SyslogReceiver(void *pArg)
 void StartSyslogServer()
 {
    s_nodeMatchingPolicy = (NodeMatchingPolicy)ConfigReadInt(_T("SyslogNodeMatchingPolicy"), SOURCE_IP_THEN_HOSTNAME);
+   s_alwaysUseServerTime = ConfigReadInt(_T("SyslogIgnoreMessageTimestamp"), 0) ? true : false;
 
    // Determine first available message id
    DB_HANDLE hdb = DBConnectionPoolAcquireConnection();
@@ -826,3 +837,15 @@ void ReinitializeSyslogParser()
                return; // Syslog daemon not initialized
        CreateParserFromConfig();
 }
+
+/**
+ * Handler for syslog related configuration changes
+ */
+void OnSyslogConfigurationChange(const TCHAR *name, const TCHAR *value)
+{
+   if (!_tcscmp(name, _T("SyslogIgnoreMessageTimestamp")))
+   {
+      s_alwaysUseServerTime = _tcstol(value, NULL, 0) ? true : false;
+      nxlog_debug(4, _T("Syslog: ignore message timestamp option set to %s"), s_alwaysUseServerTime ? _T("ON") : _T("OFF"));
+   }
+}
index 2abf643..15611b4 100644 (file)
@@ -1032,6 +1032,7 @@ bool ImportSummaryTable(ConfigEntry *config);
 
 void CreateMessageFromSyslogMsg(NXCPMessage *pMsg, NX_SYSLOG_RECORD *pRec);
 void ReinitializeSyslogParser();
+void OnSyslogConfigurationChange(const TCHAR *name, const TCHAR *value);
 
 void EscapeString(String &str);
 
index 7b0714a..2aaeb62 100644 (file)
@@ -673,6 +673,18 @@ static int NextFreeEPPruleID()
        return ruleId;
 }
 
+/**
+ * Upgrade from V403 to V404
+ */
+static BOOL H_UpgradeFromV403(int currVersion, int newVersion)
+{
+   CHK_EXEC(CreateConfigParam(_T("SyslogIgnoreMessageTimestamp"), _T("0"),
+            _T("Ignore timestamp received in syslog messages and always use server time"),
+            'B', true, false, false, false));
+   CHK_EXEC(SQLQuery(_T("UPDATE metadata SET var_value='404' WHERE var_name='SchemaVersion'")));
+   return TRUE;
+}
+
 /**
  * Upgrade from V402 to V403
  */
@@ -10179,6 +10191,7 @@ static struct
    { 400, 401, H_UpgradeFromV400 },
    { 401, 402, H_UpgradeFromV401 },
    { 402, 403, H_UpgradeFromV402 },
+   { 403, 404, H_UpgradeFromV403 },
    { 0, 0, NULL }
 };