Added NXSL DCI-related functions execution option on cluster and mobile device. Fixes...
authorZev <zev@radensolutions.com>
Thu, 3 Mar 2016 16:44:09 +0000 (18:44 +0200)
committerZev <zev@radensolutions.com>
Thu, 3 Mar 2016 16:44:14 +0000 (18:44 +0200)
src/server/core/dc_nxsl.cpp
src/server/core/nxsl_classes.cpp
src/server/core/session.cpp
src/server/include/nms_script.h

index 9b03c80..c5cb02d 100644 (file)
@@ -36,10 +36,11 @@ static int F_GetDCIObject(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NX
                return NXSL_ERR_NOT_INTEGER;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = node->getDCObjectById(argv[1]->getValueAsUInt32());
        if (dci != NULL)
        {
@@ -65,10 +66,11 @@ static int GetDCIValueImpl(bool rawValue, int argc, NXSL_Value **argv, NXSL_Valu
                return NXSL_ERR_NOT_INTEGER;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = node->getDCObjectById(argv[1]->getValueAsUInt32());
        if (dci != NULL)
    {
@@ -126,10 +128,11 @@ static int GetDciValueExImpl(bool byName, int argc, NXSL_Value **argv, NXSL_Valu
                return NXSL_ERR_NOT_STRING;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = byName ? node->getDCObjectByName(argv[1]->getValueAsCString()) : node->getDCObjectByDescription(argv[1]->getValueAsCString());
        if (dci != NULL)
    {
@@ -187,10 +190,11 @@ static int F_FindDCIByName(int argc, NXSL_Value **argv, NXSL_Value **ppResult, N
                return NXSL_ERR_NOT_STRING;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = node->getDCObjectByName(argv[1]->getValueAsCString());
        *ppResult = (dci != NULL) ? new NXSL_Value(dci->getId()) : new NXSL_Value((UINT32)0);
        return 0;
@@ -208,10 +212,11 @@ static int F_FindDCIByDescription(int argc, NXSL_Value **argv, NXSL_Value **ppRe
                return NXSL_ERR_NOT_STRING;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = node->getDCObjectByDescription(argv[1]->getValueAsCString());
        *ppResult = (dci != NULL) ? new NXSL_Value(dci->getId()) : new NXSL_Value((UINT32)0);
        return 0;
@@ -229,7 +234,8 @@ static int F_FindAllDCIs(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXS
                return NXSL_ERR_NOT_OBJECT;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
    const TCHAR *nameFilter = NULL, *descriptionFilter = NULL;
@@ -253,7 +259,7 @@ static int F_FindAllDCIs(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXS
       }
    }
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        *ppResult = node->getAllDCObjectsForNXSL(nameFilter, descriptionFilter);
        return 0;
 }
@@ -270,10 +276,11 @@ static int F_GetDCIValueStat(int argc, NXSL_Value **argv, NXSL_Value **ppResult,
                return NXSL_ERR_NOT_INTEGER;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
 
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = node->getDCObjectById(argv[1]->getValueAsUInt32());
        if ((dci != NULL) && (dci->getType() == DCO_TYPE_ITEM))
        {
@@ -342,10 +349,11 @@ static int F_GetDCIValues(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NX
                return NXSL_ERR_NOT_INTEGER;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
-       Node *node = (Node *)object->getData();
 
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
        DCObject *dci = node->getDCObjectById(argv[1]->getValueAsUInt32());
        if ((dci != NULL) && (dci->getType() == DCO_TYPE_ITEM))
        {
@@ -414,9 +422,10 @@ static int F_CreateDCI(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_
                return NXSL_ERR_NOT_INTEGER;
 
        NXSL_Object *object = argv[0]->getValueAsObject();
-       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
                return NXSL_ERR_BAD_CLASS;
-       Node *node = (Node *)object->getData();
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
 
        // Origin
        static const TCHAR *originNames[] = { _T("internal"), _T("agent"), _T("snmp"), _T("cpsnmp"), _T("push"), NULL };
@@ -474,9 +483,10 @@ static int F_PushDCIData(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXS
       return NXSL_ERR_NOT_STRING;
 
    NXSL_Object *object = argv[0]->getValueAsObject();
-   if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
-      return NXSL_ERR_BAD_CLASS;
-   DataCollectionTarget *node = (Node *)object->getData();
+       if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()) && _tcscmp(object->getClass()->getName(), g_nxslClusterClass.getName())
+           && _tcscmp(object->getClass()->getName(), g_nxslMobileDeviceClass.getName()))
+               return NXSL_ERR_BAD_CLASS;
+       DataCollectionTarget *node = (DataCollectionTarget *)object->getData();
 
    bool success = false;
        DCObject *dci = node->getDCObjectById(argv[1]->getValueAsUInt32());
index 29c806d..ea80acc 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
 ** NetXMS - Network Management System
 ** Copyright (C) 2003-2015 Victor Kirhenshtein
 **
@@ -688,6 +688,50 @@ NXSL_Value *NXSL_InterfaceClass::getAttr(NXSL_Object *object, const TCHAR *attr)
    return value;
 }
 
+/**
+ * NXSL class Mobile Device: constructor
+ */
+NXSL_MobileDeviceClass::NXSL_MobileDeviceClass() : NXSL_NetObjClass()
+{
+   _tcscpy(m_name, _T("MobileDevice"));
+}
+
+/**
+ * NXSL class Mobile Device: get attribute
+ */
+NXSL_Value *NXSL_MobileDeviceClass::getAttr(NXSL_Object *object, const TCHAR *attr)
+{
+   NXSL_Value *value = NXSL_NetObjClass::getAttr(object, attr);
+   if (value != NULL)
+      return value;
+
+   Interface *iface = (Interface *)object->getData();
+   // TODO: Declare possible attrs
+   return value;
+}
+
+/**
+ * NXSL class Cluster: constructor
+ */
+NXSL_ClusetClass::NXSL_ClusetClass() : NXSL_NetObjClass()
+{
+   _tcscpy(m_name, _T("Cluster"));
+}
+
+/**
+ * NXSL class Cluster: get attribute
+ */
+NXSL_Value *NXSL_ClusetClass::getAttr(NXSL_Object *object, const TCHAR *attr)
+{
+   NXSL_Value *value = NXSL_NetObjClass::getAttr(object, attr);
+   if (value != NULL)
+      return value;
+
+   Cluster *cluster = (Cluster *)object->getData();
+   // TODO: Declare possible attrs
+   return value;
+}
+
 /**
  * Event::setMessage() method
  */
@@ -1095,6 +1139,8 @@ NXSL_AlarmClass g_nxslAlarmClass;
 NXSL_DciClass g_nxslDciClass;
 NXSL_EventClass g_nxslEventClass;
 NXSL_InterfaceClass g_nxslInterfaceClass;
+NXSL_ClusetClass g_nxslClusterClass;
+NXSL_MobileDeviceClass g_nxslMobileDeviceClass;
 NXSL_NetObjClass g_nxslNetObjClass;
 NXSL_NodeClass g_nxslNodeClass;
 NXSL_SNMPTransportClass g_nxslSnmpTransportClass;
index daa5e82..ef15480 100644 (file)
@@ -11110,10 +11110,24 @@ void ClientSession::executeScript(NXCPMessage *request)
                vm = NXSLCompileAndCreateVM(script, errorMessage, 256, new NXSL_ClientSessionEnv(this, &msg));
                if (vm != NULL)
                {
-                  vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
-                  if (object->getObjectClass() == OBJECT_NODE)
+                  switch(object->getObjectClass())
                   {
-                     vm->setGlobalVariable(_T("$node"), new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, object)));
+                     case OBJECT_NODE:
+                        vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, object)));
+                        vm->setGlobalVariable(_T("$node"), new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, object)));
+                        break;
+                     case OBJECT_CLUSTER:
+                        vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslClusterClass, object)));
+                        break;
+                     case OBJECT_MOBILEDEVICE:
+                        vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslMobileDeviceClass, object)));
+                        break;
+                     case OBJECT_ZONE:
+                        vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslZoneClass, object)));
+                        break;
+                     default:
+                        vm->setGlobalVariable(_T("$object"), new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
+                        break;
                   }
                   msg.setField(VID_RCC, RCC_SUCCESS);
                   sendMessage(&msg);
