- Situations fully implemented
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 29 Feb 2008 21:17:29 +0000 (21:17 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 29 Feb 2008 21:17:29 +0000 (21:17 +0000)
- Added checking of NetXMS server own network connectivity via beacon hosts
- Version set to 0.2.20-rc3

29 files changed:
ChangeLog
configure.ac
doc/internal/db_format_change.txt
include/netxms-version.h
include/netxmsdb.h
include/nxevent.h
include/nxsl.h
sql/events.in
sql/schema.in
sql/setup.in
src/client/console/nxmc/tbicon.cpp
src/libnxsl/compiler.cpp
src/libnxsl/env.cpp
src/libnxsl/functions.cpp
src/libnxsl/main.cpp
src/libnxsl/program.cpp
src/libnxsl/value.cpp
src/libnxsnmp/ber.cpp
src/server/core/Makefile.am
src/server/core/correlate.cpp
src/server/core/dcitem.cpp
src/server/core/epp.cpp
src/server/core/main.cpp
src/server/core/nxcore.dsp
src/server/core/situation.cpp
src/server/include/nxcore_situations.h
src/server/include/nxsrvapi.h
src/server/libnxsrv/messages.mc
src/server/tools/nxdbmgr/upgrade.cpp

index 224de65..8a0fd2b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@
 * 0.2.20
 *
 
+- Implemented advanced event processing using situations
+- Added checking of NetXMS server own network connectivity via beacon hosts
 - Implemented "proxy node" functionality for DCIs
 - Added possibility to specify multiple recipients in e-mail or SMS action
 - Implemented System.CPU.Usage for individual processors on Linux
index 2fa503c..404166d 100644 (file)
@@ -1,10 +1,10 @@
-# $Id: configure.ac,v 1.290 2008-02-17 12:22:05 victor Exp $
+# $Id: configure.ac,v 1.291 2008-02-29 21:17:26 victor Exp $
 #
 # NetXMS - Network Management System
 # Configure script
 #
 
-AC_INIT([NetXMS], [0.2.20-rc2], [NetXMS Team <bugs@netxms.org>])
+AC_INIT([NetXMS], [0.2.20-rc3], [NetXMS Team <bugs@netxms.org>])
 AC_CONFIG_AUX_DIR(config)
 AM_CONFIG_HEADER(config.h)
 AM_INIT_AUTOMAKE
index 98fff10..07307de 100644 (file)
@@ -2,7 +2,27 @@
 * 75 ==> 76 *
 *************
 
-- New configuration parameters added: AgentCommandTimeout, AnchorHosts
+- New events added:
+INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES
+       (
+               EVENT_NETWORK_CONNECTION_LOST, 'SYS_NETWORK_CONN_LOST',
+               EVENT_SEVERITY_CRITICAL, 1,
+               'NetXMS server network connectivity lost',
+               'Generated when system detects loss of network connectivity based on beacon probing.#0D#0A' CONCAT
+               'Parameters:#0D#0A' CONCAT
+               '   1) Number of beacons'
+       );
+INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES
+       (
+               EVENT_NETWORK_CONNECTION_RESTORED, 'SYS_NETWORK_CONN_RESTORED',
+               EVENT_SEVERITY_NORMAL, 1,
+               'NetXMS server network connectivity restored',
+               'Generated when system detects restoration of network connectivity based on beacon probing.#0D#0A' CONCAT
+               'Parameters:#0D#0A' CONCAT
+               '   1) Number of beacons'
+       );
+- New configuration parameters added: AgentCommandTimeout, BeaconHosts,
+  BeaconTimeout, BeaconPollingInterval
 
 
 *************
index 4ad9324..e589ed1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: netxms-version.h,v 1.135 2008-02-07 14:23:25 victor Exp $ */
+/* $Id: netxms-version.h,v 1.136 2008-02-29 21:17:27 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Victor Kirhenshtein
@@ -33,7 +33,7 @@
 #define NETXMS_VERSION_MINOR        2
 #define NETXMS_VERSION_BUILD        20
 #define NETXMS_VERSION_HOTFIX       0
-#define NETXMS_VERSION_STRING       _T("0.2.20-rc2")
+#define NETXMS_VERSION_STRING       _T("0.2.20-rc3")
 
 
 //
index c9c4d22..b216c12 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: netxmsdb.h,v 1.77 2008-02-04 15:03:04 victor Exp $ */
+/* $Id: netxmsdb.h,v 1.78 2008-02-29 21:17:27 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2003, 2004, 2005, 2006, 2007 Victor Kirhenshtein
@@ -24,6 +24,6 @@
 #ifndef _netxmsdb_h
 #define _netxmsdb_h
 
-#define DB_FORMAT_VERSION      75
+#define DB_FORMAT_VERSION      76
 
 #endif
index e220086..0639917 100644 (file)
 // System-defined events
 //
 
-#define EVENT_NODE_ADDED               1
-#define EVENT_SUBNET_ADDED             2
-#define EVENT_INTERFACE_ADDED          3
-#define EVENT_INTERFACE_UP             4
-#define EVENT_INTERFACE_DOWN           5
-#define EVENT_NODE_NORMAL              6
-#define EVENT_NODE_WARNING             7
-#define EVENT_NODE_MINOR               8
-#define EVENT_NODE_MAJOR               9
-#define EVENT_NODE_CRITICAL            10
-#define EVENT_NODE_UNKNOWN             11
-#define EVENT_NODE_UNMANAGED           12
-#define EVENT_NODE_FLAGS_CHANGED       13
-#define EVENT_SNMP_FAIL                14
-#define EVENT_AGENT_FAIL               15
-#define EVENT_INTERFACE_DELETED        16
-#define EVENT_THRESHOLD_REACHED        17
-#define EVENT_THRESHOLD_REARMED        18
-#define EVENT_SUBNET_DELETED           19
-#define EVENT_THREAD_HANGS             20
-#define EVENT_THREAD_RUNNING           21
-#define EVENT_SMTP_FAILURE             22
-#define EVENT_MAC_ADDR_CHANGED         23
-#define EVENT_INCORRECT_NETMASK        24
-#define EVENT_SERVICE_DOWN             25
-#define EVENT_SERVICE_UP               26
-#define EVENT_SERVICE_UNKNOWN          27
-#define EVENT_NODE_DOWN                28
-#define EVENT_NODE_UP                  29
-#define EVENT_SMS_FAILURE              30
-#define EVENT_SNMP_OK                  31
-#define EVENT_AGENT_OK                 32
-#define EVENT_SCRIPT_ERROR             33
-#define EVENT_CONDITION_ACTIVATED      34
-#define EVENT_CONDITION_DEACTIVATED    35
-#define EVENT_DB_CONNECTION_LOST       36
-#define EVENT_DB_CONNECTION_RESTORED   37
-#define EVENT_CLUSTER_RESOURCE_MOVED   38
-#define EVENT_CLUSTER_RESOURCE_DOWN    39
-#define EVENT_CLUSTER_RESOURCE_UP      40
-#define EVENT_CLUSTER_DOWN             41
-#define EVENT_CLUSTER_UP               42
-#define EVENT_ALARM_TIMEOUT            43
-#define EVENT_LOG_RECORD_MATCHED       44
-#define EVENT_INTERFACE_UNKNOWN        45
-#define EVENT_INTERFACE_DISABLED       46
-#define EVENT_INTERFACE_TESTING        47
-#define EVENT_EVENT_STORM_DETECTED     48
-#define EVENT_EVENT_STORM_ENDED        49
+#define EVENT_NODE_ADDED                  1
+#define EVENT_SUBNET_ADDED                2
+#define EVENT_INTERFACE_ADDED             3
+#define EVENT_INTERFACE_UP                4
+#define EVENT_INTERFACE_DOWN              5
+#define EVENT_NODE_NORMAL                 6
+#define EVENT_NODE_WARNING                7
+#define EVENT_NODE_MINOR                  8
+#define EVENT_NODE_MAJOR                  9
+#define EVENT_NODE_CRITICAL               10
+#define EVENT_NODE_UNKNOWN                11
+#define EVENT_NODE_UNMANAGED              12
+#define EVENT_NODE_FLAGS_CHANGED          13
+#define EVENT_SNMP_FAIL                   14
+#define EVENT_AGENT_FAIL                  15
+#define EVENT_INTERFACE_DELETED           16
+#define EVENT_THRESHOLD_REACHED           17
+#define EVENT_THRESHOLD_REARMED           18
+#define EVENT_SUBNET_DELETED              19
+#define EVENT_THREAD_HANGS                20
+#define EVENT_THREAD_RUNNING              21
+#define EVENT_SMTP_FAILURE                22
+#define EVENT_MAC_ADDR_CHANGED            23
+#define EVENT_INCORRECT_NETMASK           24
+#define EVENT_SERVICE_DOWN                25
+#define EVENT_SERVICE_UP                  26
+#define EVENT_SERVICE_UNKNOWN             27
+#define EVENT_NODE_DOWN                   28
+#define EVENT_NODE_UP                     29
+#define EVENT_SMS_FAILURE                 30
+#define EVENT_SNMP_OK                     31
+#define EVENT_AGENT_OK                    32
+#define EVENT_SCRIPT_ERROR                33
+#define EVENT_CONDITION_ACTIVATED         34
+#define EVENT_CONDITION_DEACTIVATED       35
+#define EVENT_DB_CONNECTION_LOST          36
+#define EVENT_DB_CONNECTION_RESTORED      37
+#define EVENT_CLUSTER_RESOURCE_MOVED      38
+#define EVENT_CLUSTER_RESOURCE_DOWN       39
+#define EVENT_CLUSTER_RESOURCE_UP         40
+#define EVENT_CLUSTER_DOWN                41
+#define EVENT_CLUSTER_UP                  42
+#define EVENT_ALARM_TIMEOUT               43
+#define EVENT_LOG_RECORD_MATCHED          44
+#define EVENT_INTERFACE_UNKNOWN           45
+#define EVENT_INTERFACE_DISABLED          46
+#define EVENT_INTERFACE_TESTING           47
+#define EVENT_EVENT_STORM_DETECTED        48
+#define EVENT_EVENT_STORM_ENDED           49
+#define EVENT_NETWORK_CONNECTION_LOST     50
+#define EVENT_NETWORK_CONNECTION_RESTORED 51
 
-#define EVENT_SNMP_UNMATCHED_TRAP      500
-#define EVENT_SNMP_COLD_START          501
-#define EVENT_SNMP_WARM_START          502
-#define EVENT_SNMP_LINK_DOWN           503
-#define EVENT_SNMP_LINK_UP             504
-#define EVENT_SNMP_AUTH_FAILURE        505
-#define EVENT_SNMP_EGP_NL              506
+#define EVENT_SNMP_UNMATCHED_TRAP         500
+#define EVENT_SNMP_COLD_START             501
+#define EVENT_SNMP_WARM_START             502
+#define EVENT_SNMP_LINK_DOWN              503
+#define EVENT_SNMP_LINK_UP                504
+#define EVENT_SNMP_AUTH_FAILURE           505
+#define EVENT_SNMP_EGP_NL                 506
 
 #endif
index 2d5e912..3af1a86 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nxsl.h,v 1.12 2007-05-02 12:40:33 victor Exp $ */
+/* $Id: nxsl.h,v 1.13 2008-02-29 21:17:27 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2005, 2006 Victor Kirhenshtein
@@ -65,6 +65,8 @@
 #define NXSL_ERR_NOT_STRING               17
 #define NXSL_ERR_REGEXP_ERROR             18
 #define NXSL_ERR_NOT_INTEGER                                   19
+#define NXSL_ERR_INVALID_OBJECT_OPERATION 20
+#define NXSL_ERR_BAD_CLASS                21
 
 
 //
index 4eb6bdf..7394d4b 100644 (file)
@@ -539,6 +539,24 @@ INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description)
                '   2) Duration#0D#0A' CONCAT
                '   3) Threshold'
        );
+INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES
+       (
+               EVENT_NETWORK_CONNECTION_LOST, 'SYS_NETWORK_CONN_LOST',
+               EVENT_SEVERITY_CRITICAL, 1,
+               'NetXMS server network connectivity lost',
+               'Generated when system detects loss of network connectivity based on beacon probing.#0D#0A' CONCAT
+               'Parameters:#0D#0A' CONCAT
+               '   1) Number of beacons'
+       );
+INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES
+       (
+               EVENT_NETWORK_CONNECTION_RESTORED, 'SYS_NETWORK_CONN_RESTORED',
+               EVENT_SEVERITY_NORMAL, 1,
+               'NetXMS server network connectivity restored',
+               'Generated when system detects restoration of network connectivity based on beacon probing.#0D#0A' CONCAT
+               'Parameters:#0D#0A' CONCAT
+               '   1) Number of beacons'
+       );
 
 
 /*
index c0e5313..3217126 100644 (file)
@@ -1237,26 +1237,6 @@ CREATE TABLE situation_data
 */
 
 
-/*
-** Event correlation policy
-*/
-
-/*CREATE TABLE event_correlation_policy
-(
-       rule_id integer not null,
-       script SQL_TEXT not null,
-       comments SQL_TEXT not null,
-       PRIMARY KEY(rule_id)
-) TABLE_TYPE;
-
-CREATE TABLE ecp_events
-(
-       rule_id integer not null,
-       event_code integer not null,
-       PRIMARY KEY(rule_id,event_code)
-);*/
-
-
 /*
 ** List of possible community strings
 */
index 36c47ef..831369b 100644 (file)
@@ -185,7 +185,11 @@ INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
        VALUES ('AgentCommandTimeout','2000',1,1);
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
-       VALUES ('AnchorHosts','#00',1,1);
+       VALUES ('BeaconHosts','#00',1,1);
+INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
+       VALUES ('BeaconTimeout','1000',1,1);
+INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
+       VALUES ('BeaconPollingInterval','1000',1,1);
 
 
 /*
index eefa810..b1f80d2 100644 (file)
@@ -105,6 +105,7 @@ bool nxTaskBarIcon::ShowBalloon(wxString title, wxString message, unsigned int t
 
        switch(severity)
        {
+               case STATUS_WARNING:
                case STATUS_MINOR:
                case STATUS_MAJOR:
                        notifyData.dwInfoFlags = NIIF_WARNING;
index 1cbddee..d8d449f 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Scripting Language Interpreter
-** Copyright (C) 2005 Victor Kirhenshtein
+** Copyright (C) 2005, 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: compiler.cpp
+** File: compiler.cpp
 **
 **/
 
index 0dad9d7..0dd6fac 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Scripting Language Interpreter
-** Copyright (C) 2005 Victor Kirhenshtein
+** Copyright (C) 2005, 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: env.cpp
+** File: env.cpp
 **
 **/
 
@@ -29,6 +29,7 @@
 //
 
 int F_abs(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
+int F_d2x(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_length(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_lower(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_max(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
@@ -51,6 +52,7 @@ int F_SecondsToUptime(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 static NXSL_ExtFunction m_builtinFunctions[] =
 {
    { "abs", F_abs, 1 },
+       { "d2x", F_d2x, -1 },
    { "length", F_length, 1 },
    { "lower", F_lower, 1 },
    { "max", F_max, -1 },
index 0977cb1..996f2a3 100644 (file)
@@ -436,3 +436,36 @@ int F_substr(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
 
        return 0;
 }
+
+
+//
+// Convert decimal value to hexadecimal string
+//   d2x(value)          -> hex value
+//   d2x(value, padding) -> hex value padded vith zeros
+//
+
+int F_d2x(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{
+       TCHAR buffer[128], format[32];
+
+   if ((argc < 1) || (argc > 2))
+      return NXSL_ERR_INVALID_ARGUMENT_COUNT;
+
+   if (!argv[0]->IsInteger())
+      return NXSL_ERR_NOT_INTEGER;
+
+   if ((argc == 2) && (!argv[1]->IsInteger()))
+      return NXSL_ERR_NOT_INTEGER;
+
+       if (argc == 1)
+       {
+               _tcscpy(format, _T("%X"));
+       }
+       else
+       {
+               _sntprintf(format, 32, _T("%%0%dX"), argv[1]->GetValueAsInt32());
+       }
+       _sntprintf(buffer, 128, format, argv[0]->GetValueAsUInt32());
+       *ppResult = new NXSL_Value(buffer);
+       return 0;
+}
index 356a4e6..f8d63fb 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Scripting Language Interpreter
-** Copyright (C) 2005 Victor Kirhenshtein
+** Copyright (C) 2005, 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: main.cpp
+** File: main.cpp
 **
 **/
 
index 92f18ae..ca06f08 100644 (file)
@@ -33,7 +33,7 @@
 // Constants
 //
 
-#define MAX_ERROR_NUMBER         19
+#define MAX_ERROR_NUMBER         21
 #define CONTROL_STACK_LIMIT      32768
 
 
@@ -81,7 +81,9 @@ static const TCHAR *m_szErrorMessage[MAX_ERROR_NUMBER] =
        _T("Requested module not found or cannot be loaded"),
        _T("Argument is not of string type and cannot be converted to string"),
        _T("Invalid regular expression"),
-       _T("Function or operation argument is not a whole number")
+       _T("Function or operation argument is not a whole number"),
+       _T("Invalid operation on object"),
+       _T("Bad (or incompatible) object class")
 };
 
 
@@ -1014,6 +1016,10 @@ void NXSL_Program::DoBinaryOperation(int nOpCode)
                   {
                      Error(NXSL_ERR_NULL_VALUE);
                   }
+                  else if (pVal1->IsObject() || pVal2->IsObject())
+                  {
+                     Error(NXSL_ERR_INVALID_OBJECT_OPERATION);
+                  }
                   else
                   {
                      pRes = pVal1;
index 7971356..f0bea49 100644 (file)
@@ -176,8 +176,16 @@ NXSL_Value::NXSL_Value(double dValue)
 NXSL_Value::NXSL_Value(const TCHAR *pszValue)
 {
    m_nDataType = NXSL_DT_STRING;
-   m_dwStrLen = (DWORD)_tcslen(pszValue);
-   m_pszValStr = strdup(pszValue);
+       if (pszValue != NULL)
+       {
+               m_dwStrLen = (DWORD)_tcslen(pszValue);
+               m_pszValStr = _tcsdup(pszValue);
+       }
+       else
+       {
+               m_dwStrLen = 0;
+               m_pszValStr = _tcsdup(_T(""));
+       }
    m_bStringIsValid = TRUE;
    UpdateNumber();
 }
@@ -186,7 +194,7 @@ NXSL_Value::NXSL_Value(const TCHAR *pszValue, DWORD dwLen)
 {
    m_nDataType = NXSL_DT_STRING;
    m_dwStrLen = dwLen;
-   m_pszValStr = (TCHAR *)nx_memdup(pszValue, (dwLen + 1) * sizeof(TCHAR));
+   m_pszValStr = (TCHAR *)nx_memdup(CHECK_NULL_EX(pszValue), (dwLen + 1) * sizeof(TCHAR));
    m_pszValStr[dwLen] = 0;
    m_bStringIsValid = TRUE;
    UpdateNumber();
@@ -373,7 +381,10 @@ char *NXSL_Value::GetValueAsCString(void)
 char *NXSL_Value::GetValueAsString(DWORD *pdwLen)
 {
    if (IsNull() || IsObject())
+       {
+               *pdwLen = 0;
       return NULL;
+       }
 
    if (!m_bStringIsValid)
       UpdateString();
index 71e810c..fbca99d 100644 (file)
@@ -311,6 +311,11 @@ static LONG EncodeContent(DWORD dwType, BYTE *pData, DWORD dwDataLength, BYTE *p
                nBytes += dwSize;
             }
          }
+                       else if (iOidLength == 1)
+                       {
+                               *pResult = (BYTE)(*((DWORD *)pData)) * 40;
+                               nBytes++;
+                       }
          break;
       default:
          memcpy(pResult, pData, dwDataLength);
index ea16243..8143471 100644 (file)
@@ -4,8 +4,9 @@ INCLUDES=-I@top_srcdir@/include -I@top_srcdir@/src/server/include
 
 lib_LTLIBRARIES = libnxcore.la
 libnxcore_la_SOURCES = acl.cpp agent.cpp actions.cpp admin.cpp alarm.cpp \
-                       audit.cpp cert.cpp client.cpp cluster.cpp condition.cpp \
-                       config.cpp container.cpp correlate.cpp datacoll.cpp \
+                       audit.cpp beacon.cpp cert.cpp client.cpp \
+                       cluster.cpp condition.cpp confi.cpp \
+                       container.cpp correlate.cpp datacoll.cpp \
                        dbwrite.cpp dcitem.cpp dcithreshold.cpp dcivalue.cpp \
                        debug.cpp email.cpp entirenet.cpp epp.cpp events.cpp \
                        evproc.cpp hk.cpp id.cpp image.cpp interface.cpp \
index 2b59a90..c1bdaa6 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003, 2004, 2005 Victor Kirhenshtein
+** Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: correlate.cpp
+** File: correlate.cpp
 **
 **/
 
 #include "nxcore.h"
 
 
+//
+// Static data
+//
+
+static QWORD m_networkLostEventId = 0;
+
+
 //
 // Correlate SYS_NODE_DOWN event
 //
@@ -35,6 +42,13 @@ static void C_SysNodeDown(Node *pNode, Event *pEvent)
    NetObj *pObject;
    int i;
 
+       // Check for NetXMS server netwok connectivity
+       if (g_dwFlags & AF_NO_NETWORK_CONNECTIVITY)
+       {
+               pEvent->SetRootId(m_networkLostEventId);
+               return;
+       }
+
    // Trace route from management station to failed node and
    // check for failed intermediate nodes or interfaces
    pMgmtNode = (Node *)FindObjectById(g_dwMgmtNode);
@@ -125,6 +139,9 @@ void CorrelateEvent(Event *pEvent)
          case EVENT_NODE_UP:
             ((Node *)pObject)->SetLastEventId(LAST_EVENT_NODE_DOWN, 0);
             break;
+                       case EVENT_NETWORK_CONNECTION_LOST:
+                               m_networkLostEventId = pEvent->Id();
+                               break;
          default:
             break;
       }
index 4df8fb7..834033b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: dcitem.cpp,v 1.86 2008-01-30 17:02:46 victor Exp $ */
+/* $Id: dcitem.cpp,v 1.87 2008-02-29 21:17:28 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2003, 2004, 2005, 2006, 2007 Victor Kirhenshtein
@@ -38,7 +38,7 @@ public:
 
 
 //
-// Implementation of discovery class
+// Implementation of "NetXMS node" class
 //
 
 NXSL_NodeClass::NXSL_NodeClass()
index 6bc3f52..7c39469 100644 (file)
 #include "nxcore.h"
 
 
+//
+// Externals
+//
+
+extern DWORD g_nxslNumSituationFunctions;
+extern NXSL_ExtFunction g_nxslSituationFunctions[];
+
+
 //
 // Default event policy rule constructor
 //
@@ -272,6 +280,7 @@ BOOL EPRule::MatchScript(Event *pEvent)
 
    pEnv = new NXSL_Environment;
    pEnv->SetLibrary(g_pScriptLibrary);
+       pEnv->RegisterFunctionSet(g_nxslNumSituationFunctions, g_nxslSituationFunctions);
 
    // Pass event's parameters as arguments and
    // other information as variables
index bdba6b0..1a23f0b 100644 (file)
@@ -77,6 +77,7 @@ THREAD_RESULT THREAD_CALL ClientListener(void *pArg);
 THREAD_RESULT THREAD_CALL LocalAdminListener(void *pArg);
 THREAD_RESULT THREAD_CALL SNMPTrapReceiver(void *pArg);
 THREAD_RESULT THREAD_CALL SyslogDaemon(void *pArg);
+THREAD_RESULT THREAD_CALL BeaconPoller(void *pArg);
 
 
 //
@@ -624,6 +625,9 @@ retry_db_lock:
        // Load modules
        LoadNetXMSModules();
 
+       // Start beacon host poller
+       ThreadCreate(BeaconPoller, 0, NULL);
+
        // Allow clients to connect
        ThreadCreate(ClientListener, 0, NULL);
 
index 08b9606..e448b72 100644 (file)
@@ -198,6 +198,10 @@ SOURCE=.\audit.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\beacon.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\cert.cpp
 # End Source File
 # Begin Source File
index e53236e..eba7d38 100644 (file)
@@ -61,9 +61,10 @@ static void NotifyClientsOnSituationChange(int code, Situation *st)
 // SituationInstance constructor
 //
 
-SituationInstance::SituationInstance(const TCHAR *name)
+SituationInstance::SituationInstance(const TCHAR *name, Situation *parent)
 {
        m_name = _tcsdup(name);
+       m_parent = parent;
 }
 
 
@@ -87,6 +88,16 @@ void SituationInstance::UpdateAttribute(const TCHAR *attribute, const TCHAR *val
 }
 
 
+//
+// Get atribute's value
+//
+
+const TCHAR *SituationInstance::GetAttribute(const TCHAR *attribute)
+{
+       return m_attributes.Get(attribute);
+}
+
+
 //
 // Create NXCP message
 //
@@ -230,7 +241,7 @@ void Situation::UpdateSituation(const TCHAR *instance, const TCHAR *attribute, c
        {
                m_numInstances++;
                m_instanceList = (SituationInstance **)realloc(m_instanceList, sizeof(SituationInstance *) * m_numInstances);
-               m_instanceList[i] = new SituationInstance(instance);
+               m_instanceList[i] = new SituationInstance(instance, this);
                m_instanceList[i]->UpdateAttribute(attribute, value);
        }
        
@@ -271,6 +282,31 @@ BOOL Situation::DeleteInstance(const TCHAR *instance)
 }
 
 
+//
+// Find situation instance by name
+//
+
+SituationInstance *Situation::FindInstance(const TCHAR *name)
+{
+       int i;
+       SituationInstance *instance = NULL;
+
+       Lock();
+       
+       for(i = 0; i < m_numInstances; i++)
+       {
+               if (!_tcsicmp(m_instanceList[i]->GetName(), name))
+               {
+                       instance = m_instanceList[i];
+                       break;
+               }
+       }
+       
+       Unlock();
+       return instance;
+}
+
+
 //
 // Create NXCP message
 //
@@ -373,6 +409,32 @@ Situation *FindSituationById(DWORD id)
 }
 
 
+//
+// Find situation by name
+//
+
+Situation *FindSituationByName(const TCHAR *name)
+{
+   DWORD i;
+   Situation *st = NULL;
+
+   if (m_pSituationIndex == NULL)
+      return NULL;
+
+   RWLockReadLock(m_rwlockSituationIndex, INFINITE);
+       for(i = 0; i < m_dwSituationIndexSize; i++)
+       {
+               if (!_tcsicmp(name, ((Situation *)m_pSituationIndex[i].pObject)->GetName()))
+               {
+                       st = (Situation *)m_pSituationIndex[i].pObject;
+                       break;
+               }
+       }
+   RWLockUnlock(m_rwlockSituationIndex);
+   return st;
+}
+
+
 //
 // Create new situation
 //
@@ -445,3 +507,143 @@ void SendSituationListToClient(ClientSession *session, CSCPMessage *msg)
    RWLockUnlock(m_rwlockSituationIndex);
 }
 
+
+//
+// NXSL "Situation" class
+//
+
+class NXSL_SituationClass : public NXSL_Class
+{
+public:
+   NXSL_SituationClass();
+
+   virtual NXSL_Value *GetAttr(NXSL_Object *pObject, char *pszAttr);
+};
+
+
+//
+// Implementation of "Situation" class
+//
+
+NXSL_SituationClass::NXSL_SituationClass()
+                    :NXSL_Class()
+{
+   strcpy(m_szName, "Situation");
+}
+
+NXSL_Value *NXSL_SituationClass::GetAttr(NXSL_Object *pObject, char *pszAttr)
+{
+   SituationInstance *instance;
+   NXSL_Value *value = NULL;
+       const TCHAR *attrValue;
+
+   instance = (SituationInstance *)pObject->Data();
+   if (!strcmp(pszAttr, "name"))
+   {
+      value = new NXSL_Value(instance->GetParent()->GetName());
+   }
+   else if (!strcmp(pszAttr, "id"))
+   {
+      value = new NXSL_Value(instance->GetParent()->GetId());
+   }
+   else if (!strcmp(pszAttr, "instance"))
+   {
+      value = new NXSL_Value(instance->GetName());
+   }
+       else
+       {
+               attrValue = instance->GetAttribute(pszAttr);
+               if (attrValue != NULL)
+               {
+                       value = new NXSL_Value(attrValue);
+               }
+               else
+               {
+                       value = new NXSL_Value; // return NULL
+               }
+       }
+   return value;
+}
+
+
+//
+// NXSL "Situation" class object
+//
+
+static NXSL_SituationClass m_nxslSituationClass;
+
+
+//
+// NXSL function for finding situation
+//
+
+static int F_FindSituation(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{
+       Situation *situation;
+       SituationInstance *instance;
+
+   if (argv[0]->IsInteger())
+   {
+               situation = FindSituationById(argv[0]->GetValueAsUInt32());
+   }
+   else        // First parameter is not a number, assume that it's a name
+   {
+               situation = FindSituationByName(argv[0]->GetValueAsCString());
+   }
+
+       if (situation != NULL)
+       {
+               instance = situation->FindInstance(argv[1]->GetValueAsCString());
+               if (instance != NULL)
+               {
+                       *ppResult = new NXSL_Value(new NXSL_Object(&m_nxslSituationClass, instance));
+               }
+               else
+               {
+                       *ppResult = new NXSL_Value;     // Instance not found, return NULL
+               }
+       }
+       else
+       {
+               *ppResult = new NXSL_Value;     // Situation not found, return NULL
+       }
+
+   return 0;
+}
+
+
+//
+// NXSL function: get situation instance attribute
+//
+
+static int F_GetSituationAttribute(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{
+       NXSL_Object *object;
+       const TCHAR *attrValue;
+
+       if (!argv[0]->IsObject())
+               return NXSL_ERR_NOT_OBJECT;
+
+       if (!argv[1]->IsString())
+               return NXSL_ERR_NOT_STRING;
+
+       object = argv[0]->GetValueAsObject();
+       if (_tcscmp(object->Class()->Name(), "Situation"))
+               return NXSL_ERR_BAD_CLASS;
+
+       attrValue = ((SituationInstance *)object->Data())->GetAttribute(argv[1]->GetValueAsCString());
+       *ppResult = (attrValue != NULL) ? new NXSL_Value(attrValue) : new NXSL_Value;
+       return 0;
+}
+
+
+//
+// NXSL function set
+//
+
+NXSL_ExtFunction g_nxslSituationFunctions[] =
+{
+   { "FindSituation", F_FindSituation, 2 },
+   { "GetSituationAttribute", F_GetSituationAttribute, 2 }
+};
+DWORD g_nxslNumSituationFunctions = sizeof(g_nxslSituationFunctions) / sizeof(NXSL_ExtFunction);
index 2ab1686..9a66c86 100644 (file)
 // Situation instance object
 //
 
+class Situation;
+
 class SituationInstance
 {
 private:
+       Situation *m_parent;
        TCHAR *m_name;
        StringMap m_attributes;
 
 public:
-       SituationInstance(const TCHAR *name);
+       SituationInstance(const TCHAR *name, Situation *parent);
        ~SituationInstance();
 
        const TCHAR *GetName() { return m_name; }
+       Situation *GetParent() { return m_parent; }
        
        DWORD CreateMessage(CSCPMessage *msg, DWORD baseId);
 
+       const TCHAR *GetAttribute(const TCHAR *attribute);
        void UpdateAttribute(const TCHAR *attribute, const TCHAR *value);
 };
 
@@ -79,6 +84,7 @@ public:
 
        void UpdateSituation(const TCHAR *instance, const TCHAR *attribute, const TCHAR *value);
        BOOL DeleteInstance(const TCHAR *instance);
+       SituationInstance *FindInstance(const TCHAR *name);
 };
 
 
@@ -88,6 +94,7 @@ public:
 
 BOOL SituationsInit(void);
 Situation *FindSituationById(DWORD id);
+Situation *FindSituationByName(const TCHAR *name);
 Situation *CreateSituation(const TCHAR *name);
 DWORD DeleteSituation(DWORD id);
 void SendSituationListToClient(ClientSession *session, CSCPMessage *msg);
index 0e09da3..1b8b200 100644 (file)
 #define AF_DB_LOCKED                      0x01000000
 #define AF_ENABLE_MULTIPLE_DB_CONN        0x02000000
 #define AF_DB_CONNECTION_LOST             0x04000000
+#define AF_NO_NETWORK_CONNECTIVITY        0x08000000
 #define AF_EVENT_STORM_DETECTED           0x08000000
 #define AF_SERVER_INITIALIZED             0x40000000
 #define AF_SHUTDOWN                       0x80000000
index ae94697..b60e3ad 100644 (file)
@@ -656,4 +656,10 @@ Language=English
 Unable to set codepage to %1
 .
 
+MessageId=
+SymbolicName=MSG_INVALID_BEACON
+Language=English
+Invalid beacon host name or address %1 - host will be excluded from beacon list
+.
+
 ;#endif
index 78a7ff1..427cf1e 100644 (file)
@@ -86,6 +86,51 @@ static BOOL CreateConfigParam(const TCHAR *pszName, const TCHAR *pszValue,
 }
 
 
+//
+// Upgrade from V75 to V76
+//
+
+static BOOL H_UpgradeFromV75(void)
+{
+   static TCHAR m_szBatch[] =
+               _T("INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES (")
+                       _T("50,'SYS_NETWORK_CONN_LOST',4,1,'NetXMS server network connectivity lost',")
+                       _T("'Generated when system detects loss of network connectivity based on beacon ")
+                       _T("probing.#0D#0AParameters:#0D#0A   1) Number of beacons')\n")
+               _T("INSERT INTO event_cfg (event_code,event_name,severity,flags,message,description) VALUES (")
+                       _T("51,'SYS_NETWORK_CONN_RESTORED',0,1,'NetXMS server network connectivity restored',")
+                       _T("'Generated when system detects restoration of network connectivity based on ")
+                       _T("beacon probing.#0D#0AParameters:#0D#0A   1) Number of beacons')\n")
+      _T("<END>");
+
+       if (!SQLBatch(m_szBatch))
+               if (!g_bIgnoreErrors)
+                       return FALSE;
+
+       if (!CreateConfigParam(_T("AgentCommandTimeout"), _T("2000"), 1, 1))
+               if (!g_bIgnoreErrors)
+                       return FALSE;
+
+       if (!CreateConfigParam(_T("BeaconHosts"), _T(""), 1, 1))
+               if (!g_bIgnoreErrors)
+                       return FALSE;
+
+       if (!CreateConfigParam(_T("BeaconTimeout"), _T("1000"), 1, 1))
+               if (!g_bIgnoreErrors)
+                       return FALSE;
+
+       if (!CreateConfigParam(_T("BeaconPollingInterval"), _T("1000"), 1, 1))
+               if (!g_bIgnoreErrors)
+                       return FALSE;
+
+       if (!SQLQuery(_T("UPDATE config SET var_value='76' WHERE var_name='DBFormatVersion'")))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   return TRUE;
+}
+
+
 //
 // Upgrade from V74 to V75
 //
@@ -3313,6 +3358,7 @@ static struct
    { 72, H_UpgradeFromV72 },
    { 73, H_UpgradeFromV73 },
    { 74, H_UpgradeFromV74 },
+   { 75, H_UpgradeFromV75 },
    { 0, NULL }
 };