s3-rpcclient: add cmd_clusapi_get_cluster_version2.
[Samba.git] / source3 / rpcclient / cmd_clusapi.c
blobb7451dc2760e089c3757471db36fc8d7fcb5b935
1 /*
2 Unix SMB/CIFS implementation.
3 RPC pipe client
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/>.
21 #include "includes.h"
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,
26 TALLOC_CTX *mem_ctx,
27 int argc,
28 const char **argv)
30 struct dcerpc_binding_handle *b = cli->binding_handle;
31 NTSTATUS status;
32 WERROR error;
33 struct policy_handle Cluster;
35 status = dcerpc_clusapi_OpenCluster(b, mem_ctx,
36 &error,
37 &Cluster);
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));
44 return error;
47 printf("successfully opened cluster\n");
49 status = dcerpc_clusapi_CloseCluster(b, mem_ctx,
50 &Cluster,
51 &error);
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));
58 return error;
61 printf("successfully closed cluster\n");
63 return WERR_OK;
66 static WERROR cmd_clusapi_get_cluster_name(struct rpc_pipe_client *cli,
67 TALLOC_CTX *mem_ctx,
68 int argc,
69 const char **argv)
71 struct dcerpc_binding_handle *b = cli->binding_handle;
72 NTSTATUS status;
73 WERROR error;
74 const char *ClusterName;
75 const char *NodeName;
77 status = dcerpc_clusapi_GetClusterName(b, mem_ctx,
78 &ClusterName,
79 &NodeName,
80 &error);
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));
87 return error;
90 printf("ClusterName: %s\n", ClusterName);
91 printf("NodeName: %s\n", NodeName);
93 return WERR_OK;
96 static WERROR cmd_clusapi_get_cluster_version(struct rpc_pipe_client *cli,
97 TALLOC_CTX *mem_ctx,
98 int argc,
99 const char **argv)
101 struct dcerpc_binding_handle *b = cli->binding_handle;
102 NTSTATUS status;
103 WERROR error;
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,
111 &lpwMajorVersion,
112 &lpwMinorVersion,
113 &lpwBuildNumber,
114 &lpszVendorId,
115 &lpszCSDVersion,
116 &error);
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));
123 return 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);
132 return WERR_OK;
135 static WERROR cmd_clusapi_get_quorum_resource(struct rpc_pipe_client *cli,
136 TALLOC_CTX *mem_ctx,
137 int argc,
138 const char **argv)
140 struct dcerpc_binding_handle *b = cli->binding_handle;
141 NTSTATUS status;
142 WERROR error;
143 const char *lpszResourceName;
144 const char *lpszDeviceName;
145 uint32_t pdwMaxQuorumLogSize;
146 WERROR rpc_status;
148 status = dcerpc_clusapi_GetQuorumResource(b, mem_ctx,
149 &lpszResourceName,
150 &lpszDeviceName,
151 &pdwMaxQuorumLogSize,
152 &rpc_status,
153 &error);
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));
160 return 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));
168 return WERR_OK;
171 static WERROR cmd_clusapi_create_enum(struct rpc_pipe_client *cli,
172 TALLOC_CTX *mem_ctx,
173 int argc,
174 const char **argv)
176 struct dcerpc_binding_handle *b = cli->binding_handle;
177 NTSTATUS status;
178 WERROR error;
179 uint32_t dwType = 1;
180 struct ENUM_LIST *ReturnEnum;
181 WERROR rpc_status;
183 if (argc >= 2) {
184 sscanf(argv[1],"%x",&dwType);
187 status = dcerpc_clusapi_CreateEnum(b, mem_ctx,
188 dwType,
189 &ReturnEnum,
190 &rpc_status,
191 &error);
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));
198 return error;
201 printf("rpc_status: %s\n", win_errstr(rpc_status));
203 return WERR_OK;
206 static WERROR cmd_clusapi_open_resource(struct rpc_pipe_client *cli,
207 TALLOC_CTX *mem_ctx,
208 int argc,
209 const char **argv)
211 struct dcerpc_binding_handle *b = cli->binding_handle;
212 NTSTATUS status;
213 const char *lpszResourceName = "Cluster Name";
214 WERROR Status;
215 struct policy_handle hResource;
216 WERROR rpc_status, ignore;
218 if (argc >= 2) {
219 lpszResourceName = argv[1];
222 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
223 lpszResourceName,
224 &Status,
225 &rpc_status,
226 &hResource);
227 if (!NT_STATUS_IS_OK(status)) {
228 return ntstatus_to_werror(status);
231 if (!W_ERROR_IS_OK(Status)) {
232 printf("Status: %s\n", win_errstr(Status));
233 return Status;
236 printf("rpc_status: %s\n", win_errstr(rpc_status));
238 dcerpc_clusapi_CloseResource(b, mem_ctx,
239 &hResource,
240 &ignore);
242 return WERR_OK;
245 static WERROR cmd_clusapi_online_resource(struct rpc_pipe_client *cli,
246 TALLOC_CTX *mem_ctx,
247 int argc,
248 const char **argv)
250 struct dcerpc_binding_handle *b = cli->binding_handle;
251 NTSTATUS status;
252 const char *lpszResourceName = "Cluster Name";
253 WERROR Status;
254 struct policy_handle hResource;
255 WERROR rpc_status, ignore;
257 if (argc >= 2) {
258 lpszResourceName = argv[1];
261 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
262 lpszResourceName,
263 &Status,
264 &rpc_status,
265 &hResource);
266 if (!NT_STATUS_IS_OK(status)) {
267 return ntstatus_to_werror(status);
270 if (!W_ERROR_IS_OK(Status)) {
271 printf("Status: %s\n", win_errstr(Status));
272 return Status;
275 status = dcerpc_clusapi_OnlineResource(b, mem_ctx,
276 hResource,
277 &Status,
278 &rpc_status);
279 dcerpc_clusapi_CloseResource(b, mem_ctx,
280 &hResource,
281 &ignore);
283 if (!NT_STATUS_IS_OK(status)) {
284 return ntstatus_to_werror(status);
287 if (!W_ERROR_IS_OK(Status)) {
288 printf("Status: %s\n", win_errstr(Status));
289 return Status;
292 printf("rpc_status: %s\n", win_errstr(rpc_status));
294 return WERR_OK;
297 static WERROR cmd_clusapi_offline_resource(struct rpc_pipe_client *cli,
298 TALLOC_CTX *mem_ctx,
299 int argc,
300 const char **argv)
302 struct dcerpc_binding_handle *b = cli->binding_handle;
303 NTSTATUS status;
304 const char *lpszResourceName = "Cluster Name";
305 WERROR Status;
306 struct policy_handle hResource;
307 WERROR rpc_status, ignore;
309 if (argc >= 2) {
310 lpszResourceName = argv[1];
313 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
314 lpszResourceName,
315 &Status,
316 &rpc_status,
317 &hResource);
318 if (!NT_STATUS_IS_OK(status)) {
319 return ntstatus_to_werror(status);
322 if (!W_ERROR_IS_OK(Status)) {
323 printf("Status: %s\n", win_errstr(Status));
324 return Status;
327 status = dcerpc_clusapi_OfflineResource(b, mem_ctx,
328 hResource,
329 &Status,
330 &rpc_status);
331 dcerpc_clusapi_CloseResource(b, mem_ctx,
332 &hResource,
333 &ignore);
335 if (!NT_STATUS_IS_OK(status)) {
336 return ntstatus_to_werror(status);
339 if (!W_ERROR_IS_OK(Status)) {
340 printf("Status: %s\n", win_errstr(Status));
341 return Status;
344 printf("rpc_status: %s\n", win_errstr(rpc_status));
346 return WERR_OK;
349 static WERROR cmd_clusapi_get_resource_state(struct rpc_pipe_client *cli,
350 TALLOC_CTX *mem_ctx,
351 int argc,
352 const char **argv)
354 struct dcerpc_binding_handle *b = cli->binding_handle;
355 NTSTATUS status;
356 const char *lpszResourceName = "Cluster Name";
357 WERROR Status;
358 struct policy_handle hResource;
359 WERROR rpc_status;
360 enum clusapi_ClusterResourceState State;
361 const char *NodeName;
362 const char *GroupName;
363 WERROR result, ignore;
365 if (argc >= 2) {
366 lpszResourceName = argv[1];
369 status = dcerpc_clusapi_OpenResource(b, mem_ctx,
370 lpszResourceName,
371 &Status,
372 &rpc_status,
373 &hResource);
374 if (!NT_STATUS_IS_OK(status)) {
375 return ntstatus_to_werror(status);
378 if (!W_ERROR_IS_OK(Status)) {
379 printf("Status: %s\n", win_errstr(Status));
380 return Status;
383 status = dcerpc_clusapi_GetResourceState(b, mem_ctx,
384 hResource,
385 &State,
386 &NodeName,
387 &GroupName,
388 &rpc_status,
389 &result);
390 dcerpc_clusapi_CloseResource(b, mem_ctx,
391 &hResource,
392 &ignore);
394 if (!NT_STATUS_IS_OK(status)) {
395 return ntstatus_to_werror(status);
398 if (!W_ERROR_IS_OK(Status)) {
399 printf("Status: %s\n", win_errstr(Status));
400 return Status;
403 printf("rpc_status: %s\n", win_errstr(rpc_status));
405 return WERR_OK;
408 static WERROR cmd_clusapi_get_cluster_version2(struct rpc_pipe_client *cli,
409 TALLOC_CTX *mem_ctx,
410 int argc,
411 const char **argv)
413 struct dcerpc_binding_handle *b = cli->binding_handle;
414 NTSTATUS status;
415 uint16_t lpwMajorVersion;
416 uint16_t lpwMinorVersion;
417 uint16_t lpwBuildNumber;
418 const char *lpszVendorId;
419 const char *lpszCSDVersion;
420 struct CLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo;
421 WERROR rpc_status;
422 WERROR result;
424 status = dcerpc_clusapi_GetClusterVersion2(b, mem_ctx,
425 &lpwMajorVersion,
426 &lpwMinorVersion,
427 &lpwBuildNumber,
428 &lpszVendorId,
429 &lpszCSDVersion,
430 &ppClusterOpVerInfo,
431 &rpc_status,
432 &result);
433 if (!NT_STATUS_IS_OK(status)) {
434 return ntstatus_to_werror(status);
437 if (!W_ERROR_IS_OK(result)) {
438 printf("result: %s\n", win_errstr(result));
439 return result;
442 printf("rpc_status: %s\n", win_errstr(rpc_status));
444 return WERR_OK;
448 struct cmd_set clusapi_commands[] = {
450 { "CLUSAPI" },
451 { "clusapi_open_cluster", RPC_RTYPE_WERROR, NULL, cmd_clusapi_open_cluster, &ndr_table_clusapi, NULL, "bla", "" },
452 { "clusapi_get_cluster_name", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_name, &ndr_table_clusapi, NULL, "bla", "" },
453 { "clusapi_get_cluster_version", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_version, &ndr_table_clusapi, NULL, "bla", "" },
454 { "clusapi_get_quorum_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_quorum_resource, &ndr_table_clusapi, NULL, "bla", "" },
455 { "clusapi_create_enum", RPC_RTYPE_WERROR, NULL, cmd_clusapi_create_enum, &ndr_table_clusapi, NULL, "bla", "" },
456 { "clusapi_open_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_open_resource, &ndr_table_clusapi, NULL, "bla", "" },
457 { "clusapi_online_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_online_resource, &ndr_table_clusapi, NULL, "bla", "" },
458 { "clusapi_offline_resource", RPC_RTYPE_WERROR, NULL, cmd_clusapi_offline_resource, &ndr_table_clusapi, NULL, "bla", "" },
459 { "clusapi_get_resource_state", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_resource_state, &ndr_table_clusapi, NULL, "bla", "" },
460 { "clusapi_get_cluster_version2", RPC_RTYPE_WERROR, NULL, cmd_clusapi_get_cluster_version2, &ndr_table_clusapi, NULL, "bla", "" },
461 { NULL }