// 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 instanceStore; _bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\""; machine.getSpecificInstance( L"NlbsNic", relPath, &instanceStore ); // input parameters are none. // vector inputParameters; // output parameters which are of interest. // vector 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 instanceStore; _bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\""; machine.getSpecificInstance( L"NlbsNic", relPath, &instanceStore ); // input parameters are none. // vector inputParameters; // output parameters which are of interest. // vector 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 instanceStore; _bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\""; machine.getSpecificInstance( L"NlbsNic", relPath, &instanceStore ); // input parameters are none. // vector inputParameters; // output parameters which are of interest. // vector 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 ( p_clusterData ); MWmiObject machine( m_ip, L"root\\microsoftnlb", L"administrator", L"" ); vector instanceStore; _bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\""; machine.getSpecificInstance( L"NlbsNic", relPath, &instanceStore ); // input parameters // vector 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 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 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 instanceStore; _bstr_t relPath = L"NlbsNic.FullName=\"" + m_fullNicName + "\""; machine.getSpecificInstance( L"NlbsNic", relPath, &instanceStore ); // input parameters // vector 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 outputParameters; MWmiParameter ReturnValue(L"ReturnValue"); outputParameters.push_back( &ReturnValue ); instanceStore[0].runMethod( L"ModifyClusterProperties", inputParameters, outputParameters ); return MNLBNetCfg_SUCCESS; }