639 lines
16 KiB
C++
639 lines
16 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1999-2002 Microsoft Corporation
|
|
//
|
|
// Module Name: CClusterNode.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of CClusterNode class
|
|
//
|
|
// Author:
|
|
// Henry Wang (HenryWa) 24-AUG-1999
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Pch.h"
|
|
#include "ClusterNode.h"
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterNode
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::CClusterNode
|
|
//
|
|
// Description:
|
|
// Constructor
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CClusterNode::CClusterNode(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn
|
|
)
|
|
: CProvBase( pwszNameIn, pNamespaceIn )
|
|
{
|
|
|
|
} //*** CClusterNode::CClusterNode()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CClusterNode::S_CreateThis
|
|
//
|
|
// Description:
|
|
// Create a cluster node object.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// Pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterNode::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD // dwEnumTypeIn
|
|
)
|
|
{
|
|
return new CClusterNode( pwszNameIn, pNamespaceIn );
|
|
|
|
} //*** CClusterNode::S_CreateThis()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::RgGetPropMap
|
|
//
|
|
// Description:
|
|
// Retrieve the property mapping table of the cluster node.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// Reference to the array of property maping table
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
const SPropMapEntryArray *
|
|
CClusterNode::RgGetPropMap( void )
|
|
{
|
|
|
|
static SPropMapEntry s_rgpm[] =
|
|
{
|
|
{
|
|
PVD_PROP_NAME,
|
|
CLUSREG_NAME_NODE_NAME,
|
|
SZ_TYPE,
|
|
READONLY
|
|
}
|
|
};
|
|
|
|
static SPropMapEntryArray s_pmea(
|
|
sizeof( s_rgpm ) / sizeof( SPropMapEntry ),
|
|
s_rgpm
|
|
);
|
|
|
|
return & s_pmea;
|
|
|
|
} //*** CClusterNode::RgGetPropMap()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::EnumInstance
|
|
//
|
|
// Description:
|
|
// enum cluster instance
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterNode::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFENODE shNode;
|
|
LPCWSTR pwszNode;
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
CClusterEnum cluEnum(
|
|
shCluster,
|
|
CLUSTER_ENUM_NODE );
|
|
|
|
|
|
while ( ( pwszNode = cluEnum.GetNext() ) != NULL )
|
|
{
|
|
shNode = OpenClusterNode( shCluster, pwszNode );
|
|
|
|
ClusterToWMI( shNode, pHandlerIn );
|
|
|
|
} // while: more nodes
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterNode::EnumInstance()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterResource::ClusterToWMI
|
|
//
|
|
// Description:
|
|
// Translate a cluster resource objects to WMI object.
|
|
//
|
|
// Arguments:
|
|
// hNodeIn -- Handle to node
|
|
// pHandlerIn -- Pointer to WMI sink
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
// Win32 error
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
void
|
|
CClusterNode::ClusterToWMI(
|
|
HNODE hNodeIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
static SGetControl s_rgControl[] =
|
|
{
|
|
{ CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES, FALSE },
|
|
{ CLUSCTL_NODE_GET_COMMON_PROPERTIES, FALSE },
|
|
{ CLUSCTL_NODE_GET_RO_PRIVATE_PROPERTIES, TRUE },
|
|
{ CLUSCTL_NODE_GET_PRIVATE_PROPERTIES, TRUE }
|
|
};
|
|
static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
|
|
|
|
CWbemClassObject wco;
|
|
CError er;
|
|
UINT idx;
|
|
|
|
m_pClass->SpawnInstance( 0, & wco );
|
|
for ( idx = 0 ; idx < s_cControl; idx ++ )
|
|
{
|
|
CClusPropList pl;
|
|
er = pl.ScGetNodeProperties(
|
|
hNodeIn,
|
|
s_rgControl[ idx ].dwControl,
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
CClusterApi::GetObjectProperties(
|
|
RgGetPropMap(),
|
|
pl,
|
|
wco,
|
|
s_rgControl[ idx ].fPrivate
|
|
);
|
|
|
|
} // for: each control code
|
|
|
|
{
|
|
DWORD dwState = GetClusterNodeState( hNodeIn );
|
|
|
|
wco.SetProperty( dwState, PVD_PROP_STATE );
|
|
}
|
|
|
|
//
|
|
// flags and characteristics
|
|
//
|
|
{
|
|
DWORD cbReturned;
|
|
DWORD dwOut;
|
|
|
|
er = ClusterNodeControl(
|
|
hNodeIn,
|
|
NULL,
|
|
CLUSCTL_NODE_GET_CHARACTERISTICS,
|
|
NULL,
|
|
0,
|
|
& dwOut,
|
|
sizeof( DWORD ),
|
|
& cbReturned
|
|
);
|
|
wco.SetProperty( dwOut, PVD_PROP_CHARACTERISTIC );
|
|
|
|
er = ClusterNodeControl(
|
|
hNodeIn,
|
|
NULL,
|
|
CLUSCTL_NODE_GET_FLAGS,
|
|
NULL,
|
|
0,
|
|
& dwOut,
|
|
sizeof( DWORD ),
|
|
& cbReturned
|
|
);
|
|
wco.SetProperty( dwOut, PVD_PROP_FLAGS );
|
|
}
|
|
|
|
pHandlerIn->Indicate( 1, & wco );
|
|
return;
|
|
|
|
} //*** CClusterResource::ClusterToWMI()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::GetObject
|
|
//
|
|
// Description:
|
|
// retrieve cluster node object based given object path
|
|
//
|
|
// Arguments:
|
|
// rObjPathIn -- Object path to cluster object
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
// win32 error
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterNode::GetObject(
|
|
CObjPath & rObjPathIn,
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
SAFENODE shNode;
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
shNode = OpenClusterNode(
|
|
shCluster,
|
|
rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME )
|
|
);
|
|
|
|
ClusterToWMI( shNode, pHandlerIn );
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterNode::GetObject()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::ExecuteMethod
|
|
// )
|
|
//
|
|
// Description:
|
|
// execute methods defined in the mof for cluster node
|
|
//
|
|
// Arguments:
|
|
// rObjPathIn -- Object path to cluster object
|
|
// pwszMethodNameIn -- Name of the method to be invoked
|
|
// lFlagIn -- WMI flag
|
|
// pParamsIn -- Input parameters for the method
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_E_NOT_SUPPORTED
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterNode::ExecuteMethod(
|
|
CObjPath & rObjPathIn,
|
|
WCHAR * pwszMethodNameIn,
|
|
long lFlagIn,
|
|
IWbemClassObject * pParamsIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
|
|
} //*** CClusterNode::ExecuteMethod()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::PutInstance
|
|
//
|
|
// Description:
|
|
// save this instance
|
|
//
|
|
// Arguments:
|
|
// rInstToPutIn -- WMI object to be saved
|
|
// lFlagIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterNode::PutInstance(
|
|
CWbemClassObject & rInstToPutIn,
|
|
long lFlagIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
static SGetSetControl s_rgControl[] =
|
|
{
|
|
{
|
|
CLUSCTL_NODE_GET_COMMON_PROPERTIES,
|
|
CLUSCTL_NODE_SET_COMMON_PROPERTIES,
|
|
FALSE
|
|
},
|
|
{
|
|
CLUSCTL_NODE_GET_PRIVATE_PROPERTIES,
|
|
CLUSCTL_NODE_SET_PRIVATE_PROPERTIES,
|
|
TRUE
|
|
}
|
|
};
|
|
static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
|
|
|
|
_bstr_t bstrName;
|
|
SAFECLUSTER shCluster;
|
|
SAFENODE shNode;
|
|
CError er;
|
|
UINT idx;
|
|
|
|
rInstToPutIn.GetProperty( bstrName, PVD_PROP_NAME );
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
shNode = OpenClusterNode( shCluster, bstrName );
|
|
|
|
for ( idx = 0 ; idx < s_cControl ; idx ++ )
|
|
{
|
|
CClusPropList plOld;
|
|
CClusPropList plNew;
|
|
|
|
er = plOld.ScGetNodeProperties(
|
|
shNode,
|
|
s_rgControl[ idx ].dwGetControl,
|
|
NULL,
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
CClusterApi::SetObjectProperties(
|
|
RgGetPropMap(),
|
|
plNew,
|
|
plOld,
|
|
rInstToPutIn,
|
|
s_rgControl[ idx ].fPrivate
|
|
);
|
|
|
|
if ( plNew.Cprops() > 0 )
|
|
{
|
|
er = ClusterNodeControl(
|
|
shNode,
|
|
NULL,
|
|
s_rgControl[ idx ].dwSetControl,
|
|
plNew.PbPropList(),
|
|
static_cast< DWORD >( plNew.CbPropList() ),
|
|
NULL,
|
|
0,
|
|
NULL
|
|
);
|
|
}
|
|
} // for: each control code
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterNode::PutInstance()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterNode::DeleteInstance
|
|
//
|
|
// Description:
|
|
// Delete the object specified in rObjPathIn.
|
|
//
|
|
// Arguments:
|
|
// rObjPathIn -- ObjPath for the instance to be deleted
|
|
// lFlagIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_E_NOT_SUPPORTED
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterNode::DeleteInstance(
|
|
CObjPath & rObjPathIn,
|
|
long lFlagIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
|
|
} //*** CClusterNode::DeleteInstance()
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterNodeNetInterface
|
|
//
|
|
//****************************************************************************
|
|
|
|
CClusterNodeNetInterface::CClusterNodeNetInterface(
|
|
const WCHAR * pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
: CClusterObjAssoc( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
|
|
{
|
|
|
|
} //*** ClusterNodeNetInterface::ClusterNodeNetInterface()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// ClusterNodeNetInterface::S_CreateThis
|
|
//
|
|
// Description:
|
|
// Create a cluster Node Network Interface object.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Str type id
|
|
//
|
|
// Return Values:
|
|
// pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterNodeNetInterface::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
{
|
|
return new CClusterNodeNetInterface(
|
|
pwszNameIn,
|
|
pNamespaceIn,
|
|
dwEnumTypeIn
|
|
);
|
|
|
|
} //*** ClusterNodeNetInterface::S_CreateThis()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// ClusterNodeNetInterface::EnumInstance
|
|
//
|
|
// Description:
|
|
// Enumerate net interfaces for the node.
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn --
|
|
// pCtxIn --
|
|
// pHandlerIn --
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterNodeNetInterface::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
CError er;
|
|
DWORD dwError;
|
|
CWbemClassObject wcoGroup;
|
|
_bstr_t bstrGroup;
|
|
_bstr_t bstrPart;
|
|
DWORD cbName = MAX_PATH;
|
|
CWstrBuf wsbName;
|
|
CComPtr< IEnumWbemClassObject > pEnum;
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
|
|
m_wcoGroup.SpawnInstance( 0, & wcoGroup );
|
|
|
|
//
|
|
// network interface objects
|
|
//
|
|
|
|
er = m_pNamespace->CreateInstanceEnum(
|
|
_bstr_t( PVD_CLASS_NETWORKINTERFACE ),
|
|
0,
|
|
NULL,
|
|
& pEnum
|
|
);
|
|
|
|
wsbName.SetSize( cbName );
|
|
|
|
for( ; ; )
|
|
{
|
|
CWbemClassObject wcoNetInterface;
|
|
DWORD cWco;
|
|
|
|
hr = pEnum->Next(
|
|
5000,
|
|
1,
|
|
& wcoNetInterface,
|
|
& cWco
|
|
);
|
|
if ( hr == WBEM_S_NO_ERROR )
|
|
{
|
|
SAFENETINTERFACE shNetInterface;
|
|
DWORD cbReturn;
|
|
CWbemClassObject wco;
|
|
|
|
wcoNetInterface.GetProperty( bstrPart, PVD_WBEM_PROP_DEVICEID );
|
|
shNetInterface = OpenClusterNetInterface( shCluster, bstrPart );
|
|
dwError = ClusterNetInterfaceControl(
|
|
shNetInterface,
|
|
NULL,
|
|
CLUSCTL_NETINTERFACE_GET_NODE,
|
|
NULL,
|
|
0,
|
|
wsbName,
|
|
cbName,
|
|
& cbReturn
|
|
);
|
|
if ( dwError == ERROR_MORE_DATA )
|
|
{
|
|
cbName = cbReturn;
|
|
wsbName.SetSize( cbName );
|
|
er = ClusterNetInterfaceControl(
|
|
shNetInterface,
|
|
NULL,
|
|
CLUSCTL_NETINTERFACE_GET_NODE,
|
|
NULL,
|
|
0,
|
|
wsbName,
|
|
cbName,
|
|
& cbReturn
|
|
);
|
|
} // if: more data
|
|
|
|
wcoGroup.SetProperty( wsbName, PVD_PROP_NAME );
|
|
wcoGroup.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
|
|
|
|
wcoNetInterface.GetProperty( bstrPart, PVD_WBEM_RELPATH );
|
|
m_pClass->SpawnInstance( 0, & wco );
|
|
wco.SetProperty( (LPWSTR) bstrGroup, PVD_PROP_GROUPCOMPONENT );
|
|
wco.SetProperty( (LPWSTR ) bstrPart, PVD_PROP_PARTCOMPONENT );
|
|
er = pHandlerIn->Indicate( 1, & wco );
|
|
|
|
} // if: success
|
|
else
|
|
{
|
|
break;
|
|
} // else: E_XXX, or S_FALSE
|
|
|
|
} // forever
|
|
|
|
if ( FAILED ( hr ) )
|
|
{
|
|
throw CProvException( hr );
|
|
}
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** ClusterNodeNetInterface::EnumInstance()
|