Added functionality to access physical components from NXSL::Node object. Fixes ...
authorEriks Jenkevics <eriks@netxms.org>
Thu, 20 Apr 2017 13:26:11 +0000 (16:26 +0300)
committerEriks Jenkevics <eriks@netxms.org>
Wed, 3 May 2017 09:34:54 +0000 (12:34 +0300)
src/server/core/components.cpp
src/server/core/nxsl_classes.cpp
src/server/include/nms_objects.h
src/server/include/nms_script.h

index c0c6916..e0d9534 100644 (file)
@@ -179,6 +179,21 @@ UINT32 Component::fillMessage(NXCPMessage *msg, UINT32 baseId)
        return varId;
 }
 
+/*
+ * Get child components as NXSL Array
+ */
+NXSL_Array *Component::getChildrenForNXSL()
+{
+   NXSL_Array *components = new NXSL_Array();
+
+   for(int i = 0; i < m_childs.size(); i++)
+   {
+      components->set(i, new NXSL_Value(new NXSL_Object(&g_nxslComponentClass, m_childs.get(i))));
+   }
+
+   return components;
+}
+
 /**
  * Physical entity tree walk callback
  */
index 407edcf..a620921 100644 (file)
@@ -438,6 +438,10 @@ NXSL_Value *NXSL_NodeClass::getAttr(NXSL_Object *object, const TCHAR *attr)
       TCHAR buffer[64];
       value = new NXSL_Value(BinToStr(node->getBridgeId(), MAC_ADDR_LENGTH, buffer));
    }
+   else if (!_tcscmp(attr, _T("components")))
+   {
+      value = new NXSL_Value(new NXSL_Object(&g_nxslComponentClass, node->getComponents()->getRoot()));
+   }
    else if (!_tcscmp(attr, _T("driver")))
    {
       value = new NXSL_Value(node->getDriverName());
@@ -1552,11 +1556,51 @@ void NXSL_SNMPVarBindClass::onObjectDelete(NXSL_Object *object)
 }
 
 /**
+ * NXSL class ComponentClass: constructor
+ */
+NXSL_ComponentClass::NXSL_ComponentClass() : NXSL_Class()
+{
+   setName(_T("Component"));
+}
+
+NXSL_Value *NXSL_ComponentClass::getAttr(NXSL_Object *object, const TCHAR *attr)
+{
+   const UINT32 classCount = 12;
+   static String className[classCount] = { _T(""), _T("other"), _T("unknown"), _T("chassis"), _T("backplane"),
+                                    _T("container"), _T("power supply"), _T("fan"), _T("sensor"),
+                                    _T("module"), _T("port"), _T("stack") };
+   NXSL_Value *value = NULL;
+   Component *component = (Component *)object->getData();
+   if (!_tcscmp(attr, _T("class")))
+   {
+      if (component->getClass() >= classCount)
+         value = new NXSL_Value(className[2]); // Unknown class
+      else
+         value = new NXSL_Value(className[component->getClass()]);
+   }
+   if (!_tcscmp(attr, _T("children")))
+            value = new NXSL_Value(component->getChildrenForNXSL());
+   if (!_tcscmp(attr, _T("firmware")))
+      value = new NXSL_Value(component->getFirmware());
+   if (!_tcscmp(attr, _T("model")))
+      value = new NXSL_Value(component->getModel());
+   if (!_tcscmp(attr, _T("name")))
+         value = new NXSL_Value(component->getName());
+   if (!_tcscmp(attr, _T("serial")))
+         value = new NXSL_Value(component->getSerial());
+   if (!_tcscmp(attr, _T("vendor")))
+         value = new NXSL_Value(component->getVendor());
+
+   return value;
+}
+
+/**
  * Class objects
  */
 NXSL_AlarmClass g_nxslAlarmClass;
 NXSL_ChassisClass g_nxslChassisClass;
 NXSL_ClusterClass g_nxslClusterClass;
+NXSL_ComponentClass g_nxslComponentClass;
 NXSL_ContainerClass g_nxslContainerClass;
 NXSL_DciClass g_nxslDciClass;
 NXSL_EventClass g_nxslEventClass;
index e9de052..63e7e1b 100644 (file)
@@ -328,6 +328,14 @@ public:
 
        UINT32 getIndex() { return m_index; }
        UINT32 getParentIndex() { return m_parentIndex; }
+       NXSL_Array *getChildrenForNXSL();
+
+       UINT32 getClass() { return m_class; }
+       const TCHAR *getFirmware() { return m_firmware; }
+   const TCHAR *getModel() { return m_model; }
+   const TCHAR *getName() { return m_name; }
+   const TCHAR *getSerial() { return m_serial; }
+   const TCHAR *getVendor() { return m_vendor; }
 
        UINT32 fillMessage(NXCPMessage *msg, UINT32 baseId);
 
index 122195e..f925b3e 100644 (file)
@@ -174,6 +174,17 @@ public:
 };
 
 /**
+ * NXSL "Component" class
+ */
+class NXSL_ComponentClass : public NXSL_Class
+{
+public:
+   NXSL_ComponentClass();
+
+   virtual NXSL_Value *getAttr(NXSL_Object *object, const TCHAR *attr);
+};
+
+/**
  * Server's default script environment
  */
 class NXSL_ServerEnv : public NXSL_Environment
@@ -238,6 +249,7 @@ bool ParseValueList(TCHAR **start, ObjectArray<NXSL_Value> &args);
 extern NXSL_AlarmClass g_nxslAlarmClass;
 extern NXSL_ChassisClass g_nxslChassisClass;
 extern NXSL_ClusterClass g_nxslClusterClass;
+extern NXSL_ComponentClass g_nxslComponentClass;
 extern NXSL_ContainerClass g_nxslContainerClass;
 extern NXSL_DciClass g_nxslDciClass;
 extern NXSL_EventClass g_nxslEventClass;