Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

475 lines
12 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ClusterService.cpp
  7. //
  8. // Description:
  9. // Implementation of CClusterService class
  10. //
  11. // Author:
  12. // Henry Wang (HenryWa) 24-AUG-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ClusterService.h"
  17. //****************************************************************************
  18. //
  19. // CClusterService
  20. //
  21. //****************************************************************************
  22. //////////////////////////////////////////////////////////////////////////////
  23. //++
  24. //
  25. // CClusterService::CClusterService
  26. //
  27. // Description:
  28. // Constructor.
  29. //
  30. // Arguments:
  31. // pwszNameIn -- Class name
  32. // pNamespaceIn -- Namespace
  33. //
  34. // Return Values:
  35. // None.
  36. //
  37. //--
  38. //////////////////////////////////////////////////////////////////////////////
  39. CClusterService::CClusterService(
  40. LPCWSTR pwszNameIn,
  41. CWbemServices * pNamespaceIn
  42. )
  43. : CProvBase( pwszNameIn, pNamespaceIn )
  44. {
  45. } //*** CClusterService::CClusterService()
  46. //////////////////////////////////////////////////////////////////////////////
  47. //++
  48. //
  49. // static
  50. // CClusterService::S_CreateThis
  51. //
  52. // Description:
  53. // Create a cluster node object
  54. //
  55. // Arguments:
  56. // pwszNameIn -- Class name
  57. // pNamespaceIn -- Namespace
  58. // dwEnumTypeIn -- Type id
  59. //
  60. // Return Values:
  61. // pointer to the CProvBase
  62. //
  63. //--
  64. //////////////////////////////////////////////////////////////////////////////
  65. CProvBase *
  66. CClusterService::S_CreateThis(
  67. LPCWSTR pwszNameIn,
  68. CWbemServices * pNamespaceIn,
  69. DWORD // dwEnumTypeIn
  70. )
  71. {
  72. return new CClusterService( pwszNameIn, pNamespaceIn );
  73. } //*** CClusterService::S_CreateThis()
  74. //////////////////////////////////////////////////////////////////////////////
  75. //++
  76. //
  77. // CClusterService::RgGetPropMap
  78. //
  79. // Description:
  80. // Retrieve the property mapping table of the cluster node.
  81. //
  82. // Arguments:
  83. // None.
  84. //
  85. // Return Values:
  86. // Reference to the array of property maping table.
  87. //
  88. //--
  89. //////////////////////////////////////////////////////////////////////////////
  90. const SPropMapEntryArray *
  91. CClusterService::RgGetPropMap( void )
  92. {
  93. static SPropMapEntry s_rgpm[] =
  94. {
  95. {
  96. PVD_PROP_SERVICE_SYSTEMNAME,
  97. CLUSREG_NAME_NODE_NAME,
  98. SZ_TYPE,
  99. READONLY
  100. },
  101. {
  102. NULL,
  103. CLUSREG_NAME_NODE_DESC,
  104. SZ_TYPE,
  105. READWRITE
  106. },
  107. {
  108. NULL,
  109. CLUSREG_NAME_NODE_MAJOR_VERSION,
  110. DWORD_TYPE,
  111. READWRITE
  112. },
  113. {
  114. NULL,
  115. CLUSREG_NAME_NODE_MINOR_VERSION,
  116. DWORD_TYPE,
  117. READWRITE
  118. },
  119. {
  120. NULL,
  121. CLUSREG_NAME_NODE_BUILD_NUMBER,
  122. DWORD_TYPE,
  123. READWRITE
  124. },
  125. {
  126. NULL,
  127. CLUSREG_NAME_NODE_CSDVERSION,
  128. DWORD_TYPE,
  129. READWRITE
  130. }
  131. };
  132. static SPropMapEntryArray s_pmea(
  133. sizeof( s_rgpm ) / sizeof( SPropMapEntry ),
  134. s_rgpm
  135. );
  136. return &s_pmea;
  137. } //*** CClusterService::RgGetPropMap()
  138. //////////////////////////////////////////////////////////////////////////////
  139. //++
  140. //
  141. // CClusterService::EnumInstance
  142. //
  143. // Description:
  144. // Enumerate cluster instance.
  145. //
  146. // Arguments:
  147. // lFlagsIn -- WMI flag
  148. // pCtxIn -- WMI context
  149. // pHandlerIn -- WMI sink pointer
  150. //
  151. // Return Values:
  152. // WBEM_S_NO_ERROR
  153. //
  154. //--
  155. //////////////////////////////////////////////////////////////////////////////
  156. SCODE
  157. CClusterService::EnumInstance(
  158. long lFlagsIn,
  159. IWbemContext * pCtxIn,
  160. IWbemObjectSink * pHandlerIn
  161. )
  162. {
  163. SAFECLUSTER shCluster;
  164. SAFENODE shNode;
  165. LPCWSTR pwszNode;
  166. shCluster = OpenCluster( NULL );
  167. CClusterEnum cluEnum( shCluster, CLUSTER_ENUM_NODE );
  168. while ( ( pwszNode = cluEnum.GetNext() ) != NULL )
  169. {
  170. shNode = OpenClusterNode( shCluster, pwszNode );
  171. ClusterToWMI( shNode, pHandlerIn );
  172. } // while: more nodes
  173. return WBEM_S_NO_ERROR;
  174. } //*** CClusterService::EnumInstance()
  175. //////////////////////////////////////////////////////////////////////////////
  176. //++
  177. //
  178. // CClusterService::ClusterToWMI
  179. //
  180. // Description:
  181. // Translate a cluster node object to WMI object.
  182. //
  183. // Arguments:
  184. // hNodeIn -- Handle to node.
  185. // pHandlerIn -- WMI sink
  186. //
  187. // Return Values:
  188. // None.
  189. //
  190. //--
  191. //////////////////////////////////////////////////////////////////////////////
  192. void
  193. CClusterService::ClusterToWMI(
  194. HNODE hNodeIn,
  195. IWbemObjectSink * pHandlerIn
  196. )
  197. {
  198. static SGetControl s_rgControl[] =
  199. {
  200. { CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES, FALSE },
  201. { CLUSCTL_NODE_GET_COMMON_PROPERTIES, FALSE },
  202. { CLUSCTL_NODE_GET_RO_PRIVATE_PROPERTIES, TRUE },
  203. { CLUSCTL_NODE_GET_PRIVATE_PROPERTIES, TRUE }
  204. };
  205. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
  206. CWbemClassObject wco;
  207. UINT idx;
  208. CError er;
  209. m_pClass->SpawnInstance( 0, & wco );
  210. for ( idx = 0 ; idx < s_cControl ; idx ++ )
  211. {
  212. CClusPropList pl;
  213. er = pl.ScGetNodeProperties(
  214. hNodeIn,
  215. s_rgControl[ idx ].dwControl,
  216. NULL,
  217. 0
  218. );
  219. CClusterApi::GetObjectProperties(
  220. RgGetPropMap(),
  221. pl,
  222. wco,
  223. s_rgControl[ idx ].fPrivate
  224. );
  225. } // for: each control code
  226. wco.SetProperty( L"ClusterService", PVD_PROP_SERVICE_NAME );
  227. pHandlerIn->Indicate( 1, & wco );
  228. return;
  229. } //*** CClusterResource::ClusterToWMI()
  230. //////////////////////////////////////////////////////////////////////////////
  231. //++
  232. //
  233. // CClusterService::GetObject
  234. //
  235. // Description:
  236. // Retrieve cluster node object based given object path.
  237. //
  238. // Arguments:
  239. // rObjPathIn -- Object path to cluster object
  240. // lFlagsIn -- WMI flag
  241. // pCtxIn -- WMI context
  242. // pHandlerIn -- WMI sink pointer
  243. //
  244. // Return Values:
  245. // WBEM_S_NO_ERROR
  246. //
  247. //--
  248. //////////////////////////////////////////////////////////////////////////////
  249. SCODE
  250. CClusterService::GetObject(
  251. CObjPath & rObjPathIn,
  252. long lFlagsIn,
  253. IWbemContext * pCtxIn,
  254. IWbemObjectSink * pHandlerIn
  255. )
  256. {
  257. SAFECLUSTER shCluster;
  258. SAFENODE shNode;
  259. shCluster = OpenCluster( NULL );
  260. shNode = OpenClusterNode(
  261. shCluster,
  262. rObjPathIn.GetStringValueForProperty( PVD_PROP_SERVICE_SYSTEMNAME )
  263. );
  264. ClusterToWMI( shNode, pHandlerIn );
  265. return WBEM_S_NO_ERROR;
  266. } //*** CClusterService::GetObject()
  267. //////////////////////////////////////////////////////////////////////////////
  268. //++
  269. //
  270. // CClusterService::ExecuteMethod
  271. //
  272. // Description:
  273. // Execute methods defined in the mof for cluster node.
  274. //
  275. // Arguments:
  276. // rObjPathIn -- Object path to cluster object
  277. // pwszMethodNameIn -- Name of the method to be invoked
  278. // lFlagIn -- WMI flag
  279. // pParamsIn -- Input parameters for the method
  280. // pHandlerIn -- WMI sink pointer
  281. //
  282. // Return Values:
  283. // WBEM_S_NO_ERROR
  284. //
  285. //--
  286. //////////////////////////////////////////////////////////////////////////////
  287. SCODE
  288. CClusterService::ExecuteMethod(
  289. CObjPath & rObjPathIn,
  290. WCHAR * pwszMethodNameIn,
  291. long lFlagIn,
  292. IWbemClassObject * pParamsIn,
  293. IWbemObjectSink * pHandlerIn
  294. )
  295. {
  296. SAFECLUSTER shCluster;
  297. SAFENODE shNode;
  298. CError er;
  299. shCluster = OpenCluster( NULL );
  300. shNode = OpenClusterNode(
  301. shCluster,
  302. rObjPathIn.GetStringValueForProperty( PVD_PROP_SERVICE_SYSTEMNAME )
  303. );
  304. if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_SERVICE_PAUSE ) == 0 )
  305. {
  306. er = PauseClusterNode( shNode );
  307. } // if: PAUSE
  308. else if( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_SERVICE_RESUME ) == 0 )
  309. {
  310. er = ResumeClusterNode( shNode );
  311. } // else if: RESUME
  312. else
  313. {
  314. er = static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER );
  315. }
  316. return WBEM_S_NO_ERROR;
  317. } //*** CClusterService::ExecuteMethod()
  318. //////////////////////////////////////////////////////////////////////////////
  319. //++
  320. //
  321. // CClusterService::PutInstance
  322. //
  323. // Description:
  324. // Save this instance.
  325. //
  326. // Arguments:
  327. // rInstToPutIn -- WMI object to be saved
  328. // lFlagIn -- WMI flag
  329. // pCtxIn -- WMI context
  330. // pHandlerIn -- WMI sink pointer
  331. //
  332. // Return Values:
  333. // WBEM_S_NO_ERROR
  334. //
  335. //--
  336. //////////////////////////////////////////////////////////////////////////////
  337. SCODE
  338. CClusterService::PutInstance(
  339. CWbemClassObject & rInstToPutIn,
  340. long lFlagIn,
  341. IWbemContext * pCtxIn,
  342. IWbemObjectSink * pHandlerIn
  343. )
  344. {
  345. static SGetSetControl s_rgControl[] =
  346. {
  347. {
  348. CLUSCTL_NODE_GET_COMMON_PROPERTIES,
  349. CLUSCTL_NODE_SET_COMMON_PROPERTIES,
  350. FALSE
  351. },
  352. {
  353. CLUSCTL_NODE_GET_PRIVATE_PROPERTIES,
  354. CLUSCTL_NODE_SET_PRIVATE_PROPERTIES,
  355. TRUE
  356. }
  357. };
  358. static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
  359. _bstr_t bstrName;
  360. SAFECLUSTER shCluster;
  361. SAFENODE shNode;
  362. CError er;
  363. UINT idx;
  364. rInstToPutIn.GetProperty( bstrName, PVD_PROP_SERVICE_SYSTEMNAME );
  365. shCluster = OpenCluster( NULL );
  366. shNode = OpenClusterNode( shCluster, bstrName );
  367. for ( idx = 0 ; idx < s_cControl ; idx ++ )
  368. {
  369. CClusPropList plOld;
  370. CClusPropList plNew;
  371. er = plOld.ScGetNodeProperties(
  372. shNode,
  373. s_rgControl[ idx ].dwGetControl,
  374. NULL,
  375. NULL,
  376. 0
  377. );
  378. CClusterApi::SetObjectProperties(
  379. RgGetPropMap(),
  380. plNew,
  381. plOld,
  382. rInstToPutIn,
  383. s_rgControl[ idx ].fPrivate
  384. );
  385. if ( plNew.Cprops() > 0 )
  386. {
  387. er = ClusterNodeControl(
  388. shNode,
  389. NULL,
  390. s_rgControl[ idx ].dwSetControl,
  391. plNew.PbPropList(),
  392. static_cast< DWORD >( plNew.CbPropList() ),
  393. NULL,
  394. 0,
  395. NULL
  396. );
  397. }
  398. } // for: each control code
  399. return WBEM_S_NO_ERROR;
  400. } //*** CClusterService::PutInstance()
  401. //////////////////////////////////////////////////////////////////////////////
  402. //++
  403. //
  404. // CClusterService::DeleteInstance
  405. //
  406. // Description:
  407. // Delete the object specified in rObjPathIn.
  408. //
  409. // Arguments:
  410. // rObjPathIn -- ObjPath for the instance to be deleted
  411. // lFlagIn -- WMI flag
  412. // pCtxIn -- WMI context
  413. // pHandlerIn -- WMI sink pointer
  414. //
  415. // Return Values:
  416. // WBEM_E_NOT_SUPPORTED
  417. //
  418. //--
  419. //////////////////////////////////////////////////////////////////////////////
  420. SCODE
  421. CClusterService::DeleteInstance(
  422. CObjPath & rObjPathIn,
  423. long lFlagIn,
  424. IWbemContext * pCtxIn,
  425. IWbemObjectSink * pHandlerIn
  426. )
  427. {
  428. return WBEM_E_NOT_SUPPORTED;
  429. } //*** CClusterService::DeleteInstance()