- New NXSL built-in functions added: time and substr
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 2 May 2007 12:40:34 +0000 (12:40 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 2 May 2007 12:40:34 +0000 (12:40 +0000)
- All NXSL built-in functions documented
- Other minor changes in documentation
- Minor fixes in server code

14 files changed:
doc/manuals/netxms_user_manual.doc
include/nxclapi.h
include/nxsl.h
src/libnxsl/env.cpp
src/libnxsl/functions.cpp
src/libnxsl/program.cpp
src/nxhttpd/httprequest.cpp
src/nxhttpd/httprequest.h
src/nxhttpd/nxhttpd.h
src/nxhttpd/nxwebhandlers.cpp
src/server/core/layer2.cpp
src/server/core/node.cpp
src/server/core/np.cpp
src/server/include/nms_core.h

index e773073..3dda3e1 100644 (file)
Binary files a/doc/manuals/netxms_user_manual.doc and b/doc/manuals/netxms_user_manual.doc differ
index 91da99f..866e856 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nxclapi.h,v 1.264 2007-03-27 16:21:41 victor Exp $ */
+/* $Id: nxclapi.h,v 1.265 2007-05-02 12:40:33 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Client Library API
@@ -207,7 +207,8 @@ typedef void * NXC_SESSION;
 #define NF_BEHIND_NAT         0x00000080
 #define NF_IS_CPSNMP          0x00000100  /* CheckPoint SNMP agent on port 260 */
 #define NF_IS_CDP             0x00000200
-#define NF_IS_NORTEL_TOPO     0x00000400  /* Supports Nortel topology discovery */
+#define NF_IS_SONMP           0x00000400  /* Supports Nortel (Synoptics/Bay Networks) topology discovery */
+#define NF_IS_LLDP                             0x00000800      /* Supports Link Layer Discovery Protocol */
 
 #define NF_DISABLE_SNMP       0x01000000
 #define NF_DISABLE_NXCP       0x02000000
index c2ccd50..2d5e912 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nxsl.h,v 1.11 2007-01-02 09:56:16 victor Exp $ */
+/* $Id: nxsl.h,v 1.12 2007-05-02 12:40:33 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2005, 2006 Victor Kirhenshtein
@@ -64,6 +64,7 @@
 #define NXSL_ERR_MODULE_NOT_FOUND         16
 #define NXSL_ERR_NOT_STRING               17
 #define NXSL_ERR_REGEXP_ERROR             18
+#define NXSL_ERR_NOT_INTEGER                                   19
 
 
 //
index 95ec412..0dad9d7 100644 (file)
@@ -35,6 +35,8 @@ int F_max(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_min(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_pow(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_strftime(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
+int F_substr(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
+int F_time(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_typeof(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_upper(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_AddrInRange(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
@@ -55,6 +57,8 @@ static NXSL_ExtFunction m_builtinFunctions[] =
    { "min", F_min, -1 },
    { "pow", F_pow, 2 },
        { "strftime", F_strftime, -1 },
+       { "substr", F_substr, -1 },
+       { "time", F_time, 0 },
    { "typeof", F_typeof, 1 },
    { "upper", F_upper, 1 },
    { "AddrInRange", F_AddrInRange, 3 },
index 387713e..a051f88 100644 (file)
@@ -355,3 +355,84 @@ int F_SecondsToUptime(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
    *ppResult = new NXSL_Value(pResult);
    return 0;
 }
+
+
+//
+// Get current time
+//
+
+int F_time(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{
+   *ppResult = new NXSL_Value(time(NULL));
+   return 0;
+}
+
+
+//
+// Get substring of a string
+// Possible usage:
+//    substr(string, start) - all characters from position 'start'
+//    substr(string, start, n) - n characters from position 'start'
+//    substr(string, NULL, n) - first n characters
+//
+
+int F_substr(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{
+       int nStart, nCount;
+       TCHAR *pBase;
+       DWORD dwLen;
+
+   if ((argc < 2) || (argc > 3))
+      return NXSL_ERR_INVALID_ARGUMENT_COUNT;
+
+   if (!argv[0]->IsString())
+      return NXSL_ERR_NOT_STRING;
+
+       if (argv[1]->IsNull())
+       {
+               nStart = 0;
+       }
+       else if (argv[1]->IsInteger())
+       {
+               nStart = argv[1]->GetValueAsInt32();
+               if (nStart > 0)
+                       nStart--;
+               else
+                       nStart = 0;
+       }
+       else
+       {
+               return NXSL_ERR_NOT_INTEGER;
+       }
+
+       if (argc == 3)
+       {
+               if (!argv[2]->IsInteger())
+                       return NXSL_ERR_NOT_INTEGER;
+               nCount = argv[2]->GetValueAsInt32();
+               if (nCount < 0)
+                       nCount = 0;
+       }
+       else
+       {
+               nCount = -1;
+       }
+
+       pBase = argv[0]->GetValueAsString(&dwLen);
+       if ((DWORD)nStart < dwLen)
+       {
+               pBase += nStart;
+               dwLen -= nStart;
+               if ((nCount == -1) || ((DWORD)nCount > dwLen))
+               {
+                       nCount = dwLen;
+               }
+               *ppResult = new NXSL_Value(pBase, (DWORD)nCount);
+       }
+       else
+       {
+               *ppResult = new NXSL_Value("");
+       }
+
+       return 0;
+}
index e126ff1..49b18c6 100644 (file)
@@ -33,7 +33,7 @@
 // Constants
 //
 
-#define MAX_ERROR_NUMBER         18
+#define MAX_ERROR_NUMBER         19
 #define CONTROL_STACK_LIMIT      32768
 
 
@@ -80,7 +80,8 @@ static TCHAR *m_szErrorMessage[MAX_ERROR_NUMBER] =
    _T("Unknown object's attribute"),
    _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("Invalid regular expression"),
+       _T("Function or operation argument is not a whole number")
 };
 
 
index 93979ee..abda321 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** HTTP Server
-** Copyright (C) 2006 Alex Kirhenshtein
+** Copyright (C) 2006, 2007 Alex Kirhenshtein & 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
 **
 **/
 
-#pragma warning(disable: 4018)
-
 #include "nxhttpd.h"
 
-using namespace std;
-
 HttpRequest::HttpRequest()
 {
        m_raw = "";
index 88a054f..b74fb37 100644 (file)
@@ -1,11 +1,6 @@
 #ifndef __HTTP_REQUEST__H__
 #define __HTTP_REQUEST__H__
 
-#pragma warning(disable: 4786)
-
-#include <string>
-#include <map>
-
 enum
 {
        METHOD_INVALID,
@@ -13,7 +8,6 @@ enum
        METHOD_POST
 };
 
-
 class HttpRequest
 {
 public:
index 2f30dbb..5970eb7 100644 (file)
 #ifndef __NXHTTPD__H__
 #define __NXHTTPD__H__
 
-#pragma warning(disable: 4530 4786)
-
-#ifdef _WIN32
-#include <winsock2.h>
-#include <windows.h>
-#include <process.h>
-#endif
-
 #include <nms_common.h>
 #include <nms_util.h>
-
-#include <stdio.h>
-#include <time.h>
-#include <string>
-#include <iostream>
-#include <map>
-#include <string>
-#include <vector>
-
-#include <sys/stat.h>
-#include "httprequest.h"
-#include "httpresponse.h"
-#include "misc.h"
-
-
-#ifndef _WIN32
-# include <signal.h>
-# include <sys/types.h>
-# include <sys/wait.h>
-#endif
-
+#include <nxclapi.h>
 
 #ifdef _WIN32
 #define NXHTTPD_SERVICE_NAME     "nxhttpd"
 #endif
 
 
-//////////////////////////////////////////////////////////////////////////
+//
+// Generic HTTP daemon instance
+//
 
 class NxHttpd
 {
@@ -81,24 +55,24 @@ public:
 
        //////////////////////////////////////////////////////////////////////////
        
-       string FilterEnt(string);
+       String FilterEnt(String);
 
        //////////////////////////////////////////////////////////////////////////
 
-       virtual bool HandleRequest(HttpRequest &, HttpResponse &);
+       virtual BOOL HandleRequest(HttpRequest &, HttpResponse &);
 
 private:
-       bool DefaultHandleRequest(HttpRequest &, HttpResponse &);
+       BOOL DefaultHandleRequest(HttpRequest &, HttpResponse &);
        static THREAD_RESULT THREAD_CALL ClientHandler(void *);
        
-       bool m_goDown;
+       BOOL m_goDown;
 
        unsigned short m_port;
 
        SOCKET m_socket;
        SOCKET m_clientSocket;
 
-       string m_documentRoot;
+       String m_documentRoot;
 };
 
 //////////////////////////////////////////////////////////////////////////
@@ -110,6 +84,5 @@ public:
        NxHttpd *instance;
 };
 
-//////////////////////////////////////////////////////////////////////////
 
 #endif // __NXHTTPD__H__
index dbd3922..f725c65 100644 (file)
@@ -27,7 +27,7 @@ bool NxWeb::DoLogin(HttpRequest req, HttpResponse &resp, string &sid)
                                                (char *)password.c_str(),
                                                0, NULL, NULL,
                                                &s->handle,
-                                               "NetXMS WSM/" NETXMS_VERSION_STRING,
+                                               "nxhttpd/" NETXMS_VERSION_STRING,
                                                NULL);
 
                                if (err == RCC_SUCCESS)
index 9f25114..35c6a2a 100644 (file)
@@ -53,12 +53,12 @@ public:
 
 
 //
-// Topology table walker's callback for Nortel topology table
+// Topology table walker's callback for SONMP topology table
 //
 
-static DWORD NortelTopoHandler(DWORD dwVersion, const char *pszCommunity,
-                               SNMP_Variable *pVar, SNMP_Transport *pTransport,
-                               void *pArg)
+static DWORD SONMPTopoHandler(DWORD dwVersion, const char *pszCommunity,
+                              SNMP_Variable *pVar, SNMP_Transport *pTransport,
+                              void *pArg)
 {
    SNMP_ObjectId *pOid;
    TCHAR szOid[MAX_OID_LEN * 4], szSuffix[MAX_OID_LEN * 4], szIfName[MAX_CONNECTOR_NAME];
@@ -139,9 +139,9 @@ DWORD BuildL2Topology(nxObjList &topology, Node *pRoot, Node *pParent, int nDept
        Node *pNode;
 
        pList = new PeerList;
-       if (pRoot->Flags() & NF_IS_NORTEL_TOPO)
+       if (pRoot->Flags() & NF_IS_SONMP)
        {
-               if (pRoot->CallSnmpEnumerate(".1.3.6.1.4.1.45.1.6.13.2.1.1.3", NortelTopoHandler, pList) != SNMP_ERR_SUCCESS)
+               if (pRoot->CallSnmpEnumerate(".1.3.6.1.4.1.45.1.6.13.2.1.1.3", SONMPTopoHandler, pList) != SNMP_ERR_SUCCESS)
                        goto cleanup;
        }
        else if (pRoot->Flags() & NF_IS_CDP)
index 69a21fe..31b67a4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: node.cpp,v 1.179 2007-04-20 11:44:37 victor Exp $ */
+/* $Id: node.cpp,v 1.180 2007-05-02 12:40:34 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2003, 2004, 2005, 2006, 2007 Victor Kirhenshtein
@@ -1007,14 +1007,14 @@ void Node::ConfigurationPoll(ClientSession *pSession, DWORD dwRqId,
                m_dwFlags &= ~NF_IS_CDP;
             }
 
-            // Check for Nortel topology discovery support
+            // Check for SONMP (Nortel topology discovery discovery protocol) support
             if (CheckSNMPIntegerValue(pTransport, ".1.3.6.1.4.1.45.1.6.13.1.2.0", 1))
             {
-               m_dwFlags |= NF_IS_NORTEL_TOPO;
+               m_dwFlags |= NF_IS_SONMP;
             }
             else
             {
-               m_dwFlags &= ~NF_IS_NORTEL_TOPO;
+               m_dwFlags &= ~NF_IS_SONMP;
             }
 
             UnlockData();
@@ -2796,7 +2796,7 @@ nxObjList *Node::BuildL2Topology(DWORD *pdwStatus)
        nDepth = ConfigReadInt(_T("TopologyDiscoveryRadius"), 5);
        MutexLock(m_mutexTopoAccess, INFINITE);
        delete m_pTopology;
-       if ((m_dwFlags & NF_IS_CDP) || (m_dwFlags & NF_IS_NORTEL_TOPO))
+       if ((m_dwFlags & NF_IS_CDP) || (m_dwFlags & NF_IS_SONMP) || (m_dwFlags & NF_IS_LLDP))
        {
                m_pTopology = new nxObjList;
                if ((*pdwStatus = ::BuildL2Topology(*m_pTopology, this, NULL, nDepth, NULL)) == RCC_SUCCESS)
index 30a39e0..df294f3 100644 (file)
@@ -99,9 +99,13 @@ NXSL_Value *NXSL_DiscoveryClass::GetAttr(NXSL_Object *pObject, char *pszAttr)
    {
       pValue = new NXSL_Value((LONG)((pData->dwFlags & NNF_IS_CDP) ? 1 : 0));
    }
-   else if (!strcmp(pszAttr, "isNortelTopo"))
+   else if (!strcmp(pszAttr, "isSONMP"))
    {
-      pValue = new NXSL_Value((LONG)((pData->dwFlags & NNF_IS_NORTEL_TOPO) ? 1 : 0));
+      pValue = new NXSL_Value((LONG)((pData->dwFlags & NNF_IS_SONMP) ? 1 : 0));
+   }
+   else if (!strcmp(pszAttr, "isLLDP"))
+   {
+      pValue = new NXSL_Value((LONG)((pData->dwFlags & NNF_IS_LLDP) ? 1 : 0));
    }
    else if (!strcmp(pszAttr, "snmpVersion"))
    {
@@ -304,13 +308,22 @@ static BOOL AcceptNewNode(DWORD dwIpAddr, DWORD dwNetMask)
             data.dwFlags |= NNF_IS_CDP;
       }
 
-      // Check for Nortel topology discovery support
+      // Check for SONMP (Nortel topology discovery protocol) support
+      if (SnmpGet(data.nSNMPVersion, pTransport, szCommunityString,
+                  ".1.3.6.1.4.1.45.1.6.13.1.2.0", NULL, 0, &dwTemp, sizeof(DWORD),
+                  FALSE, FALSE) == SNMP_ERR_SUCCESS)
+      {
+         if (dwTemp == 1)
+            data.dwFlags |= NNF_IS_SONMP;
+      }
+
+      // Check for LLDP (Link Layer Discovery Protocol) support
       if (SnmpGet(data.nSNMPVersion, pTransport, szCommunityString,
                   ".1.3.6.1.4.1.45.1.6.13.1.2.0", NULL, 0, &dwTemp, sizeof(DWORD),
                   FALSE, FALSE) == SNMP_ERR_SUCCESS)
       {
          if (dwTemp == 1)
-            data.dwFlags |= NNF_IS_NORTEL_TOPO;
+            data.dwFlags |= NNF_IS_SONMP;
       }
    }
 
index b3d176a..b2583b5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nms_core.h,v 1.129 2007-04-13 21:43:38 victor Exp $ */
+/* $Id: nms_core.h,v 1.130 2007-05-02 12:40:34 victor Exp $ */
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2003, 2004, 2005, 2006, 2007 Victor Kirhenshtein
@@ -249,7 +249,8 @@ typedef struct
 #define NNF_IS_BRIDGE         0x0008
 #define NNF_IS_PRINTER        0x0010
 #define NNF_IS_CDP            0x0020
-#define NNF_IS_NORTEL_TOPO    0x0040
+#define NNF_IS_SONMP          0x0040
+#define NNF_IS_LLDP           0x0080
 
 
 //