- Implemented primary IP address selection for nodes
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 29 Jan 2005 09:32:49 +0000 (09:32 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 29 Jan 2005 09:32:49 +0000 (09:32 +0000)
- Initial work on service status polling

13 files changed:
ChangeLog
TODO
include/nxclapi.h
src/console/win32/NodePropsGeneral.cpp
src/console/win32/NodePropsGeneral.h
src/console/win32/nxcon.clw
src/console/win32/nxcon.cpp
src/libnxcl/main.cpp
src/server/core/interface.cpp
src/server/core/netobj.cpp
src/server/core/netsrv.cpp
src/server/core/node.cpp
src/server/include/nms_objects.h

index db88bc5..3bd5056 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,7 @@
 - Added parameters System.Hostname, System.Uname and System.Uptime to
   Solaris subagent
 - Object status now recalculated after binding change
+- Implemented primary IP address selection for nodes
 
 
 *
diff --git a/TODO b/TODO
index 41ec6fc..7a92575 100644 (file)
--- a/TODO
+++ b/TODO
@@ -85,7 +85,6 @@ WINDOWS CONSOLE:
 
 - Find good graph creation library
 - Enlarge 16x16 status overlay icons
-- Add primary IP address selection 
 - Add real-time graphs
 - Play sound on new alarms
 - Add sorting to all list views
index b602b10..efbeb7c 100644 (file)
@@ -254,6 +254,7 @@ typedef void * NXC_SESSION;
 #define RCC_PACKAGE_FILE_EXIST      ((DWORD)34)
 #define RCC_RESOURCE_BUSY           ((DWORD)35)
 #define RCC_INVALID_PACKAGE_ID      ((DWORD)36)
+#define RCC_INVALID_IP_ADDR         ((DWORD)37)
 
 
 //
index 6f13582..ab44030 100644 (file)
@@ -32,7 +32,6 @@ CNodePropsGeneral::CNodePropsGeneral() : CPropertyPage(CNodePropsGeneral::IDD)
        m_strName = _T("");
        m_strOID = _T("");
        m_iAgentPort = 0;
-       m_strPrimaryIp = _T("");
        m_strSecret = _T("");
        m_strCommunity = _T("");
        m_iAuthType = -1;
@@ -55,7 +54,6 @@ void CNodePropsGeneral::DoDataExchange(CDataExchange* pDX)
        DDX_Text(pDX, IDC_EDIT_OID, m_strOID);
        DDX_Text(pDX, IDC_EDIT_PORT, m_iAgentPort);
        DDV_MinMaxInt(pDX, m_iAgentPort, 1, 65535);
-       DDX_Text(pDX, IDC_EDIT_PRIMARY_IP, m_strPrimaryIp);
        DDX_Text(pDX, IDC_EDIT_SECRET, m_strSecret);
        DDV_MaxChars(pDX, m_strSecret, 63);
        DDX_Text(pDX, IDC_EDIT_COMMUNITY, m_strCommunity);
@@ -85,11 +83,14 @@ END_MESSAGE_MAP()
 BOOL CNodePropsGeneral::OnInitDialog() 
 {
    int i;
+   TCHAR szBuffer[16];
 
        CPropertyPage::OnInitDialog();
 
    m_pUpdate = ((CObjectPropSheet *)GetParent())->GetUpdateStruct();
        
+   SetDlgItemText(IDC_EDIT_PRIMARY_IP, IpToStr(m_dwIpAddr, szBuffer));
+
    // Initialize dropdown lists
    for(i = 0; i < 4; i++)
       m_wndAuthList.AddString(m_pszAuthStrings[i]);
@@ -163,6 +164,7 @@ void CNodePropsGeneral::OnOK()
    m_pUpdate->pszCommunity = (char *)((LPCTSTR)m_strCommunity);
    m_pUpdate->pszSecret = (char *)((LPCTSTR)m_strSecret);
    m_pUpdate->wSNMPVersion = (m_iSNMPVersion == 0) ? SNMP_VERSION_1 : SNMP_VERSION_2C;
+   m_pUpdate->dwIpAddr = m_dwIpAddr;
 
    // Authentication type
    m_wndAuthList.GetWindowText(szBuffer, 255);
@@ -181,4 +183,24 @@ void CNodePropsGeneral::OnOK()
 
 void CNodePropsGeneral::OnSelectIp() 
 {
+   CObjectSelDlg dlg;
+   NXC_OBJECT *pObject;
+
+   dlg.m_bSelectAddress = TRUE;
+   dlg.m_bSingleSelection = TRUE;
+   dlg.m_bAllowEmptySelection = FALSE;
+   dlg.m_dwParentObject = m_dwObjectId;
+   if (dlg.DoModal() == IDOK)
+   {
+      pObject = NXCFindObjectById(g_hSession, dlg.m_pdwObjectList[0]);
+      if (pObject != NULL)
+      {
+         TCHAR szBuffer[16];
+
+         m_dwIpAddr = pObject->dwIpAddr;
+         SetDlgItemText(IDC_EDIT_PRIMARY_IP, IpToStr(m_dwIpAddr, szBuffer));
+      }
+      m_pUpdate->dwFlags |= OBJ_UPDATE_IP_ADDR;
+      SetModified();
+   }
 }
index a18c4b3..a69ea67 100644 (file)
@@ -16,6 +16,7 @@ class CNodePropsGeneral : public CPropertyPage
 
 // Construction
 public:
+       DWORD m_dwIpAddr;
        CNodePropsGeneral();
        ~CNodePropsGeneral();
 
@@ -27,7 +28,6 @@ public:
        CString m_strName;
        CString m_strOID;
        int             m_iAgentPort;
-       CString m_strPrimaryIp;
        CString m_strSecret;
        CString m_strCommunity;
        int             m_iAuthType;
index 23e6d52..e330e86 100644 (file)
@@ -2,7 +2,7 @@
 
 [General Info]
 Version=1
-LastClass=CNodePropsPolling
+LastClass=CNodePropsGeneral
 LastTemplate=CPropertyPage
 NewFileInclude1=#include "stdafx.h"
 NewFileInclude2=#include "nxcon.h"
@@ -16,9 +16,9 @@ Class7=CEventBrowser
 Class9=CMapView
 
 ResourceCount=113
-Resource1=IDD_DATA_QUERY (English (U.S.))
+Resource1=IDD_NEW_ACTION (English (U.S.))
 Resource2=IDD_OBJECT_NODE_GENERAL
-Resource3=IDD_ABOUTBOX (English (U.S.))
+Resource3=IDA_EPP (English (U.S.))
 Resource4=IDD_SELECT_OBJECT
 Resource5=IDD_SELECT_ACTION
 Class2=CChildView
@@ -32,9 +32,9 @@ Resource7=IDD_NEW_USER
 Class12=CObjectBrowser
 Resource8=IDD_CREATE_CONTAINER
 Class13=CObjectPropDlg
-Resource9=IDD_OBJECT_NETSRV_GENERAL (English (U.S.))
-Resource10=IDD_OBJECT_CAPS (English (U.S.))
-Resource11=IDD_SELECT_OBJECT (English (U.S.))
+Resource9=IDD_DATA_QUERY (English (U.S.))
+Resource10=IDA_ACTION_EDITOR (English (U.S.))
+Resource11=IDD_NEW_USER (English (U.S.))
 Resource12=IDR_CTRLPANEL (English (U.S.))
 Resource13=IDR_EVENTS (English (U.S.))
 Resource14=IDR_MAPFRAME (English (U.S.))
@@ -42,33 +42,33 @@ Resource15=IDR_OBJECTS (English (U.S.))
 Resource16=IDD_DUMMY (English (U.S.))
 Class14=CEventEditor
 Class15=CEditEventDlg
-Resource17=IDD_NEW_ACTION (English (U.S.))
+Resource17=IDD_MIB_BROWSER (English (U.S.))
 Class16=CDebugFrame
-Resource18=IDD_DCI_COLLECTION (English (U.S.))
+Resource18=IDD_REQUEST_PROCESSING (English (U.S.))
 Resource19=IDD_OBJECT_PROPERTIES (English (U.S.))
 Resource20=IDD_SELECT_EVENT
 Class17=CObjectPreview
-Resource21=IDA_EVENT_EDITOR (English (U.S.))
+Resource21=IDD_CREATE_NETSRV (English (U.S.))
 Class18=CToolBox
 Class19=CObjectInfoBox
 Class20=CObjectSearchBox
-Resource22=IDD_SELECT_AGENT_PARAM (English (U.S.))
+Resource22=IDD_DCI_TRANSFORM (English (U.S.))
 Class21=CEditBox
 Class22=COPGeneral
 Class23=CNodePropsGeneral
-Resource23=IDD_THRESHOLD (English (U.S.))
+Resource23=IDD_OBJECT_SECURITY (English (U.S.))
 Class24=CObjectPropCaps
 Class25=CObjectPropSheet
 Resource24=IDA_MDI_DEFAULT
 Class26=CRequestProcessingDlg
-Resource25=IDD_MIB_BROWSER (English (U.S.))
+Resource25=IDD_SELECT_USER (English (U.S.))
 Resource26=IDD_PROGRESS (English (U.S.))
 Resource27=IDD_EDIT_RULE_ALARM
-Resource28=IDD_GROUP_PROPERTIES (English (U.S.))
+Resource28=IDD_OBJECT_NODE_GENERAL (English (U.S.))
 Class27=CObjectPropsGeneral
-Resource29=IDD_OBJECT_GENERAL (English (U.S.))
+Resource29=IDA_GRAPH (English (U.S.))
 Class28=CObjectPropsSecurity
-Resource30=IDA_ALARM_BROWSER (English (U.S.))
+Resource30=IDD_SELECT_AGENT_PARAM (English (U.S.))
 Resource31=IDD_SELECT_USER
 Resource32=IDD_OBJECT_SECURITY
 Class29=CUserSelectDlg
@@ -79,36 +79,36 @@ Class31=CNewUserDlg
 Resource35=IDD_THRESHOLD
 Resource36=IDA_EPP
 Class32=CUserPropDlg
-Resource37=IDD_LOGIN (English (U.S.))
+Resource37=IDA_ALARM_BROWSER (English (U.S.))
 Resource38=IDD_ABOUTBOX
 Class33=CGroupPropDlg
 Resource39=IDD_CP_GENERAL
 Resource40=IDA_TRAP_EDITOR
 Resource41=IDM_VIEW_SPECIFIC
-Resource42=IDD_ACTION_PROPERTIES (English (U.S.))
+Resource42=IDD_SELECT_OBJECT (English (U.S.))
 Class34=CPasswordChangeDlg
 Class35=CNodeSummary
 Class36=CNetSummaryFrame
 Class37=CDataCollectionEditor
-Resource43=IDA_OBJECT_BROWSER (English (U.S.))
+Resource43=IDD_GRAPH_PROPERTIES (English (U.S.))
 Class38=CDCIPropPage
-Resource44=IDD_CP_GENERAL (English (U.S.))
+Resource44=IDD_THRESHOLD (English (U.S.))
 Class39=CDCIDataView
-Resource45=IDA_GRAPH (English (U.S.))
+Resource45=IDA_MDI_DEFAULT (English (U.S.))
 Class40=CGraph
 Class41=CGraphFrame
 Class42=CDCIThresholdsPage
-Resource46=IDD_OBJECT_NODE_GENERAL (English (U.S.))
-Resource47=IDD_OBJECT_PRESENTATION (English (U.S.))
+Resource46=IDD_EDIT_TRAP (English (U.S.))
+Resource47=IDD_SET_PASSWORD (English (U.S.))
 Resource48=IDM_CONTEXT
 Class43=CThresholdDlg
-Resource49=IDD_SELECT_ACTION (English (U.S.))
+Resource49=IDD_EDIT_RULE_COMMENT (English (U.S.))
 Resource50=IDD_EDIT_TRAP_ARG
 Class44=CMIBBrowserDlg
 Class45=CEventPolicyEditor
 Class46=CRuleList
 Class47=CRuleHeader
-Resource51=IDD_EDIT_EVENT (English (U.S.))
+Resource51=IDA_NETMAP (English (U.S.))
 Resource52=IDD_CREATE_NODE
 Class48=CObjectSelDlg
 Resource53=IDD_OBJECT_CAPS
@@ -117,22 +117,22 @@ Class49=CRuleCommentDlg
 Resource55=IDD_DCI_COLLECTION
 Class50=CEventSelDlg
 Resource56=IDD_DATA_QUERY
-Resource57=IDD_EDIT_RULE_SEVERITY (English (U.S.))
+Resource57=IDD_DCI_COLLECTION (English (U.S.))
 Resource58=IDD_CREATE_TG
-Resource59=IDD_CREATE_CONTAINER (English (U.S.))
-Resource60=IDD_EDIT_TRAP_ARG (English (U.S.))
+Resource59=IDD_SELECT_EVENT (English (U.S.))
+Resource60=IDD_SELECT_ACTION (English (U.S.))
 Class51=CObjectPropsPresentation
-Resource61=IDD_SELECT_INTERNAL_ITEM (English (U.S.))
+Resource61=IDD_CREATE_NODE (English (U.S.))
 Resource62=IDD_EDIT_RULE_COMMENT
 Class52=CRuleSeverityDlg
 Resource63=IDD_ACTION_PROPERTIES
 Class53=CRuleAlarmDlg
 Class54=CAlarmBrowser
-Resource64=IDD_SET_PASSWORD (English (U.S.))
+Resource64=IDD_OBJECT_CAPS (English (U.S.))
 Resource65=IDD_DCI_TRANSFORM
-Resource66=IDR_MAINFRAME (English (U.S.))
-Resource67=IDD_EDIT_TRAP (English (U.S.))
-Resource68=IDD_DCI_TRANSFORM (English (U.S.))
+Resource66=IDA_EVENT_EDITOR (English (U.S.))
+Resource67=IDD_ACTION_PROPERTIES (English (U.S.))
+Resource68=IDD_EDIT_RULE_SEVERITY (English (U.S.))
 Class55=CConsolePropsGeneral
 Class56=CActionEditor
 Resource69=IDA_ACTION_EDITOR
@@ -143,18 +143,18 @@ Class58=CEditActionDlg
 Resource72=IDA_NETMAP
 Class59=CActionSelDlg
 Resource73=IDD_MIB_BROWSER
-Resource74=IDD_CREATE_TG (English (U.S.))
-Resource75=IDD_CREATE_NETSRV (English (U.S.))
+Resource74=IDD_EDIT_RULE_ALARM (English (U.S.))
+Resource75=IDD_CREATE_TEMPLATE (English (U.S.))
 Resource76=IDD_USER_PROPERTIES
 Class60=CCreateObjectDlg
 Class61=CCreateContainerDlg
 Resource77=IDR_MAINFRAME
 Class62=CCreateNodeDlg
-Resource78=IDD_REQUEST_PROCESSING (English (U.S.))
-Resource79=IDA_EPP (English (U.S.))
-Resource80=IDD_EDIT_RULE_ALARM (English (U.S.))
+Resource78=IDA_TRAP_EDITOR (English (U.S.))
+Resource79=IDD_SELECT_INTERNAL_ITEM (English (U.S.))
+Resource80=IDD_DCI_THRESHOLDS (English (U.S.))
 Class63=CDCITransformPage
-Resource81=IDA_MDI_DEFAULT (English (U.S.))
+Resource81=IDD_EDIT_TRAP_ARG (English (U.S.))
 Class64=CPollNodeDlg
 Resource82=IDD_POLL_NODE (English (U.S.))
 Class65=CNodePoller
@@ -180,28 +180,28 @@ Class73=CColorSelector
 Class74=CPackageMgr
 Resource94=IDD_GROUP_PROPERTIES
 Resource95=IDD_GRAPH_PROPERTIES
-Resource96=IDD_OBJECT_SECURITY (English (U.S.))
-Resource97=IDD_SELECT_USER (English (U.S.))
-Resource98=IDD_NEW_USER (English (U.S.))
-Resource99=IDD_USER_PROPERTIES (English (U.S.))
-Resource100=IDD_CREATE_NODE (English (U.S.))
-Resource101=IDD_CREATE_TEMPLATE (English (U.S.))
-Resource102=IDA_ACTION_EDITOR (English (U.S.))
-Resource103=IDA_TRAP_EDITOR (English (U.S.))
-Resource104=IDA_PACKAGE_MGR (English (U.S.))
+Resource96=IDA_PACKAGE_MGR (English (U.S.))
+Resource97=IDD_ABOUTBOX (English (U.S.))
+Resource98=IDD_LOGIN (English (U.S.))
+Resource99=IDD_EDIT_EVENT (English (U.S.))
+Resource100=IDD_OBJECT_PRESENTATION (English (U.S.))
+Resource101=IDD_CP_GENERAL (English (U.S.))
+Resource102=IDD_OBJECT_NETSRV_GENERAL (English (U.S.))
+Resource103=IDR_MAINFRAME (English (U.S.))
+Resource104=IDA_OBJECT_BROWSER (English (U.S.))
 Resource105=IDM_CONTEXT (English (U.S.))
 Resource106=IDM_VIEW_SPECIFIC (English (U.S.))
-Resource107=IDD_SELECT_EVENT (English (U.S.))
+Resource107=IDD_GROUP_PROPERTIES (English (U.S.))
 Class75=CInternalItemSelDlg
-Resource108=IDD_GRAPH_PROPERTIES (English (U.S.))
+Resource108=IDD_CREATE_CONTAINER (English (U.S.))
 Class76=CAgentParamSelDlg
-Resource109=IDD_EDIT_RULE_COMMENT (English (U.S.))
+Resource109=IDD_USER_PROPERTIES (English (U.S.))
 Class77=CInputBox
-Resource110=IDA_NETMAP (English (U.S.))
+Resource110=IDD_INPUT_BOX (English (U.S.))
 Class78=CCreateNetSrvDlg
-Resource111=IDD_DCI_THRESHOLDS (English (U.S.))
+Resource111=IDD_OBJECT_GENERAL (English (U.S.))
 Class79=CNetSrvPropsGeneral
-Resource112=IDD_INPUT_BOX (English (U.S.))
+Resource112=IDD_CREATE_TG (English (U.S.))
 Class80=CNodePropsPolling
 Resource113=IDD_OBJECT_NODE_POLL (English (U.S.))
 
index 50fad9e..80ff451 100644 (file)
@@ -822,7 +822,6 @@ void CConsoleApp::ObjectProperties(DWORD dwObjectId)
    CObjectPropsPresentation wndObjectPresentation;
    CNodePropsPolling wndNodePolling;
    NXC_OBJECT *pObject;
-   char szBuffer[32];
 
    pObject = NXCFindObjectById(g_hSession, dwObjectId);
    if (pObject != NULL)
@@ -834,7 +833,7 @@ void CConsoleApp::ObjectProperties(DWORD dwObjectId)
             wndNodeGeneral.m_dwObjectId = dwObjectId;
             wndNodeGeneral.m_strName = pObject->szName;
             wndNodeGeneral.m_strOID = pObject->node.szObjectId;
-            wndNodeGeneral.m_strPrimaryIp = IpToStr(pObject->dwIpAddr, szBuffer);
+            wndNodeGeneral.m_dwIpAddr = pObject->dwIpAddr;
             wndNodeGeneral.m_iAgentPort = (int)pObject->node.wAgentPort;
             wndNodeGeneral.m_strCommunity = pObject->node.szCommunityString;
             wndNodeGeneral.m_iAuthType = pObject->node.wAuthMethod;
index 9a2764a..10dc4ec 100644 (file)
@@ -154,9 +154,10 @@ const TCHAR LIBNXCL_EXPORTABLE *NXCGetErrorText(DWORD dwError)
       _T("Package with specified properties already installed on server"),
       _T("Package file already exist on server"),
       _T("Server resource busy"),
-      _T("Invalid package ID")
+      _T("Invalid package ID"),
+      _T("Invalid IP address")
    };
-   return ((dwError >= 0) && (dwError <= RCC_INVALID_PACKAGE_ID)) ? pszErrorText[dwError] : _T("Unknown error code");
+   return ((dwError >= 0) && (dwError <= RCC_INVALID_IP_ADDR)) ? pszErrorText[dwError] : _T("Unknown error code");
 }
 
 
