Implemented SNMP table tools on server level
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 6 Sep 2005 12:12:18 +0000 (12:12 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 6 Sep 2005 12:12:18 +0000 (12:12 +0000)
13 files changed:
.gitattributes
include/nxclapi.h
include/nxtools.h
sql/schema.in
src/server/core/Makefile.am
src/server/core/node.cpp
src/server/core/nortel.cpp
src/server/core/nxcore.dsp
src/server/core/objtools.cpp [new file with mode: 0644]
src/server/core/session.cpp
src/server/core/snmp.cpp
src/server/include/nms_core.h
src/server/include/nms_objects.h

index e509767..27bd8bd 100644 (file)
@@ -763,6 +763,7 @@ src/server/core/nxcore.dsp -text
 src/server/core/nxcore.dsw -text
 src/server/core/nxcore.h -text
 src/server/core/objects.cpp -text
+src/server/core/objtools.cpp -text
 src/server/core/package.cpp -text
 src/server/core/poll.cpp -text
 src/server/core/rootobj.cpp -text
index 797de40..0abb6c9 100644 (file)
@@ -271,6 +271,7 @@ typedef void * NXC_SESSION;
 #define RCC_NO_ENCRYPTION_SUPPORT   ((DWORD)45)
 #define RCC_INTERNAL_ERROR          ((DWORD)46)
 #define RCC_EXEC_FAILED             ((DWORD)47)
+#define RCC_INVALID_TOOL_ID         ((DWORD)48)
 
 
 //
index b6865d2..a00e178 100644 (file)
 // Tool types
 //
 
-#define TOOL_TYPE_INTERNAL       0
-#define TOOL_TYPE_ACTION         1
-#define TOOL_TYPE_TABLE_SNMP     2
-#define TOOL_TYPE_TABLE_AGENT    3
-#define TOOL_TYPE_URL            4
-#define TOOL_TYPE_COMMAND        5
+#define TOOL_TYPE_INTERNAL          0
+#define TOOL_TYPE_ACTION            1
+#define TOOL_TYPE_TABLE_SNMP        2
+#define TOOL_TYPE_TABLE_AGENT       3
+#define TOOL_TYPE_URL               4
+#define TOOL_TYPE_COMMAND           5
+
+
+//
+// SNMP tool flags
+//
+
+#define TF_SNMP_INDEXED_BY_VALUE    ((DWORD)0x00010000)
+
+
+//
+// Column formats
+//
+
+#define CFMT_STRING     0
+#define CFMT_INTEGER    1
+#define CFMT_FLOAT      2
+#define CFMT_IP_ADDR    3
+#define CFMT_MAC_ADDR   4
 
 
 #endif
index f127b1a..702f82d 100644 (file)
@@ -706,6 +706,6 @@ CREATE TABLE object_tools_snmp_tables
        col_number integer not null,
        col_name varchar(255),
        col_oid varchar(255),
-       col_display integer,    // Column display mode
+       col_format integer,     // Column format (integer, string, etc.)
        PRIMARY KEY(tool_id,col_number)
 ) TABLE_TYPE;
index 6cc2eec..cb3a370 100644 (file)
@@ -1,7 +1,7 @@
 INCLUDES=-I@top_srcdir@/include -I@top_srcdir@/src/server/include
 
 lib_LTLIBRARIES = libnxcore.la
