metric support in network device drivers; data collection error codes changed from...
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 7 Dec 2017 11:17:21 +0000 (13:17 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 7 Dec 2017 11:17:21 +0000 (13:17 +0200)
13 files changed:
include/nxcldefs.h
src/server/core/datacoll.cpp
src/server/core/dctarget.cpp
src/server/core/debug.cpp
src/server/core/mobile.cpp
src/server/core/node.cpp
src/server/core/sensor.cpp
src/server/include/nddrv.h
src/server/include/nms_core.h
src/server/include/nms_dcoll.h
src/server/include/nms_objects.h
src/server/include/nxsrvapi.h
src/server/libnxsrv/ndd.cpp

index 5a61962..813c0ca 100644 (file)
@@ -879,6 +879,7 @@ enum SessionState
 #define DS_SCRIPT             7
 #define DS_SSH                8
 #define DS_MQTT               9
+#define DS_DEVICE_DRIVER      10
 
 /**
  * Item status
index ae014b6..63804e7 100644 (file)
@@ -83,6 +83,12 @@ static void *GetItemData(DataCollectionTarget *dcTarget, DCItem *pItem, TCHAR *p
                           else
                                   *error = DCE_NOT_SUPPORTED;
             break;
+         case DS_DEVICE_DRIVER:
+            if (dcTarget->getObjectClass() == OBJECT_NODE)
+               *error = ((Node *)dcTarget)->getItemFromDeviceDriver(pItem->getName(), pBuffer, MAX_LINE_SIZE);
+            else
+               *error = DCE_NOT_SUPPORTED;
+            break;
          case DS_CHECKPOINT_AGENT:
                           if (dcTarget->getObjectClass() == OBJECT_NODE)
                    *error = ((Node *)dcTarget)->getItemFromCheckPointSNMP(pItem->getName(), MAX_LINE_SIZE, pBuffer);
@@ -152,7 +158,7 @@ static void *GetItemData(DataCollectionTarget *dcTarget, DCItem *pItem, TCHAR *p
          case DS_SMCLP:
             if (dcTarget->getObjectClass() == OBJECT_NODE)
             {
-                   *error = ((Node *)dcTarget)->getItemFromSMCLP(pItem->getName(), MAX_LINE_SIZE, pBuffer);
+                   *error = ((Node *)dcTarget)->getItemFromSMCLP(pItem->getName(), pBuffer, MAX_LINE_SIZE);
             }
             else
             {
index cc73fc2..4a3d0fb 100644 (file)
@@ -613,9 +613,9 @@ NetObj *DataCollectionTarget::objectFromParameter(const TCHAR *param)
 /**
  * Get value for server's internal parameter
  */
-UINT32 DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
+DataCollectionError DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
 {
-   UINT32 dwError = DCE_SUCCESS;
+   DataCollectionError error = DCE_SUCCESS;
 
    if (!_tcsicmp(param, _T("Status")))
    {
@@ -634,7 +634,7 @@ UINT32 DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize,
       }
       else
       {
-         dwError = DCE_NOT_SUPPORTED;
+         error = DCE_NOT_SUPPORTED;
       }
    }
    else if (MatchString(_T("ConditionStatus(*)"), param, FALSE))
@@ -666,20 +666,20 @@ UINT32 DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize,
                        }
                        else
                        {
-                dwError = DCE_NOT_SUPPORTED;
+                error = DCE_NOT_SUPPORTED;
                        }
       }
       else
       {
-         dwError = DCE_NOT_SUPPORTED;
+         error = DCE_NOT_SUPPORTED;
       }
    }
    else
    {
-      dwError = DCE_NOT_SUPPORTED;
+      error = DCE_NOT_SUPPORTED;
    }
 
-   return dwError;
+   return error;
 }
 
 /**
@@ -740,9 +740,9 @@ NXSL_VM *DataCollectionTarget::runDataCollectionScript(const TCHAR *param, DataC
 /**
  * Get parameter value from NXSL script
  */