index d2ed085..ebc1fc3 100644 (file)
@@ -283,7 +283,7 @@ void Interface::StatusPoll(ClientSession *pSession, DWORD dwRqId)
    {
       SendPollerMsg(dwRqId, "      Interface status changed to %s\r\n", g_pszStatusName[m_iStatus]);
       PostEvent(m_iStatus == STATUS_NORMAL ? EVENT_INTERFACE_UP : EVENT_INTERFACE_DOWN,
-                GetParent()->Id(), "dsaad", m_dwId, m_szName, m_dwIpAddr, m_dwIpNetMask,
+                pNode->Id(), "dsaad", m_dwId, m_szName, m_dwIpAddr, m_dwIpNetMask,
                 m_dwIfIndex);
       Modify();
    }
index dbbdbbc..121235a 100644 (file)
@@ -308,6 +308,7 @@ void NetObj::CalculateCompoundStatus(void)
 
    if (m_iStatus != STATUS_UNMANAGED)
    {
+      Lock();
       /* TODO: probably status calculation algorithm should be changed */
       for(i = 0, iSum = 0, iCount = 0; i < m_dwChildCount; i++)
          if (m_pChildList[i]->Status() < STATUS_UNKNOWN)
@@ -319,12 +320,15 @@ void NetObj::CalculateCompoundStatus(void)
          m_iStatus = iSum / iCount;
       else
          m_iStatus = STATUS_UNKNOWN;
+      Unlock();
 
       // Cause parent object(s) to recalculate it's status
       if (iOldStatus != m_iStatus)
       {
+         Lock();
          for(i = 0; i < m_dwParentCount; i++)
             m_pParentList[i]->CalculateCompoundStatus();
+         Unlock();
          Modify();
       }
    }