-libnxcore_la_SOURCES = acl.cpp actions.cpp admin.cpp alarm.cpp client.cpp config.cpp container.cpp correlate.cpp datacoll.cpp dbwrite.cpp dcitem.cpp dcithreshold.cpp dcivalue.cpp debug.cpp email.cpp entirenet.cpp epp.cpp events.cpp evproc.cpp hk.cpp id.cpp image.cpp interface.cpp locks.cpp main.cpp modules.cpp netinfo.cpp netobj.cpp netsrv.cpp node.cpp nortel.cpp np.cpp objects.cpp package.cpp poll.cpp rootobj.cpp session.cpp sms.cpp snmp.cpp snmptrap.cpp subnet.cpp syncer.cpp template.cpp tools.cpp tracert.cpp uniroot.cpp users.cpp vpnconn.cpp watchdog.cpp zone.cpp
+libnxcore_la_SOURCES = acl.cpp actions.cpp admin.cpp alarm.cpp client.cpp config.cpp container.cpp correlate.cpp datacoll.cpp dbwrite.cpp dcitem.cpp dcithreshold.cpp dcivalue.cpp debug.cpp email.cpp entirenet.cpp epp.cpp events.cpp evproc.cpp hk.cpp id.cpp image.cpp interface.cpp locks.cpp main.cpp modules.cpp netinfo.cpp netobj.cpp netsrv.cpp node.cpp nortel.cpp np.cpp objects.cpp objtools.cpp package.cpp poll.cpp rootobj.cpp session.cpp sms.cpp snmp.cpp snmptrap.cpp subnet.cpp syncer.cpp template.cpp tools.cpp tracert.cpp uniroot.cpp users.cpp vpnconn.cpp watchdog.cpp zone.cpp
 libnxcore_la_LDFLAGS = -version-info $(LIBNXCORE_LIBRARY_VERSION)
 
 EXTRA_DIST = \
index 58fb565..fe26c0a 100644 (file)
@@ -2217,3 +2217,21 @@ void Node::UpdateRoutingTable(void)
       RTUnlock();
    }
 }
