new NXSL class InetAddress; new NXSL Interface class attribute ipAddressList; minor...
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 22 Jul 2017 19:54:48 +0000 (22:54 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 22 Jul 2017 19:54:48 +0000 (22:54 +0300)
ChangeLog
include/nxsl_classes.h
src/libnxsl/Makefile.am
src/libnxsl/env.cpp
src/libnxsl/geolocation.cpp
src/libnxsl/inetaddr.cpp [new file with mode: 0644]
src/server/core/nxsl_classes.cpp

index 1aa9d1b..41e9a31 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,9 @@
 - XEN monitoring subagent
 - Fixed issues with agent tunnels
 - Fixed bug in STP-based topology discovery
+- NXSL:
+       - New class "InetAddress"
+       - New attribute "ipAddressList" for class "Interface"
 - Management console:
        - Improved status map
 
index 3232d25..88b4204 100644 (file)
@@ -26,6 +26,7 @@
 #include <nms_threads.h>
 #include <nms_util.h>
 #include <nxcpapi.h>
+#include <geolocation.h>
 
 //
 // Constants
@@ -492,10 +493,10 @@ class NXSL_Library;
 class LIBNXSL_EXPORTABLE NXSL_Environment
 {
 private:
-   UINT32 m_numFunctions;
+   int m_numFunctions;
    NXSL_ExtFunction *m_functions;
 
-   UINT32 m_numSelectors;
+   int m_numSelectors;
    NXSL_ExtSelector *m_selectors;
 
    NXSL_Library *m_library;
@@ -512,10 +513,10 @@ public:
    void setLibrary(NXSL_Library *lib) { m_library = lib; }
 
    NXSL_ExtFunction *findFunction(const TCHAR *name);
-   void registerFunctionSet(UINT32 count, NXSL_ExtFunction *list);
+   void registerFunctionSet(int count, NXSL_ExtFunction *list);
 
    NXSL_ExtSelector *findSelector(const TCHAR *name);
-   void registerSelectorSet(UINT32 count, NXSL_ExtSelector *list);
+   void registerSelectorSet(int count, NXSL_ExtSelector *list);
 
    bool loadModule(NXSL_VM *vm, const NXSL_ModuleImport *importInfo);
 };
@@ -931,7 +932,7 @@ public:
 };
 
 /**
- * NXSL "Connector" class
+ * NXSL "GeoLocation" class
  */
 class LIBNXSL_EXPORTABLE NXSL_GeoLocationClass : public NXSL_Class
 {
@@ -941,6 +942,23 @@ public:
 
    virtual NXSL_Value *getAttr(NXSL_Object *pObject, const TCHAR *pszAttr);
    virtual void onObjectDelete(NXSL_Object *object);
+
+   static NXSL_Value *createObject(const GeoLocation& gl);
+};
+
+/**
+ * NXSL "InetAddress" class
+ */
+class LIBNXSL_EXPORTABLE NXSL_InetAddressClass : public NXSL_Class
+{
+public:
+   NXSL_InetAddressClass();
+   virtual ~NXSL_InetAddressClass();
+
+   virtual NXSL_Value *getAttr(NXSL_Object *pObject, const TCHAR *pszAttr);
+   virtual void onObjectDelete(NXSL_Object *object);
+
+   static NXSL_Value *createObject(const InetAddress& addr);
 };
 
 /**
@@ -952,5 +970,6 @@ extern NXSL_TableRowClass LIBNXSL_EXPORTABLE g_nxslTableRowClass;
 extern NXSL_TableColumnClass LIBNXSL_EXPORTABLE g_nxslTableColumnClass;
 extern NXSL_ConnectorClass LIBNXSL_EXPORTABLE g_nxslConnectorClass;
 extern NXSL_GeoLocationClass LIBNXSL_EXPORTABLE g_nxslGeoLocationClass;
+extern NXSL_InetAddressClass LIBNXSL_EXPORTABLE g_nxslInetAddressClass;
 
 #endif
index db4a73c..a819d2d 100644 (file)
@@ -1,10 +1,10 @@
 lib_LTLIBRARIES = libnxsl.la
 libnxsl_la_SOURCES = lex.parser.cpp parser.tab.cpp \
                     array.cpp class.cpp compiler.cpp env.cpp functions.cpp \
-                     geolocation.cpp hashmap.cpp instruction.cpp iterator.cpp \
-                    lexer.cpp library.cpp main.cpp network.cpp program.cpp \
-                    selectors.cpp stack.cpp storage.cpp table.cpp value.cpp \
-                    variable.cpp vm.cpp
+                     geolocation.cpp hashmap.cpp inetaddr.cpp instruction.cpp \
+                     iterator.cpp lexer.cpp library.cpp main.cpp network.cpp \
+                     program.cpp selectors.cpp stack.cpp storage.cpp \
+                     table.cpp value.cpp variable.cpp vm.cpp
 libnxsl_la_CPPFLAGS=-I@top_srcdir@/include
 libnxsl_la_LDFLAGS = -version-info $(NETXMS_LIBRARY_VERSION)
 libnxsl_la_LIBADD = ../libnetxms/libnetxms.la
index 457c4bd..7c21f48 100644 (file)
@@ -185,9 +185,7 @@ NXSL_Environment::~NXSL_Environment()
  */
 NXSL_ExtFunction *NXSL_Environment::findFunction(const TCHAR *name)
 {
-   UINT32 i;
-
-   for(i = 0; i < m_numFunctions; i++)
+   for(int i = 0; i < m_numFunctions; i++)
       if (!_tcscmp(m_functions[i].m_name, name))
          return &m_functions[i];
    return NULL;
@@ -196,7 +194,7 @@ NXSL_ExtFunction *NXSL_Environment::findFunction(const TCHAR *name)
 /**
  * Register function set
  */
-void NXSL_Environment::registerFunctionSet(UINT32 count, NXSL_ExtFunction *list)
+void NXSL_Environment::registerFunctionSet(int count, NXSL_ExtFunction *list)
 {
    m_functions = (NXSL_ExtFunction *)realloc(m_functions, sizeof(NXSL_ExtFunction) * (m_numFunctions + count));
    memcpy(&m_functions[m_numFunctions], list, sizeof(NXSL_ExtFunction) * count);
@@ -208,9 +206,7 @@ void NXSL_Environment::registerFunctionSet(UINT32 count, NXSL_ExtFunction *list)
  */
 NXSL_ExtSelector *NXSL_Environment::findSelector(const TCHAR *name)
 {
-   UINT32 i;
-
-   for(i = 0; i < m_numSelectors; i++)
+   for(int i = 0; i < m_numSelectors; i++)
       if (!_tcscmp(m_selectors[i].m_name, name))
          return &m_selectors[i];
    return NULL;
@@ -219,7 +215,7 @@ NXSL_ExtSelector *NXSL_Environment::findSelector(const TCHAR *name)
 /**
  * Register selector set
  */
-void NXSL_Environment::registerSelectorSet(UINT32 count, NXSL_ExtSelector *list)
+void NXSL_Environment::registerSelectorSet(int count, NXSL_ExtSelector *list)
 {
    m_selectors = (NXSL_ExtSelector *)realloc(m_selectors, sizeof(NXSL_ExtSelector) * (m_numSelectors + count));
    memcpy(&m_selectors[m_numSelectors], list, sizeof(NXSL_ExtSelector) * count);
index 7fc344d..c2e4c01 100644 (file)
@@ -22,7 +22,6 @@
 **/
 
 #include "libnxsl.h"
-#include <geolocation.h>
 
 /**
  * Instance of NXSL_Table class
@@ -91,6 +90,14 @@ NXSL_Value *NXSL_GeoLocationClass::getAttr(NXSL_Object *object, const TCHAR *att
 }
 
 /**
+ * Create NXSL object from GeoLocation object
+ */
+NXSL_Value *NXSL_GeoLocationClass::createObject(const GeoLocation& gl)
+{
+   return new NXSL_Value(new NXSL_Object(&g_nxslGeoLocationClass, new GeoLocation(gl)));
+}
+
+/**
  * Create geolocation
  */
 int F_GeoLocation(int argc, NXSL_Value **argv, NXSL_Value **result, NXSL_VM *vm)
diff --git a/src/libnxsl/inetaddr.cpp b/src/libnxsl/inetaddr.cpp
new file mode 100644 (file)
index 0000000..4ed1fce
--- /dev/null
@@ -0,0 +1,111 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Language Interpreter
+** Copyright (C) 2003-2017 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 3 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** File: inetaddr.cpp
+**
+**/
+
+#include "libnxsl.h"
+
+/**
+ * Instance of InetAddress class
+ */
+NXSL_InetAddressClass LIBNXSL_EXPORTABLE g_nxslInetAddressClass;
+
+/**
+ * Implementation of "InetAddress" class: constructor
+ */
+NXSL_InetAddressClass::NXSL_InetAddressClass() : NXSL_Class()
+{
+   setName(_T("InetAddress"));
+}
+
+/**
+ * Implementation of "InetAddress" class: destructor
+ */
+NXSL_InetAddressClass::~NXSL_InetAddressClass()
+{
+}
+
+/**
+ * Object delete
+ */
+void NXSL_InetAddressClass::onObjectDelete(NXSL_Object *object)
+{
+   delete (InetAddress *)object->getData();
+}
+
+/**
+ * Implementation of "InetAddress" class: get attribute
+ */
+NXSL_Value *NXSL_InetAddressClass::getAttr(NXSL_Object *object, const TCHAR *attr)
+{
+   NXSL_Value *value = NULL;
+   InetAddress *a = (InetAddress *)object->getData();
+   if (!_tcscmp(attr, _T("address")))
+   {
+      TCHAR buffer[64];
+      value = new NXSL_Value(a->toString(buffer));
+   }
+   else if (!_tcscmp(attr, _T("family")))
+   {
+      value = new NXSL_Value((a->getFamily() == AF_INET) ? _T("inet") : (a->getFamily() == AF_INET6 ? _T("inet6") : _T("unspec")));
+   }
+   else if (!_tcscmp(attr, _T("isAnyLocal")))
+   {
+      value = new NXSL_Value(a->isAnyLocal());
+   }
+   else if (!_tcscmp(attr, _T("isBroadcast")))
+   {
+      value = new NXSL_Value(a->isBroadcast());
+   }
+   else if (!_tcscmp(attr, _T("isLinkLocal")))
+   {
+      value = new NXSL_Value(a->isLinkLocal());
+   }
+   else if (!_tcscmp(attr, _T("isLoopback")))
+   {
+      value = new NXSL_Value(a->isLoopback());
+   }
+   else if (!_tcscmp(attr, _T("isMulticast")))
+   {
+      value = new NXSL_Value(a->isMulticast());
+   }
+   else if (!_tcscmp(attr, _T("isValid")))
+   {
+      value = new NXSL_Value(a->isValid());
+   }
+   else if (!_tcscmp(attr, _T("isValidUnicast")))
+   {
+      value = new NXSL_Value(a->isValidUnicast());
+   }
+   else if (!_tcscmp(attr, _T("mask")))
+   {
+      value = new NXSL_Value(a->getMaskBits());
+   }
+   return value;
+}
+
+/**
+ * Create NXSL object from InetAddress object
+ */
+NXSL_Value *NXSL_InetAddressClass::createObject(const InetAddress& addr)
+{
+   return new NXSL_Value(new NXSL_Object(&g_nxslInetAddressClass, new InetAddress(addr)));
+}
index 7f22fd6..6ad837e 100644 (file)
@@ -238,7 +238,7 @@ NXSL_Value *NXSL_NetObjClass::getAttr(NXSL_Object *_object, const TCHAR *attr)
    }
    else if (!_tcscmp(attr, _T("geolocation")))
    {
-      value = new NXSL_Value(new NXSL_Object(&g_nxslGeoLocationClass, new GeoLocation(object->getGeoLocation())));
+      value = NXSL_GeoLocationClass::createObject(object->getGeoLocation());
    }
    else if (!_tcscmp(attr, _T("guid")))
    {
@@ -697,6 +697,16 @@ NXSL_Value *NXSL_InterfaceClass::getAttr(NXSL_Object *object, const TCHAR *attr)
    {
                value = new NXSL_Value(iface->getIfType());
    }
+   else if (!_tcscmp(attr, _T("ipAddressList")))
+   {
+      const InetAddressList *addrList = iface->getIpAddressList();
+      NXSL_Array *a = new NXSL_Array();
+      for(int i = 0; i < addrList->size(); i++)
+      {
+         a->append(new NXSL_Value(NXSL_InetAddressClass::createObject(addrList->get(i))));
+      }
+      value = new NXSL_Value(a);
+   }
    else if (!_tcscmp(attr, _T("ipNetMask")))
    {
       value = new NXSL_Value(iface->getIpAddressList()->getFirstUnicastAddress().getMaskBits());