b7451dc2760e089c3757471db36fc8d7fcb5b935
[obnox/samba/samba-obnox.git] / source3 / rpcclient / cmd_clusapi.c
1 /*
2    Unix SMB/CIFS implementation.
3    RPC pipe client
4
5    Copyright (C) Günther Deschner 2015
6
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.
11
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.
16
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/>.
19 */
20
21 #include "includes.h"
22 #include "rpcclient.h"
23 #include "../librpc/gen_ndr/ndr_clusapi_c.h"
24
25 static WERROR cmd_clusapi_open_cluster(struct rpc_pipe_client *cli,
26                                        TALLOC_CTX *mem_ctx,
27                                        int argc,
28                                        const char **argv)
29 {
30         struct dcerpc_binding_handle *b = cli->binding_handle;
31         NTSTATUS status;
32         WERROR error;
33         struct policy_handle Cluster;
34
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);
40         }
41
42         if (!W_ERROR_IS_OK(error)) {
43                 printf("error: %s\n", win_errstr(error));
44                 return error;
45         }
46
47         printf("successfully opened cluster\n");
48
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);
54         }
55
56         if (!W_ERROR_IS_OK(error)) {
57                 printf("error: %s\n", win_errstr(error));
58                 return error;
59         }
60
61         printf("successfully closed cluster\n");
62
63         return WERR_OK;
64 }
65
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)
70 {
71         struct dcerpc_binding_handle *b = cli->binding_handle;
72         NTSTATUS status;
73         WERROR error;
74         const char *ClusterName;
75         const char *NodeName;
76
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);
83         }
84
85         if (!W_ERROR_IS_OK(error)) {
86                 printf("error: %s\n", win_errstr(error));
87                 return error;
88         }
89
90         printf("ClusterName: %s\n", ClusterName);
91         printf("NodeName: %s\n", NodeName);
92
93         return WERR_OK;
94 }
95
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)
100 {
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;
109
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);
119         }
120
121         if (!W_ERROR_IS_OK(error)) {
122                 printf("error: %s\n", win_errstr(error));
123                 return error;
124         }
125
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);
131
132         return WERR_OK;
133 }
134
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)
139 {
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;
147
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);
156         }
157
158         if (!W_ERROR_IS_OK(error)) {
159                 printf("error: %s\n", win_errstr(error));
160                 return error;
161         }
162
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));
167
168         return WERR_OK;
169 }
170
171 static WERROR cmd_clusapi_create_enum(struct rpc_pipe_client *cli,
172                                       TALLOC_CTX *mem_ctx,
173                                       int argc,
174                                       const char **argv)
175 {
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;
182
183         if (argc >= 2) {
184                 sscanf(argv[1],"%x",&dwType);
185         }
186
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);
194         }
195
196         if (!W_ERROR_IS_OK(error)) {
197                 printf("error: %s\n", win_errstr(error));
198                 return error;
199         }
200
201         printf("rpc_status: %s\n", win_errstr(rpc_status));
202
203         return WERR_OK;
204 }
205
206 static WERROR cmd_clusapi_open_resource(struct rpc_pipe_client *cli,
207                                         TALLOC_CTX *mem_ctx,
208                                         int argc,
209                                         const char **argv)
210 {
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;
217
218         if (argc >= 2) {
219                 lpszResourceName = argv[1];
220         }
221
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);
229         }
230
231         if (!W_ERROR_IS_OK(Status)) {
232                 printf("Status: %s\n", win_errstr(Status));
233                 return Status;
234         }
235
236         printf("rpc_status: %s\n", win_errstr(rpc_status));
237
238         dcerpc_clusapi_CloseResource(b, mem_ctx,
239                                      &hResource,
240                                      &ignore);
241
242         return WERR_OK;
243 }
244
245 static WERROR cmd_clusapi_online_resource(struct rpc_pipe_client *cli,
246                                           TALLOC_CTX *mem_ctx,
247                                           int argc,
248                                           const char **argv)
249 {
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;
256
257         if (argc >= 2) {
258                 lpszResourceName = argv[1];
259         }
260
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);
268         }
269
270         if (!W_ERROR_IS_OK(Status)) {
271                 printf("Status: %s\n", win_errstr(Status));
272                 return Status;
273         }
274
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);
282
283         if (!NT_STATUS_IS_OK(status)) {
284                 return ntstatus_to_werror(status);
285         }
286
287         if (!W_ERROR_IS_OK(Status)) {
288                 printf("Status: %s\n", win_errstr(Status));
289                 return Status;
290         }
291
292         printf("rpc_status: %s\n", win_errstr(rpc_status));
293
294         return WERR_OK;
295 }
296
297 static WERROR cmd_clusapi_offline_resource(struct rpc_pipe_client *cli,
298                                            TALLOC_CTX *mem_ctx,
299                                            int argc,
300                                            const char **argv)
301 {
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;
308
309         if (argc >= 2) {
310                 lpszResourceName = argv[1];
311         }
312
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);
320         }
321
322         if (!W_ERROR_IS_OK(Status)) {
323                 printf("Status: %s\n", win_errstr(Status));
324                 return Status;
325         }
326
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);
334
335         if (!NT_STATUS_IS_OK(status)) {
336                 return ntstatus_to_werror(status);
337         }
338
339         if (!W_ERROR_IS_OK(Status)) {
340                 printf("Status: %s\n", win_errstr(Status));
341                 return Status;
342         }
343
344         printf("rpc_status: %s\n", win_errstr(rpc_status));
345
346         return WERR_OK;
347 }
348
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)
353 {
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;
364
365         if (argc >= 2) {
366                 lpszResourceName = argv[1];
367         }
368
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);
376         }
377
378         if (!W_ERROR_IS_OK(Status)) {
379                 printf("Status: %s\n", win_errstr(Status));
380                 return Status;
381         }
382
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);
393
394         if (!NT_STATUS_IS_OK(status)) {
395                 return ntstatus_to_werror(status);
396         }
397
398         if (!W_ERROR_IS_OK(Status)) {
399                 printf("Status: %s\n", win_errstr(Status));
400                 return Status;
401         }
402
403         printf("rpc_status: %s\n", win_errstr(rpc_status));
404
405         return WERR_OK;
406 }
407
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)
412 {
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;
423
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);
435         }
436
437         if (!W_ERROR_IS_OK(result)) {
438                 printf("result: %s\n", win_errstr(result));
439                 return result;
440         }
441
442         printf("rpc_status: %s\n", win_errstr(rpc_status));
443
444         return WERR_OK;
445 }
446
447
448 struct cmd_set clusapi_commands[] = {
449
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 }
462 };