2 Unix SMB/CIFS implementation.
5 Copyright (C) Günther Deschner 2015
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "rpcclient.h"
23 #include "../librpc/gen_ndr/ndr_clusapi_c.h"
25 static WERROR cmd_clusapi_open_cluster(struct rpc_pipe_client *cli,
30 struct dcerpc_binding_handle *b = cli->binding_handle;
33 struct policy_handle Cluster;
35 status = dcerpc_clusapi_OpenCluster(b, mem_ctx,
38 if (!NT_STATUS_IS_OK(status)) {
39 return ntstatus_to_werror(status);
42 if (!W_ERROR_IS_OK(error)) {
43 printf("error: %s\n", win_errstr(error));
47 printf("successfully opened cluster\n");
49 status = dcerpc_clusapi_CloseCluster(b, mem_ctx,
52 if (!NT_STATUS_IS_OK(status)) {
53 return ntstatus_to_werror(status);
56 if (!W_ERROR_IS_OK(error)) {
57 printf("error: %s\n", win_errstr(error));
61 printf("successfully closed cluster\n");
66 static WERROR cmd_clusapi_get_cluster_name(struct rpc_pipe_client *cli,
71 struct dcerpc_binding_handle *b = cli->binding_handle;
74 const char *ClusterName;
77 status = dcerpc_clusapi_GetClusterName(b, mem_ctx,
81 if (!NT_STATUS_IS_OK(status)) {
82 return ntstatus_to_werror(status);
85 if (!W_ERROR_IS_OK(error)) {
86 printf("error: %s\n", win_errstr(error));
90 printf("ClusterName: %s\n", ClusterName);
91 printf("NodeName: %s\n", NodeName);
96 static WERROR cmd_clusapi_get_cluster_version(struct rpc_pipe_client *cli,
101 struct dcerpc_binding_handle *b = cli->binding_handle;
104 uint16_t lpwMajorVersion;
105 uint16_t lpwMinorVersion;
106 uint16_t lpwBuildNumber;
107 const char *lpszVendorId;
108 const char *lpszCSDVersion;
110 status = dcerpc_clusapi_GetClusterVersion(b, mem_ctx,
117 if (!NT_STATUS_IS_OK(status)) {
118 return ntstatus_to_werror(status);
121 if (!W_ERROR_IS_OK(error)) {
122 printf("error: %s\n", win_errstr(error));
126 printf("lpwMajorVersion: %d\n", lpwMajorVersion);
127 printf("lpwMinorVersion: %d\n", lpwMinorVersion);
128 printf("lpwBuildNumber: %d\n", lpwBuildNumber);
129 printf("lpszVendorId: %s\n", lpszVendorId);
130 printf("lpszCSDVersion: %s\n", lpszCSDVersion);
135 static WERROR cmd_clusapi_get_quorum_resource(struct rpc_pipe_client *cli,
140 struct dcerpc_binding_handle *b = cli->binding_handle;
143 const char *lpszResourceName;
144 const char *lpszDeviceName;
145 uint32_t pdwMaxQuorumLogSize;
148 status = dcerpc_clusapi_GetQuorumResource(b, mem_ctx,
151 &pdwMaxQuorumLogSize,
154 if (!NT_STATUS_IS_OK(status)) {
155 return ntstatus_to_werror(status);
158 if (!W_ERROR_IS_OK(error)) {
159 printf("error: %s\n", win_errstr(error));
163 printf("lpszResourceName: %s\n", lpszResourceName);
164 printf("lpszDeviceName: %s\n", lpszDeviceName);
165 printf("pdwMaxQuorumLogSize: %d\n", pdwMaxQuorumLogSize);
166 printf("rpc_status: %s\n", win_errstr(rpc_status));
171 static WERROR cmd_clusapi_create_enum(struct rpc_pipe_client *cli,
176 struct dcerpc_binding_handle *b = cli->binding_handle;
180 struct ENUM_LIST *ReturnEnum;
184 sscanf(argv[1],"%x",&dwType);
187 status = dcerpc_clusapi_CreateEnum(b, mem_ctx,
192 if (!NT_STATUS_IS_OK(status)) {
193 return ntstatus_to_werror(status);
196 if (!W_ERROR_IS_OK(error)) {
197 printf("error: %s\n", win_errstr(error));
201 printf("rpc_status: %s\n", win_errstr(rpc_status));
206 static WERROR cmd_clusapi_create_enumex(struct rpc_pipe_client *cli,
211 struct dcerpc_binding_handle *b = cli->binding_handle;
215 struct ENUM_LIST *ReturnIdEnum;
216 struct ENUM_LIST *ReturnNameEnum;
217 WERROR rpc_status, ignore;
218 struct policy_handle Cluster;
220 status = dcerpc_clusapi_OpenCluster(b, mem_ctx,
223 if (!NT_STATUS_IS_OK(status)) {
224 return ntstatus_to_werror(status);
227 if (!W_ERROR_IS_OK(error)) {
228 printf("error: %s\n", win_errstr(error));
233 sscanf(argv[1],"%x",&dwType);
236 status = dcerpc_clusapi_CreateEnumEx(b, mem_ctx,
244 dcerpc_clusapi_CloseCluster(b, mem_ctx,
248 if (!NT_STATUS_IS_OK(status)) {
249 return ntstatus_to_werror(status);
252 if (!W_ERROR_IS_OK(error)) {
253 printf("error: %s\n", win_errstr(error));
257 printf("rpc_status: %s\n", win_errstr(rpc_status));
263 static WERROR cmd_clusapi_open_resource(struct rpc_pipe_client *cli,
268 struct dcerpc_binding_handle *b = cli->binding_handle;
270 const char *lpszResourceName = "Cluster Name";
272 struct policy_handle hResource;
273 WERROR rpc_status, ignore;
276 lpszResourceName = argv[1];
279 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
284 if (!NT_STATUS_IS_OK(status)) {
285 return ntstatus_to_werror(status);
288 if (!W_ERROR_IS_OK(Status)) {
289 printf("Status: %s\n", win_errstr(Status));
293 printf("rpc_status: %s\n", win_errstr(rpc_status));
295 dcerpc_clusapi_CloseResource(b, mem_ctx,
302 static WERROR cmd_clusapi_online_resource(struct rpc_pipe_client *cli,
307 struct dcerpc_binding_handle *b = cli->binding_handle;
309 const char *lpszResourceName = "Cluster Name";
311 struct policy_handle hResource;
312 WERROR rpc_status, ignore;
315 lpszResourceName = argv[1];
318 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
323 if (!NT_STATUS_IS_OK(status)) {
324 return ntstatus_to_werror(status);
327 if (!W_ERROR_IS_OK(Status)) {
328 printf("Status: %s\n", win_errstr(Status));
332 status = dcerpc_clusapi_OnlineResource(b, mem_ctx,
336 dcerpc_clusapi_CloseResource(b, mem_ctx,
340 if (!NT_STATUS_IS_OK(status)) {
341 return ntstatus_to_werror(status);
344 if (!W_ERROR_IS_OK(Status)) {
345 printf("Status: %s\n", win_errstr(Status));
349 printf("rpc_status: %s\n", win_errstr(rpc_status));
354 static WERROR cmd_clusapi_offline_resource(struct rpc_pipe_client *cli,
359 struct dcerpc_binding_handle *b = cli->binding_handle;
361 const char *lpszResourceName = "Cluster Name";
363 struct policy_handle hResource;
364 WERROR rpc_status, ignore;
367 lpszResourceName = argv[1];
370 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
375 if (!NT_STATUS_IS_OK(status)) {
376 return ntstatus_to_werror(status);
379 if (!W_ERROR_IS_OK(Status)) {
380 printf("Status: %s\n", win_errstr(Status));
384 status = dcerpc_clusapi_OfflineResource(b, mem_ctx,
388 dcerpc_clusapi_CloseResource(b, mem_ctx,
392 if (!NT_STATUS_IS_OK(status)) {
393 return ntstatus_to_werror(status);
396 if (!W_ERROR_IS_OK(Status)) {
397 printf("Status: %s\n", win_errstr(Status));
401 printf("rpc_status: %s\n", win_errstr(rpc_status));
406 static WERROR cmd_clusapi_get_resource_state(struct rpc_pipe_client *cli,
411 struct dcerpc_binding_handle *b = cli->binding_handle;
413 const char *lpszResourceName = "Cluster Name";
415 struct policy_handle hResource;
417 enum clusapi_ClusterResourceState State;
418 const char *NodeName;
419 const char *GroupName;
420 WERROR result, ignore;
423 lpszResourceName = argv[1];
426 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
431 if (!NT_STATUS_IS_OK(status)) {
432 return ntstatus_to_werror(status);
435 if (!W_ERROR_IS_OK(Status)) {
436 printf("Status: %s\n", win_errstr(Status));
440 status = dcerpc_clusapi_GetResourceState(b, mem_ctx,
447 dcerpc_clusapi_CloseResource(b, mem_ctx,
451 if (!NT_STATUS_IS_OK(status)) {
452 return ntstatus_to_werror(status);
455 if (!W_ERROR_IS_OK(Status)) {
456 printf("Status: %s\n", win_errstr(Status));
460 printf("rpc_status: %s\n", win_errstr(rpc_status));
465 static WERROR cmd_clusapi_get_cluster_version2(struct rpc_pipe_client *cli,
470 struct dcerpc_binding_handle *b = cli->binding_handle;
472 uint16_t lpwMajorVersion;
473 uint16_t lpwMinorVersion;
474 uint16_t lpwBuildNumber;
475 const char *lpszVendorId;
476 const char *lpszCSDVersion;
477 struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
481 status = dcerpc_clusapi_GetClusterVersion2(b, mem_ctx,
490 if (!NT_STATUS_IS_OK(status)) {
491 return ntstatus_to_werror(status);
494 if (!W_ERROR_IS_OK(result)) {
495 printf("result: %s\n", win_errstr(result));
499 printf("rpc_status: %s\n", win_errstr(rpc_status));
505 struct cmd_set clusapi_commands[] = {
508 { "clusapi_open_cluster", RPC_RTYPE_WERROR, NULL, cmd_clusapi_open_cluster, &ndr_table_clusapi, NULL, "bla", "" },
509 { "clusapi_get_cluster_name", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_name, &ndr_table_clusapi, NULL, "bla", "" },
510 { "clusapi_get_cluster_version", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_version, &ndr_table_clusapi, NULL, "bla", "" },
511 { "clusapi_get_quorum_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_quorum_resource, &ndr_table_clusapi, NULL, "bla", "" },
512 { "clusapi_create_enum", RPC_RTYPE_WERROR, NULL, cmd_clusapi_create_enum, &ndr_table_clusapi, NULL, "bla", "" },
513 { "clusapi_create_enumex", RPC_RTYPE_WERROR, NULL, cmd_clusapi_create_enumex, &ndr_table_clusapi, NULL, "bla", "" },
514 { "clusapi_open_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_open_resource, &ndr_table_clusapi, NULL, "bla", "" },
515 { "clusapi_online_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_online_resource, &ndr_table_clusapi, NULL, "bla", "" },
516 { "clusapi_offline_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_offline_resource, &ndr_table_clusapi, NULL, "bla", "" },
517 { "clusapi_get_resource_state", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_resource_state, &ndr_table_clusapi, NULL, "bla", "" },
518 { "clusapi_get_cluster_version2", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_version2, &ndr_table_clusapi, NULL, "bla", "" },