windows-nt/Source/XPSP1/NT/net/wlbs/nlbmgr/nlbsprov/mnlbnetcfg.cpp
2020-09-26 16:20:57 +08:00

544 lines
16 KiB
C++

// Copyright (c) Microsoft. All rights reserved.
//
// This is unpublished source code of Microsoft.
// The copyright notice above does not evidence any
// actual or intended publication of such source code.
// OneLiner : Implementation of MNLBNetCfg
// DevUnit : wlbstest
// Author : Murtaza Hakim
// include files
#include "MNLBNetCfg.h"
#include "MTrace.h"
#include "WTokens.h"
// History:
// --------
//
//
// Revised by : mhakim
// Date : 02-12-01
// Reason : Added password support.
// constructor
//
MNLBNetCfg::MNLBNetCfg( const _bstr_t& ip,
const _bstr_t& fullNicName )
:
m_ip( ip ),
m_fullNicName( fullNicName )
{
}
// constructor
//
MNLBNetCfg::MNLBNetCfg( const _bstr_t& fullNicName )
:
m_ip( L"self"),
m_fullNicName( fullNicName )
{
}
// unbind
//
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::unbind()
{
MWmiObject machine( m_ip,
L"root\\microsoftnlb",
L"administrator",
L"" );
vector<MWmiInstance> instanceStore;
_bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\"";
machine.getSpecificInstance( L"NlbsNic",
relPath,
&instanceStore );
// input parameters are none.
//
vector<MWmiParameter *> inputParameters;
// output parameters which are of interest.
//
vector<MWmiParameter *> outputParameters;
MWmiParameter ReturnValue(L"ReturnValue");
outputParameters.push_back( &ReturnValue );
instanceStore[0].runMethod( L"Unbind",
inputParameters,
outputParameters );
if( long( ReturnValue.getValue() ) != 0 )
{
TRACE( MTrace::SEVERE_ERROR,
L"Not able to unbind nlb" );
throw _com_error( WBEM_E_NOT_FOUND );
}
return MNLBNetCfg_SUCCESS;
}
// isBound
//
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::isBound()
{
MWmiObject machine( m_ip,
L"root\\microsoftnlb",
L"administrator",
L"" );
vector<MWmiInstance> instanceStore;
_bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\"";
machine.getSpecificInstance( L"NlbsNic",
relPath,
&instanceStore );
// input parameters are none.
//
vector<MWmiParameter *> inputParameters;
// output parameters which are of interest.
//
vector<MWmiParameter *> outputParameters;
MWmiParameter ReturnValue(L"ReturnValue");
outputParameters.push_back( &ReturnValue );
instanceStore[0].runMethod( L"IsBound",
inputParameters,
outputParameters );
if( long( ReturnValue.getValue() ) == 1 )
{
return BOUND;
}
else if( long( ReturnValue.getValue() ) == 0 )
{
return UNBOUND;
}
else
{
TRACE( MTrace::SEVERE_ERROR,
L"Not able to check if nlb is bound or not" );
throw _com_error( WBEM_E_NOT_FOUND );
}
return MNLBNetCfg_SUCCESS;
}
// addClusterIP
//
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::addClusterIP( const _bstr_t& clusterIP,
const _bstr_t& subnet )
{
if( m_ip == _bstr_t( L"self" ) )
{
MIPAddressAdmin ipAdmin( m_fullNicName );
ipAdmin.addIPAddress( clusterIP,
subnet );
}
else
{
MIPAddressAdmin ipAdmin( m_ip,
m_fullNicName );
ipAdmin.addIPAddress( clusterIP,
subnet );
}
return MNLBNetCfg_SUCCESS;
}
// removeClusterIP
//
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::removeClusterIP( const _bstr_t& clusterIP )
{
if( m_ip == _bstr_t( L"self" ) )
{
MIPAddressAdmin ipAdmin( m_fullNicName );
ipAdmin.deleteIPAddress( clusterIP );
}
else
{
MIPAddressAdmin ipAdmin( m_ip,
m_fullNicName);
ipAdmin.deleteIPAddress( clusterIP );
}
return MNLBNetCfg_SUCCESS;
}
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::bind()
{
MWmiObject machine( m_ip,
L"root\\microsoftnlb",
L"administrator",
L"" );
vector<MWmiInstance> instanceStore;
_bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\"";
machine.getSpecificInstance( L"NlbsNic",
relPath,
&instanceStore );
// input parameters are none.
//
vector<MWmiParameter *> inputParameters;
// output parameters which are of interest.
//
vector<MWmiParameter *> outputParameters;
MWmiParameter ReturnValue(L"ReturnValue");
outputParameters.push_back( &ReturnValue );
instanceStore[0].runMethod( L"Bind",
inputParameters,
outputParameters );
if( long( ReturnValue.getValue() ) != 0 )
{
TRACE( MTrace::SEVERE_ERROR,
L"Not able to bind nlb" );
throw _com_error( WBEM_E_NOT_FOUND );
}
return MNLBNetCfg_SUCCESS;
}
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::bindAndConfigure(
const ClusterData* p_clusterData,
const _bstr_t& machineName
)
{
ClusterData* p_clusterDataCopy =
const_cast <ClusterData *>( p_clusterData );
MWmiObject machine( m_ip,
L"root\\microsoftnlb",
L"administrator",
L"" );
vector<MWmiInstance> instanceStore;
_bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\"";
machine.getSpecificInstance( L"NlbsNic",
relPath,
&instanceStore );
// input parameters
//
vector<MWmiParameter *> inputParameters;
// cluster properties
MWmiParameter ClusterIPAddress(L"ClusterIPAddress");
inputParameters.push_back( &ClusterIPAddress );
ClusterIPAddress.setValue( p_clusterDataCopy->cp.cIP );
MWmiParameter ClusterNetworkMask(L"ClusterNetworkMask");
inputParameters.push_back( &ClusterNetworkMask );
ClusterNetworkMask.setValue( p_clusterDataCopy->cp.cSubnetMask );
MWmiParameter ClusterName(L"ClusterName");
inputParameters.push_back( &ClusterName );
ClusterName.setValue( p_clusterDataCopy->cp.cFullInternetName );
MWmiParameter MulticastSupportEnabled(L"MulticastSupportEnabled");
inputParameters.push_back( &MulticastSupportEnabled );
MulticastSupportEnabled.setValue( p_clusterDataCopy->cp.multicastSupportEnabled );
MWmiParameter IGMPSupport(L"IGMPSupport");
inputParameters.push_back( &IGMPSupport );
IGMPSupport.setValue( p_clusterDataCopy->cp.igmpSupportEnabled );
MWmiParameter RemoteControlEnabled(L"RemoteControlEnabled");
inputParameters.push_back( &RemoteControlEnabled );
RemoteControlEnabled.setValue( p_clusterDataCopy->cp.remoteControlEnabled );
MWmiParameter Password(L"Password");
inputParameters.push_back( &Password );
Password.setValue( p_clusterDataCopy->cp.password );
// host properties
MWmiParameter HostPriority(L"HostPriority");
inputParameters.push_back( &HostPriority );
HostPriority.setValue( p_clusterDataCopy->hosts[machineName].hp.hID );
MWmiParameter DedicatedIPAddress(L"DedicatedIPAddress");
inputParameters.push_back( &DedicatedIPAddress );
DedicatedIPAddress.setValue( p_clusterDataCopy->hosts[machineName].hp.hIP );
MWmiParameter DedicatedNetworkMask(L"DedicatedNetworkMask");
inputParameters.push_back( &DedicatedNetworkMask );
DedicatedNetworkMask.setValue( p_clusterDataCopy->hosts[machineName].hp.hSubnetMask );
MWmiParameter ClusterModeOnStart(L"ClusterModeOnStart");
inputParameters.push_back( &ClusterModeOnStart );
ClusterModeOnStart.setValue( p_clusterDataCopy->hosts[machineName].hp.initialClusterStateActive );
// port rules
vector<_bstr_t> portRulesVector;
getPortRules( p_clusterData,
machineName,
portRulesVector );
SAFEARRAY* portRulesArray;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = portRulesVector.size();
portRulesArray = SafeArrayCreate( VT_BSTR, 1, rgsabound );
LONG scount = 0;
HRESULT hr;
for( int i = 0; i < portRulesVector.size(); ++i )
{
scount = i;
hr = SafeArrayPutElement( portRulesArray,
&scount,
(wchar_t * ) portRulesVector[i] );
}
VARIANT portRulesVariant;
portRulesVariant.vt = VT_ARRAY | VT_BSTR;
portRulesVariant.parray = portRulesArray;
MWmiParameter PortRules(L"PortRules");
inputParameters.push_back( &PortRules );
PortRules.setValue( portRulesVariant );
// output parameters which are of interest.
//
vector<MWmiParameter *> outputParameters;
MWmiParameter ReturnValue(L"ReturnValue");
outputParameters.push_back( &ReturnValue );
instanceStore[0].runMethod( L"BindAndConfigure",
inputParameters,
outputParameters );
return MNLBNetCfg_SUCCESS;
}
void
MNLBNetCfg::getPortRules( const ClusterData* p_clusterData,
const _bstr_t& myMachine,
vector<_bstr_t>& myPortRules )
{
wchar_t portBuf[1000];
wstring temp;
WTokens tok;
vector<wstring> tokens;
map< long, PortDataELB>::iterator topELB;
map< long, PortDataULB>::iterator topULB;
map< long, PortDataD>::iterator topD;
map< long, PortDataF>::iterator topF;
wstring trafficToHandle;
wstring affinity;
for( topELB = p_clusterData->portELB.begin(); topELB != p_clusterData->portELB.end(); ++topELB )
{
if( (*topELB).second._trafficToHandle == MNLBPortRule::both )
{
trafficToHandle = L"Both";
}
else if( (*topELB).second._trafficToHandle == MNLBPortRule::tcp )
{
trafficToHandle = L"TCP";
}
else
{
trafficToHandle = L"UDP";
}
if( (*topELB).second._affinity == MNLBPortRule::single )
{
affinity = L"Single";
}
else if( (*topELB).second._affinity == MNLBPortRule::none )
{
affinity = L"None";
}
else
{
affinity = L"Class C";
}
wsprintf( portBuf, L"%d\t%d\t%s\tMultiple\t \tEqual\t%s\t",
(*topELB).second._startPort,
(*topELB).second._endPort,
trafficToHandle.c_str(),
affinity.c_str() );
myPortRules.push_back( portBuf );
}
for( topULB = p_clusterData->portULB.begin(); topULB != p_clusterData->portULB.end(); ++topULB )
{
if( (*topULB).second._trafficToHandle == MNLBPortRule::both )
{
trafficToHandle = L"Both";
}
else if( (*topULB).second._trafficToHandle == MNLBPortRule::tcp )
{
trafficToHandle = L"TCP";
}
else
{
trafficToHandle = L"UDP";
}
if( (*topULB).second._affinity == MNLBPortRule::single )
{
affinity = L"Single";
}
else if( (*topULB).second._affinity == MNLBPortRule::none )
{
affinity = L"None";
}
else
{
affinity = L"Class C";
}
int loadWeight = (*topULB).second.machineMapToLoadWeight[myMachine];
wsprintf( portBuf, L"%d\t%d\t%s\tMultiple\t \t%d\t%s",
(*topULB).second._startPort,
(*topULB).second._endPort,
trafficToHandle.c_str(),
loadWeight,
affinity.c_str() );
myPortRules.push_back( portBuf );
}
for( topD = p_clusterData->portD.begin(); topD != p_clusterData->portD.end(); ++topD )
{
if( (*topD).second._trafficToHandle == MNLBPortRule::both )
{
trafficToHandle = L"Both";
}
else if( (*topD).second._trafficToHandle == MNLBPortRule::tcp )
{
trafficToHandle = L"TCP";
}
else
{
trafficToHandle = L"UDP";
}
wsprintf( portBuf, L"%d\t%d\t%s\tDisabled\t \t \t \t",
(*topD).second._startPort,
(*topD).second._endPort,
trafficToHandle.c_str() );
myPortRules.push_back( portBuf );
}
for( topF = p_clusterData->portF.begin(); topF != p_clusterData->portF.end(); ++topF )
{
if( (*topF).second._trafficToHandle == MNLBPortRule::both )
{
trafficToHandle = L"Both";
}
else if( (*topF).second._trafficToHandle == MNLBPortRule::tcp )
{
trafficToHandle = L"TCP";
}
else
{
trafficToHandle = L"UDP";
}
wsprintf( portBuf, L"%d\t%d\t%s\tSingle\t%d\t \t \t",
(*topF).second._startPort,
(*topF).second._endPort,
trafficToHandle.c_str(),
(*topF).second.machineMapToPriority[ myMachine ] );
myPortRules.push_back( portBuf );
}
}
MNLBNetCfg::MNLBNetCfg_Error
MNLBNetCfg::modifyClusterProperties(const ClusterProperties* p_clusterProperties)
{
MWmiObject machine( m_ip,
L"root\\microsoftnlb",
L"administrator",
L"" );
vector<MWmiInstance> instanceStore;
_bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\"";
machine.getSpecificInstance( L"NlbsNic",
relPath,
&instanceStore );
// input parameters
//
vector<MWmiParameter *> inputParameters;
// cluster properties
MWmiParameter ClusterIPAddress(L"ClusterIPAddress");
inputParameters.push_back( &ClusterIPAddress );
ClusterIPAddress.setValue(p_clusterProperties->cIP);
MWmiParameter ClusterNetworkMask(L"ClusterNetworkMask");
inputParameters.push_back( &ClusterNetworkMask );
ClusterNetworkMask.setValue( p_clusterProperties->cSubnetMask );
MWmiParameter ClusterName(L"ClusterName");
inputParameters.push_back( &ClusterName );
ClusterName.setValue( p_clusterProperties->cFullInternetName );
MWmiParameter MulticastSupportEnabled(L"MulticastSupportEnabled");
inputParameters.push_back( &MulticastSupportEnabled );
MulticastSupportEnabled.setValue( p_clusterProperties->multicastSupportEnabled );
MWmiParameter IGMPSupport(L"IGMPSupport");
inputParameters.push_back( &IGMPSupport );
IGMPSupport.setValue( p_clusterProperties->igmpSupportEnabled );
MWmiParameter RemoteControlEnabled(L"RemoteControlEnabled");
inputParameters.push_back( &RemoteControlEnabled );
RemoteControlEnabled.setValue( p_clusterProperties->remoteControlEnabled );
MWmiParameter Password(L"Password");
inputParameters.push_back( &Password );
Password.setValue( p_clusterProperties->password );
// output parameters which are of interest.
//
vector<MWmiParameter *> outputParameters;
MWmiParameter ReturnValue(L"ReturnValue");
outputParameters.push_back( &ReturnValue );
instanceStore[0].runMethod( L"ModifyClusterProperties",
inputParameters,
outputParameters );
return MNLBNetCfg_SUCCESS;
}