index 0792d76..48063ef 100644 (file)
@@ -329,3 +329,33 @@ DWORD NetworkService::ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLock
 
    return NetObj::ModifyFromMessage(pRequest, TRUE);
 }
+
+
+//
+// Perform status poll on network service
+//
+
+void NetworkService::StatusPoll(ClientSession *pSession, DWORD dwRqId, Node *pPollerNode)
+{
+   int iOldStatus = m_iStatus;
+
+   m_pPollRequestor = pSession;
+   if (m_pHostNode == NULL)
+   {
+      m_iStatus = STATUS_UNKNOWN;
+      return;     // Status without host node, which is VERY strange
+   }
+
+   SendPollerMsg(dwRqId, "   Starting status poll on network service %s\r\n"
+                         "      Current status is %s\r\n",
+                 m_szName, g_pszStatusName[m_iStatus]);
+
+   if (m_iStatus != iOldStatus)
+   {
+      SendPollerMsg(dwRqId, "      Service status changed to %s\r\n", g_pszStatusName[m_iStatus]);
+      PostEvent(m_iStatus == STATUS_NORMAL ? EVENT_SERVICE_UP : EVENT_SERVICE_DOWN,
+                m_pHostNode->Id(), "sdd", m_szName, m_dwId, m_iServiceType);
+      Modify();
+   }
+   SendPollerMsg(dwRqId, "   Finished status poll on network service %s\r\n", m_szName);
+}
index d61aa5b..966c60c 100644 (file)
@@ -671,10 +671,23 @@ void Node::StatusPoll(ClientSession *pSession, DWORD dwRqId)
    PollerLock();
    m_pPollRequestor = pSession;
    SendPollerMsg(dwRqId, _T("Starting status poll for node %s\r\n"), m_szName);
