Added new object class - VPNConnector
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 1 Aug 2005 10:21:34 +0000 (10:21 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 1 Aug 2005 10:21:34 +0000 (10:21 +0000)
.gitattributes
include/netxmsdb.h
include/nms_cscp.h
include/nxclapi.h
sql/schema.in
src/server/core/Makefile.am
src/server/core/nxcore.dsp
src/server/core/vpnconn.cpp [new file with mode: 0644]
src/server/include/nms_objects.h

index c046c8a..510d9f2 100644 (file)
@@ -740,6 +740,7 @@ src/server/core/tools.cpp -text
 src/server/core/tracert.cpp -text
 src/server/core/uniroot.cpp -text
 src/server/core/users.cpp -text
+src/server/core/vpnconn.cpp -text
 src/server/core/watchdog.cpp -text
 src/server/core/zone.cpp -text
 src/server/dbdrv/Makefile.am -text
index d7ece95..ac632c7 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _netxms_db_h
 #define _netxms_db_h
 
-#define DB_FORMAT_VERSION      30
+#define DB_FORMAT_VERSION      31
 
 #endif
index f36193c..cd57f74 100644 (file)
@@ -385,7 +385,7 @@ typedef struct
 #define VID_SNMP_OID                ((DWORD)19)
 #define VID_NAME                    ((DWORD)20)
 #define VID_VALUE                   ((DWORD)21)
-//#define VID_ERROR                   ((DWORD)22)
+#define VID_PEER_GATEWAY            ((DWORD)22)
 #define VID_NOTIFICATION_CODE       ((DWORD)23)
 #define VID_EVENT_CODE              ((DWORD)24)
 #define VID_SEVERITY                ((DWORD)25)
@@ -524,6 +524,8 @@ typedef struct
 #define VID_SESSION_IV              ((DWORD)158)
 #define VID_CONFIG_FILE             ((DWORD)159)
 #define VID_STATUS_ALGORITHM        ((DWORD)160)
+#define VID_NUM_LOCAL_NETS          ((DWORD)161)
+#define VID_NUM_REMOTE_NETS         ((DWORD)162)
 
 // Variable ranges for object's ACL
 #define VID_ACL_USER_BASE           ((DWORD)0x00001000)
@@ -582,6 +584,10 @@ typedef struct
 // Base value for variable names
 #define VID_VARLIST_BASE            ((DWORD)0x10000000)
 
+// Base value for network list
+#define VID_VPN_NETWORK_BASE        ((DWORD)0x10000000)
+
+
 //
 // Inline functions
 //
index 056069c..a702c17 100644 (file)
@@ -117,6 +117,7 @@ typedef void * NXC_SESSION;
 #define OBJECT_TEMPLATEGROUP  9
 #define OBJECT_TEMPLATEROOT   10
 #define OBJECT_NETWORKSERVICE 11
+#define OBJECT_VPNCONNECTOR   12
 
 
 //
index d804cda..0ffb2dc 100644 (file)
@@ -226,6 +226,33 @@ CREATE TABLE network_services
 
 
 /*
+** VPN connectors
+*/
+
+CREATE TABLE vpn_connectors
+(
+       id integer not null,
+       node_id integer not null,
+       peer_gateway integer not null,
+       PRIMARY KEY(id)
+) TABLE_TYPE;
+
+
+/*
+** VPN connector networks
+*/
+
+CREATE TABLE vpn_connector_networks
+(
+       vpn_id integer not null,
+       network_type integer not null,  // 0 == local, 1 == remote
+       ip_addr varchar(15),
+       ip_netmask varchar(15),
+       PRIMARY KEY(vpn_id,ip_addr)
+) TABLE_TYPE;
+
+
+/*
 ** Container objects
 */
 
index 7a7057c..6cc2eec 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 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 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 5804a6b..998c7d2 100644 (file)
@@ -290,6 +290,10 @@ SOURCE=.\users.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\vpnconn.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\watchdog.cpp
 # End Source File
 # Begin Source File
diff --git a/src/server/core/vpnconn.cpp b/src/server/core/vpnconn.cpp
new file mode 100644 (file)
index 0000000..311347e
--- /dev/null
@@ -0,0 +1,339 @@
+/* 
+** 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: vpnconn.cpp
+**
+**/
+
+#include "nxcore.h"
+
+
+//
+// Default constructor for VPNConnector object
+//
+
+VPNConnector::VPNConnector()
+             : NetObj()
+{
+   m_dwPeerGateway = 0;
+   m_dwNumLocalNets = 0;
+   m_dwNumRemoteNets = 0;
+   m_pLocalNetList = NULL;
+   m_pRemoteNetList = NULL;
+}
+
+
+//
+// VPNConnector class destructor
+//
+
+VPNConnector::~VPNConnector()
+{
+   safe_free(m_pLocalNetList);
+   safe_free(m_pRemoteNetList);
+}
+
+
+//
+// Create object from database data
+//
+
+BOOL VPNConnector::CreateFromDB(DWORD dwId)
+{
+   TCHAR szQuery[256];
+   DB_RESULT hResult;
+   DWORD i, dwNodeId;
+   NetObj *pObject;
+   BOOL bResult = FALSE;
+
+   m_dwId = dwId;
+
+   if (!LoadCommonProperties())
+      return FALSE;
+
+   // Load network lists
+   _sntprintf(szQuery, 256, _T("SELECT ip_addr,ip_netmask FROM vpn_connector_networks WHERE vpn_id=%ld AND network_type=0"), m_dwId);
+   hResult = DBSelect(g_hCoreDB, szQuery);
+   if (hResult == NULL)
+      return FALSE;     // Query failed
+   m_dwNumLocalNets = DBGetNumRows(hResult);
+   m_pLocalNetList = (IP_NETWORK *)malloc(sizeof(IP_NETWORK) * m_dwNumLocalNets);
+   for(i = 0; i < m_dwNumLocalNets; i++)
+   {
+      m_pLocalNetList[i].dwAddr = DBGetFieldIPAddr(hResult, i, 0);
+      m_pLocalNetList[i].dwMask = DBGetFieldIPAddr(hResult, i, 1);
+   }
+   DBFreeResult(hResult);
+
+   _sntprintf(szQuery, 256, _T("SELECT ip_addr,ip_netmask FROM vpn_connector_networks WHERE vpn_id=%ld AND network_type=1"), m_dwId);
+   hResult = DBSelect(g_hCoreDB, szQuery);
+   if (hResult == NULL)
+      return FALSE;     // Query failed
+   m_dwNumRemoteNets = DBGetNumRows(hResult);
+   m_pRemoteNetList = (IP_NETWORK *)malloc(sizeof(IP_NETWORK) * m_dwNumRemoteNets);
+   for(i = 0; i < m_dwNumRemoteNets; i++)
+   {
+      m_pRemoteNetList[i].dwAddr = DBGetFieldIPAddr(hResult, i, 0);
+      m_pRemoteNetList[i].dwMask = DBGetFieldIPAddr(hResult, i, 1);
+   }
+   DBFreeResult(hResult);
+   
+   // Load custom properties
+   _sntprintf(szQuery, 256, _T("SELECT node_id,peer_gateway FROM vpn_connectors WHERE id=%ld"), dwId);
+   hResult = DBSelect(g_hCoreDB, szQuery);
+   if (hResult == NULL)
+      return FALSE;     // Query failed
+
+   if (DBGetNumRows(hResult) != 0)
+   {
+      dwNodeId = DBGetFieldULong(hResult, 0, 0);
+      m_dwPeerGateway = DBGetFieldULong(hResult, 0, 1);
+
+      // Link VPN connector to node
+      if (!m_bIsDeleted)
+      {
+         pObject = FindObjectById(dwNodeId);
+         if (pObject == NULL)
+         {
+            WriteLog(MSG_INVALID_NODE_ID, EVENTLOG_ERROR_TYPE, "dd", dwId, dwNodeId);
+         }
+         else if (pObject->Type() != OBJECT_NODE)
+         {
+            WriteLog(MSG_NODE_NOT_NODE, EVENTLOG_ERROR_TYPE, "dd", dwId, dwNodeId);
+         }
+         else
+         {
+            pObject->AddChild(this);
+            AddParent(pObject);
+            bResult = TRUE;
+         }
+      }
+      else
+      {
+         bResult = TRUE;
+      }
+   }
+
+   DBFreeResult(hResult);
+
+   // Load access list
+   LoadACLFromDB();
+
+   return bResult;
+}
+
+
+//
+// Save interface object to database
+//
+
+BOOL VPNConnector::SaveToDB(DB_HANDLE hdb)
+{
+   char szQuery[1024], szIpAddr[16], szNetMask[16];
+   BOOL bNewObject = TRUE;
+   Node *pNode;
+   DWORD i, dwNodeId;
+   DB_RESULT hResult;
+
+   // Lock object's access
+   LockData();
+
+   SaveCommonProperties(hdb);
+
+   // Check for object's existence in database
+   sprintf(szQuery, "SELECT id FROM vpn_connectors WHERE id=%ld", m_dwId);
+   hResult = DBSelect(hdb, szQuery);
+   if (hResult != 0)
+   {
+      if (DBGetNumRows(hResult) > 0)
+         bNewObject = FALSE;
+      DBFreeResult(hResult);
+   }
+
+   // Determine owning node's ID
+   pNode = GetParentNode();
+   if (pNode != NULL)
+      dwNodeId = pNode->Id();
+   else
+      dwNodeId = 0;
+
+   // Form and execute INSERT or UPDATE query
+   if (bNewObject)
+      sprintf(szQuery, "INSERT INTO vpn_connectors (id,node_id,peer_gateway) "
+                       "VALUES (%ld,%ld,%ld)",
+              m_dwId, dwNodeId, m_dwPeerGateway);
+   else
+      sprintf(szQuery, "UPDATE vpn_connectors SET node_id=%ld,"
+                       "peer_gateway=%ld WHERE id=%ld",
+              dwNodeId, m_dwPeerGateway, m_dwId);
+   DBQuery(hdb, szQuery);
+
+   // Save network list
+   sprintf(szQuery, "DELETE FROM vpn_connector_networks WHERE vpn_id=%ld", m_dwId);
+   DBQuery(hdb, szQuery);
+   for(i = 0; i < m_dwNumLocalNets; i++)
+   {
+      sprintf(szQuery, "INSERT INTO vpn_connector_networks (vpn_id,network_type,"
+                       "ip_addr,ip_netmask) VALUES (%ld,0,'%s','%s')",
+              m_dwId, IpToStr(m_pLocalNetList[i].dwAddr, szIpAddr),
+              IpToStr(m_pLocalNetList[i].dwMask, szNetMask));
+      DBQuery(hdb, szQuery);
+   }
+   for(i = 0; i < m_dwNumRemoteNets; i++)
+   {
+      sprintf(szQuery, "INSERT INTO vpn_connector_networks (vpn_id,network_type,"
+                       "ip_addr,ip_netmask) VALUES (%ld,1,'%s','%s')",
+              m_dwId, IpToStr(m_pRemoteNetList[i].dwAddr, szIpAddr),
+              IpToStr(m_pRemoteNetList[i].dwMask, szNetMask));
+      DBQuery(hdb, szQuery);
+   }
+
+   // Save access list
+   SaveACLToDB(hdb);
+
+   // Clear modifications flag and unlock object
+   m_bIsModified = FALSE;
+   UnlockData();
+
+   return TRUE;
+}
+
+
+//
+// Delete VPN connector object from database
+//
+
+BOOL VPNConnector::DeleteFromDB(void)
+{
+   char szQuery[128];
+   BOOL bSuccess;
+
+   bSuccess = NetObj::DeleteFromDB();
+   if (bSuccess)
+   {
+      sprintf(szQuery, "DELETE FROM vpn_connectors WHERE id=%ld", m_dwId);
+      QueueSQLRequest(szQuery);
+      sprintf(szQuery, "DELETE FROM vpn_connector_networks WHERE vpn_id=%ld", m_dwId);
+      QueueSQLRequest(szQuery);
+   }
+   return bSuccess;
+}
+
+
+//
+// Get connector's parent node
+//
+
+Node *VPNConnector::GetParentNode(void)
+{
+   DWORD i;
+   Node *pNode = NULL;
+
+   LockParentList(FALSE);
+   for(i = 0; i < m_dwParentCount; i++)
+      if (m_pParentList[i]->Type() == OBJECT_NODE)
+      {
+         pNode = (Node *)m_pParentList[i];
+         break;
+      }
+   UnlockParentList();
+   return pNode;
+}
+
+
+//
+// Create CSCP message with object's data
+//
+
+void VPNConnector::CreateMessage(CSCPMessage *pMsg)
+{
+   DWORD i, dwId;
+
+   NetObj::CreateMessage(pMsg);
+   pMsg->SetVariable(VID_PEER_GATEWAY, m_dwPeerGateway);
+   pMsg->SetVariable(VID_NUM_LOCAL_NETS, m_dwNumLocalNets);
+   pMsg->SetVariable(VID_NUM_REMOTE_NETS, m_dwNumRemoteNets);
+
+   for(i = 0, dwId = VID_VPN_NETWORK_BASE; i < m_dwNumLocalNets; i++)
+   {
+      pMsg->SetVariable(dwId++, m_pLocalNetList[i].dwAddr);
+      pMsg->SetVariable(dwId++, m_pLocalNetList[i].dwMask);
+   }
+
+   for(i = 0; i < m_dwNumRemoteNets; i++)
+   {
+      pMsg->SetVariable(dwId++, m_pRemoteNetList[i].dwAddr);
+      pMsg->SetVariable(dwId++, m_pRemoteNetList[i].dwMask);
+   }
+}
+
+
+//
+// Modify object from message
+//
+
+DWORD VPNConnector::ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLocked)
+{
+   DWORD i, dwId;
+
+   if (!bAlreadyLocked)
+      LockData();
+
+   // Peer gateway
+   if (pRequest->IsVariableExist(VID_PEER_GATEWAY))
+      m_dwPeerGateway = pRequest->GetVariableLong(VID_PEER_GATEWAY);
+
+   // Network list
+   if ((pRequest->IsVariableExist(VID_NUM_LOCAL_NETS)) &&
+       (pRequest->IsVariableExist(VID_NUM_REMOTE_NETS)))
+   {
+      m_dwNumLocalNets = pRequest->GetVariableLong(VID_NUM_LOCAL_NETS);
+      if (m_dwNumLocalNets > 0)
+      {
+         m_pLocalNetList = (IP_NETWORK *)realloc(m_pLocalNetList, sizeof(IP_NETWORK) * m_dwNumLocalNets);
+         for(i = 0, dwId = VID_VPN_NETWORK_BASE; i < m_dwNumLocalNets; i++)
+         {
+            m_pLocalNetList[i].dwAddr = pRequest->GetVariableLong(dwId++);
+            m_pLocalNetList[i].dwMask = pRequest->GetVariableLong(dwId++);
+         }
+      }
+      else
+      {
+         safe_free(m_pLocalNetList);
+         m_pLocalNetList = NULL;
+      }
+
+      m_dwNumRemoteNets = pRequest->GetVariableLong(VID_NUM_REMOTE_NETS);
+      if (m_dwNumRemoteNets > 0)
+      {
+         m_pRemoteNetList = (IP_NETWORK *)realloc(m_pRemoteNetList, sizeof(IP_NETWORK) * m_dwNumRemoteNets);
+         for(i = 0; i < m_dwNumRemoteNets; i++)
+         {
+            m_pRemoteNetList[i].dwAddr = pRequest->GetVariableLong(dwId++);
+            m_pRemoteNetList[i].dwMask = pRequest->GetVariableLong(dwId++);
+         }
+      }
+      else
+      {
+         safe_free(m_pRemoteNetList);
+         m_pRemoteNetList = NULL;
+      }
+   }
+
+   return NetObj::ModifyFromMessage(pRequest, TRUE);
+}
index 63b1a66..ba258e9 100644 (file)
@@ -144,6 +144,17 @@ struct TEMPLATE_UPDATE_INFO
 
 
 //
+// IP network
+//
+
+struct IP_NETWORK
+{
+   DWORD dwAddr;
+   DWORD dwMask;
+};
+
+
+//
 // Base class for network objects
 //
 
@@ -445,6 +456,36 @@ public:
 
 
 //
+// VPN connector class
+//
+
+class VPNConnector : public NetObj
+{
+protected:
+   DWORD m_dwPeerGateway;        // Object ID of peer gateway
+   DWORD m_dwNumLocalNets;
+   IP_NETWORK *m_pLocalNetList;
+   DWORD m_dwNumRemoteNets;
+   IP_NETWORK *m_pRemoteNetList;
+
+   Node *GetParentNode(void);
+
+public:
+   VPNConnector();
+   virtual ~VPNConnector();
+
+   virtual int Type(void) { return OBJECT_VPNCONNECTOR; }
+
+   virtual BOOL SaveToDB(DB_HANDLE hdb);
+   virtual BOOL DeleteFromDB(void);
+   virtual BOOL CreateFromDB(DWORD dwId);
+
+   virtual void CreateMessage(CSCPMessage *pMsg);
+   virtual DWORD ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLocked = FALSE);
+};
+
+
+//
 // Node
 //