Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

518 lines
15 KiB

//***************************************************************************
//
// CLUSTERPAGE.CPP
//
// Module: NLB Manager
//
// Purpose: LeftView, the tree view of NlbManager, and a few other
// smaller classes.
//
// Copyright (c)2001-2002 Microsoft Corporation, All Rights Reserved
//
// History:
//
// 02/12/01 Mhakim created
// 07/30/01 JosephJ complete rewrite
// 09/15/01 SHouse ctxt sensitive help
// 01/22/02 SHouse misc cleanup and features
//
//
//***************************************************************************
#include "precomp.h"
#pragma hdrstop
#include "private.h"
#include "ClusterPage.h"
BEGIN_MESSAGE_MAP( ClusterPage, CPropertyPage )
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
ClusterPage::ClusterPage(
CPropertySheet *pshOwner,
LeftView::OPERATION op,
NLB_EXTENDED_CLUSTER_CONFIGURATION *pNlbCfg,
ENGINEHANDLE ehCluster OPTIONAL
// ENGINEHANDLE ehInterface OPTIONAL
)
:
m_pshOwner(pshOwner),
CPropertyPage( ClusterPage::IDD ),
m_pNlbCfg( pNlbCfg ),
m_ehCluster(ehCluster)
// m_ehInterface(ehInterface)
{
m_operation = op;
switch(op)
{
case LeftView::OP_NEWCLUSTER:
m_fWizard=TRUE;
m_fDisableClusterProperties=FALSE;
break;
case LeftView::OP_CLUSTERPROPERTIES:
m_fWizard=FALSE;
m_fDisableClusterProperties=FALSE;
break;
case LeftView::OP_HOSTPROPERTIES:
m_fWizard=FALSE;
m_fDisableClusterProperties=TRUE;
break;
default:
ASSERT(FALSE);
break;
}
ZeroMemory(&m_WlbsConfig, sizeof(m_WlbsConfig));
mfn_LoadFromNlbCfg();
m_pCommonClusterPage = new CCommonClusterPage(AfxGetInstanceHandle(),
&m_WlbsConfig, false, NULL);
}
void
ClusterPage::mfn_LoadFromNlbCfg()
{
ZeroMemory(&m_WlbsConfig, sizeof(m_WlbsConfig));
ARRAYSTRCPY(m_WlbsConfig.cl_ip_addr, m_pNlbCfg->NlbParams.cl_ip_addr);
ARRAYSTRCPY(m_WlbsConfig.cl_net_mask, m_pNlbCfg->NlbParams.cl_net_mask);
ARRAYSTRCPY(m_WlbsConfig.domain_name, m_pNlbCfg->NlbParams.domain_name);
ARRAYSTRCPY(m_WlbsConfig.cl_mac_addr, m_pNlbCfg->NlbParams.cl_mac_addr);
//
// pClusterProperty->multicastIpAddress could be NULL
//
if (m_pNlbCfg->NlbParams.szMCastIpAddress[0] != 0)
{
ARRAYSTRCPY(m_WlbsConfig.szMCastIpAddress, m_pNlbCfg->NlbParams.szMCastIpAddress);
}
m_WlbsConfig.fMcastSupport = m_pNlbCfg->NlbParams.mcast_support;
m_WlbsConfig.fIGMPSupport = m_pNlbCfg->NlbParams.fIGMPSupport;
m_WlbsConfig.fRctEnabled = m_pNlbCfg->NlbParams.rct_enabled;
m_WlbsConfig.fMcastSupport = m_pNlbCfg->NlbParams.mcast_support;
m_WlbsConfig.fIpToMCastIp = m_pNlbCfg->NlbParams.fIpToMCastIp;
// m_WlbsConfig.fConvertMac = m_pNlbCfg->NlbParams.i_convert_mac;
// TODO: check: Always generate the MAC address from IP
m_WlbsConfig.fConvertMac = TRUE;
*m_WlbsConfig.szPassword = 0;
}
void
ClusterPage::mfn_SaveToNlbCfg(void)
{
//
// Replace the old cluster IP address/subnet with the new one in the
// list of network addresses.
//
{
WBEMSTATUS wStat;
wStat = m_pNlbCfg->ModifyNetworkAddress(
m_pNlbCfg->NlbParams.cl_ip_addr,
m_WlbsConfig.cl_ip_addr,
m_WlbsConfig.cl_net_mask
);
if (FAILED(wStat))
{
_bstr_t bstrMsg = GETRESOURCEIDSTRING(IDS_INVALID_IP_OR_SUBNET);
_bstr_t bstrTitle = GETRESOURCEIDSTRING(IDS_INVALID_INFORMATION);
::MessageBox(
NULL,
bstrMsg,
bstrTitle,
MB_ICONINFORMATION | MB_OK
);
goto end;
}
}
ARRAYSTRCPY(m_pNlbCfg->NlbParams.cl_ip_addr, m_WlbsConfig.cl_ip_addr);
ARRAYSTRCPY(m_pNlbCfg->NlbParams.cl_net_mask, m_WlbsConfig.cl_net_mask);
ARRAYSTRCPY(m_pNlbCfg->NlbParams.domain_name, m_WlbsConfig.domain_name);
ARRAYSTRCPY(m_pNlbCfg->NlbParams.cl_mac_addr, m_WlbsConfig.cl_mac_addr);
//
// pClusterProperty->multicastIpAddress could be NULL
//
if (m_WlbsConfig.szMCastIpAddress[0] != 0)
{
ARRAYSTRCPY(m_pNlbCfg->NlbParams.szMCastIpAddress, m_WlbsConfig.szMCastIpAddress);
}
m_pNlbCfg->NlbParams.mcast_support = m_WlbsConfig.fMcastSupport;
m_pNlbCfg->NlbParams.fIGMPSupport = m_WlbsConfig.fIGMPSupport;
m_pNlbCfg->NlbParams.rct_enabled= m_WlbsConfig.fRctEnabled;
m_pNlbCfg->NlbParams.mcast_support = m_WlbsConfig.fMcastSupport;
m_pNlbCfg->NlbParams.fIpToMCastIp = m_WlbsConfig.fIpToMCastIp;
// m_pNlbCfg->NlbParams.i_convert_mac= m_WlbsConfig.fConvertMac;
// TODO: check: Always generate the MAC address from IP
// m_pNlbCfg->NlbParams.i_convert_mac = m_WlbsConfig.fConvertMac;
// TODO: *m_pNlbCfg->NlbParams.password = 0;
if (m_WlbsConfig.fChangePassword)
{
m_pNlbCfg->SetNewRemoteControlPassword(m_WlbsConfig.szPassword);
}
else
{
m_pNlbCfg->SetNewRemoteControlPassword(NULL);
}
end:
return;
}
ClusterPage::~ClusterPage()
{
delete m_pCommonClusterPage;
}
//+----------------------------------------------------------------------------
//
// Function: ClusterPage::OnInitDialog
//
// Description: Process WM_INITDIALOG message
//
// Arguments: None
//
// Returns: BOOL -
//
// History: fengsun Created Header 1/4/01
//
//+----------------------------------------------------------------------------
BOOL ClusterPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
//
// Always set that the page has changed, so we don't have to keep track of this.
//
SetModified(TRUE);
m_pCommonClusterPage->OnInitDialog(m_hWnd);
if (m_fDisableClusterProperties)
{
//
// The page is for host property.
// disable all cluster windows as we are at host level.
//
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_CL_IP), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_CL_MASK), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_RADIO_UNICAST), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_RADIO_MULTICAST), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_IGMP), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_DOMAIN), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_RCT), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW2), FALSE );
}
else
{
//
// The page is for cluster property
//
// enable all cluster windows as we are at cluster level.
//
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_CL_IP), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_CL_MASK), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_RADIO_UNICAST), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_RADIO_MULTICAST), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_IGMP), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_DOMAIN), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_RCT), TRUE );
// enable remote control check box only if remote control is disabled.
//
// if remote control is enabled , enable password windows
// else disable them.
if (m_WlbsConfig.fRctEnabled)
{
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW), TRUE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW2), TRUE );
}
else
{
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW), FALSE );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW2), FALSE );
}
}
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_ETH), FALSE );
return TRUE;
}
//+----------------------------------------------------------------------------
//
// Function: ClusterPage::OnContextMenu
//
// Description: Process WM_CONTEXTMENU message
//
// Arguments: CWnd* pWnd -
// CPoint point -
//
// Returns: Nothing
//
// History: fengsun Created Header 1/4/01
//
//+----------------------------------------------------------------------------
//+----------------------------------------------------------------------------
//
// Function: ClusterPage::OnCommand
//
// Description: Process WM_COMMAND message
//
// Arguments: WPARAM wParam -
// LPARAM lParam -
//
// Returns: BOOL -
//
// History: fengsun Created Header 1/4/01
//
//+----------------------------------------------------------------------------
BOOL ClusterPage::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDC_EDIT_CL_IP:
return m_pCommonClusterPage->OnEditClIp(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
case IDC_EDIT_CL_MASK:
return m_pCommonClusterPage->OnEditClMask(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
case IDC_CHECK_RCT:
return m_pCommonClusterPage->OnCheckRct(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
case IDC_BUTTON_HELP:
return m_pCommonClusterPage->OnButtonHelp(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
case IDC_RADIO_UNICAST:
return m_pCommonClusterPage->OnCheckMode(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
case IDC_RADIO_MULTICAST:
return m_pCommonClusterPage->OnCheckMode(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
case IDC_CHECK_IGMP:
return m_pCommonClusterPage->OnCheckIGMP(HIWORD(wParam),LOWORD(wParam), (HWND)lParam);
break;
}
return CPropertyPage::OnCommand(wParam, lParam);
}
//+----------------------------------------------------------------------------
//
// Function: ClusterPage::OnNotify
//
// Description: Process WM_NOTIFY message
//
// Arguments: WPARAM idCtrl -
// LPARAM pnmh -
// LRESULT* pResult -
//
// Returns: BOOL -
//
// History: fengsun Created Header 1/4/01
//
//+----------------------------------------------------------------------------
BOOL ClusterPage::OnNotify(WPARAM idCtrl , LPARAM pnmh , LRESULT* pResult)
{
NMHDR* pNmhdr = (NMHDR*)pnmh ;
switch(pNmhdr->code)
{
case PSN_KILLACTIVE:
if (KillActive())
{
*pResult = PSNRET_NOERROR;
}
else
{
*pResult = PSNRET_INVALID;
}
return TRUE;
case PSN_SETACTIVE:
if (this->SetActive())
{
*pResult = PSNRET_NOERROR;
}
else
{
*pResult = PSNRET_INVALID;
}
return TRUE;
case IPN_FIELDCHANGED:
*pResult = m_pCommonClusterPage->OnIpFieldChange(idCtrl, pNmhdr, *(BOOL*)pResult);
return TRUE;
}
return CPropertyPage::OnNotify(idCtrl, pnmh, pResult);
}
BOOL
ClusterPage::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_CLUSTER_PAGE);
}
return TRUE;
}
void
ClusterPage::OnContextMenu( CWnd* pWnd, CPoint point )
{
::WinHelp( m_hWnd,
CVY_CTXT_HELP_FILE,
HELP_CONTEXTMENU,
(ULONG_PTR ) g_aHelpIDs_IDD_CLUSTER_PAGE);
}
BOOL
ClusterPage::SetActive()
{
BOOL fRet = TRUE;
if (m_fWizard)
{
//
// We're the first page, so only enable next.
//
m_pshOwner->SetWizardButtons(
// PSWIZB_BACK|
PSWIZB_NEXT|
// PSWIZB_FINISH|
// PSWIZB_DISABLEDFINISH|
0
);
}
fRet = m_pCommonClusterPage->Load();
return fRet;
}
BOOL
ClusterPage::KillActive(void)
{
BOOL fRet = FALSE;
fRet = m_pCommonClusterPage->Save();
if (!fRet) goto end;
//
// Do extra checking here...
//
{
//
// Check that cluster IP is not used in any other way...
//
CLocalLogger logConflict;
BOOL fExistsOnRawIterface = FALSE;
NLBERROR nerr;
nerr = gEngine.ValidateNewClusterIp(
m_ehCluster,
m_WlbsConfig.cl_ip_addr,
REF fExistsOnRawIterface,
REF logConflict
);
if (nerr == NLBERR_INVALID_IP_ADDRESS_SPECIFICATION)
{
CLocalLogger logMsg;
if (m_ehCluster == NULL && fExistsOnRawIterface)
{
//
// This is a NEW cluster, and the conflicting entity
// is an existing interface NOT bound to any cluster known to
// NLB Manager.
// We'll give the user the opportunity to proceed...
//
int sel;
logMsg.Log(
IDS_CIP_CONFLICTS_WITH_RAW_INTERFACE,
m_WlbsConfig.cl_ip_addr,
logConflict.GetStringSafe()
);
sel = MessageBox(
logMsg.GetStringSafe(),
GETRESOURCEIDSTRING( IDS_PARM_WARNING ),
MB_YESNO | MB_ICONEXCLAMATION
);
if (sel == IDNO)
{
fRet = FALSE;
goto end;
}
}
else
{
logMsg.Log(
IDS_NEW_CIP_CONFLICTS_WITH_XXX,
logConflict.GetStringSafe()
);
MessageBox(
logMsg.GetStringSafe(),
GETRESOURCEIDSTRING( IDS_PARM_ERROR ),
MB_ICONSTOP | MB_OK
);
fRet = FALSE;
goto end;
}
}
}
//
// Actually save to the passed-in NLB cfg. This "commits" the changes,
// as far as this dialog is concerned.
//
mfn_SaveToNlbCfg();
end:
return fRet;
}