471 lines
14 KiB
C++
471 lines
14 KiB
C++
#include "HostPage.h"
|
|
#include "CommonUtils.h"
|
|
#include "CommonNLB.h"
|
|
#include "MIPAddress.h"
|
|
#include "ResourceString.h"
|
|
|
|
#include <vector>
|
|
#include <algorithm>
|
|
|
|
using namespace std;
|
|
//
|
|
// History:
|
|
// --------
|
|
//
|
|
// Revised by : mhakim
|
|
// Date : 02-14-01
|
|
// Reason : Passing complete nic information instead of only the nic list.
|
|
//
|
|
// Reason : If nic selected is the one which has the connection ip, then
|
|
// dip has to be connection ip.
|
|
|
|
BEGIN_MESSAGE_MAP( HostPage, CPropertyPage )
|
|
ON_EN_SETFOCUS( IDC_EDIT_DED_IP, OnGainFocusDedicatedIP )
|
|
ON_EN_SETFOCUS( IDC_EDIT_DED_MASK, OnGainFocusDedicatedMask )
|
|
ON_LBN_SELCHANGE(IDC_NIC, OnSelectedNicChanged )
|
|
ON_WM_HELPINFO()
|
|
ON_WM_CONTEXTMENU()
|
|
END_MESSAGE_MAP()
|
|
|
|
HostPage::HostPage( const _bstr_t& machine,
|
|
ClusterData* p_clusterData,
|
|
const vector<CommonNLB::NicNLBBound> listOfNics,
|
|
const bool& isNewHost,
|
|
UINT ID )
|
|
:
|
|
m_machine( machine ),
|
|
m_clusterData( p_clusterData ),
|
|
m_nicList( listOfNics ),
|
|
m_isNewHost( isNewHost ),
|
|
CPropertyPage( ID )
|
|
{
|
|
}
|
|
|
|
void
|
|
HostPage::DoDataExchange( CDataExchange* pDX )
|
|
{
|
|
DDX_Control( pDX, IDC_NIC, nicName );
|
|
DDX_Control( pDX, IDC_EDIT_PRI, priority );
|
|
DDX_Control( pDX, IDC_CHECK_ACTIVE, initialState );
|
|
DDX_Control( pDX, IDC_NIC_DETAIL, detailedNicInfo );
|
|
DDX_Control( pDX, IDC_EDIT_DED_IP, ipAddress );
|
|
DDX_Control( pDX, IDC_EDIT_DED_MASK, subnetMask );
|
|
}
|
|
|
|
BOOL
|
|
HostPage::OnInitDialog()
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
SetControlData();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
HostPage::SetControlData()
|
|
{
|
|
// fill in nic name.
|
|
for( int i = 0; i < m_nicList.size(); ++i )
|
|
{
|
|
// using insertstring so we can add it to exact position.
|
|
//
|
|
nicName.InsertString( i, m_nicList[i].friendlyName );
|
|
}
|
|
|
|
// keep a track of nic selection.
|
|
m_previousSelection = nicName.SelectString( -1,
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.friendlyName );
|
|
|
|
// fill in detailed nic info.
|
|
detailedNicInfo.SetWindowText( m_clusterData->hosts[m_machine].hp.nicInfo.fullNicName );
|
|
|
|
// fill in priority.
|
|
wchar_t buf[Common::BUF_SIZE];
|
|
set<int> availHostIDS = m_clusterData->getAvailableHostIDS();
|
|
|
|
// add this hosts priority.
|
|
availHostIDS.insert( m_clusterData->hosts[m_machine].hp.hID );
|
|
|
|
set<int>::iterator top;
|
|
for( top = availHostIDS.begin();
|
|
top != availHostIDS.end();
|
|
++top )
|
|
{
|
|
swprintf( buf, L"%d", *top );
|
|
|
|
priority.AddString( buf );
|
|
}
|
|
|
|
// set selection to present hostid
|
|
swprintf( buf, L"%d", m_clusterData->hosts[m_machine].hp.hID );
|
|
priority.SelectString( -1, buf );
|
|
|
|
// set initial cluster state.
|
|
initialState.SetCheck(
|
|
m_clusterData->hosts[m_machine].hp.initialClusterStateActive );
|
|
|
|
// fill in host ip
|
|
CommonUtils::fillCIPAddressCtrlString(
|
|
ipAddress,
|
|
m_clusterData->hosts[m_machine].hp.hIP );
|
|
|
|
// set host mask.
|
|
CommonUtils::fillCIPAddressCtrlString(
|
|
subnetMask,
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask );
|
|
|
|
}
|
|
|
|
// ReadControlData
|
|
//
|
|
void
|
|
HostPage::ReadControlData()
|
|
{
|
|
wchar_t buf[Common::BUF_SIZE ];
|
|
|
|
// fill in nic name.
|
|
int currentSelection = nicName.GetCurSel();
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.fullNicName = m_nicList[currentSelection].fullNicName;
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.adapterGuid = m_nicList[currentSelection].adapterGuid;
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.friendlyName = m_nicList[currentSelection].friendlyName;
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.dhcpEnabled = m_nicList[currentSelection].dhcpEnabled;
|
|
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic = m_nicList[currentSelection].ipsOnNic;
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.subnetMasks = m_nicList[currentSelection].subnetMasks;
|
|
|
|
// fill in priority.
|
|
int selectedPriorityIndex = priority.GetCurSel();
|
|
priority.GetLBText( selectedPriorityIndex, buf );
|
|
m_clusterData->hosts[m_machine].hp.hID = _wtoi( buf );
|
|
|
|
// fill in host ip
|
|
m_clusterData->hosts[m_machine].hp.hIP =
|
|
CommonUtils::getCIPAddressCtrlString( ipAddress );
|
|
|
|
// set host mask.
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask =
|
|
CommonUtils::getCIPAddressCtrlString( subnetMask );
|
|
|
|
|
|
// set initial cluster state.
|
|
m_clusterData->hosts[m_machine].hp.initialClusterStateActive =
|
|
initialState.GetCheck() ? true : false;
|
|
}
|
|
|
|
void
|
|
HostPage::OnOK()
|
|
{
|
|
CPropertyPage::OnOK();
|
|
}
|
|
|
|
|
|
bool
|
|
HostPage::isDipConfiguredOK()
|
|
{
|
|
// if nic selected has the connection ip then
|
|
// connection ip has to match the dip to ensure
|
|
// future connectivity.
|
|
//
|
|
|
|
// if connection ip is same as dip then no need
|
|
// to worry.
|
|
//
|
|
if( m_clusterData->hosts[m_machine].hp.hIP ==
|
|
m_clusterData->hosts[m_machine].connectionIP )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// check if selected nic has connection ip.
|
|
if( find( m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.begin(),
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end(),
|
|
m_clusterData->hosts[m_machine].connectionIP )
|
|
!=
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end() )
|
|
{
|
|
// the nic selected has the connection ip.
|
|
return false;
|
|
}
|
|
|
|
// selected nic does not have connection ip, so dont care.
|
|
return true;
|
|
}
|
|
|
|
|
|
BOOL
|
|
HostPage::OnKillActive()
|
|
{
|
|
ReadControlData();
|
|
|
|
// ip is blank
|
|
// subnet is blank
|
|
// valid
|
|
|
|
if( ( m_clusterData->hosts[m_machine].hp.hIP == _bstr_t( L"0.0.0.0") )
|
|
&&
|
|
( m_clusterData->hosts[m_machine].hp.hSubnetMask == _bstr_t( L"0.0.0.0") )
|
|
)
|
|
{
|
|
// both ip and subnet can be blank or 0.0.0.0 in host page. both but not
|
|
// either.
|
|
//
|
|
// this is empty, we just need to catch this case.
|
|
}
|
|
else if( m_clusterData->hosts[m_machine].hp.hIP == _bstr_t( L"0.0.0.0") )
|
|
{
|
|
// if only ip is blank or 0.0.0.0 then this is not allowed
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_PARM_DED_IP_BLANK ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
// check if ip is valid.
|
|
bool isIPValid = MIPAddress::checkIfValid(m_clusterData->hosts[m_machine].hp.hIP );
|
|
if( isIPValid != true )
|
|
{
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_PARM_INVAL_DED_IP ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
|
|
// check if subnet is 0.0.0.0
|
|
// if so ask user if he wants us to fill it or not.
|
|
if( m_clusterData->hosts[m_machine].hp.hSubnetMask == _bstr_t( L"0.0.0.0") )
|
|
{
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_PARM_DED_NM_BLANK ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
|
|
MIPAddress::getDefaultSubnetMask( m_clusterData->hosts[m_machine].hp.hIP,
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask
|
|
);
|
|
|
|
CommonUtils::fillCIPAddressCtrlString( subnetMask,
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask );
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
|
|
// check if subnet is contiguous
|
|
bool isSubnetContiguous = MIPAddress::isContiguousSubnetMask( m_clusterData->hosts[m_machine].hp.hSubnetMask );
|
|
if( isSubnetContiguous == false )
|
|
{
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_PARM_INVAL_DED_MASK ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
|
|
}
|
|
|
|
// check if ip address and subnet mask are valid as a pair
|
|
bool isIPSubnetPairValid = MIPAddress::isValidIPAddressSubnetMaskPair( m_clusterData->hosts[m_machine].hp.hIP,
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask );
|
|
if( isIPSubnetPairValid == false )
|
|
{
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_PARM_INVAL_DED_IP ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
// Edited (mhakim 02-14-01 )
|
|
//
|
|
// check if dip is properly configured.
|
|
//
|
|
if( isDipConfiguredOK() != true )
|
|
{
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_PARM_DIP_MISCONFIG ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
|
|
// set the dedicated ip back to the connection ip.
|
|
// and mask to derived from connection ip.
|
|
//
|
|
|
|
m_clusterData->hosts[m_machine].hp.hIP =
|
|
m_clusterData->hosts[m_machine].connectionIP;
|
|
|
|
MIPAddress::getDefaultSubnetMask( m_clusterData->hosts[m_machine].hp.hIP,
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask
|
|
);
|
|
|
|
CommonUtils::fillCIPAddressCtrlString( ipAddress,
|
|
m_clusterData->hosts[m_machine].hp.hIP );
|
|
|
|
CommonUtils::fillCIPAddressCtrlString( subnetMask,
|
|
m_clusterData->hosts[m_machine].hp.hSubnetMask );
|
|
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
|
|
// check if dip is non zero, it must
|
|
// be present on nic selected.
|
|
if( m_clusterData->hosts[m_machine].hp.hIP
|
|
!= _bstr_t(L"0.0.0.0") )
|
|
{
|
|
// check if the dip entered exists on that nic, if not display warning.
|
|
if( find( m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.begin(),
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end(),
|
|
m_clusterData->hosts[m_machine].hp.hIP )
|
|
==
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end() )
|
|
{
|
|
// the dip specified does not exist on
|
|
// nic selected. Display warning.
|
|
int ignoreWarning = MessageBox( GETRESOURCEIDSTRING( IDS_INVAL_DIP ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_WARN ),
|
|
MB_ICONEXCLAMATION | MB_YESNO );
|
|
if( ignoreWarning == IDNO )
|
|
{
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// check if nic selected is dhcp and also the connection nic.
|
|
// if so this is not allowed.
|
|
if( m_clusterData->hosts[m_machine].hp.nicInfo.dhcpEnabled == true )
|
|
{
|
|
if( find( m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.begin(),
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end(),
|
|
m_clusterData->hosts[m_machine].connectionIP )
|
|
!=
|
|
m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end() )
|
|
{
|
|
// the nic selected has the connection ip.
|
|
|
|
MessageBox( GETRESOURCEIDSTRING( IDS_INVAL_DHCP_NIC ),
|
|
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
|
|
MB_ICONSTOP | MB_OK );
|
|
|
|
CPropertyPage::OnCancel();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return CPropertyPage::OnKillActive();
|
|
}
|
|
|
|
void
|
|
HostPage::OnSelectedNicChanged()
|
|
{
|
|
// do any changes if in fact
|
|
// user has changed selection.
|
|
|
|
// get current selection
|
|
int currentSelection = nicName.GetCurSel();
|
|
if( m_previousSelection == currentSelection )
|
|
{
|
|
// the nic is the same so no need
|
|
// to do anything else.
|
|
return;
|
|
}
|
|
|
|
m_previousSelection = currentSelection;
|
|
|
|
detailedNicInfo.SetWindowText( m_nicList[currentSelection].fullNicName );
|
|
|
|
if( find( m_nicList[currentSelection].ipsOnNic.begin(),
|
|
m_nicList[currentSelection].ipsOnNic.end(),
|
|
m_clusterData->hosts[m_machine].connectionIP )
|
|
!=
|
|
m_nicList[currentSelection].ipsOnNic.end() )
|
|
{
|
|
// this is the connection nic
|
|
|
|
// make the dip the connectionIP
|
|
CommonUtils::fillCIPAddressCtrlString(
|
|
ipAddress,
|
|
m_clusterData->hosts[m_machine].connectionIP );
|
|
|
|
_bstr_t defaultConnectionIPSubnet;
|
|
MIPAddress::getDefaultSubnetMask( m_clusterData->hosts[m_machine].connectionIP,
|
|
defaultConnectionIPSubnet
|
|
);
|
|
|
|
CommonUtils::fillCIPAddressCtrlString(
|
|
subnetMask,
|
|
defaultConnectionIPSubnet );
|
|
|
|
}
|
|
else
|
|
{
|
|
// this is not the connection nic
|
|
|
|
// make the dip blank.
|
|
CommonUtils::fillCIPAddressCtrlString(
|
|
ipAddress,
|
|
L"0.0.0.0" );
|
|
|
|
// make the subnet also blank.
|
|
CommonUtils::fillCIPAddressCtrlString(
|
|
subnetMask,
|
|
L"0.0.0.0" );
|
|
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
HostPage::OnHelpInfo (HELPINFO* helpInfo )
|
|
{
|
|
if( helpInfo->iContextType == HELPINFO_WINDOW )
|
|
{
|
|
::WinHelp( static_cast<HWND> ( helpInfo->hItemHandle ), CVY_CTXT_HELP_FILE, HELP_WM_HELP, (ULONG_PTR ) g_aHelpIDs_IDD_HOST_PAGE);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
HostPage::OnContextMenu( CWnd* pWnd, CPoint point )
|
|
{
|
|
::WinHelp( m_hWnd, CVY_CTXT_HELP_FILE, HELP_CONTEXTMENU, (ULONG_PTR ) g_aHelpIDs_IDD_HOST_PAGE);
|
|
}
|
|
|
|
void
|
|
HostPage::OnGainFocusDedicatedIP()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
void
|
|
HostPage::OnGainFocusDedicatedMask()
|
|
{
|
|
// if dedicated ip is valid
|
|
// and subnet mask is blank, then generate
|
|
// the default subnet mask.
|
|
_bstr_t ipAddressString = CommonUtils::getCIPAddressCtrlString( ipAddress );
|
|
|
|
if( ( MIPAddress::checkIfValid( ipAddressString ) == true )
|
|
&&
|
|
( subnetMask.IsBlank() == TRUE )
|
|
)
|
|
{
|
|
_bstr_t subnetMaskString;
|
|
|
|
MIPAddress::getDefaultSubnetMask( ipAddressString,
|
|
subnetMaskString );
|
|
|
|
CommonUtils::fillCIPAddressCtrlString( subnetMask,
|
|
subnetMaskString );
|
|
}
|
|
}
|