index dc5948a..427f6ca 100644 (file)
@@ -56,6 +56,28 @@ public:
    virtual NXSL_Value *getAttr(NXSL_Object *object, const TCHAR *attr);
 };
 
+/**
+ * NXSL "MobileDevice" class
+ */
+class NXSL_MobileDeviceClass : public NXSL_NetObjClass
+{
+public:
+   NXSL_MobileDeviceClass();
+
+   virtual NXSL_Value *getAttr(NXSL_Object *object, const TCHAR *attr);
+};
+
+/**
+ * NXSL "Cluster" class
+ */
+class NXSL_ClusetClass : public NXSL_NetObjClass
+{
+public:
+   NXSL_ClusetClass();
+
+   virtual NXSL_Value *getAttr(NXSL_Object *object, const TCHAR *attr);
+};
+
 /**
  * NXSL "Zone" class
  */
@@ -183,6 +205,8 @@ extern NXSL_AlarmClass g_nxslAlarmClass;
 extern NXSL_DciClass g_nxslDciClass;
 extern NXSL_EventClass g_nxslEventClass;
 extern NXSL_InterfaceClass g_nxslInterfaceClass;
+extern NXSL_ClusetClass g_nxslClusterClass;
+extern NXSL_MobileDeviceClass g_nxslMobileDeviceClass;
 extern NXSL_NetObjClass g_nxslNetObjClass;
 extern NXSL_NodeClass g_nxslNodeClass;
 extern NXSL_SNMPTransportClass g_nxslSnmpTransportClass;