-UINT32 DataCollectionTarget::getScriptItem(const TCHAR *param, size_t bufSize, TCHAR *buffer, DataCollectionTarget *targetObject)
+DataCollectionError DataCollectionTarget::getScriptItem(const TCHAR *param, size_t bufSize, TCHAR *buffer, DataCollectionTarget *targetObject)
 {
-   UINT32 rc = DCE_NOT_SUPPORTED;
+   DataCollectionError rc = DCE_NOT_SUPPORTED;
    NXSL_VM *vm = runDataCollectionScript(param, targetObject);
    if (vm != NULL)
    {
@@ -801,9 +801,9 @@ UINT32 DataCollectionTarget::getListFromScript(const TCHAR *param, StringList **
 /**
  * Get table from NXSL script
  */
-UINT32 DataCollectionTarget::getScriptTable(const TCHAR *param, Table **result, DataCollectionTarget *targetObject)
+DataCollectionError DataCollectionTarget::getScriptTable(const TCHAR *param, Table **result, DataCollectionTarget *targetObject)
 {
-   UINT32 rc = DCE_NOT_SUPPORTED;
+   DataCollectionError rc = DCE_NOT_SUPPORTED;
    NXSL_VM *vm = runDataCollectionScript(param, targetObject);
    if (vm != NULL)
    {
index ee6a4e7..c6f117b 100644 (file)
@@ -215,16 +215,16 @@ void ShowThreadPool(CONSOLE_CTX console, ThreadPool *p)
 /**
  * Get thread pool stat (for internal DCI)
  */
-LONG GetThreadPoolStat(ThreadPoolStat stat, const TCHAR *param, TCHAR *value)
+DataCollectionError GetThreadPoolStat(ThreadPoolStat stat, const TCHAR *param, TCHAR *value)
 {
    TCHAR poolName[64], options[64];
    if (!AgentGetParameterArg(param, 1, poolName, 64) ||
        !AgentGetParameterArg(param, 2, options, 64))
-      return SYSINFO_RC_UNSUPPORTED;
+      return DCE_NOT_SUPPORTED;
 
    ThreadPoolInfo info;
    if (!ThreadPoolGetInfo(poolName, &info))
-      return SYSINFO_RC_UNSUPPORTED;
+      return DCE_NOT_SUPPORTED;
 
    switch(stat)
    {
@@ -265,9 +265,9 @@ LONG GetThreadPoolStat(ThreadPoolStat stat, const TCHAR *param, TCHAR *value)
          ret_int(value, info.usage);
          break;
       default:
-         return SYSINFO_RC_UNSUPPORTED;
+         return DCE_NOT_SUPPORTED;
    }
-   return SYSINFO_RC_SUCCESS;
+   return DCE_SUCCESS;
 }
 
 /**
index 040bc5a..1b2f6e0 100644 (file)
@@ -272,9 +272,9 @@ void MobileDevice::updateStatus(NXCPMessage *msg)
 /**
  * Get value for server's internal parameter
  */
-UINT32 MobileDevice::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
+DataCollectionError MobileDevice::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
 {
-       UINT32 rc = DataCollectionTarget::getInternalItem(param, bufSize, buffer);
+   DataCollectionError rc = DataCollectionTarget::getInternalItem(param, bufSize, buffer);
        if (rc != DCE_NOT_SUPPORTED)
                return rc;
        rc = DCE_SUCCESS;
index ee011b2..bb3ffad 100644 (file)
@@ -3812,7 +3812,7 @@ bool Node::connectToAgent(UINT32 *error, UINT32 *socketError, bool *newConnectio
 /**
  * Convert SNMP error code to DC collection error code
  */
-inline UINT32 DCErrorFromSNMPError(UINT32 snmpError)
+inline DataCollectionError DCErrorFromSNMPError(UINT32 snmpError)
 {
    switch(snmpError)
    {
@@ -3832,7 +3832,7 @@ inline UINT32 DCErrorFromSNMPError(UINT32 snmpError)
 /**
  * Get DCI value via SNMP
  */
-UINT32 Node::getItemFromSNMP(WORD port, const TCHAR *param, size_t bufSize, TCHAR *buffer, int interpretRawValue)
+DataCollectionError Node::getItemFromSNMP(WORD port, const TCHAR *param, size_t bufSize, TCHAR *buffer, int interpretRawValue)
 {
    UINT32 dwResult;
 
@@ -3965,7 +3965,7 @@ static UINT32 SNMPGetTableCallback(SNMP_Variable *varbind, SNMP_Transport *snmp,
 /**
  * Get table from SNMP
  */
-UINT32 Node::getTableFromSNMP(WORD port, const TCHAR *oid, ObjectArray<DCTableColumn> *columns, Table **table)
+DataCollectionError Node::getTableFromSNMP(WORD port, const TCHAR *oid, ObjectArray<DCTableColumn> *columns, Table **table)
 {
    *table = NULL;
 
@@ -4014,7 +4014,7 @@ static UINT32 SNMPGetListCallback(SNMP_Variable *varbind, SNMP_Transport *snmp,
 /**
  * Get list of values from SNMP
  */
-UINT32 Node::getListFromSNMP(WORD port, const TCHAR *oid, StringList **list)
+DataCollectionError Node::getListFromSNMP(WORD port, const TCHAR *oid, StringList **list)
 {
    *list = NULL;
    SNMP_Transport *snmp = createSnmpTransport(port);
@@ -4065,7 +4065,7 @@ static UINT32 SNMPOIDSuffixListCallback(SNMP_Variable *varbind, SNMP_Transport *
 /**
  * Get list of OID suffixes from SNMP
  */
-UINT32 Node::getOIDSuffixListFromSNMP(WORD port, const TCHAR *oid, StringMap **values)
+DataCollectionError Node::getOIDSuffixListFromSNMP(WORD port, const TCHAR *oid, StringMap **values)
 {
    *values = NULL;
    SNMP_Transport *snmp = createSnmpTransport(port);
@@ -4098,7 +4098,7 @@ UINT32 Node::getOIDSuffixListFromSNMP(WORD port, const TCHAR *oid, StringMap **v
 /**
  * Get item's value via SNMP from CheckPoint's agent
  */
-UINT32 Node::getItemFromCheckPointSNMP(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer)
+DataCollectionError Node::getItemFromCheckPointSNMP(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer)
 {
    UINT32 dwResult;
 
@@ -4117,13 +4117,13 @@ UINT32 Node::getItemFromCheckPointSNMP(const TCHAR *szParam, UINT32 dwBufSize, T
       delete pTransport;
    }
    DbgPrintf(7, _T("Node(%s)->GetItemFromCheckPointSNMP(%s): dwResult=%d"), m_name, szParam, dwResult);
-   return DCErrorFromSNMPError(dwResult == SNMP_ERR_SUCCESS);
+   return DCErrorFromSNMPError(dwResult);
 }
 
 /**
  * Get item's value via native agent
  */
-UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer)
+DataCollectionError Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer)
 {
    if ((m_state & NSF_AGENT_UNREACHABLE) ||
        (m_state & DCSF_UNREACHABLE) ||
@@ -4131,7 +4131,8 @@ UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szB
        !(m_capabilities & NC_IS_NATIVE_AGENT))
       return DCE_COMM_ERROR;
 
-   UINT32 dwError = ERR_NOT_CONNECTED, dwResult = DCE_COMM_ERROR;
+   UINT32 dwError = ERR_NOT_CONNECTED;
+   DataCollectionError rc = DCE_COMM_ERROR;
    int retry = 3;
 
    AgentConnectionEx *conn = getAgentConnection();
@@ -4145,15 +4146,15 @@ UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szB
       switch(dwError)
       {
          case ERR_SUCCESS:
-            dwResult = DCE_SUCCESS;
+            rc = DCE_SUCCESS;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_UNKNOWN_PARAMETER:
-            dwResult = DCE_NOT_SUPPORTED;
+            rc = DCE_NOT_SUPPORTED;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_NO_SUCH_INSTANCE:
-            dwResult = DCE_NO_SUCH_INSTANCE;
+            rc = DCE_NO_SUCH_INSTANCE;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_NOT_CONNECTED:
@@ -4165,7 +4166,7 @@ UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szB
                goto end_loop;
             break;
          case ERR_INTERNAL_ERROR:
-            dwResult = DCE_COLLECTION_ERROR;
+            rc = DCE_COLLECTION_ERROR;
             setLastAgentCommTime();
             goto end_loop;
       }
@@ -4174,16 +4175,17 @@ UINT32 Node::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szB
 end_loop:
    if (conn != NULL)
       conn->decRefCount();
-   nxlog_debug(7, _T("Node(%s)->GetItemFromAgent(%s): dwError=%d dwResult=%d"), m_name, szParam, dwError, dwResult);
-   return dwResult;
+   nxlog_debug(7, _T("Node(%s)->GetItemFromAgent(%s): dwError=%d dwResult=%d"), m_name, szParam, dwError, rc);
+   return rc;
 }
 
 /**
  * Get table from agent
  */
-UINT32 Node::getTableFromAgent(const TCHAR *name, Table **table)
+DataCollectionError Node::getTableFromAgent(const TCHAR *name, Table **table)
 {
-   UINT32 dwError = ERR_NOT_CONNECTED, dwResult = DCE_COMM_ERROR;
+   UINT32 dwError = ERR_NOT_CONNECTED;
+   DataCollectionError result = DCE_COMM_ERROR;
    UINT32 dwTries = 3;
 
    *table = NULL;
@@ -4205,15 +4207,15 @@ UINT32 Node::getTableFromAgent(const TCHAR *name, Table **table)
       switch(dwError)
       {
          case ERR_SUCCESS:
-            dwResult = DCE_SUCCESS;
+            result = DCE_SUCCESS;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_UNKNOWN_PARAMETER:
-            dwResult = DCE_NOT_SUPPORTED;
+            result = DCE_NOT_SUPPORTED;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_NO_SUCH_INSTANCE:
-            dwResult = DCE_NO_SUCH_INSTANCE;
+            result = DCE_NO_SUCH_INSTANCE;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_NOT_CONNECTED:
@@ -4225,7 +4227,7 @@ UINT32 Node::getTableFromAgent(const TCHAR *name, Table **table)
                goto end_loop;
             break;
          case ERR_INTERNAL_ERROR:
-            dwResult = DCE_COLLECTION_ERROR;
+            result = DCE_COLLECTION_ERROR;
             setLastAgentCommTime();
             goto end_loop;
       }
@@ -4234,16 +4236,17 @@ UINT32 Node::getTableFromAgent(const TCHAR *name, Table **table)
 end_loop:
    if (conn != NULL)
       conn->decRefCount();
-   DbgPrintf(7, _T("Node(%s)->getTableFromAgent(%s): dwError=%d dwResult=%d"), m_name, name, dwError, dwResult);
-   return dwResult;
+   DbgPrintf(7, _T("Node(%s)->getTableFromAgent(%s): dwError=%d dwResult=%d"), m_name, name, dwError, result);
+   return result;
 }
 
 /**
  * Get list from agent
  */
-UINT32 Node::getListFromAgent(const TCHAR *name, StringList **list)
+DataCollectionError Node::getListFromAgent(const TCHAR *name, StringList **list)
 {
-   UINT32 dwError = ERR_NOT_CONNECTED, dwResult = DCE_COMM_ERROR;
+   UINT32 dwError = ERR_NOT_CONNECTED;
+   DataCollectionError rc = DCE_COMM_ERROR;
    UINT32 dwTries = 3;
 
    *list = NULL;
@@ -4265,15 +4268,15 @@ UINT32 Node::getListFromAgent(const TCHAR *name, StringList **list)
       switch(dwError)
       {
          case ERR_SUCCESS:
-            dwResult = DCE_SUCCESS;
+            rc = DCE_SUCCESS;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_UNKNOWN_PARAMETER:
-            dwResult = DCE_NOT_SUPPORTED;
+            rc = DCE_NOT_SUPPORTED;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_NO_SUCH_INSTANCE:
-            dwResult = DCE_NO_SUCH_INSTANCE;
+            rc = DCE_NO_SUCH_INSTANCE;
             setLastAgentCommTime();
             goto end_loop;
          case ERR_NOT_CONNECTED:
@@ -4285,7 +4288,7 @@ UINT32 Node::getListFromAgent(const TCHAR *name, StringList **list)
                goto end_loop;
             break;
          case ERR_INTERNAL_ERROR:
-            dwResult = DCE_COLLECTION_ERROR;
+            rc = DCE_COLLECTION_ERROR;
             setLastAgentCommTime();
             goto end_loop;
       }
@@ -4294,16 +4297,16 @@ UINT32 Node::getListFromAgent(const TCHAR *name, StringList **list)
 end_loop:
    if (conn != NULL)
       conn->decRefCount();
-   DbgPrintf(7, _T("Node(%s)->getListFromAgent(%s): dwError=%d dwResult=%d"), m_name, name, dwError, dwResult);
-   return dwResult;
+   DbgPrintf(7, _T("Node(%s)->getListFromAgent(%s): dwError=%d dwResult=%d"), m_name, name, dwError, rc);
+   return rc;
 }
 
 /**
  * Get item's value via SM-CLP protocol
  */
-UINT32 Node::getItemFromSMCLP(const TCHAR *param, UINT32 bufSize, TCHAR *buffer)
+DataCollectionError Node::getItemFromSMCLP(const TCHAR *param, TCHAR *buffer, size_t size)
 {
-   UINT32 result = DCE_COMM_ERROR;
+   DataCollectionError result = DCE_COMM_ERROR;
    int tries = 3;
 
    if (m_state & DCSF_UNREACHABLE)
@@ -4330,7 +4333,7 @@ UINT32 Node::getItemFromSMCLP(const TCHAR *param, UINT32 bufSize, TCHAR *buffer)
       TCHAR *value = m_smclpConnection->get(path, attr);
       if (value != NULL)
       {
-         nx_strncpy(buffer, value, bufSize);
+         _tcslcpy(buffer, value, size);
          free(value);
          result = DCE_SUCCESS;
          break;
@@ -4351,11 +4354,31 @@ end_loop:
 }
 
 /**
+ * Get metric value from network device driver
+ */
+DataCollectionError Node::getItemFromDeviceDriver(const TCHAR *param, TCHAR *buffer, size_t size)
+{
+   lockProperties();
+   NetworkDeviceDriver *driver = m_driver;
+   unlockProperties();
+
+   if ((driver == NULL) || !driver->hasMetrics())
+      return DCE_NOT_SUPPORTED;
+
+   SNMP_Transport *transport = createSnmpTransport();
+   if (transport == NULL)
+      return DCE_COMM_ERROR;
+   DataCollectionError rc = driver->getMetric(m_guid, transport, param, buffer, size);
+   delete transport;
+   return rc;
+}
+
+/**
  * Get value for server's internal parameter
  */
-UINT32 Node::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
+DataCollectionError Node::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
 {
-   UINT32 rc = DataCollectionTarget::getInternalItem(param, bufSize, buffer);
+   DataCollectionError rc = DataCollectionTarget::getInternalItem(param, bufSize, buffer);
    if (rc != DCE_NOT_SUPPORTED)
       return rc;
    rc = DCE_SUCCESS;
@@ -4660,7 +4683,7 @@ UINT32 Node::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
 /**
  * Translate DCI error code into RCC
  */
-static UINT32 RCCFromDCIError(UINT32 error)
+inline UINT32 RCCFromDCIError(DataCollectionError error)
 {
    switch(error)
    {
@@ -4674,6 +4697,8 @@ static UINT32 RCCFromDCIError(UINT32 error)
          return RCC_DCI_NOT_SUPPORTED;
       case DCE_COLLECTION_ERROR:
          return RCC_AGENT_ERROR;
+      case DCE_ACCESS_DENIED:
+         return RCC_ACCESS_DENIED;
       default:
          return RCC_SYSTEM_FAILURE;
    }
@@ -4684,36 +4709,32 @@ static UINT32 RCCFromDCIError(UINT32 error)
  */
 UINT32 Node::getItemForClient(int iOrigin, UINT32 userId, const TCHAR *pszParam, TCHAR *pszBuffer, UINT32 dwBufSize)
 {
-   UINT32 dwResult = RCC_ACCESS_DENIED, dwRetCode = -1;
+   DataCollectionError rc = DCE_ACCESS_DENIED;
 
    // Get data from node
    switch(iOrigin)
    {
       case DS_INTERNAL:
          if (checkAccessRights(userId, OBJECT_ACCESS_READ))
-            dwRetCode = getInternalItem(pszParam, dwBufSize, pszBuffer);
+            rc = getInternalItem(pszParam, dwBufSize, pszBuffer);
          break;
       case DS_NATIVE_AGENT:
          if (checkAccessRights(userId, OBJECT_ACCESS_READ_AGENT))
-            dwRetCode = getItemFromAgent(pszParam, dwBufSize, pszBuffer);
+            rc = getItemFromAgent(pszParam, dwBufSize, pszBuffer);
          break;
       case DS_SNMP_AGENT:
          if (checkAccessRights(userId, OBJECT_ACCESS_READ_SNMP))
-            dwRetCode = getItemFromSNMP(0, pszParam, dwBufSize, pszBuffer, SNMP_RAWTYPE_NONE);
+            rc = getItemFromSNMP(0, pszParam, dwBufSize, pszBuffer, SNMP_RAWTYPE_NONE);
          break;
       case DS_CHECKPOINT_AGENT:
          if (checkAccessRights(userId, OBJECT_ACCESS_READ_SNMP))
-            dwRetCode = getItemFromCheckPointSNMP(pszParam, dwBufSize, pszBuffer);
+            rc = getItemFromCheckPointSNMP(pszParam, dwBufSize, pszBuffer);
          break;
       default:
          return RCC_INVALID_ARGUMENT;
    }
 
-   // Translate return code to RCC
-   if (dwRetCode != -1)
-      dwResult = RCCFromDCIError(dwRetCode);
-
-   return dwResult;
+   return RCCFromDCIError(rc);
 }
 
 /**
@@ -4721,8 +4742,7 @@ UINT32 Node::getItemForClient(int iOrigin, UINT32 userId, const TCHAR *pszParam,
  */
 UINT32 Node::getTableForClient(const TCHAR *name, Table **table)
 {
-   UINT32 dwRetCode = getTableFromAgent(name, table);
-   return RCCFromDCIError(dwRetCode);
+   return RCCFromDCIError(getTableFromAgent(name, table));
 }
 
 /**
index 13ceeea..4926989 100644 (file)
@@ -832,12 +832,13 @@ void Sensor::prepareDlmsDciParameters(String &parameter)
 /**
  * Get item's value via native agent
  */
-UINT32 Sensor::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer)
+DataCollectionError Sensor::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer)
 {
    if (m_state & DCSF_UNREACHABLE)
       return DCE_COMM_ERROR;
 
-   UINT32 dwError = ERR_NOT_CONNECTED, dwResult = DCE_COMM_ERROR;
+   UINT32 dwError = ERR_NOT_CONNECTED;
+   DataCollectionError dwResult = DCE_COMM_ERROR;
    int retry = 3;
 
    nxlog_debug(7, _T("Sensor(%s)->GetItemFromAgent(%s)"), m_name, szParam);
@@ -899,9 +900,10 @@ UINT32 Sensor::getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *s
 /**
  * Get list from agent
  */
-UINT32 Sensor::getListFromAgent(const TCHAR *name, StringList **list)
+DataCollectionError Sensor::getListFromAgent(const TCHAR *name, StringList **list)
 {
-   UINT32 dwError = ERR_NOT_CONNECTED, dwResult = DCE_COMM_ERROR;
+   UINT32 dwError = ERR_NOT_CONNECTED;
+   DataCollectionError dwResult = DCE_COMM_ERROR;
    UINT32 dwTries = 3;
 
    *list = NULL;
index 7db91fa..3943a18 100644 (file)
@@ -104,14 +104,14 @@ enum AccessPointState
 /**
  * Module layout definition
  */
-typedef struct __ndd_module_layout
+struct NDD_MODULE_LAYOUT
 {
        int rows;                                       // number of port rows on the module
        int numberingScheme;            // port numbering scheme
        int columns;            // number of columns for custom layout
        WORD portRows[256];     // row numbers for ports
        WORD portColumns[256];  // column numbers for ports
-} NDD_MODULE_LAYOUT;
+};
 
 /**
  * Radio interface information
@@ -229,6 +229,9 @@ public:
    virtual ObjectArray<WirelessStationInfo> *getWirelessStations(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData);
    virtual AccessPointState getAccessPointState(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData,
                                                 UINT32 apIndex, const BYTE *macAddr, const InetAddress& ipAddr);
+   virtual bool hasMetrics();
+   virtual DataCollectionError getMetric(const uuid& node, SNMP_Transport *snmp, const TCHAR *name, TCHAR *value, size_t size);
+   virtual ObjectArray<AgentParameterDefinition> *getAvailableMetrics(const uuid& node, SNMP_Transport *snmp);
 };
 
 #endif   /* _nddrv_h_ */
index 1bc15d0..bcc4779 100644 (file)
@@ -1161,7 +1161,7 @@ void ShowServerStats(CONSOLE_CTX console);
 void ShowQueueStats(CONSOLE_CTX console, Queue *pQueue, const TCHAR *pszName);
 void ShowThreadPoolPendingQueue(CONSOLE_CTX console, ThreadPool *p, const TCHAR *pszName);
 void ShowThreadPool(CONSOLE_CTX console, ThreadPool *p);
-LONG GetThreadPoolStat(ThreadPoolStat stat, const TCHAR *param, TCHAR *value);
+DataCollectionError GetThreadPoolStat(ThreadPoolStat stat, const TCHAR *param, TCHAR *value);
 void DumpProcess(CONSOLE_CTX console);
 
 #define GRAPH_FLAG_TEMPLATE 1
index 07e137e..d01e805 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** 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 General Public License as published by
 #ifndef _nms_dcoll_h_
 #define _nms_dcoll_h_
 
-
-//
-// Data collection errors
-//
-
-#define DCE_SUCCESS           0
-#define DCE_COMM_ERROR        1
-#define DCE_NOT_SUPPORTED     2
-#define DCE_IGNORE            3
-#define DCE_NO_SUCH_INSTANCE  4
-#define DCE_COLLECTION_ERROR  5
-
 /**
  * Threshold check results
  */
index 5137de3..fb133d7 100644 (file)
@@ -1116,9 +1116,9 @@ public:
    virtual void enterMaintenanceMode();
    virtual void leaveMaintenanceMode();
 
-   virtual UINT32 getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer);
-   virtual UINT32 getScriptItem(const TCHAR *param, size_t bufSize, TCHAR *buffer, DataCollectionTarget *targetObject);
-   virtual UINT32 getScriptTable(const TCHAR *param, Table **result, DataCollectionTarget *targetObject);
+   virtual DataCollectionError getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer);
+   virtual DataCollectionError getScriptItem(const TCHAR *param, size_t bufSize, TCHAR *buffer, DataCollectionTarget *targetObject);
+   virtual DataCollectionError getScriptTable(const TCHAR *param, Table **result, DataCollectionTarget *targetObject);
 
    virtual UINT32 getEffectiveSourceNode(DCObject *dco);
 
@@ -1310,7 +1310,7 @@ public:
        const TCHAR *getUserId() { return CHECK_NULL_EX(m_userId); }
        const LONG getBatteryLevel() { return m_batteryLevel; }
 
-       virtual UINT32 getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer);
+       virtual DataCollectionError getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer);
 
        virtual bool isReadyForStatusPoll()  { return false; }
        virtual bool isReadyForConfigurationPoll()  { return false; }
@@ -1573,8 +1573,8 @@ public:
    const TCHAR *getDescription() const { return m_description; }
    UINT32 getFrameCount() const { return m_frameCount; }
 
-   UINT32 getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer);
-   UINT32 getListFromAgent(const TCHAR *name, StringList **list);
+   DataCollectionError getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer);
+   DataCollectionError getListFromAgent(const TCHAR *name, StringList **list);
 
    void setProvisoned() { m_state |= SSF_PROVISIONED; }
 
@@ -1978,19 +1978,21 @@ public:
 
    bool connectToSMCLP();
 
-       virtual UINT32 getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer);
+       virtual DataCollectionError getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer);
+
+   DataCollectionError getItemFromSNMP(WORD port, const TCHAR *param, size_t bufSize, TCHAR *buffer, int interpretRawValue);
+   DataCollectionError getTableFromSNMP(WORD port, const TCHAR *oid, ObjectArray<DCTableColumn> *columns, Table **table);
+   DataCollectionError getListFromSNMP(WORD port, const TCHAR *oid, StringList **list);
+   DataCollectionError getOIDSuffixListFromSNMP(WORD port, const TCHAR *oid, StringMap **values);
+   DataCollectionError getItemFromCheckPointSNMP(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer);
+   DataCollectionError getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer);
+   DataCollectionError getTableFromAgent(const TCHAR *name, Table **table);
+   DataCollectionError getListFromAgent(const TCHAR *name, StringList **list);
+   DataCollectionError getItemFromSMCLP(const TCHAR *param, TCHAR *buffer, size_t size);
+   DataCollectionError getItemFromDeviceDriver(const TCHAR *param, TCHAR *buffer, size_t size);
 
-   UINT32 getItemFromSNMP(WORD port, const TCHAR *param, size_t bufSize, TCHAR *buffer, int interpretRawValue);
-       UINT32 getTableFromSNMP(WORD port, const TCHAR *oid, ObjectArray<DCTableColumn> *columns, Table **table);
-   UINT32 getListFromSNMP(WORD port, const TCHAR *oid, StringList **list);
-   UINT32 getOIDSuffixListFromSNMP(WORD port, const TCHAR *oid, StringMap **values);
-   UINT32 getItemFromCheckPointSNMP(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer);
-   UINT32 getItemFromAgent(const TCHAR *szParam, UINT32 dwBufSize, TCHAR *szBuffer);
-       UINT32 getTableFromAgent(const TCHAR *name, Table **table);
-       UINT32 getListFromAgent(const TCHAR *name, StringList **list);
    UINT32 getItemForClient(int iOrigin, UINT32 userId, const TCHAR *pszParam, TCHAR *pszBuffer, UINT32 dwBufSize);
    UINT32 getTableForClient(const TCHAR *name, Table **table);
-   UINT32 getItemFromSMCLP(const TCHAR *param, UINT32 bufSize, TCHAR *buffer);
 
        virtual NXSL_Array *getParentsForNXSL();
        virtual NXSL_Array *getTemplatesForNXSL();
index 82fefd9..33de5ee 100644 (file)
 #define ENCRYPTION_REQUIRED   3
 
 /**
+ * Data collection errors
+ */
+enum DataCollectionError
+{
+   DCE_SUCCESS           = 0,
+   DCE_COMM_ERROR        = 1,
+   DCE_NOT_SUPPORTED     = 2,
+   DCE_IGNORE            = 3,
+   DCE_NO_SUCH_INSTANCE  = 4,
+   DCE_COLLECTION_ERROR  = 5,
+   DCE_ACCESS_DENIED     = 6
+};
+
+/**
  * Agent action output callback events
  */
 enum ActionCallbackEvent
index 65d9318..d754649 100644 (file)
@@ -834,3 +834,38 @@ AccessPointState NetworkDeviceDriver::getAccessPointState(SNMP_Transport *snmp,
 {
    return AP_UNKNOWN;
 }
+
+/**
+ * Check if driver can provide additional metrics
+ */
+bool NetworkDeviceDriver::hasMetrics()
+{
+   return false;
+}
+
+/**
+ * Get value of given metric
+ *
+ * @param node node object GUID
+ * @param snmp SNMP transport
+ * @param name metric name
+ * @param value buffer for metric value (size at least MAX_RESULT_LENGTH)
+ * @param size buffer size
+ * @return data collection error code
+ */
+DataCollectionError NetworkDeviceDriver::getMetric(const uuid& node, SNMP_Transport *snmp, const TCHAR *name, TCHAR *value, size_t size)
+{
+   return DCE_NOT_SUPPORTED;
+}
+
+/**
+ * Get list of metrics supported by driver
+ *
+ * @param node node object GUID
+ * @param snmp SNMP transport
+ * @return list of metrics supported by driver or NULL on error
+ */
+ObjectArray<AgentParameterDefinition> *NetworkDeviceDriver::getAvailableMetrics(const uuid& node, SNMP_Transport *snmp)
+{
+   return NULL;
+}