+   Lock();
    for(i = 0; i < m_dwChildCount; i++)
-      if ((m_pChildList[i]->Type() == OBJECT_INTERFACE) &&
-          (m_pChildList[i]->Status() != STATUS_UNMANAGED))
-         ((Interface *)m_pChildList[i])->StatusPoll(pSession, dwRqId);
+      if (m_pChildList[i]->Status() != STATUS_UNMANAGED)
+      {
+         switch(m_pChildList[i]->Type())
+         {
+            case OBJECT_INTERFACE:
+               ((Interface *)m_pChildList[i])->StatusPoll(pSession, dwRqId);
+               break;
+            case OBJECT_NETWORKSERVICE:
+               ((NetworkService *)m_pChildList[i])->StatusPoll(pSession, dwRqId, m_pPollerNode);
+               break;
+            default:
+               break;
+         }
+      }
+   Unlock();
    CalculateCompoundStatus();
    m_tLastStatusPoll = time(NULL);
    SendPollerMsg(dwRqId, "Finished status poll for node %s\r\n"
@@ -1101,6 +1114,27 @@ DWORD Node::ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLocked)
    if (!bAlreadyLocked)
       Lock();
 
+   // Change primary IP address
+   if (pRequest->IsVariableExist(VID_IP_ADDRESS))
+   {
+      DWORD i, dwIpAddr;
+      
+      dwIpAddr = pRequest->GetVariableLong(VID_IP_ADDRESS);
+
+      // Check if received IP address is one of node's interface addresses
+      for(i = 0; i < m_dwChildCount; i++)
+         if ((m_pChildList[i]->Type() == OBJECT_INTERFACE) &&
+             (m_pChildList[i]->IpAddr() == dwIpAddr))
+            break;
+      if (i == m_dwChildCount)
+      {
+         Unlock();
+         return RCC_INVALID_IP_ADDR;
+      }
+
+      m_dwIpAddr = dwIpAddr;
+   }
+
    // Change listen port of native agent
    if (pRequest->IsVariableExist(VID_AGENT_PORT))
       m_wAgentPort = pRequest->GetVariableShort(VID_AGENT_PORT);
index edd1c91..558ed3a 100644 (file)
@@ -291,7 +291,7 @@ public:
    virtual BOOL DeleteFromDB(void);
    virtual BOOL CreateFromDB(DWORD dwId);
 
-   void StatusPoll(ClientSession *pSession, DWORD dwRqId);
+   void StatusPoll(ClientSession *pSession, DWORD dwRqId, Node *pPollerNode);
 
    virtual void CreateMessage(CSCPMessage *pMsg);
    virtual DWORD ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLocked = FALSE);