|
|
#include <crtdbg.h>
#include <comdef.h>
#include <iostream>
#include <memory>
#include <string>
#include <wbemprov.h>
#include <genlex.h> //for wmi object path parser
#include <objbase.h>
#include <wlbsconfig.h>
#include <ntrkcomm.h>
using namespace std;
#include "objpath.h"
#include "debug.h"
#include "wlbsiocl.h"
#include "controlwrapper.h"
#include "clusterwrapper.h"
#include "utils.h"
#include "wlbsparm.h"
#include "cluster.h"
#include "wlbsutil.h"
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::GetClusterConfig
//
// Purpose: This is used to obtain the current
// cluster configuration.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::GetClusterConfig( CClusterConfiguration& a_WlbsConfig ) { WLBS_REG_PARAMS WlbsParam;
DWORD dwWlbsRegRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsReadReg );
a_WlbsConfig.szClusterName = WlbsParam.domain_name; a_WlbsConfig.szClusterIPAddress = WlbsParam.cl_ip_addr; a_WlbsConfig.szClusterNetworkMask = WlbsParam.cl_net_mask; a_WlbsConfig.szClusterMACAddress = WlbsParam.cl_mac_addr;
a_WlbsConfig.bMulticastSupportEnable = ( WlbsParam.mcast_support != 0); a_WlbsConfig.bRemoteControlEnabled = ( WlbsParam.rct_enabled != 0 ); a_WlbsConfig.nMaxNodes = WLBS_MAX_HOSTS;
a_WlbsConfig.bIgmpSupport = (WlbsParam.fIGMPSupport != FALSE); a_WlbsConfig.bClusterIPToMulticastIP = (WlbsParam.fIpToMCastIp != FALSE); a_WlbsConfig.szMulticastIPAddress = WlbsParam.szMCastIpAddress;
a_WlbsConfig.bBDATeamActive = (WlbsParam.bda_teaming.active != 0);
if (a_WlbsConfig.bBDATeamActive) { a_WlbsConfig.szBDATeamId = WlbsParam.bda_teaming.team_id; a_WlbsConfig.bBDATeamMaster = (WlbsParam.bda_teaming.master != 0); a_WlbsConfig.bBDAReverseHash = (WlbsParam.bda_teaming.reverse_hash != 0); } }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::GetNodeConfig
//
// Purpose: This function retrieves the current WLBS configuration and selects
// only NodeSetting pertinent information. The information is passed
// back in a CNodeConfiguration class instance.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::GetNodeConfig( CNodeConfiguration& a_WlbsConfig ) { WLBS_REG_PARAMS WlbsParam;
DWORD dwWlbsRegRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsReadReg );
a_WlbsConfig.szDedicatedIPAddress = WlbsParam.ded_ip_addr; a_WlbsConfig.szDedicatedNetworkMask = WlbsParam.ded_net_mask;
a_WlbsConfig.bClusterModeOnStart = ( WlbsParam.cluster_mode != 0 ); //a_WlbsConfig.bNBTSupportEnable = ( WlbsParam.nbt_support != 0 );
a_WlbsConfig.bMaskSourceMAC = ( WlbsParam.mask_src_mac != 0 );
a_WlbsConfig.dwNumberOfRules = WlbsGetNumPortRules(&WlbsParam); a_WlbsConfig.dwCurrentVersion = WlbsParam.alive_period; a_WlbsConfig.dwHostPriority = WlbsParam.host_priority; a_WlbsConfig.dwAliveMsgPeriod = WlbsParam.alive_period; a_WlbsConfig.dwAliveMsgTolerance = WlbsParam.alive_tolerance; a_WlbsConfig.dwRemoteControlUDPPort = WlbsParam.rct_port; a_WlbsConfig.dwDescriptorsPerAlloc = WlbsParam.dscr_per_alloc; a_WlbsConfig.dwMaxDescriptorAllocs = WlbsParam.max_dscr_allocs; a_WlbsConfig.dwNumActions = WlbsParam.num_actions; a_WlbsConfig.dwNumPackets = WlbsParam.num_packets; a_WlbsConfig.dwNumAliveMsgs = WlbsParam.num_send_msgs; a_WlbsConfig.szDedicatedIPAddress = WlbsParam.ded_ip_addr; a_WlbsConfig.dwEffectiveVersion = WlbsGetEffectiveVersion(&WlbsParam); }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::SetClusterConfig
//
// Purpose: This is used to update the registry with values that originate from
// the MOF ClusterSetting class.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::PutClusterConfig( const CClusterConfiguration &a_WlbsConfig ) {
WLBS_REG_PARAMS NlbRegData;
DWORD dwWlbsRegRes = CWlbsCluster::ReadConfig(&NlbRegData );
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsReadReg );
wcsncpy ( NlbRegData.domain_name, a_WlbsConfig.szClusterName.c_str(), WLBS_MAX_DOMAIN_NAME );
wcsncpy ( NlbRegData.cl_net_mask, a_WlbsConfig.szClusterNetworkMask.c_str(), WLBS_MAX_CL_NET_MASK );
wcsncpy ( NlbRegData.cl_ip_addr , a_WlbsConfig.szClusterIPAddress.c_str(), WLBS_MAX_CL_IP_ADDR );
NlbRegData.mcast_support = a_WlbsConfig.bMulticastSupportEnable; NlbRegData.rct_enabled = a_WlbsConfig.bRemoteControlEnabled;
NlbRegData.fIGMPSupport = a_WlbsConfig.bIgmpSupport; NlbRegData.fIpToMCastIp = a_WlbsConfig.bClusterIPToMulticastIP;
wcsncpy ( NlbRegData.szMCastIpAddress , a_WlbsConfig.szMulticastIPAddress.c_str(), WLBS_MAX_CL_IP_ADDR );
// Fill in BDA information, if active
NlbRegData.bda_teaming.active = a_WlbsConfig.bBDATeamActive; if (NlbRegData.bda_teaming.active) { wcsncpy ( NlbRegData.bda_teaming.team_id, a_WlbsConfig.szBDATeamId.c_str(), WLBS_MAX_BDA_TEAM_ID );
NlbRegData.bda_teaming.master = a_WlbsConfig.bBDATeamMaster; NlbRegData.bda_teaming.reverse_hash = a_WlbsConfig.bBDAReverseHash; } dwWlbsRegRes = CWlbsCluster::WriteConfig(&NlbRegData );
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsWriteReg );
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::PutNodeConfig
//
// Purpose:This is used to update the registry with values that originate from
// the MOF NodeSetting class.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::PutNodeConfig( const CNodeConfiguration& a_WlbsConfig ) { WLBS_REG_PARAMS NlbRegData;
DWORD dwWlbsRegRes = CWlbsCluster::ReadConfig(&NlbRegData);
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsReadReg );
NlbRegData.host_priority = a_WlbsConfig.dwHostPriority; NlbRegData.alive_period = a_WlbsConfig.dwAliveMsgPeriod; NlbRegData.alive_tolerance = a_WlbsConfig.dwAliveMsgTolerance; NlbRegData.cluster_mode = a_WlbsConfig.bClusterModeOnStart; // NlbRegData.nbt_support = a_WlbsConfig.bNBTSupportEnable;
NlbRegData.rct_port = a_WlbsConfig.dwRemoteControlUDPPort; NlbRegData.mask_src_mac = a_WlbsConfig.bMaskSourceMAC; NlbRegData.dscr_per_alloc = a_WlbsConfig.dwDescriptorsPerAlloc; NlbRegData.max_dscr_allocs = a_WlbsConfig.dwMaxDescriptorAllocs; NlbRegData.num_actions = a_WlbsConfig.dwNumActions; NlbRegData.num_packets = a_WlbsConfig.dwNumPackets; NlbRegData.num_send_msgs = a_WlbsConfig.dwNumAliveMsgs;
//set dedicated IP
wcsncpy ( NlbRegData.ded_ip_addr, a_WlbsConfig.szDedicatedIPAddress.c_str(), WLBS_MAX_DED_IP_ADDR );
//set dedicated mask
wcsncpy ( NlbRegData.ded_net_mask, a_WlbsConfig.szDedicatedNetworkMask.c_str(), WLBS_MAX_DED_NET_MASK );
dwWlbsRegRes = CWlbsCluster::WriteConfig(&NlbRegData);
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsWriteReg );
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::Commit
//
// Purpose: This function invokes WlbsCommitChanges, which causes the driver to
// load the current registry parameters.
//
// Return: This function returns either WLBS_OK or WLBS_REBOOT. All other
// Wlbs return values cause this function to throw WBEM_E_FAILED.
//
// Note: The wlbs API currently caches the cluster and dedicated IP addreses.
// As a result, if a user changes these values via a source external
// to this provider, the cached values will fall out of sync. To
// prevent this, a WlbsWriteReg is invoked to force the cache to
// update.
//
////////////////////////////////////////////////////////////////////////////////
DWORD CWlbsClusterWrapper::Commit(CWlbsControlWrapper* pControl) {
WLBS_REG_PARAMS WlbsRegData; DWORD dwExtRes;
dwExtRes = CWlbsCluster::CommitChanges(&pControl->m_WlbsControl);
if( !(dwExtRes != WLBS_OK || dwExtRes != WLBS_REBOOT) ) throw CErrorWlbsControl( dwExtRes, CmdWlbsCommitChanges );
return dwExtRes; }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::SetPassword
//
// Purpose: This function encodes the WLBS remote control password and saves
// it in the registry.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::SetPassword( LPWSTR a_szPassword ) { WLBS_REG_PARAMS RegData;
DWORD dwRes = CWlbsCluster::ReadConfig(&RegData );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
dwRes = WlbsSetRemotePassword( &RegData, a_szPassword );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsSetRemotePassword );
dwRes = CWlbsCluster::WriteConfig( &RegData );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsWriteReg );
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::GetPortRule
//
// Purpose: This function retrieves the port rule that encompasses the requested
// port.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::GetPortRule( DWORD a_dwVip, DWORD a_dwPort, PWLBS_PORT_RULE a_pPortRule ) {
WLBS_REG_PARAMS WlbsParam;
DWORD dwWlbsRegRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwWlbsRegRes != WLBS_OK ) throw CErrorWlbsControl( dwWlbsRegRes, CmdWlbsReadReg );
DWORD dwRes = WlbsGetPortRule( &WlbsParam, a_dwVip, a_dwPort, a_pPortRule );
if( dwRes == WLBS_NOT_FOUND ) throw _com_error( WBEM_E_NOT_FOUND );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsGetPortRule ); }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::EnumPortRules
//
// Purpose: This function retrieves all of the port rules of a given type. The
// function allocates memory for the received port rules. It is up
// to the caller to free the memory. The number of rules retrieved is
// placed in the a_dwNumRules parameter.
//
// Note: Setting a_FilteringMode = 0 instructs function to retrieve all the
// port rules.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::EnumPortRules ( WLBS_PORT_RULE** a_ppPortRule, LPDWORD a_pdwNumRules, DWORD a_FilteringMode ) {
WLBS_PORT_RULE AllPortRules[WLBS_MAX_RULES]; DWORD dwTotalNumRules = WLBS_MAX_RULES;
ASSERT( a_ppPortRule );
WLBS_REG_PARAMS WlbsParam; DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
dwRes = WlbsEnumPortRules( &WlbsParam, AllPortRules, &dwTotalNumRules );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsEnumPortRules );
if( dwTotalNumRules == 0 ) { a_pdwNumRules = 0; return; }
long nMaxSelRuleIndex = -1; DWORD dwSelectedPortRules[WLBS_MAX_RULES];
//loop through all of the port rules
for( DWORD i = 0; i < dwTotalNumRules; i++) { if( a_FilteringMode == 0 || AllPortRules[i].mode == a_FilteringMode ) dwSelectedPortRules[++nMaxSelRuleIndex] = i; }
//if rule counter is less than zero, then return not found
if( nMaxSelRuleIndex < 0 ) { a_pdwNumRules = 0; return; } *a_ppPortRule = new WLBS_PORT_RULE[nMaxSelRuleIndex+1];
if( !*a_ppPortRule ) throw _com_error( WBEM_E_OUT_OF_MEMORY );
PWLBS_PORT_RULE pRule = *a_ppPortRule; for( i = 0; i <= (DWORD)nMaxSelRuleIndex; i++ ) { CopyMemory( pRule++, &AllPortRules[dwSelectedPortRules[i]], sizeof( WLBS_PORT_RULE ) ); }
*a_pdwNumRules = nMaxSelRuleIndex + 1; return; }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::RuleExists
//
// Purpose: This function checks for the existence of a rule that has start
// and end ports that match the input values.
//
////////////////////////////////////////////////////////////////////////////////
bool CWlbsClusterWrapper::RuleExists(DWORD a_dwVip, DWORD a_dwStartPort ) {
WLBS_REG_PARAMS WlbsParam; DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
WLBS_PORT_RULE PortRule; dwRes = WlbsGetPortRule( &WlbsParam, a_dwVip, a_dwStartPort, &PortRule );
if( dwRes == WLBS_NOT_FOUND ) return false;
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsGetPortRule );
if( PortRule.start_port == a_dwStartPort ) return true;
return false; }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::DeletePortRule
//
// Purpose: This function deletes the rule that contains the input port.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::DeletePortRule(DWORD a_dwVip, DWORD a_dwPort ) {
WLBS_REG_PARAMS WlbsParam;
DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg ); dwRes = WlbsDeletePortRule( &WlbsParam, a_dwVip, a_dwPort );
if( dwRes == WBEM_E_NOT_FOUND ) throw _com_error( WBEM_E_NOT_FOUND );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsDeletePortRule );
dwRes = CWlbsCluster::WriteConfig(&WlbsParam );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsWriteReg ); }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::PutPortRule
//
// Purpose: This function adds a rule.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::PutPortRule(const PWLBS_PORT_RULE a_pPortRule) {
WLBS_REG_PARAMS WlbsParam;
DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsParam );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
dwRes = WlbsAddPortRule( &WlbsParam, a_pPortRule );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsAddPortRule );
dwRes = CWlbsCluster::WriteConfig(&WlbsParam );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsWriteReg );
return; }
DWORD CWlbsClusterWrapper::GetClusterIpOrIndex(CWlbsControlWrapper* pControl) { return CWlbsCluster::GetClusterIpOrIndex(&pControl->m_WlbsControl); }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::GetHostID
//
// Purpose: Obtain ID of the local host.
//
////////////////////////////////////////////////////////////////////////////////
DWORD CWlbsClusterWrapper::GetHostID() { return CWlbsCluster::GetHostID(); /*
WLBS_RESPONSE WlbsResponse; DWORD dwResSize = 1;
//get the cluster and HostID
DWORD dwRes = WlbsQuery( CWlbsCluster::GetClusterIp(), WLBS_LOCAL_HOST, &WlbsResponse, &dwResSize, NULL, NULL );
//analyze query results for errors
switch( dwRes ) { case WLBS_OK: case WLBS_STOPPED: case WLBS_CONVERGING: case WLBS_CONVERGED: case WLBS_DEFAULT: case WLBS_DRAINING: case WLBS_SUSPENDED: break; default: throw CErrorWlbsControl( dwRes, CmdWlbsQuery ); }
return WlbsResponse.id; */ }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::SetNodeDefaults
//
// Purpose: This routine obtains the default configuration and sets the node
// setting properties to their defaults without affecting the other
// values.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::SetNodeDefaults() { WLBS_REG_PARAMS WlbsConfiguration; WLBS_REG_PARAMS WlbsDefaultConfiguration;
//get current configuration
DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
//get the default configuration
dwRes = WlbsSetDefaults(&WlbsDefaultConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsSetDefaults );
//modify current configuration with
//default configuration
WlbsConfiguration.host_priority = WlbsDefaultConfiguration.host_priority; WlbsConfiguration.alive_period = WlbsDefaultConfiguration.alive_period; WlbsConfiguration.alive_tolerance = WlbsDefaultConfiguration.alive_tolerance; WlbsConfiguration.cluster_mode = WlbsDefaultConfiguration.cluster_mode; WlbsConfiguration.rct_port = WlbsDefaultConfiguration.rct_port; WlbsConfiguration.mask_src_mac = WlbsDefaultConfiguration.mask_src_mac; WlbsConfiguration.dscr_per_alloc = WlbsDefaultConfiguration.dscr_per_alloc; WlbsConfiguration.max_dscr_allocs = WlbsDefaultConfiguration.max_dscr_allocs; WlbsConfiguration.num_actions = WlbsDefaultConfiguration.num_actions; WlbsConfiguration.num_packets = WlbsDefaultConfiguration.num_packets; WlbsConfiguration.num_send_msgs = WlbsDefaultConfiguration.num_send_msgs;
//set dedicated IP
wcsncpy ( WlbsConfiguration.ded_ip_addr, WlbsDefaultConfiguration.ded_ip_addr, WLBS_MAX_DED_IP_ADDR );
//set dedicated mask
wcsncpy ( WlbsConfiguration.ded_net_mask, WlbsDefaultConfiguration.ded_net_mask, WLBS_MAX_DED_NET_MASK );
//write the default configuration
dwRes = CWlbsCluster::WriteConfig(&WlbsConfiguration);
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsWriteReg );
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::SetClusterDefaults
//
// Purpose: This routine obtains the default configuration and sets the cluster
// setting properties to their defaults without affecting the other
// values.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::SetClusterDefaults() { WLBS_REG_PARAMS WlbsConfiguration; WLBS_REG_PARAMS WlbsDefaultConfiguration;
//get current configuration
DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
//get the default configuration
dwRes = WlbsSetDefaults(&WlbsDefaultConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsSetDefaults );
//modify current configuration
wcsncpy ( WlbsConfiguration.domain_name, WlbsDefaultConfiguration.domain_name, WLBS_MAX_DOMAIN_NAME );
wcsncpy ( WlbsConfiguration.cl_net_mask, WlbsDefaultConfiguration.cl_net_mask, WLBS_MAX_CL_NET_MASK );
wcsncpy ( WlbsConfiguration.cl_ip_addr , WlbsDefaultConfiguration.cl_ip_addr, WLBS_MAX_CL_IP_ADDR );
WlbsConfiguration.mcast_support = WlbsDefaultConfiguration.mcast_support; WlbsConfiguration.rct_enabled = WlbsDefaultConfiguration.rct_enabled; WlbsConfiguration.fIGMPSupport = WlbsDefaultConfiguration.fIGMPSupport; WlbsConfiguration.fIpToMCastIp = WlbsDefaultConfiguration.fIpToMCastIp; wcsncpy ( WlbsConfiguration.szMCastIpAddress , WlbsDefaultConfiguration.szMCastIpAddress, WLBS_MAX_CL_IP_ADDR );
// Copy over BDA values
WlbsConfiguration.bda_teaming.active = WlbsDefaultConfiguration.bda_teaming.active; if (WlbsConfiguration.bda_teaming.active) { wcsncpy ( WlbsConfiguration.bda_teaming.team_id, WlbsDefaultConfiguration.bda_teaming.team_id, WLBS_MAX_BDA_TEAM_ID );
WlbsConfiguration.bda_teaming.master = WlbsDefaultConfiguration.bda_teaming.master; WlbsConfiguration.bda_teaming.reverse_hash = WlbsDefaultConfiguration.bda_teaming.reverse_hash; }
//write the default configuration
dwRes = CWlbsCluster::WriteConfig(&WlbsConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsWriteReg ); }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbsClusterWrapper::SetPortRuleDefaults
//
// Purpose: This routine obtains the current NLB configuration and the default
// configuration. All of the port rules are removed in the current
// configuration and replaced by the default configuration.
//
// Note: The routine only uses WLBS API calls to replace the current port
// rule configuration with the default configuration. This is not
// the most efficient method, but it avoids making assumptions
// about the underlying data structure.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbsClusterWrapper::SetPortRuleDefaults() { WLBS_REG_PARAMS WlbsConfiguration; WLBS_REG_PARAMS WlbsDefaultConfiguration; WLBS_PORT_RULE PortRules[WLBS_MAX_RULES]; DWORD dwNumRules = WLBS_MAX_RULES;
//get current configuration
DWORD dwRes = CWlbsCluster::ReadConfig(&WlbsConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsReadReg );
//get the default configuration
dwRes = WlbsSetDefaults(&WlbsDefaultConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsSetDefaults );
//get the current port rules
dwRes = WlbsEnumPortRules( &WlbsConfiguration, PortRules, &dwNumRules );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsEnumPortRules );
//remove all of the current port rules
DWORD i = 0; for( i = 0; i < dwNumRules; i++ ) { //make sure that this works as expected i.e. the indexes must be valid
dwRes = WlbsDeletePortRule( &WlbsConfiguration, IpAddressFromAbcdWsz(PortRules[i].virtual_ip_addr), PortRules[i].start_port );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsDeletePortRule ); }
//get the default port rules
dwNumRules = WLBS_MAX_RULES;
dwRes = WlbsEnumPortRules( &WlbsDefaultConfiguration, PortRules, &dwNumRules );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsEnumPortRules );
//add the default port rules
for( i = 0; i < dwNumRules; i++ ) {
dwRes = WlbsAddPortRule( &WlbsConfiguration, &PortRules[i] );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsAddPortRule ); }
dwRes = CWlbsCluster::WriteConfig(&WlbsConfiguration );
if( dwRes != WLBS_OK ) throw CErrorWlbsControl( dwRes, CmdWlbsWriteReg );
return; }
|