+
+
+//
+// Call SNMP Enumerate with node's SNMP parameters
+//
+
+DWORD Node::CallSnmpEnumerate(char *pszRootOid, 
+                              void (* pHandler)(DWORD, DWORD, WORD, const char *, SNMP_Variable *, SNMP_Transport *, void *),
+                              void *pArg)
+{
+   if ((m_dwFlags & NF_IS_SNMP) && 
+       (!(m_dwDynamicFlags & NDF_SNMP_UNREACHEABLE)) &&
+       (!(m_dwDynamicFlags & NDF_UNREACHEABLE)))
+      return SnmpEnumerate(m_iSNMPVersion, m_dwIpAddr, m_wSNMPPort,
+                           m_szCommunityString, pszRootOid, pHandler, pArg, FALSE);
+   else
+      return SNMP_ERR_COMM;
+}
index f35d430..da31dc2 100644 (file)
@@ -47,7 +47,8 @@ struct VLAN_LIST
 //
 
 static void HandlerVlanList(DWORD dwVersion, DWORD dwAddr, WORD wPort, 
-                            const char *pszCommunity, SNMP_Variable *pVar, void *pArg)
+                            const char *pszCommunity, SNMP_Variable *pVar,
+                            SNMP_Transport *pTransport, void *pArg)
 {
    DWORD dwIndex, oidName[MAX_OID_LEN], dwNameLen;
    VLAN_LIST *pVlanList = (VLAN_LIST *)pArg;
@@ -87,7 +88,8 @@ static void HandlerVlanList(DWORD dwVersion, DWORD dwAddr, WORD wPort,
 //
 
 static void HandlerPassportIfList(DWORD dwVersion, DWORD dwAddr, WORD wPort,
-                                  const char *pszCommunity, SNMP_Variable *pVar, void *pArg)
+                                  const char *pszCommunity, SNMP_Variable *pVar,
+                                  SNMP_Transport *pTransport, void *pArg)
 {
    INTERFACE_LIST *pIfList = (INTERFACE_LIST *)pArg;
    VLAN_LIST *pVlanList = (VLAN_LIST *)pIfList->pArg;
index e8ad302..d8785ac 100644 (file)
@@ -234,6 +234,10 @@ SOURCE=.\objects.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\objtools.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\package.cpp
 # End Source File
 # Begin Source File
diff --git a/src/server/core/objtools.cpp b/src/server/core/objtools.cpp
new file mode 100644 (file)
index 0000000..eb3b284
--- /dev/null
@@ -0,0 +1,327 @@
+/* 
+** NetXMS - Network Management System
+** Copyright (C) 2003, 2004, 2005 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
+** the Free Software Foundation; either version 2 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 General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: objtools.cpp
+**
+**/
+
+#include "nxcore.h"
+
+
+//
+// Tool startup info
+//
+
+struct TOOL_STARTUP_INFO
+{
+   DWORD dwToolId;
+   DWORD dwRqId;
+   DWORD dwFlags;
+   Node *pNode;
+   ClientSession *pSession;
+};
+
+
+//
+// SNMP table enumerator arguments
+//
+
+struct SNMP_ENUM_ARGS
+{
+   DWORD dwNumCols;
+   TCHAR **ppszOidList;
+   LONG *pnFormatList;
+   DWORD dwFlags;
+   NETXMS_VALUES_LIST values;
+};
+
+
+//
+// Check if tool with given id exist and is a table tool
+//
+
+BOOL IsTableTool(DWORD dwToolId)
+{
+   DB_RESULT hResult;
+   TCHAR szBuffer[256];
+   LONG nType;
+   BOOL bResult = FALSE;
+
+   _stprintf(szBuffer, _T("SELECT tool_type FROM object_tools WHERE tool_id=%ld"), dwToolId);
+   hResult = DBSelect(g_hCoreDB, szBuffer);
+   if (hResult != NULL)
+   {
+      if (DBGetNumRows(hResult) > 0)
+      {
+         nType = DBGetFieldLong(hResult, 0, 0);
+         bResult = ((nType == TOOL_TYPE_TABLE_SNMP) || (nType == TOOL_TYPE_TABLE_AGENT));
+      }
+      DBFreeResult(hResult);
+   }
+   return bResult;
+}
+
+
+//
+// Check if user has access to the tool
+//
+
+BOOL CheckObjectToolAccess(DWORD dwToolId, DWORD dwUserId)
+{
+   DB_RESULT hResult;
+   TCHAR szBuffer[256];
+   BOOL bResult = FALSE;
+
+   if (dwUserId == 0)
+      return TRUE;
+
+   _stprintf(szBuffer, _T("SELECT tool_id FROM object_tools_acl WHERE tool_id=%ld AND user_id=%ld"),
+             dwToolId, dwUserId);
+   hResult = DBSelect(g_hCoreDB, szBuffer);
+   if (hResult != NULL)
+   {
+      if (DBGetNumRows(hResult) > 0)
+      {
+         bResult = TRUE;
+      }
+      DBFreeResult(hResult);
+   }
+   return bResult;
+}
+
+
+//
+// Agent table tool execution thread
+//
+
+static THREAD_RESULT THREAD_CALL GetAgentTable(void *pArg)
+{
+   return THREAD_OK;
+}
+
+
+//
+// Add SNMP variable value to results list
+//
+
+static void AddSNMPResult(NETXMS_VALUES_LIST *pValues, SNMP_Variable *pVar, LONG nFmt)
+{
+   TCHAR szBuffer[4096];
+
+   if (pVar != NULL)
+   {
+      switch(nFmt)
+      {
+         case CFMT_MAC_ADDR:
+            pVar->GetValueAsMACAddr(szBuffer);
+            break;
+         default:
+            pVar->GetValueAsString(szBuffer, 4096);
+            break;
+      }
+   }
+   else
+   {
+      szBuffer[0] = 0;
+   }
+   NxAddResultString(pValues, szBuffer);
+}
+
+
+//
+// Handler for SNMP table enumeration
+//
+
+static void TableHandler(DWORD dwVersion, DWORD dwAddr, WORD wPort,
+                         const char *szCommunity, SNMP_Variable *pVar,
+                         SNMP_Transport *pTransport, void *pArg)
+{
+   TCHAR szOid[MAX_OID_LEN * 4], szSuffix[MAX_OID_LEN * 4];
+   SNMP_PDU *pRqPDU, *pRespPDU;
+   DWORD i, dwResult, dwNameLen, pdwVarName[MAX_OID_LEN];
+
+   // Create index (OID suffix) for columns
+   if (((SNMP_ENUM_ARGS *)pArg)->dwFlags & TF_SNMP_INDEXED_BY_VALUE)
+   {
+      _stprintf(szSuffix, _T(".%lu"), pVar->GetValueAsUInt());
+   }
+   else
+   {
+      SNMP_ObjectId *pOid;
+
+      dwNameLen = SNMPParseOID(((SNMP_ENUM_ARGS *)pArg)->ppszOidList[0], pdwVarName, MAX_OID_LEN);
+      pOid = pVar->GetName();
+      SNMPConvertOIDToText(pOid->Length() - dwNameLen, 
+         (DWORD *)&(pOid->GetValue())[dwNameLen], szSuffix, MAX_OID_LEN * 4);
+   }
+printf("SUFFIX: \"%s\"\n", szSuffix);
+
+   // Get values for other columns
+   pRqPDU = new SNMP_PDU(SNMP_GET_REQUEST, (char *)szCommunity, SnmpNewRequestId(), dwVersion);
+   for(i = 1; i < ((SNMP_ENUM_ARGS *)pArg)->dwNumCols; i++)
+   {
+      _tcscpy(szOid, ((SNMP_ENUM_ARGS *)pArg)->ppszOidList[i]);
+      _tcscat(szOid, szSuffix);
+      dwNameLen = SNMPParseOID(szOid, pdwVarName, MAX_OID_LEN);
+      if (dwNameLen != 0)
+      {
+         pRqPDU->BindVariable(new SNMP_Variable(pdwVarName, dwNameLen));
+      }
+   }
+
+   dwResult = pTransport->DoRequest(pRqPDU, &pRespPDU, 1000, 3);
+   delete pRqPDU;
+   if (dwResult == SNMP_ERR_SUCCESS)
+   {
+      if ((pRespPDU->GetNumVariables() > 0) &&
+       (pRespPDU->GetErrorCode() == SNMP_PDU_ERR_SUCCESS))
+      {
+         // Add first column to results
+         AddSNMPResult(&((SNMP_ENUM_ARGS *)pArg)->values, pVar, ((SNMP_ENUM_ARGS *)pArg)->pnFormatList[0]);
+
+         for(i = 1; i < ((SNMP_ENUM_ARGS *)pArg)->dwNumCols; i++)
+            AddSNMPResult(&((SNMP_ENUM_ARGS *)pArg)->values, 
+                          pRespPDU->GetVariable(i - 1), 
+                          ((SNMP_ENUM_ARGS *)pArg)->pnFormatList[i]);
+      }
+      delete pRespPDU;
+   }
+}
+
+
+//
+// SNMP table tool execution thread
+//
+
+static THREAD_RESULT THREAD_CALL GetSNMPTable(void *pArg)
+{
+   TCHAR szBuffer[256];
+   DB_RESULT hResult;
+   CSCPMessage msg;
+   DWORD i, dwId, dwNumCols;
+   SNMP_ENUM_ARGS args;
+
+   // Prepare data message
+   msg.SetCode(CMD_TABLE_DATA);
+   msg.SetId(((TOOL_STARTUP_INFO *)pArg)->dwRqId);
+
+   _stprintf(szBuffer, _T("SELECT col_name,col_oid,col_format FROM object_tools_snmp_tables WHERE tool_id=%ld ORDER BY col_number"),
+             ((TOOL_STARTUP_INFO *)pArg)->dwToolId);
+   hResult = DBSelect(g_hCoreDB, szBuffer);
+   if (hResult != NULL)
+   {
+      dwNumCols = DBGetNumRows(hResult);
+      if (dwNumCols > 0)
+      {
+         msg.SetVariable(VID_NUM_COLUMNS, dwNumCols);
+         args.dwNumCols = dwNumCols;
+         args.ppszOidList = (TCHAR **)malloc(sizeof(TCHAR *) * dwNumCols);
+         args.pnFormatList = (LONG *)malloc(sizeof(LONG) * dwNumCols);
+         args.dwFlags = ((TOOL_STARTUP_INFO *)pArg)->dwFlags;
+         args.values.dwNumStrings = 0;
+         args.values.ppStringList = NULL;
+         for(i = 0; i < dwNumCols; i++)
+         {
+            msg.SetVariable(VID_COLUMN_NAME_BASE + i, DBGetField(hResult, i, 0));
+            args.ppszOidList[i] = _tcsdup(DBGetField(hResult, i, 1));
+            args.pnFormatList[i] = DBGetFieldLong(hResult, i, 2);
+         }
+
+         // Enumerate
+         ((TOOL_STARTUP_INFO *)pArg)->pNode->CallSnmpEnumerate(args.ppszOidList[0], TableHandler, &args);
+
+         // Fill in message with results
+         for(i = 0; i < args.values.dwNumStrings; i++)
+            msg.SetVariable(dwId++, args.values.ppStringList[i]);
+
+         // Cleanup
+         for(i = 0; i < args.values.dwNumStrings; i++)
+            safe_free(args.values.ppStringList[i]);
+         safe_free(args.values.ppStringList);
+         for(i = 0; i < dwNumCols; i++)
+            safe_free(args.ppszOidList[i]);
+         free(args.ppszOidList);
+         free(args.pnFormatList);
+      }
+      else
+      {
+         msg.SetVariable(VID_RCC, RCC_INTERNAL_ERROR);
+      }
+      DBFreeResult(hResult);
+   }
+   else
+   {
+      msg.SetVariable(VID_RCC, RCC_DB_FAILURE);
+   }
+
+   // Send responce to client
+   ((TOOL_STARTUP_INFO *)pArg)->pSession->SendMessage(&msg);
+   ((TOOL_STARTUP_INFO *)pArg)->pSession->DecRefCount();
+   free(pArg);
+   return THREAD_OK;
+}
+
+
+//
+// Execute table tool
+//
+
+DWORD ExecuteTableTool(DWORD dwToolId, Node *pNode, DWORD dwRqId, ClientSession *pSession)
+{
+   LONG nType;
+   DWORD dwRet = SYSINFO_RC_SUCCESS;
+   TOOL_STARTUP_INFO *pStartup;
+   TCHAR szBuffer[256];
+   DB_RESULT hResult;
+
+   _stprintf(szBuffer, _T("SELECT tool_type,flags FROM object_tools WHERE tool_id=%ld"), dwToolId);
+   hResult = DBSelect(g_hCoreDB, szBuffer);
+   if (hResult != NULL)
+   {
+      if (DBGetNumRows(hResult) > 0)
+      {
+         nType = DBGetFieldLong(hResult, 0, 0);
+         if ((nType == TOOL_TYPE_TABLE_SNMP) || (nType == TOOL_TYPE_TABLE_AGENT))
+         {
+            pSession->IncRefCount();
+            pStartup = (TOOL_STARTUP_INFO *)malloc(sizeof(TOOL_STARTUP_INFO));
+            pStartup->dwToolId = dwToolId;
+            pStartup->dwRqId = dwRqId;
+            pStartup->dwFlags = DBGetFieldULong(hResult, 0, 1);
+            pStartup->pNode = pNode;
+            pStartup->pSession = pSession;
+            ThreadCreate((nType == TOOL_TYPE_TABLE_SNMP) ? GetSNMPTable : GetAgentTable,
+                         0, pStartup);
+         }
+         else
+         {
+            dwRet = RCC_INCOMPATIBLE_OPERATION;
+         }
+      }
+      else
+      {
+         dwRet = RCC_INVALID_TOOL_ID;
+      }
+      DBFreeResult(hResult);
+   }
+   else
+   {
+      dwRet = RCC_DB_FAILURE;
+   }
+   return dwRet;
+}
index 1e70e13..1b4cea5 100644 (file)
@@ -843,6 +843,9 @@ void ClientSession::ProcessingThread(void)
          case CMD_GET_OBJECT_TOOLS:
             SendObjectTools(pMsg->GetId());
             break;
+         case CMD_EXEC_TABLE_TOOL:
+            ExecTableTool(pMsg);
+            break;
          default:
             // Pass message to loaded modules
             for(i = 0; i < g_dwNumModules; i++)
@@ -5009,3 +5012,58 @@ void ClientSession::SendObjectTools(DWORD dwRqId)
    // Send response
    SendMessage(&msg);
 }
+
+
+//
+// Execute table tool (either SNMP or agent table)
+//
+
+void ClientSession::ExecTableTool(CSCPMessage *pRequest)
+{
+   CSCPMessage msg;
+   DWORD dwToolId;
+   NetObj *pObject;
+
+   // Prepare response message
+   msg.SetCode(CMD_REQUEST_COMPLETED);
+   msg.SetId(pRequest->GetId());
+
+   // Check if tool exist and has correct type
+   dwToolId = pRequest->GetVariableLong(VID_TOOL_ID);
+   if (IsTableTool(dwToolId))
+   {
+      // Check access
+      if (CheckObjectToolAccess(dwToolId, m_dwUserId))
+      {
+         pObject = FindObjectById(pRequest->GetVariableLong(VID_OBJECT_ID));
+         if (pObject != NULL)
+         {
+            if (pObject->Type() == OBJECT_NODE)
+            {
+               msg.SetVariable(VID_RCC,
+                               ExecuteTableTool(dwToolId, (Node *)pObject,
+                                                pRequest->GetId(), this));
+            }
+            else
+            {
+               msg.SetVariable(VID_RCC, RCC_INCOMPATIBLE_OPERATION);
+            }
+         }
+         else
+         {
+            msg.SetVariable(VID_RCC, RCC_INVALID_OBJECT_ID);
+         }
+      }
+      else
+      {
+         msg.SetVariable(VID_RCC, RCC_ACCESS_DENIED);
+      }
+   }
+   else
+   {
+      msg.SetVariable(VID_RCC, RCC_INVALID_TOOL_ID);
+   }
+
+   // Send response
+   SendMessage(&msg);
+}
index 511109e..1ff190f 100644 (file)
@@ -44,6 +44,16 @@ static DWORD m_dwOidTableSize = 0;
 static DWORD m_dwRequestId = 1;
 
 
+//
+// Generate new request ID
+//
+
+DWORD SnmpNewRequestId(void)
+{
+   return m_dwRequestId++;
+}
+
+
 //
 // Initialize SNMP subsystem
 //
@@ -213,7 +223,7 @@ DWORD SnmpGet(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCommunity
 
 DWORD SnmpEnumerate(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCommunity, 
                     const char *szRootOid,
-                    void (* pHandler)(DWORD, DWORD, WORD, const char *, SNMP_Variable *, void *), 
+                    void (* pHandler)(DWORD, DWORD, WORD, const char *, SNMP_Variable *, SNMP_Transport *, void *),
                     void *pUserArg, BOOL bVerbose)
 {
    DWORD pdwRootName[MAX_OID_LEN], dwRootLen, pdwName[MAX_OID_LEN], dwNameLen, dwResult;
@@ -274,7 +284,7 @@ DWORD SnmpEnumerate(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCom
                      dwNameLen = pVar->GetName()->Length();
 
                      // Call user's callback function for processing
-                     pHandler(dwVersion, dwAddr, wPort, szCommunity, pVar, pUserArg);
+                     pHandler(dwVersion, dwAddr, wPort, szCommunity, pVar, pTransport, pUserArg);
                   }
                   else
                   {
@@ -313,7 +323,7 @@ DWORD SnmpEnumerate(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCom
 //
 
 static void HandlerIndex(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCommunity, 
-                         SNMP_Variable *pVar, void *pArg)
+                         SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    if (((INTERFACE_LIST *)pArg)->iEnumPos < ((INTERFACE_LIST *)pArg)->iNumEntries)
       ((INTERFACE_LIST *)pArg)->pInterfaces[((INTERFACE_LIST *)pArg)->iEnumPos].dwIndex = pVar->GetValueAsUInt();
@@ -326,7 +336,8 @@ static void HandlerIndex(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *
 //
 
 static void HandlerIpAddr(DWORD dwVersion, DWORD dwAddr, WORD wPort,
-                          const char *szCommunity, SNMP_Variable *pVar, void *pArg)
+                          const char *szCommunity, SNMP_Variable *pVar,
+                          SNMP_Transport *pTransport, void *pArg)
 {
    DWORD dwIndex, dwNetMask, dwNameLen;
    DWORD oidName[MAX_OID_LEN];
@@ -460,7 +471,7 @@ INTERFACE_LIST *SnmpGetInterfaceList(DWORD dwVersion, DWORD dwAddr, WORD wPort,
 //
 
 static void HandlerArp(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCommunity, 
-                       SNMP_Variable *pVar, void *pArg)
+                       SNMP_Variable *pVar, SNMP_Transport *pTransport, void *pArg)
 {
    DWORD oidName[MAX_OID_LEN], dwNameLen, dwIndex = 0;
    BYTE bMac[64];
@@ -570,7 +581,8 @@ int SnmpGetInterfaceStatus(DWORD dwVersion, DWORD dwNodeAddr, WORD wPort,
 //
 
 static void HandlerRoute(DWORD dwVersion, DWORD dwAddr, WORD wPort,
-                         const char *szCommunity, SNMP_Variable *pVar, void *pArg)
+                         const char *szCommunity, SNMP_Variable *pVar,
+                         SNMP_Transport *pTransport, void *pArg)
 {
    DWORD oidName[MAX_OID_LEN], dwNameLen;
    ROUTE route;
index b378999..216ca08 100644 (file)
@@ -371,6 +371,7 @@ private:
    void UpdateAgentConfig(CSCPMessage *pRequest);
    void ExecuteAction(CSCPMessage *pRequest);
    void SendObjectTools(DWORD dwRqId);
+   void ExecTableTool(CSCPMessage *pRequest);
 
 public:
    ClientSession(SOCKET hSocket, DWORD dwHostAddr);
@@ -435,12 +436,14 @@ void StartDBWriter(void);
 void StopDBWriter(void);
 
 void SnmpInit(void);
+DWORD SnmpNewRequestId(void);
 DWORD SnmpGet(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCommunity,
               const char *szOidStr, const DWORD *oidBinary, DWORD dwOidLen, void *pValue,
               DWORD dwBufferSize, BOOL bVerbose, BOOL bStringResult);
 DWORD SnmpEnumerate(DWORD dwVersion, DWORD dwAddr, WORD wPort, const char *szCommunity,
                     const char *szRootOid, void (* pHandler)(DWORD, DWORD, WORD,
-                    const char *, SNMP_Variable *, void *), void *pUserArg, BOOL bVerbose);
+                    const char *, SNMP_Variable *, SNMP_Transport *, void *),
+                    void *pUserArg, BOOL bVerbose);
 void StrToMac(char *pszStr, BYTE *pBuffer);
 DWORD OidToType(TCHAR *pszOid, DWORD *pdwFlags);
 
@@ -500,6 +503,10 @@ DWORD CreateNewTrap(DWORD *pdwTrapId);
 DWORD UpdateTrapFromMsg(CSCPMessage *pMsg);
 DWORD DeleteTrap(DWORD dwId);
 
+BOOL IsTableTool(DWORD dwToolId);
+BOOL CheckObjectToolAccess(DWORD dwToolId, DWORD dwUserId);
+DWORD ExecuteTableTool(DWORD dwToolId, Node *pNode, DWORD dwRqId, ClientSession *pSession);
+
 #ifdef _WIN32
 
 char NXCORE_EXPORTABLE *GetSystemErrorText(DWORD error);
index febb452..f379944 100644 (file)
@@ -619,6 +619,9 @@ public:
 
    QWORD GetLastEventId(int nIndex) { return ((nIndex >= 0) && (nIndex < MAX_LAST_EVENTS)) ? m_qwLastEvents[nIndex] : 0; }
    void SetLastEventId(int nIndex, QWORD qwId) { if ((nIndex >= 0) && (nIndex < MAX_LAST_EVENTS)) m_qwLastEvents[nIndex] = qwId; }
+
+   DWORD CallSnmpEnumerate(char *pszRootOid, 
+      void (* pHandler)(DWORD, DWORD, WORD, const char *, SNMP_Variable *, SNMP_Transport *, void *), void *pArg);
 };