windows-nt/Source/XPSP1/NT/admin/cys/win32/clusterinstallationunit.cpp
2020-09-26 16:20:57 +08:00

193 lines
4.1 KiB
C++

// Copyright (c) 1997-2001 Microsoft Corporation
//
// File: ClusterInstallationUnit.cpp
//
// Synopsis: Defines a ClusterInstallationUnit
// This object has the knowledge for installing the
// clustering service
//
// History: 02/09/2001 JeffJon Created
#include "pch.h"
#include "resource.h"
#include "ClusterInstallationUnit.h"
#include <clusapi.h>
// Finish page help
static PCWSTR CYS_CLUSTER_FINISH_PAGE_HELP = L"cys.chm::/cys_configuring_cluster_server.htm";
ClusterInstallationUnit::ClusterInstallationUnit() :
makeNewCluster(true),
InstallationUnit(
IDS_CLUSTER_SERVER_TYPE,
IDS_CLUSTER_SERVER_DESCRIPTION,
CYS_CLUSTER_FINISH_PAGE_HELP,
CLUSTERSERVER_INSTALL)
{
LOG_CTOR(ClusterInstallationUnit);
}
ClusterInstallationUnit::~ClusterInstallationUnit()
{
LOG_DTOR(ClusterInstallationUnit);
}
InstallationReturnType
ClusterInstallationUnit::InstallService(HANDLE logfileHandle, HWND /*hwnd*/)
{
LOG_FUNCTION(ClusterInstallationUnit::InstallService);
InstallationReturnType result = INSTALL_SUCCESS;
// Log heading
CYS_APPEND_LOG(String::load(IDS_LOG_CLUSTER_HEADING));
String commandLine;
// Build the command line
if (MakeNewCluster())
{
commandLine = L"cluster /Create /Wizard";
}
else
{
commandLine = L"cluster /Add /Wizard";
}
// Run the wizard
DWORD exitCode = 0;
HRESULT hr = CreateAndWaitForProcess(commandLine, exitCode);
if (FAILED(hr))
{
// Failed to launch the wizard
LOG(String::format(
L"Failed to launch cluster wizard: hr = 0x%1!x!",
hr));
if (MakeNewCluster())
{
CYS_APPEND_LOG(String::load(IDS_CLUSTER_LOG_LAUNCH_FAILED_NEW_CLUSTER));
}
else
{
CYS_APPEND_LOG(String::load(IDS_CLUSTER_LOG_LAUNCH_FAILED_ADD_NODE));
}
result = INSTALL_FAILURE;
}
else if (SUCCEEDED(hr) &&
exitCode == 0)
{
// Wizard was launched and completed successfully
LOG(L"Cluster wizard launched and completed successfully");
if (MakeNewCluster())
{
CYS_APPEND_LOG(String::load(IDS_CLUSTER_LOG_SUCCESS_NEW_CLUSTER));
}
else
{
CYS_APPEND_LOG(String::load(IDS_CLUSTER_LOG_SUCCESS_ADD_NODE));
}
result = INSTALL_FAILURE;
}
else // if (SUCCEEDED(hr) && exitCode == ????<some exit code for cancelled>???
{
// Wizard was cancelled by the user
LOG(L"Cluster wizard cancelled by user");
if (MakeNewCluster())
{
CYS_APPEND_LOG(String::load(IDS_CLUSTER_LOG_CANCELLED_NEW_CLUSTER));
}
else
{
CYS_APPEND_LOG(String::load(IDS_CLUSTER_LOG_CANCELLED_ADD_NODE));
}
result = INSTALL_FAILURE;
}
LOG_INSTALL_RETURN(result);
return result;
}
bool
ClusterInstallationUnit::IsServiceInstalled()
{
LOG_FUNCTION(ClusterInstallationUnit::IsServiceInstalled);
bool result = false;
DWORD clusterState = 0;
DWORD err = ::GetNodeClusterState(0, &clusterState);
if (err == ERROR_SUCCESS &&
clusterState != ClusterStateNotConfigured)
{
result = true;
}
else
{
LOG(String::format(
L"GetNodeClusterState returned err = %1!x!",
err));
}
LOG_BOOL(result);
return result;
}
bool
ClusterInstallationUnit::GetFinishText(String& message)
{
LOG_FUNCTION(ClusterInstallationUnit::GetFinishText);
if (MakeNewCluster())
{
message = String::load(IDS_CLUSTER_FINISH_TEXT_NEW_CLUSTER);
}
else
{
message = String::load(IDS_CLUSTER_FINISH_TEXT_EXISTING_CLUSTER);
}
LOG_BOOL(true);
return true;
}
String
ClusterInstallationUnit::GetServiceDescription()
{
LOG_FUNCTION(ClusterInstallationUnit::GetServiceDescription);
unsigned int descriptionID = IDS_CLUSTER_SERVER_DESCRIPTION;
if (IsServiceInstalled())
{
descriptionID = IDS_CLUSTER_SERVER_DESCRIPTION_INSTALLED;
}
return String::load(descriptionID);
}
bool
ClusterInstallationUnit::MakeNewCluster() const
{
LOG_FUNCTION(ClusterInstallationUnit::MakeNewCluster);
return makeNewCluster;
}