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

1541 lines
36 KiB
C++

/*++
Copyright(c) 2001 Microsoft Corporation
Module Name:
NLB Manager
File Name:
tprov.cpp
Abstract:
Test harness for nlb manager provider code
History:
04/08/01 JosephJ Created
--*/
#include "tprov.h"
#include "tprov.tmh"
BOOL g_Silent = FALSE;
typedef enum
{
DO_USAGE,
DO_NICLIST,
DO_IPADDR,
DO_NLBCFG,
DO_NLBBIND,
DO_UPDATE,
DO_WMIUPDATE,
DO_CLEANREG
} COMMAND_TYPE;
VOID do_usage(VOID);
VOID do_niclist(VOID);
VOID do_ipaddr(VOID);
VOID do_nlbcfg(VOID);
VOID do_nlbbind(VOID);
VOID do_update(VOID);
VOID do_wmiupdate(VOID);
VOID do_cleanreg(VOID);
VOID test_add_ips(LPCWSTR szNic);
VOID test_bind_nlb(LPCWSTR szNic);
VOID test_cfg_nlb(LPCWSTR szNic);
VOID test_update(LPCWSTR szMachine, LPCWSTR szNic);
void test(int argc, WCHAR* argv[]);
void test(int argc, WCHAR* argv[]);
void test_safearray(void);
VOID test_exfcfgclass(void);
BOOL read_guid(LPWSTR *pszNic);
BOOL read_machinename(LPWSTR *pszNic);
COMMAND_TYPE
parse_args(int argc, WCHAR* argv[]);
void
display_config(
LPCWSTR szNicGuid,
NLB_EXTENDED_CLUSTER_CONFIGURATION *pCfg
);
VOID
display_ip_info(
IN UINT NumIpAddresses,
IN NLB_IP_ADDRESS_INFO *pIpInfo
);
WBEMSTATUS
read_ip_info(
IN LPCWSTR szNic,
OUT UINT *pNumIpAddresses,
OUT NLB_IP_ADDRESS_INFO **ppIpInfo
);
int __cdecl wmain(int argc, WCHAR* argv[], WCHAR* envp[])
{
int nRetCode = 0;
//
// Enable tracing
//
WPP_INIT_TRACING(L"Microsoft\\NLB\\TPROV");
#if 0
// test_port_rule_string();
// test_safearray();
// test_tmgr(argc, argv);
test_exfcfgclass();
#else
NlbConfigurationUpdate::Initialize();
test(argc, argv);
NlbConfigurationUpdate::Deinitialize();
#endif
//
// Disable tracing
//
WPP_CLEANUP();
return nRetCode;
}
NLB_EXTENDED_CLUSTER_CONFIGURATION MyOldCfg;
NLB_EXTENDED_CLUSTER_CONFIGURATION MyNewCfg;
VOID
display_log(WCHAR *pLog)
{
static UINT previous_length;
UINT current_length;
current_length = wcslen(pLog);
if (previous_length > current_length)
{
previous_length = 0;
}
wprintf(pLog+previous_length);
previous_length = current_length;
}
LPCWSTR NicGuids[] = {
L"{AD4DA14D-CAAE-42DD-97E3-5355E55247C2}",
L"{B2CD5533-5091-4F49-B80F-A07844B14209}",
L"{EBE09517-07B4-4E88-AAF1-E06F5540608B}",
L"{ABEA4318-5EE8-4DEC-AF3C-B4AEDE61454E}",
L"{66A1869A-BF85-4D95-BBAB-07FA5B4449D4}",
L"{AEEE83AF-AA48-4599-94BB-7C458D63CEED}",
L"{D0536EEE-2CE0-4E8D-BFEC-0A608CFD81B9}"
};
UINT Trial;
void test(int argc, WCHAR* argv[])
{
COMMAND_TYPE cmd;
cmd = parse_args(argc, argv);
switch(cmd)
{
case DO_USAGE: do_usage();
break;
case DO_NICLIST: do_niclist();
break;
case DO_IPADDR: do_ipaddr();
break;
case DO_NLBCFG: do_nlbcfg();
break;
case DO_NLBBIND: do_nlbbind();
break;
case DO_UPDATE: do_update();
break;
case DO_WMIUPDATE: do_wmiupdate();
break;
case DO_CLEANREG: do_cleanreg();
break;
}
return;
}
void
display_config(
LPCWSTR szNicGuid,
NLB_EXTENDED_CLUSTER_CONFIGURATION *pCfg
)
{
if (g_Silent) return;
printf("\nNLB Configuration for NIC %ws\n", szNicGuid);
printf("\tfValidNlbCfg=%d\n", pCfg->fValidNlbCfg);
printf("\tGeneration=%d\n", pCfg->Generation);
printf("\tfBound=%d\n", pCfg->fBound);
printf("\tfAddDedicatedIp=%d\n", pCfg->fAddDedicatedIp);
UINT AddrCount = pCfg->NumIpAddresses;
display_ip_info(AddrCount, pCfg->pIpAddressInfo);
if (pCfg->fBound)
{
printf("\n");
printf("\tNLB configuration:\n");
if (pCfg->fValidNlbCfg)
{
printf("\t\tClusterIP: {%ws,%ws}\n",
pCfg->NlbParams.cl_ip_addr,
pCfg->NlbParams.cl_net_mask
);
printf("\t\tDedicatedIP: {%ws,%ws}\n",
pCfg->NlbParams.ded_ip_addr,
pCfg->NlbParams.ded_net_mask
);
}
else
{
printf("**invalid configuration**\n");
}
}
printf("\n");
return;
}
VOID
test_add_ips(LPCWSTR szNic)
//
// Go through a set of IPs on this NIC
//
{
WBEMSTATUS Status = WBEM_NO_ERROR;
UINT NumIpAddresses= 0;
NLB_IP_ADDRESS_INFO *pIpInfo = NULL;
while(1)
{
//
// Get the current list of ip addresses
//
Status = CfgUtilGetIpAddressesAndFriendlyName(
szNic,
&NumIpAddresses,
&pIpInfo,
NULL // szFriendly name
);
if (FAILED(Status))
{
printf("Error 0x%08lx getting ip address list for %ws\n",
(UINT) Status, szNic);
pIpInfo = NULL;
goto end;
}
//
// display what we find.
//
display_ip_info(NumIpAddresses, pIpInfo);
if (pIpInfo!=NULL)
{
delete pIpInfo;
pIpInfo = NULL;
}
//
// Read the list ip address and subnet masks from the input
//
Status = read_ip_info(szNic, &NumIpAddresses, &pIpInfo);
if (FAILED(Status))
{
printf("Quitting test_add_ips\n");
break;
}
//
// Set the specified IPs
//
1 && (Status = CfgUtilSetStaticIpAddresses(
szNic,
NumIpAddresses,
pIpInfo
));
if (FAILED(Status))
{
printf("CfgUtilSetStaticIpAddresses failed with status 0x%08lx\n",
Status);
}
else
{
printf("Successfully set the specified IPs on the NIC\n");
}
}
end:
if (pIpInfo != NULL)
{
delete pIpInfo;
}
}
VOID
test_bind_nlb(LPCWSTR szNic)
{
WBEMSTATUS Status;
BOOL fBound = FALSE;
printf("\nRunning bind/unbind test for NIC %ws...\n\n", szNic);
while(1)
{
//
// Check NLB bind state
//
printf("Checking if NLB is bound...\n");
Status = CfgUtilCheckIfNlbBound(szNic, &fBound);
if (FAILED(Status))
{
printf("CfgUtilCheckIfNlbBound fails with error 0x%08lx\n", (UINT)Status);
break;
}
printf(
"NLB is %wsbound\n\n",
(fBound) ? L"" : L"NOT "
);
printf("Enter 'b' to bind, 'u' to unbind or 'q' to quit\n:");
WCHAR Temp[32] = L"";
while (wscanf(L" %1[buq]", Temp)!=1)
{
printf("Incorrect input. Try again.\n");
}
if (*Temp == 'b')
{
printf("Attempting to bind NLB...\n");
fBound = TRUE;
}
else if (*Temp == 'u')
{
printf("Attempting to unbind NLB\n");
fBound = FALSE;
}
else
{
printf("Quitting\n");
break;
}
#if 1
Status = CfgUtilChangeNlbBindState(szNic, fBound);
if (FAILED(Status))
{
printf("CfgUtilChangeNlbBindState fails with error %08lx\n",
(UINT) Status);
}
else
{
printf(
"%ws completed successfully\n",
(fBound) ? L"Bind" : L"Unbind"
);
}
#endif // 0
printf("\n");
}
}
VOID
test_cfg_nlb(LPCWSTR szNic)
{
WBEMSTATUS Status;
printf("\nRunning update NLB config test for NIC %ws...\n\n", szNic);
while (1)
{
WLBS_REG_PARAMS Params;
ZeroMemory(&Params, sizeof(Params));
//
// Read NLB config
//
Status = CfgUtilGetNlbConfig(szNic, &Params);
if (FAILED(Status))
{
printf("CfgUtilGetNlbConfig fails with error 0x%08lx\n", (UINT)Status);
break;
}
printf("NLB configuration:\n");
printf(
"\tClusterIP: {%ws,%ws}\n",
Params.cl_ip_addr,
Params.cl_net_mask
);
//
// Make some modifications
//
printf("\nEnter new {cluster-ip-addr,subnet-mask} or 'q' to quit\n:");
while(1)
{
NLB_IP_ADDRESS_INFO Info;
INT i = wscanf(
L" { %15[0-9.] , %15[0-9.] }",
Info.IpAddress,
Info.SubnetMask
);
if (i!=2)
{
WCHAR Temp[100] = L"";
wscanf(L"%64ws", Temp);
if (!_wcsicmp(Temp, L"q"))
{
printf("Quitting\n");
goto end;
}
else
{
printf("Badly formed input. Try again\n");
}
}
else
{
wcscpy(Params.cl_ip_addr, Info.IpAddress);
wcscpy(Params.cl_net_mask, Info.SubnetMask);
break;
}
}
//
// Write NLB config
//
#if 1
printf("\nAttempting to update NLB configuration...\n");
Status = CfgUtilSetNlbConfig(szNic, &Params);
if (FAILED(Status))
{
printf("CfgUtilSetNlbConfig fails with error %08lx\n",
(UINT) Status);
}
else
{
printf("change completed successfully\n");
}
#endif // 0
printf("\n");
}
end:
return;
}
VOID
test_update(
LPCWSTR szMachineName, // NULL == don't use wmi
LPCWSTR szNicGuid
)
{
WBEMSTATUS Status;
WCHAR *pLog = NULL;
WBEMSTATUS CompletionStatus;
UINT Generation;
printf("\nRunning high-level update NLB config test for NIC %ws...\n\n", szNicGuid);
while(1)
{
BOOL fSetDefaults = FALSE;
UINT NumIpAddresses = 0;
NLB_IP_ADDRESS_INFO *pIpInfo = NULL;
BOOL fUnbind = FALSE;
//
// Clean up config info
//
if (MyOldCfg.pIpAddressInfo!=NULL)
{
delete MyOldCfg.pIpAddressInfo;
}
ZeroMemory(&MyOldCfg, sizeof(MyOldCfg));
if (MyNewCfg.pIpAddressInfo!=NULL)
{
delete MyNewCfg.pIpAddressInfo;
}
ZeroMemory(&MyNewCfg, sizeof(MyNewCfg));
printf("TEST: Going to get configuration for NIC %ws\n", szNicGuid);
MyBreak(L"Break before calling GetConfiguration.\n");
if (szMachineName==NULL)
{
Status = NlbConfigurationUpdate::GetConfiguration(
szNicGuid,
&MyOldCfg
);
}
else
{
Status = NlbHostGetConfiguration(
szMachineName,
szNicGuid,
&MyOldCfg
);
}
if (FAILED(Status))
{
goto end;
}
display_config(szNicGuid, &MyOldCfg);
if (MyOldCfg.fBound)
{
printf("\nEnter 2 or more {cluster-ip-addr,subnet-mask} or none to unbind or 'q' to quit. The first entry is the dedicated-ip.\n");
if (!MyOldCfg.fValidNlbCfg)
{
//
// We're bound, but nlb params are bad. Set defaults.
//
fSetDefaults = TRUE;
}
}
else
{
//
// We're previously unbound. Set defaults.
//
fSetDefaults = TRUE;
printf("\nEnter 2 or more {cluster-ip-addr,subnet-mask} or 'q' to quit. The first entry is the dedicated-ip.\n");
}
while(1)
{
//
// Read the list ip address and subnet masks from the input
//
Status = read_ip_info(szNicGuid, &NumIpAddresses, &pIpInfo);
if (FAILED(Status))
{
printf("Quitting\n");
goto end;
}
if (NumIpAddresses < 2)
{
if (MyOldCfg.fBound)
{
if (NumIpAddresses == 0)
{
fUnbind = TRUE;
break;
}
else
{
printf("Wrong number of IP addresses -- enter either 0 or >= 2.\n");
}
}
else
{
printf("Wrong number of IP addresses. Enter >= 2 IP addresses.");
}
}
else
{
//
// >= 2 addresses. First one is the dip and the 2nd is the vip.
//
break;
}
if (pIpInfo != NULL)
{
delete pIpInfo;
pIpInfo = NULL;
}
}
if (fUnbind)
{
//
// We're to unbind.
//
ZeroMemory(&MyNewCfg, sizeof(MyNewCfg));
MyNewCfg.fValidNlbCfg = TRUE;
MyNewCfg.fBound = FALSE;
//
// Set the list of ip address to have present on unbind to
// be the dedicated ip address, if there is one, otherwise zero,
// in which case the adapter will be switched to DHCP after NLB
// is unbound
//
if (MyOldCfg.NlbParams.ded_ip_addr[0]!=0)
{
NLB_IP_ADDRESS_INFO *pIpInfo;
pIpInfo = new NLB_IP_ADDRESS_INFO;
if (pIpInfo == NULL)
{
printf("TEST: allocation failure; can't add IP on unbind.\n");
}
else
{
wcscpy(pIpInfo->IpAddress, MyOldCfg.NlbParams.ded_ip_addr);
wcscpy(pIpInfo->SubnetMask, MyOldCfg.NlbParams.ded_net_mask);
MyNewCfg.NumIpAddresses = 1;
MyNewCfg.pIpAddressInfo = pIpInfo;
}
}
}
else
{
if (fSetDefaults)
{
CfgUtilInitializeParams(&MyNewCfg.NlbParams);
MyNewCfg.fValidNlbCfg = TRUE;
MyNewCfg.fBound = TRUE;
}
else
{
MyNewCfg = MyOldCfg; // struct copy
ASSERT(MyNewCfg.fValidNlbCfg == TRUE);
ASSERT(MyNewCfg.fBound == TRUE);
}
//
// Now Add the dedicated and cluster IPs.
//
ASSERT(NumIpAddresses >= 2);
wcscpy(MyNewCfg.NlbParams.ded_ip_addr, pIpInfo[0].IpAddress);
wcscpy(MyNewCfg.NlbParams.ded_net_mask, pIpInfo[0].SubnetMask);
wcscpy(MyNewCfg.NlbParams.cl_ip_addr, pIpInfo[1].IpAddress);
wcscpy(MyNewCfg.NlbParams.cl_net_mask, pIpInfo[1].SubnetMask);
//
// If more IPs, we explicitly add the ip list, else leave it null.
//
if (NumIpAddresses > 2)
{
MyNewCfg.pIpAddressInfo = pIpInfo;
MyNewCfg.NumIpAddresses = NumIpAddresses;
}
else
{
MyNewCfg.fAddDedicatedIp = TRUE; // says to add dedicated ip.
MyNewCfg.pIpAddressInfo=NULL;
MyNewCfg.NumIpAddresses=0;
delete pIpInfo;
pIpInfo = NULL;
}
}
display_config(szNicGuid, &MyNewCfg);
printf("Going to update configuration for NIC %ws\n", szNicGuid);
MyBreak(L"Break before calling DoUpdate.\n");
if (szMachineName==NULL)
{
Status = NlbConfigurationUpdate::DoUpdate(
szNicGuid,
L"tprov.exe",
&MyNewCfg,
&Generation,
&pLog
);
}
else
{
Status = NlbHostDoUpdate(
szMachineName,
szNicGuid,
L"tprov.exe",
&MyNewCfg,
&Generation,
&pLog
);
}
if (pLog != NULL)
{
display_log(pLog);
delete pLog;
pLog = NULL;
}
if (Status == WBEM_S_PENDING)
{
printf(
"Waiting for pending operation %d...\n",
Generation
);
}
while (Status == WBEM_S_PENDING)
{
Sleep(1000);
if (szMachineName == NULL)
{
Status = NlbConfigurationUpdate::GetUpdateStatus(
szNicGuid,
Generation,
FALSE, // FALSE == Don't delete completion record
&CompletionStatus,
&pLog
);
}
else
{
Status = NlbHostGetUpdateStatus(
szMachineName,
szNicGuid,
Generation,
&CompletionStatus,
&pLog
);
}
if (pLog != NULL)
{
display_log(pLog);
delete pLog;
pLog = NULL;
}
if (!FAILED(Status))
{
Status = CompletionStatus;
}
}
printf(
"Final status of update %d is 0x%08lx\n",
Generation,
Status
);
}
end:
return;
}
VOID
display_ip_info(
IN UINT NumIpAddresses,
IN NLB_IP_ADDRESS_INFO *pIpInfo
)
{
UINT AddrCount = NumIpAddresses;
printf("\tNumIpAddresses=%d\n", AddrCount);
if (AddrCount != 0)
{
printf("\tAddress\t\tMask\n");
if (pIpInfo == NULL)
{
printf("ERROR: IpAddressInfo is NULL!\n");
goto end;
}
for (UINT u=0;u<AddrCount; u++)
{
printf(
"\t{%-15ws, %ws}\n",
pIpInfo[u].IpAddress,
pIpInfo[u].SubnetMask
);
}
}
end:
return;
}
WBEMSTATUS
read_ip_info(
IN LPCWSTR szNic,
OUT UINT *pNumIpAddresses,
OUT NLB_IP_ADDRESS_INFO **ppIpInfo
)
{
NLB_IP_ADDRESS_INFO *pIpInfo;
WBEMSTATUS Status = WBEM_NO_ERROR;
#define MAX_READ_IPS 10
printf("Enter zero or more {ip-address,subnet-mask} followed by '.'\n"
"(or 'q' to quit)\n:");
pIpInfo = new NLB_IP_ADDRESS_INFO[MAX_READ_IPS];
if (pIpInfo == NULL)
{
Status = WBEM_E_OUT_OF_MEMORY;
goto end;
}
for (UINT Index=0; Index<MAX_READ_IPS; Index++)
{
NLB_IP_ADDRESS_INFO *pInfo = pIpInfo+Index;
INT i = wscanf(
//L" { %15ws , %15ws }",
//L"{%15ws,%15ws}",
//L"{%ws,%ws}",
//L"{%[0-9.],%[0-9.]}",
L" { %15[0-9.] , %15[0-9.] }",
pInfo->IpAddress,
pInfo->SubnetMask
);
if (i!=2)
{
WCHAR Temp[100];
wscanf(L"%64ws", Temp);
if (!_wcsicmp(Temp, L"q"))
{
Status = WBEM_E_OUT_OF_MEMORY;
break;
}
else if (!_wcsicmp(Temp, L"."))
{
break;
}
else
{
printf("Badly formed input. Try again\n");
Index--;
}
}
}
*pNumIpAddresses = Index;
end:
if (FAILED(Status))
{
if (pIpInfo != NULL)
{
delete pIpInfo;
pIpInfo = NULL;
}
}
*ppIpInfo = pIpInfo;
return Status;
}
COMMAND_TYPE
parse_args(int argc, WCHAR* argv[])
/*++
tprov [niclist|ipaddr|nlbcfg|nlbbind]
--*/
{
COMMAND_TYPE ret = DO_USAGE;
if (argc!=2)
{
if (argc!=1)
{
printf("ERROR: wrong number of arguments\n");
}
goto end;
}
if (!wcscmp(argv[1], L"niclist"))
{
ret = DO_NICLIST;
}
else if (!wcscmp(argv[1], L"ipaddr"))
{
ret = DO_IPADDR;
}
else if (!wcscmp(argv[1], L"nlbcfg"))
{
ret = DO_NLBCFG;
}
else if (!wcscmp(argv[1], L"nlbbind"))
{
ret = DO_NLBBIND;
}
else if (!wcscmp(argv[1], L"update"))
{
ret = DO_UPDATE;
}
else if (!wcscmp(argv[1], L"wmiupdate"))
{
ret = DO_WMIUPDATE;
}
else if (!wcscmp(argv[1], L"cleanreg"))
{
ret = DO_CLEANREG;
}
else
{
printf("ERROR: unknown argument\n");
}
end:
return ret;
}
VOID
do_usage(VOID)
{
printf("Usage:\n\n\tprov [niclist|ipaddr|nlbbind|nlbcfg]\n");
printf("\tniclist -- display the list of NICs\n");
printf("\tipaddr -- change the static ip addresses on a NIC\n");
printf("\tnlbbind -- bind NLB to or unbind NLB from a NIC\n");
printf("\tnlbcfg -- change NLB configuration on a NIC\n");
printf("\tupdate -- update overall configuration on a NIC\n");
printf("\twmiupdate -- WMI version of the update\n");
printf("\n");
}
VOID do_niclist(VOID)
{
LPWSTR *pszNics = NULL;
UINT NumNics = 0;
UINT NumNlbBound = 0;
WBEMSTATUS Status = WBEM_E_CRITICAL_ERROR;
// printf("\n\tniclist is unimplemented.\n");
Status = CfgUtilsGetNlbCompatibleNics(&pszNics, &NumNics, &NumNlbBound);
if (FAILED(Status))
{
printf("CfgUtilsGetNlbCompatibleNics returns error 0x%08lx\n",
(UINT) Status);
pszNics = NULL;
goto end;
}
if (NumNics == 0)
{
printf("No compatible local adapter guids.\n");
}
else
{
printf("Local Adapter Guids (%lu bound to NLB):\n", NumNlbBound);
for (UINT u = 0; u<NumNics; u++)
{
LPCWSTR szNic = pszNics[u];
LPWSTR szFriendlyName = NULL;
UINT NumIpAddresses= 0;
NLB_IP_ADDRESS_INFO *pIpInfo = NULL;
//
// Get the current list of ip addresses
//
Status = CfgUtilGetIpAddressesAndFriendlyName(
szNic,
&NumIpAddresses,
&pIpInfo,
&szFriendlyName
);
if (FAILED(Status))
{
pIpInfo = NULL;
szFriendlyName = NULL;
// wprintf(L"%ws\t<null>\t<null>\n", szNic);
wprintf(L"Error getting ip addresses for %ws\n", szNic);
}
else
{
LPCWSTR szCIpAddress = L"";
LPCWSTR szCFriendlyName = L"";
if (NumIpAddresses>0)
{
szCIpAddress = pIpInfo[0].IpAddress;
}
if (szFriendlyName != NULL)
{
szCFriendlyName = szFriendlyName;
}
wprintf(
L"%ws %-15ws \"%ws\"\n",
szNic,
szCIpAddress,
szCFriendlyName
);
}
if (pIpInfo != NULL)
{
delete pIpInfo;
pIpInfo = NULL;
}
if (szFriendlyName != NULL)
{
delete szFriendlyName;
szFriendlyName = NULL;
}
}
}
end:
if (pszNics != NULL)
{
delete pszNics;
pszNics = NULL;
}
}
VOID do_ipaddr(VOID)
{
LPWSTR szNic = NULL;
if (!read_guid(&szNic))
{
szNic = NULL;
goto end;
}
test_add_ips(szNic);
end:
if (szNic!=NULL)
{
delete szNic;
}
}
VOID do_nlbcfg(VOID)
{
LPWSTR szNic = NULL;
if (!read_guid(&szNic))
{
szNic = NULL;
goto end;
}
test_cfg_nlb(szNic);
end:
if (szNic!=NULL)
{
delete szNic;
}
}
VOID do_nlbbind(VOID)
{
LPWSTR szNic = NULL;
if (!read_guid(&szNic))
{
szNic = NULL;
goto end;
}
test_bind_nlb(szNic);
end:
if (szNic!=NULL)
{
delete szNic;
}
}
VOID do_update(VOID)
{
LPWSTR szNic = NULL;
if (!read_guid(&szNic))
{
szNic = NULL;
goto end;
}
test_update(NULL, szNic); // NULL == don't use WMI
end:
if (szNic!=NULL)
{
delete szNic;
}
}
VOID do_wmiupdate(VOID)
{
LPWSTR szNic = NULL;
LPWSTR szMachineName = NULL;
if (!read_machinename(&szMachineName))
{
szMachineName = NULL;
goto end;
}
if (!read_guid(&szNic))
{
szNic = NULL;
goto end;
}
test_update(szMachineName, szNic); // TRUE == use WMI
end:
if (szNic!=NULL)
{
delete szNic;
}
if (szMachineName!=NULL)
{
delete szMachineName;
}
}
VOID do_cleanreg(VOID)
{
printf("Unimplemented\n");
}
BOOL read_guid(
LPWSTR *pszNic
)
{
BOOL fRet = FALSE;
#if 1
WCHAR rgTemp[256];
printf("\nEnter NIC GUID\n:");
while (wscanf(L" %40[-{}a-fA-F0-9]", rgTemp)!=1)
{
wscanf(L" %200s", rgTemp);
printf("Incorrect format. Please try again.\n");
}
#else
LPCWSTR rgTemp = L"{AD4DA14D-CAAE-42DD-97E3-5355E55247C2}";
#endif // 0
LPWSTR szNic = new WCHAR[wcslen(rgTemp)+1];
if (szNic != NULL)
{
wcscpy(szNic, rgTemp);
fRet = TRUE;
}
*pszNic = szNic;
return fRet;
}
BOOL read_machinename(
LPWSTR *pszMachineName
)
{
BOOL fRet = FALSE;
#if 0
WCHAR rgTemp[256];
printf("\nEnter Machine Name (or '.' for local)\n:");
while (wscanf(L" %[a-zA-Z0-9._-]", rgTemp)!=1)
{
wscanf(L" %200s", rgTemp);
printf("Incorrect format. Please try again.\n");
}
if (!wcscmp(rgTemp, L"."))
{
// convert "." to ""
*rgTemp=0;
}
#else
LPCWSTR rgTemp = L"JOSEPHJ4E";
#endif
LPWSTR szMachineName = new WCHAR[wcslen(rgTemp)+1];
if (szMachineName != NULL)
{
wcscpy(szMachineName, rgTemp);
fRet = TRUE;
}
*pszMachineName = szMachineName;
return fRet;
}
void test_safearray(void)
{
SAFEARRAY *pSA;
LPCWSTR pInStrings[] =
{
L"String1",
#if 1
L"String2",
L"String3",
#endif // 0
NULL // must be last.
};
LPWSTR *pOutStrings;
UINT NumInStrings=0;
UINT NumOutStrings=0;
WBEMSTATUS Status;
//
// Find count of strings...
//
for (NumInStrings=0; pInStrings[NumInStrings]!=NULL; NumInStrings++)
{
;
}
Status = CfgUtilSafeArrayFromStrings(
pInStrings,
NumInStrings,
&pSA
);
if (FAILED(Status))
{
printf("CfgUtilSafeArrayFromStrings failed with error 0x%08lx\n", (UINT)Status);
pSA = NULL;
goto end;
}
Status = CfgUtilStringsFromSafeArray(
pSA,
&pOutStrings,
&NumOutStrings
);
if (FAILED(Status))
{
printf("CfgUtilStringsFromSafeArray failed with error 0x%08lx\n", (UINT)Status);
pOutStrings = NULL;
goto end;
}
//
// Check that they match
//
if (NumOutStrings != NumInStrings)
{
printf("ERROR: NumOutStrings != NumInStrings.\n");
goto end;
}
for (UINT u=0; u < NumInStrings; u++)
{
if (wcscmp(pInStrings[u], pOutStrings[u]))
{
printf("MISMATCH: %ws->%ws\n", pInStrings[u], pOutStrings[u]);
}
else
{
printf("MATCH: %ws->%ws\n", pInStrings[u], pOutStrings[u]);
}
}
end:
if (pSA!=NULL)
{
SafeArrayDestroy(pSA);
pSA = NULL;
}
if (pOutStrings!=NULL)
{
delete pOutStrings;
pOutStrings = NULL;
}
return;
}
VOID test_exfcfgclass(void)
/*
tests some of the methods of class NLB_EXTENDED_CLUSTER_CONFIGURATION
1. Initialize Cfg
2. Set a bunch of fields
3. display Cfg
4. Get and set a bunch of fields on new
5. display cfg
*/
{
typedef enum
{
DO_STRINGS,
DO_SAFEARRAY,
DO_STRINGPAIR,
DO_END
} TEST_COMMAND;
TEST_COMMAND cmd;
printf("Test of NLB_EXTENDED_CLUSTER_CONFIGURATION methods...\n");
UINT u1=100000L;
while(u1--> 0)
{
g_Silent = TRUE;
for (cmd=DO_STRINGS; cmd<DO_END; cmd=(TEST_COMMAND)((UINT)cmd + 1))
{
NLB_EXTENDED_CLUSTER_CONFIGURATION Cfg;
NLB_EXTENDED_CLUSTER_CONFIGURATION NewCfg;
WBEMSTATUS Status = WBEM_NO_ERROR;
CfgUtilInitializeParams(&Cfg.NlbParams);
CfgUtilInitializeParams(&NewCfg.NlbParams);
//
// Set a bunch of fields in Cfg
//
{
#define TPROV_NUM_ADDRESSES 2
#define TPROV_NUM_PORTS 1
LPCWSTR rgszNetworkAddresses[TPROV_NUM_ADDRESSES] = {
L"10.0.0.1/255.0.0.0",
L"10.0.0.2/255.0.0.0"
};
LPCWSTR rgszIpAddresses[TPROV_NUM_ADDRESSES] = {
L"10.0.0.1",
L"10.0.0.2"
};
LPCWSTR rgszSubnetMasks[TPROV_NUM_ADDRESSES] = {
L"255.255.255.0",
L"255.255.0.0"
};
LPCWSTR rgszPortRules[TPROV_NUM_PORTS] = {
L"ip=1.1.1.1 protocol=TCP start=80 end=288 mode=SINGLE"
};
UINT NumOldNetworkAddresses = TPROV_NUM_ADDRESSES;
UINT NumOldPortRules=TPROV_NUM_PORTS;
Cfg.fValidNlbCfg = TRUE;
Cfg.Generation = 123;
Cfg.fBound = TRUE;
if (cmd == DO_STRINGS)
{
Status = Cfg.SetNetworkAddresses(
rgszNetworkAddresses,
NumOldNetworkAddresses
);
}
else if (cmd == DO_SAFEARRAY)
{
SAFEARRAY *pOldSA = NULL;
Status = CfgUtilSafeArrayFromStrings(
rgszNetworkAddresses,
NumOldNetworkAddresses,
&pOldSA
);
if (FAILED(Status))
{
printf("ERROR: couldn't create safe array!\n");
pOldSA = NULL;
}
if (pOldSA != NULL)
{
Status = Cfg.SetNetworkAddressesSafeArray(pOldSA);
SafeArrayDestroy(pOldSA);
pOldSA = NULL;
}
}
else if (cmd = DO_STRINGPAIR)
{
Status = Cfg.SetNetworkAddresPairs(
rgszIpAddresses,
rgszSubnetMasks,
NumOldNetworkAddresses
);
}
Status = Cfg.SetPortRules(rgszPortRules, NumOldPortRules);
Cfg.SetClusterNetworkAddress(L"10.0.0.11/255.0.0.0");
Cfg.SetDedicatedNetworkAddress(L"10.0.0.1/255.0.0.0");
Cfg.SetTrafficMode(
NLB_EXTENDED_CLUSTER_CONFIGURATION::TRAFFIC_MODE_UNICAST
);
Cfg.SetHostPriority(10);
Cfg.SetClusterModeOnStart(
NLB_EXTENDED_CLUSTER_CONFIGURATION::START_MODE_STOPPED
);
Cfg.SetRemoteControlEnabled(TRUE);
Cfg.fValidNlbCfg = TRUE;
}
display_config(L"<dummy nic:old>", &Cfg);
//
// Get all the fields and push it into NewCfg;
//
{
UINT NumNetworkAddresses = 0;
UINT NumPortRules=0;
LPWSTR *pszNetworkAddresses=NULL;
LPWSTR *pszIpAddresses=NULL;
LPWSTR *pszSubnetMasks=NULL;
LPWSTR *pszPortRules=NULL;
LPWSTR szClusterAddress = NULL;
LPWSTR szDedicatedAddress = NULL;
UINT Generation=0;
BOOL NlbBound=FALSE;
BOOL ValidNlbConfig=FALSE;
SAFEARRAY *pSA = NULL;
NLB_EXTENDED_CLUSTER_CONFIGURATION::TRAFFIC_MODE
TrafficMode=NLB_EXTENDED_CLUSTER_CONFIGURATION::TRAFFIC_MODE_UNICAST;
NLB_EXTENDED_CLUSTER_CONFIGURATION::START_MODE
StartMode=NLB_EXTENDED_CLUSTER_CONFIGURATION::START_MODE_STOPPED;
UINT HostPriority=0;
BOOL RemoteControlEnabled=FALSE;
//
// GET
//
Generation = Cfg.GetGeneration();
NlbBound = Cfg.IsNlbBound();
ValidNlbConfig = Cfg.IsValidNlbConfig();
if (cmd == DO_STRINGS)
{
Status = Cfg.GetNetworkAddresses(
&pszNetworkAddresses,
&NumNetworkAddresses
);
}
else if (cmd == DO_SAFEARRAY)
{
Status = Cfg.GetNetworkAddressesSafeArray(&pSA);
if (FAILED(Status))
{
pSA = NULL;
}
}
else if (cmd = DO_STRINGPAIR)
{
Status = Cfg.GetNetworkAddressPairs(
&pszIpAddresses, // free using delete
&pszSubnetMasks, // free using delete
&NumNetworkAddresses
);
}
Status = Cfg.GetPortRules(&pszPortRules, &NumPortRules);
Status = Cfg.GetClusterNetworkAddress(&szClusterAddress);
Status = Cfg.GetDedicatedNetworkAddress(&szDedicatedAddress);
TrafficMode = Cfg.GetTrafficMode();
HostPriority = Cfg.GetHostPriority();
StartMode = Cfg.GetClusterModeOnStart();
RemoteControlEnabled = Cfg.GetRemoteControlEnabled();
//
// SET
//
NewCfg.fValidNlbCfg = ValidNlbConfig;
NewCfg.Generation = Generation;
NewCfg.fBound = NlbBound;
if (cmd == DO_STRINGS)
{
Status = NewCfg.SetNetworkAddresses(
(LPCWSTR*) pszNetworkAddresses,
NumNetworkAddresses
);
}
else if (cmd == DO_SAFEARRAY)
{
if (pSA != NULL)
{
Status = NewCfg.SetNetworkAddressesSafeArray(pSA);
SafeArrayDestroy(pSA);
pSA = NULL;
}
}
else if (cmd = DO_STRINGPAIR)
{
Status = NewCfg.SetNetworkAddresPairs(
(LPCWSTR*) pszIpAddresses,
(LPCWSTR*) pszSubnetMasks,
NumNetworkAddresses
);
}
Status = NewCfg.SetPortRules((LPCWSTR*)pszPortRules, NumPortRules);
NewCfg.SetClusterNetworkAddress(szClusterAddress);
NewCfg.SetDedicatedNetworkAddress(szDedicatedAddress);
NewCfg.SetTrafficMode(TrafficMode);
NewCfg.SetHostPriority(HostPriority);
NewCfg.SetClusterModeOnStart(StartMode);
NewCfg.SetRemoteControlEnabled(RemoteControlEnabled);
delete (pszNetworkAddresses);
delete (pszIpAddresses);
delete (pszSubnetMasks);
delete (pszPortRules);
delete (szClusterAddress);
delete (szDedicatedAddress);
}
display_config(L"<dummy nic:new>", &NewCfg);
}
}
printf("... end test\n");
}