added NXSL function GetAllNodes; NXSL functions GetNodeInterfaces, GetNodeTemplates...
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 5 Oct 2016 16:05:02 +0000 (19:05 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 5 Oct 2016 16:05:02 +0000 (19:05 +0300)
ChangeLog
src/server/core/netobj.cpp
src/server/core/node.cpp
src/server/core/nxslext.cpp

index be5f04e..b312ffd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,7 +20,8 @@
 - Built-in superuser account renamed to "system"
 - Default "admin" account now is ordinary member of "Admins" group without built-in privileges
 - New method "enableDiscoveryPolling" in NXSL class "Node"
-- New NXSL function AgentExecuteAction
+- New NXSL functions: AgentExecuteAction, GetAllNodes
+- NXSL functions GetNodeInterfaces, GetNodeTemplates, GetNodeParents, GetObjectChildren returns correct object classes
 - Agent effective user and group can be set in configuration file
 - Agent environment variables can be set in configuration file
 - Added method "getResourceOwner" and attribute "nodes" to NXSL "Cluster" class
index 8ea6fe8..b961899 100644 (file)
@@ -1720,19 +1720,7 @@ NXSL_Array *NetObj::getChildrenForNXSL()
        lockChildList(false);
        for(int i = 0; i < m_childList->size(); i++)
        {
-          NetObj *obj = m_childList->get(i);
-               if (obj->getObjectClass() == OBJECT_NODE)
-               {
-                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, obj)));
-               }
-               else if (obj->getObjectClass() == OBJECT_INTERFACE)
-               {
-                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslInterfaceClass, obj)));
-               }
-               else
-               {
-                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, obj)));
-               }
+      children->set(index++, m_childList->get(i)->createNXSLObject());
        }
        unlockChildList();
 
index 5b8c740..a3f121d 100644 (file)
@@ -6876,7 +6876,7 @@ NXSL_Array *Node::getParentsForNXSL()
                          (object->getObjectClass() == OBJECT_SERVICEROOT)) &&
                    object->isTrustedNode(m_id))
                {
-                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
+                       parents->set(index++, object->createNXSLObject());
                }
        }
        unlockParentList();
@@ -6898,7 +6898,7 @@ NXSL_Array *Node::getTemplatesForNXSL()
       NetObj *object = m_parentList->get(i);
                if ((object->getObjectClass() == OBJECT_TEMPLATE) && object->isTrustedNode(m_id))
                {
-                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
+                       parents->set(index++, object->createNXSLObject());
                }
        }
        unlockParentList();
@@ -6919,7 +6919,7 @@ NXSL_Array *Node::getInterfacesForNXSL()
        {
                if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
                {
-                       ifaces->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslInterfaceClass, m_childList->get(i))));
+                       ifaces->set(index++, m_childList->get(i)->createNXSLObject());
                }
        }
        unlockChildList();
index af116d0..49c811c 100644 (file)
@@ -439,6 +439,49 @@ static int F_GetNodeInterfaces(int argc, NXSL_Value **argv, NXSL_Value **ppResul
        return 0;
 }
 
+/**
+ * Get all nodes
+ * Returns array of accessible node objects
+ * (empty array if trusted nodes check is on and current node not provided)
+ */
+static int F_GetAllNodes(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_VM *vm)
+{
+   if (argc > 1)
+      return NXSL_ERR_INVALID_ARGUMENT_COUNT;
+
+   Node *node = NULL;
+   if (argc > 0)
+   {
+      if (!argv[0]->isObject())
+         return NXSL_ERR_NOT_OBJECT;
+
+      NXSL_Object *object = argv[0]->getValueAsObject();
+      if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+         return NXSL_ERR_BAD_CLASS;
+
+      node = (Node *)object->getData();
+   }
+
+   NXSL_Array *a = new NXSL_Array;
+   if (!(g_flags & AF_CHECK_TRUSTED_NODES) || (node != NULL))
+   {
+      ObjectArray<NetObj> *nodes = g_idxNodeById.getObjects(true);
+      int index = 0;
+      for(int i = 0; i < nodes->size(); i++)
+      {
+         Node *n = (Node *)nodes->get(i);
+         if ((node == NULL) || n->isTrustedNode(node->getId()))
+         {
+            a->set(index++, n->createNXSLObject());
+         }
+         n->decRefCount();
+      }
+      delete nodes;
+   }
+   *ppResult = new NXSL_Value(a);
+   return 0;
+}
+
 /**
  * Get event's named parameter
  * First argument: event object
@@ -1461,6 +1504,7 @@ static NXSL_ExtFunction m_nxslServerFunctions[] =
    { _T("CurrencyName"), F_CurrencyName, 1 },
        { _T("DeleteCustomAttribute"), F_DeleteCustomAttribute, 2 },
    { _T("EnterMaintenance"), F_EnterMaintenance, 1 },
+   { _T("GetAllNodes"), F_GetAllNodes, -1 },
    { _T("GetConfigurationVariable"), F_GetConfigurationVariable, -1 },
    { _T("GetCustomAttribute"), F_GetCustomAttribute, 2 },
    { _T("GetEventParameter"), F_GetEventParameter, 2 },