]> andersk Git - moira.git/blame - clients/stella/stella.c
Add option for unformatted output (one field per line, in
[moira.git] / clients / stella / stella.c
CommitLineData
80e8aa14 1/*
2 * Command line oriented Moira host tool.
3 *
4 * kolya@MIT.EDU, January 2000
5 *
6 * Somewhat based on blanche
7 *
8 * Copyright (C) 2000 by the Massachusetts Institute of Technology.
9 * For copying and distribution information, please see the file
10 * <mit-copyright.h>.
11 */
12
13#include <mit-copyright.h>
14#include <moira.h>
15#include <moira_site.h>
16#include <mrclient.h>
17
18#include <ctype.h>
19#include <errno.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23
24RCSID("$Header$");
25
26struct owner_type {
27 int type;
28 char *name;
29};
30
31struct mqelem {
32 struct mqelem *q_forw;
33 struct mqelem *q_back;
34 void *q_data;
35};
36
37struct string_list {
38 char *string;
39 struct string_list *next;
40};
41
80e8aa14 42#define M_ANY 0
43#define M_USER 1
44#define M_LIST 2
a547d259 45#define M_KERBEROS 3
46#define M_NONE 4
80e8aa14 47
48/* argument parsing macro */
49#define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
50
51/* flags from command line */
52int info_flag, update_flag, create_flag, delete_flag, list_map_flag;
7e689fac 53int update_alias_flag, update_map_flag, verbose, noauth;
7b6a099a 54int list_container_flag, update_container_flag, unformatted_flag;
80e8aa14 55
56struct string_list *alias_add_queue, *alias_remove_queue;
57struct string_list *map_add_queue, *map_remove_queue;
9cd2d193 58struct string_list *container_add_queue, *container_remove_queue;
80e8aa14 59
60char *hostname, *whoami;
61
62char *newname, *address, *network, *h_status, *vendor, *model;
080e5e2c 63char *os, *location, *contact, *billing_contact, *adm_cmt, *op_cmt;
80e8aa14 64
65struct owner_type *owner;
66
67void usage(char **argv);
68int store_host_info(int argc, char **argv, void *hint);
69void show_host_info(char **argv);
7b6a099a 70void show_host_info_unformatted(char **argv);
80e8aa14 71int show_machine_in_cluster(int argc, char **argv, void *hint);
9cd2d193 72int show_machine_in_container(int argc, char **argv, void *hint);
80e8aa14 73struct owner_type *parse_member(char *s);
74struct string_list *add_to_string_list(struct string_list *old_list, char *s);
75int wrap_mr_query(char *handle, int argc, char **argv,
76 int (*callback)(int, char **, void *), void *callarg);
77void print_query(char *query_name, int argc, char **argv);
78
79int main(int argc, char **argv)
80{
81 int status, success;
82 char **arg = argv;
533bacb3 83 char *server = NULL;
80e8aa14 84
85 /* clear all flags & lists */
86 info_flag = update_flag = create_flag = list_map_flag = update_map_flag = 0;
7e689fac 87 update_alias_flag = verbose = noauth = 0;
9cd2d193 88 list_container_flag = update_container_flag = 0;
80e8aa14 89 newname = address = network = h_status = vendor = model = NULL;
080e5e2c 90 os = location = contact = billing_contact = adm_cmt = op_cmt = NULL;
80e8aa14 91 owner = NULL;
92 alias_add_queue = alias_remove_queue = NULL;
93 map_add_queue = map_remove_queue = NULL;
9cd2d193 94 container_add_queue = container_remove_queue = NULL;
80e8aa14 95 whoami = argv[0];
96
97 success = 1;
98
99 /* parse args, building addlist, dellist, & synclist */
100 while (++arg - argv < argc)
101 {
102 if (**arg == '-')
103 {
104 if (argis("i", "info"))
105 info_flag++;
106 else if (argis("C", "create"))
107 create_flag++;
108 else if (argis("D", "delete"))
109 delete_flag++;
110 else if (argis("R", "rename")) {
111 if (arg - argv < argc - 1) {
112 arg++;
113 update_flag++;
114 newname = *arg;
115 } else
116 usage(argv);
117 }
118 else if (argis("A", "address")) {
119 if (arg - argv < argc - 1) {
120 arg++;
121 update_flag++;
122 address = *arg;
123 } else
124 usage(argv);
125 }
126 else if (argis("O", "owner")) {
127 if (arg - argv < argc - 1) {
128 arg++;
129 update_flag++;
130 owner = parse_member(*arg);
131 } else
132 usage(argv);
133 }
134 else if (argis("N", "network")) {
135 if (arg - argv < argc - 1) {
136 arg++;
137 update_flag++;
138 network = *arg;
139 } else
140 usage(argv);
141 }
142 else if (argis("S", "status")) {
143 if (arg - argv < argc - 1) {
144 int i;
533bacb3 145 int len;
80e8aa14 146
147 arg++;
148 update_flag++;
149 h_status = *arg;
150
533bacb3 151 len = strlen(h_status);
152 for(i = 0; i < len; i++) {
80e8aa14 153 if(!isdigit(h_status[i])) {
154 printf("Error: status code %s is not numeric.\n", h_status);
155 exit(1);
156 }
157 }
158 } else
159 usage(argv);
160 }
161 else if (argis("V", "vendor")) {
162 if (arg - argv < argc - 1) {
163 arg++;
164 update_flag++;
165 vendor = *arg;
166 } else
167 usage(argv);
168 }
169 else if (argis("M", "model")) {
170 if (arg - argv < argc - 1) {
171 arg++;
172 update_flag++;
173 model = *arg;
174 } else
175 usage(argv);
176 }
177 else if (argis("o", "os")) {
178 if (arg - argv < argc - 1) {
179 arg++;
180 update_flag++;
181 os = *arg;
182 } else
183 usage(argv);
184 }
185 else if (argis("L", "location")) {
186 if (arg - argv < argc - 1) {
187 arg++;
188 update_flag++;
189 location = *arg;
190 } else
191 usage(argv);
192 }
193 else if (argis("c", "contact")) {
194 if (arg - argv < argc - 1) {
195 arg++;
196 update_flag++;
197 contact = *arg;
198 } else
199 usage(argv);
200 }
080e5e2c 201 else if (argis("bc", "billingcontact")) {
202 if (arg - argv < argc - 1) {
203 arg++;
204 update_flag++;
205 billing_contact = *arg;
206 } else
207 usage(argv);
208 }
80e8aa14 209 else if (argis("ac", "admcmt")) {
210 if (arg - argv < argc - 1) {
211 arg++;
212 update_flag++;
213 adm_cmt = *arg;
214 } else
215 usage(argv);
216 }
217 else if (argis("oc", "opcmt")) {
218 if (arg - argv < argc - 1) {
219 arg++;
220 update_flag++;
221 op_cmt = *arg;
222 } else
223 usage(argv);
224 }
225 else if (argis("a", "aliasadd")) {
226 if (arg - argv < argc - 1) {
227 arg++;
228 alias_add_queue=add_to_string_list(alias_add_queue, *arg);
229 } else
230 usage(argv);
7e689fac 231 update_alias_flag++;
80e8aa14 232 }
233 else if (argis("d", "aliasdelete")) {
234 if (arg - argv < argc - 1) {
235 arg++;
236 alias_remove_queue=add_to_string_list(alias_remove_queue, *arg);
237 } else
238 usage(argv);
7e689fac 239 update_alias_flag++;
80e8aa14 240 }
241 else if (argis("am", "addmap")) {
242 if (arg - argv < argc - 1) {
243 arg++;
244 map_add_queue=add_to_string_list(map_add_queue, *arg);
245 } else
246 usage(argv);
247 update_map_flag++;
248 }
249 else if (argis("dm", "deletemap")) {
250 if (arg - argv < argc - 1) {
251 arg++;
252 map_remove_queue=add_to_string_list(map_remove_queue, *arg);
253 } else
254 usage(argv);
255 update_map_flag++;
256 }
257 else if (argis("lm", "listmap"))
258 list_map_flag++;
9cd2d193 259 else if (argis("acn", "addcontainer")) {
260 if (arg - argv < argc - 1) {
261 arg++;
262 container_add_queue =
263 add_to_string_list(container_add_queue, *arg);
264 } else
265 usage(argv);
266 update_container_flag++;
267 }
268 else if (argis("dcn", "deletecontainer")) {
269 if (arg - argv < argc - 1) {
270 arg++;
271 container_remove_queue =
272 add_to_string_list(container_remove_queue, *arg);
273 } else
274 usage(argv);
275 update_container_flag++;
276 }
277 else if (argis("lcn", "listcontainer"))
278 list_container_flag++;
7b6a099a 279 else if (argis("u", "unformatted"))
280 unformatted_flag++;
80e8aa14 281 else if (argis("n", "noauth"))
282 noauth++;
283 else if (argis("v", "verbose"))
284 verbose++;
285 else if (argis("db", "database"))
286 {
287 if (arg - argv < argc - 1)
288 {
289 ++arg;
290 server = *arg;
291 }
292 else
293 usage(argv);
294 }
295 else
296 usage(argv);
297 }
298 else if (hostname == NULL)
299 hostname = *arg;
300 else
301 usage(argv);
302 }
303 if (hostname == NULL)
304 usage(argv);
305
306 /* default to info_flag if nothing else was specified */
307 if(!(info_flag || update_flag || create_flag || \
7e689fac 308 delete_flag || list_map_flag || update_map_flag || \
9cd2d193 309 update_alias_flag || update_container_flag || \
310 list_container_flag)) {
80e8aa14 311 info_flag++;
312 }
313
314 /* fire up Moira */
9cd2d193 315 status = mrcl_connect(server, "stella", 7, !noauth);
80e8aa14 316 if (status == MRCL_AUTH_ERROR)
317 {
318 com_err(whoami, 0, "Try the -noauth flag if you don't "
319 "need authentication.");
320 }
321 if (status)
322 exit(2);
323
324 /* create if needed */
325 if (create_flag)
326 {
327 char *argv[30];
328 int cnt;
329
080e5e2c 330 for (cnt = 0; cnt < 16; cnt++) {
80e8aa14 331 argv[cnt] = "";
332 }
333
334 argv[0] = canonicalize_hostname(strdup(hostname));
335
336 if (vendor)
337 argv[1] = vendor;
338 if (model)
339 argv[2] = model;
340 if (os)
341 argv[3] = os;
342 if (location)
343 argv[4] = location;
344 if (contact)
345 argv[5] = contact;
080e5e2c 346 if (billing_contact)
347 argv[6] = billing_contact;
80e8aa14 348 /* The use field always gets set to "0" */
080e5e2c 349 argv[7] = "0";
80e8aa14 350 if (h_status)
080e5e2c 351 argv[8] = h_status;
80e8aa14 352 else
080e5e2c 353 argv[8] = "1";
80e8aa14 354 if (network)
080e5e2c 355 argv[9] = network;
80e8aa14 356 if (address)
080e5e2c 357 argv[10] = address;
d55f933a 358 else
080e5e2c 359 argv[10] = "unique";
80e8aa14 360 if (adm_cmt)
080e5e2c 361 argv[13] = adm_cmt;
80e8aa14 362 if (op_cmt)
080e5e2c 363 argv[14] = op_cmt;
80e8aa14 364
365 if (owner)
366 {
080e5e2c 367 argv[12] = owner->name;
80e8aa14 368 switch (owner->type)
369 {
370 case M_ANY:
371 case M_USER:
080e5e2c 372 argv[11] = "USER";
373 status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
80e8aa14 374 if (owner->type != M_ANY || status != MR_USER)
375 break;
376
377 case M_LIST:
080e5e2c 378 argv[11] = "LIST";
379 status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
80e8aa14 380 break;
381
382 case M_KERBEROS:
080e5e2c 383 argv[11] = "KERBEROS";
df183ce8 384 status = mrcl_validate_kerberos_member(argv[12], &argv[12]);
385 if (mrcl_get_message())
386 mrcl_com_err(whoami);
080e5e2c 387 status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
80e8aa14 388 break;
389
390 case M_NONE:
080e5e2c 391 argv[11] = "NONE";
392 status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
80e8aa14 393 break;
394 }
395 }
396 else
397 {
80e8aa14 398 argv[11] = "NONE";
080e5e2c 399 argv[12] = "NONE";
80e8aa14 400
080e5e2c 401 status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
80e8aa14 402 }
403
404 if (status)
405 {
406 com_err(whoami, status, "while creating host.");
407 exit(1);
408 }
409
410 }
411 else if (update_flag)
412 {
413 char *old_argv[30];
414 char *argv[16];
415 char *args[5];
80e8aa14 416
417 args[0] = canonicalize_hostname(strdup(hostname));
418 args[1] = args[2] = args[3] = "*";
419
420 status = wrap_mr_query("get_host", 4, args, store_host_info, old_argv);
421 if (status)
422 {
423 com_err(whoami, status, "while getting list information");
424 exit(1);
425 }
426
427 argv[1] = old_argv[0];
428 argv[2] = old_argv[1];
429 argv[3] = old_argv[2];
430 argv[4] = old_argv[3];
431 argv[5] = old_argv[4];
432 argv[6] = old_argv[5];
433 argv[7] = old_argv[6];
434 argv[8] = old_argv[7];
080e5e2c 435 argv[9] = old_argv[8];
80e8aa14 436 argv[10] = old_argv[10];
437 argv[11] = old_argv[11];
438 argv[12] = old_argv[12];
439 argv[13] = old_argv[13];
440 argv[14] = old_argv[14];
080e5e2c 441 argv[15] = old_argv[15];
80e8aa14 442
443 argv[0] = canonicalize_hostname(strdup(hostname));
444 if (newname)
6c114a34 445 argv[1] = canonicalize_hostname(strdup(newname));
80e8aa14 446 if (vendor)
447 argv[2] = vendor;
448 if (model)
449 argv[3] = model;
450 if (os)
451 argv[4] = os;
452 if (location)
453 argv[5] = location;
454 if (contact)
455 argv[6] = contact;
080e5e2c 456 if (billing_contact)
457 argv[7] = billing_contact;
80e8aa14 458 if (h_status)
080e5e2c 459 argv[9] = h_status;
80e8aa14 460 if (network)
080e5e2c 461 argv[10] = network;
80e8aa14 462 if (address)
080e5e2c 463 argv[11] = address;
80e8aa14 464 if (adm_cmt)
080e5e2c 465 argv[14] = adm_cmt;
80e8aa14 466 if (op_cmt)
080e5e2c 467 argv[15] = op_cmt;
80e8aa14 468
469 if (owner)
470 {
080e5e2c 471 argv[13] = owner->name;
80e8aa14 472 switch (owner->type)
473 {
474 case M_ANY:
475 case M_USER:
080e5e2c 476 argv[12] = "USER";
477 status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
80e8aa14 478 if (owner->type != M_ANY || status != MR_USER)
479 break;
480
481 case M_LIST:
080e5e2c 482 argv[12] = "LIST";
483 status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
80e8aa14 484 break;
485
486 case M_KERBEROS:
080e5e2c 487 argv[12] = "KERBEROS";
df183ce8 488 status = mrcl_validate_kerberos_member(argv[13], &argv[13]);
489 if (mrcl_get_message())
490 mrcl_com_err(whoami);
080e5e2c 491 status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
80e8aa14 492 break;
493
494 case M_NONE:
080e5e2c 495 argv[12] = "NONE";
496 status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
80e8aa14 497 break;
498 }
499 }
500 else
080e5e2c 501 status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
80e8aa14 502
503 if (status)
504 com_err(whoami, status, "while updating host.");
505 else if (newname)
506 hostname = newname;
507 }
508
509 /* create aliases if necessary */
510 if (alias_add_queue) {
511 struct string_list *q = alias_add_queue;
512
513 while(q) {
514 char *alias = q->string;
515 char *args[2];
516
5aa7fdfd 517 args[0] = partial_canonicalize_hostname(strdup(alias));
80e8aa14 518 args[1] = canonicalize_hostname(strdup(hostname));
519 status = wrap_mr_query("add_hostalias", 2, args, NULL, NULL);
520 if (status) {
521 com_err(whoami, status, "while adding host alias");
522 exit(1);
523 }
524
525 q = q->next;
526 }
527 }
528
529 /* delete aliases if necessary */
530 if (alias_remove_queue) {
531 struct string_list *q = alias_remove_queue;
532
533 while(q) {
534 char *alias = q->string;
535 char *args[2];
536
5aa7fdfd 537 args[0] = partial_canonicalize_hostname(strdup(alias));
80e8aa14 538 args[1] = canonicalize_hostname(strdup(hostname));
539 status = wrap_mr_query("delete_hostalias", 2, args, NULL, NULL);
540 if (status) {
541 com_err(whoami, status, "while deleting host alias");
542 exit(1);
543 }
544
545 q = q->next;
546 }
547 }
548
549 /* create cluster mappings */
550 if (map_add_queue) {
551 struct string_list *q = map_add_queue;
552
553 while(q) {
554 char *clustername = q->string;
555 char *args[2];
556
557 args[0] = canonicalize_hostname(strdup(hostname));
558 args[1] = clustername;
559 status = wrap_mr_query("add_machine_to_cluster", 2, args, NULL, NULL);
560 if (status) {
561 com_err(whoami, status, "while adding cluster mapping");
562 exit(1);
563 }
564
565 q = q->next;
566 }
567 }
568
569 /* delete cluster mappings */
570 if (map_remove_queue) {
571 struct string_list *q = map_remove_queue;
572
573 while(q) {
574 char *clustername = q->string;
575 char *args[2];
576
577 args[0] = canonicalize_hostname(strdup(hostname));
578 args[1] = clustername;
579 status = wrap_mr_query("delete_machine_from_cluster", 2, args,
580 NULL, NULL);
581 if (status) {
582 com_err(whoami, status, "while deleting cluster mapping");
583 exit(1);
584 }
585
586 q = q->next;
587 }
588 }
589
9cd2d193 590 /* add container mappings */
591 if (container_add_queue) {
592 struct string_list *q = container_add_queue;
593
594 while (q) {
595 char *containername = q->string;
596 char *args[2];
597
598 args[0] = canonicalize_hostname(strdup(hostname));
599 args[1] = containername;
600 status = wrap_mr_query("add_machine_to_container", 2, args,
601 NULL, NULL);
602
603 if (status) {
604 com_err(whoami, status, "while adding container mapping");
605 exit(1);
606 }
607
608 q = q->next;
609 }
610 }
611
612 /* delete container mappings */
613 if (container_remove_queue) {
614 struct string_list *q = container_remove_queue;
615
616 while (q) {
617 char *containername = q->string;
618 char *args[2];
619
620 args[0] = canonicalize_hostname(strdup(hostname));
621 args[1] = containername;
622 status = wrap_mr_query("delete_machine_from_container", 2, args,
623 NULL, NULL);
624
625 if (status) {
626 com_err(whoami, status, "while deleting container mapping");
627 exit(1);
628 }
629
630 q = q->next;
631 }
632 }
633
80e8aa14 634 /* display list info if requested to */
635 if (info_flag) {
636 struct mqelem *elem = NULL;
637 char *args[5];
638 char *argv[30];
639
640 args[0] = canonicalize_hostname(strdup(hostname));
641 args[1] = args[2] = args[3] = "*";
642 status = wrap_mr_query("get_host", 4, args, store_host_info, argv);
643 if (status) {
644 com_err(whoami, status, "while getting host information");
645 exit(1);
646 }
7b6a099a 647 if (unformatted_flag)
648 show_host_info_unformatted(argv);
649 else
650 show_host_info(argv);
80e8aa14 651 }
652
653 /* list cluster mappings if needed */
654 if (list_map_flag) {
655 char *args[3];
656
657 args[0] = canonicalize_hostname(strdup(hostname));
658 args[1] = "*";
659 status = wrap_mr_query("get_machine_to_cluster_map", 2, args,
660 show_machine_in_cluster, NULL);
661 if (status)
662 if (status != MR_NO_MATCH) {
663 com_err(whoami, status, "while getting cluster mappings");
664 exit(1);
665 }
666 }
667
9cd2d193 668 /* list container mappings if needed */
669 if (list_container_flag) {
670 char *argv[1];
671
672 argv[0] = canonicalize_hostname(strdup(hostname));
673 status = wrap_mr_query("get_machine_to_container_map", 1, argv,
674 show_machine_in_container, NULL);
675
676 if (status)
677 if (status != MR_NO_MATCH) {
678 com_err(whoami, status, "while getting container mappings");
679 exit(1);
680 }
681 }
682
80e8aa14 683 if (delete_flag) {
684 char *argv[1];
685
686 argv[0] = canonicalize_hostname(strdup(hostname));
687 status = wrap_mr_query("delete_host", 1, argv, NULL, NULL);
688 if (status) {
689 com_err(whoami, status, "while deleting host");
690 exit(1);
691 }
692 }
693
694 /* We're done! */
695 mr_disconnect();
696 exit(success ? 0 : 1);
697}
698
699void usage(char **argv)
700{
533bacb3 701#define USAGE_OPTIONS_FORMAT " %-39s%s\n"
80e8aa14 702 fprintf(stderr, "Usage: %s hostname [options]\n", argv[0]);
703 fprintf(stderr, "Options are\n");
533bacb3 704 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C | -create",
80e8aa14 705 "-O | -owner owner");
533bacb3 706 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-D | -delete",
80e8aa14 707 "-S | -status status");
533bacb3 708 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-R | -rename newname",
80e8aa14 709 "-V | -vendor vendor");
533bacb3 710 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-a | -addalias alias",
80e8aa14 711 "-M | -model model");
533bacb3 712 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-d | -deletealias alias",
80e8aa14 713 "-L | -location location");
533bacb3 714 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-i | -info",
80e8aa14 715 "-o | -os os");
533bacb3 716 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-oc | -opcmt op_cmt",
80e8aa14 717 "-c | -contact contact");
533bacb3 718 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ac | -admcmt adm_cmt",
080e5e2c 719 "-bc | -billingcontact billing_contact");
720 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-A | -address address",
80e8aa14 721 "-N | -network network");
080e5e2c 722 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-am | -addmap cluster",
723 "-dm | deletemap cluster");
9cd2d193 724 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-acn | -addcontainer container",
725 "-dcn | -deletecontainer container");
080e5e2c 726 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-lm | -listmap",
9cd2d193 727 "-lcn | -listcontainer");
7b6a099a 728 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u | -unformatted",
729 "-v | -verbose");
730 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-n | -noauth",
731 "-db | -database host[:port]");
80e8aa14 732 exit(1);
733}
734
735/* Show alias information */
736
737static int show_has_aliases;
738
739int show_alias_info(int argc, char **argv, void *hint)
740{
741 if(!show_has_aliases++)
742 printf("Aliases: %s", argv[0]);
743 else
744 printf(", %s", argv[0]);
745
746 return MR_CONT;
747}
748
7b6a099a 749int show_alias_info_unformatted(int argc, char **argv, void *hint)
750{
751 if(!show_has_aliases++)
752 printf("Alias: %s", argv[0]);
753 else
754 printf(", %s", argv[0]);
755
756 return MR_CONT;
757}
758
80e8aa14 759static char *states[] = {
760 "Reserved (0)",
761 "Active (1)",
762 "None (2)",
763 "Deleted (3)"
764};
765
766static char *MacState(int state)
767{
768 static char buf[BUFSIZ];
769
770 if (state < 0 || state > 3)
771 {
772 sprintf(buf, "Unknown (%d)", state);
773 return buf;
774 }
775 return states[state];
776}
777
778/* Retrieve information about a host */
779
780int store_host_info(int argc, char **argv, void *hint)
781{
782 int i;
783 char **nargv = hint;
784
785 for(i=0; i<argc; i++)
786 nargv[i] = strdup(argv[i]);
787
788 return MR_CONT;
789}
790
791void show_host_info(char **argv)
792{
793 char tbuf[256];
794 char *args[3];
795 struct mqelem *elem = NULL;
796 int stat;
797
798 printf("Machine: %s\n", argv[M_NAME]);
799 args[0] = "*";
800 args[1] = argv[M_NAME];
801 show_has_aliases = 0;
802 stat = wrap_mr_query("get_hostalias", 2, args, show_alias_info, &elem);
803 printf("\n");
804 if (stat) {
805 if (stat != MR_NO_MATCH)
806 com_err(whoami, stat, "while getting aliases");
807 } else {
808 printf("\n");
809 }
810 sprintf(tbuf, "%s %s", argv[M_OWNER_TYPE],
811 strcmp(argv[M_OWNER_TYPE], "NONE") ? argv[M_OWNER_NAME] : "");
812 printf("Address: %-16s Network: %-16s\n",
813 argv[M_ADDR], argv[M_SUBNET]);
814 printf("Owner: %-16s Use data: %s\n", tbuf, argv[M_INUSE]);
815 printf("Status: %-16s Changed: %s\n",
816 MacState(atoi(argv[M_STAT])), argv[M_STAT_CHNG]);
817 printf("\n");
080e5e2c 818 printf("Vendor: %-16s Location: %s\n", argv[M_VENDOR],
819 argv[M_LOC]);
820 printf("Model: %-16s Contact: %s\n", argv[M_MODEL],
821 argv[M_CONTACT]);
822 printf("OS: %-16s Billing Contact: %s\n", argv[M_OS],
823 argv[M_BILL_CONTACT]);
824 printf("\nOpt: %s\n", argv[M_USE]);
80e8aa14 825 printf("\nAdm cmt: %s\n", argv[M_ACOMMENT]);
826 printf("Op cmt: %s\n", argv[M_OCOMMENT]);
827 printf("\n");
828 printf("Created by %s on %s\n", argv[M_CREATOR], argv[M_CREATED]);
829 printf("Last mod by %s at %s with %s.\n", argv[M_MODBY], argv[M_MODTIME], argv[M_MODWITH]);
830}
831
7b6a099a 832void show_host_info_unformatted(char **argv)
833{
834 char tbuf[256];
835 char *args[3];
836 struct mqelem *elem = NULL;
837 int stat;
838
839 printf("Machine: %s\n", argv[M_NAME]);
840 args[0] = "*";
841 args[1] = argv[M_NAME];
842 show_has_aliases = 0;
843 stat = wrap_mr_query("get_hostalias", 2, args, show_alias_info_unformatted,
844 &elem);
845 if (stat && stat != MR_NO_MATCH)
846 com_err(whoami, stat, "while getting aliases");
847 else
848 printf("\n");
849 printf("Address: %s\n", argv[M_ADDR]);
850 printf("Network: %s\n", argv[M_SUBNET]);
851 printf("Owner Type: %s\n", argv[M_OWNER_TYPE]);
852 printf("Owner: %s\n", argv[M_OWNER_NAME]);
853 printf("Status: %s\n", MacState(atoi(argv[M_STAT])));
854 printf("Changed: %s\n", argv[M_STAT_CHNG]);
855 printf("Use data: %s\n", argv[M_INUSE]);
856 printf("Vendor: %s\n", argv[M_VENDOR]);
857 printf("Model: %s\n", argv[M_MODEL]);
858 printf("OS: %s\n", argv[M_OS]);
859 printf("Location: %s\n", argv[M_LOC]);
860 printf("Contact: %s\n", argv[M_CONTACT]);
861 printf("Billing Contact: %s\n", argv[M_BILL_CONTACT]);
862 printf("Opt: %s\n", argv[M_USE]);
863 printf("Adm cmt: %s\n", argv[M_ACOMMENT]);
864 printf("Op cmt: %s\n", argv[M_OCOMMENT]);
865 printf("Created by: %s\n", argv[M_CREATOR]);
866 printf("Created on: %s\n", argv[M_CREATED]);
867 printf("Last mod by: %s\n", argv[M_MODBY]);
868 printf("Last mod on: %s\n", argv[M_MODTIME]);
869 printf("Last mod with: %s\n", argv[M_MODWITH]);
870}
871
80e8aa14 872int show_machine_in_cluster(int argc, char **argv, void *hint)
873{
874 printf("Machine: %-30s Cluster: %-30s\n", argv[0], argv[1]);
875
876 return MR_CONT;
877}
878
9cd2d193 879int show_machine_in_container(int argc, char **argv, void *hint)
880{
881 printf("Machine: %-30s Container: %-25s\n", argv[0], argv[1]);
882
883 return MR_CONT;
884}
885
80e8aa14 886/* Parse a line of input, fetching a member. NULL is returned if a member
887 * is not found. ';' is a comment character.
888 */
889
890struct owner_type *parse_member(char *s)
891{
892 struct owner_type *m;
893 char *p, *lastchar;
894
895 while (*s && isspace(*s))
896 s++;
897 lastchar = p = s;
898 while (*p && *p != '\n' && *p != ';')
899 {
900 if (isprint(*p) && !isspace(*p))
901 lastchar = p++;
902 else
903 p++;
904 }
905 lastchar++;
906 *lastchar = '\0';
907 if (p == s || strlen(s) == 0)
908 return NULL;
909
910 if (!(m = malloc(sizeof(struct owner_type))))
911 return NULL;
912
913 if ((p = strchr(s, ':')))
914 {
915 *p = '\0';
916 m->name = ++p;
917 if (!strcasecmp("user", s))
918 m->type = M_USER;
919 else if (!strcasecmp("list", s))
920 m->type = M_LIST;
80e8aa14 921 else if (!strcasecmp("kerberos", s))
922 m->type = M_KERBEROS;
923 else if (!strcasecmp("none", s))
924 m->type = M_NONE;
925 else
926 {
927 m->type = M_ANY;
928 *(--p) = ':';
929 m->name = s;
930 }
931 m->name = strdup(m->name);
932 }
933 else
934 {
935 m->name = strdup(s);
936 m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
937 }
938 return m;
939}
940
941struct string_list *add_to_string_list(struct string_list *old_list, char *s) {
942 struct string_list *new_list;
943
944 new_list = (struct string_list *)malloc(sizeof(struct string_list *));
945 new_list->next = old_list;
946 new_list->string = s;
947
948 return new_list;
949}
950
951int wrap_mr_query(char *handle, int argc, char **argv,
952 int (*callback)(int, char **, void *), void *callarg) {
953 if (verbose)
954 print_query(handle, argc, argv);
955
956 return mr_query(handle, argc, argv, callback, callarg);
957}
958
959void print_query(char *query_name, int argc, char **argv) {
960 int cnt;
961
962 printf("qy %s", query_name);
963 for(cnt=0; cnt<argc; cnt++)
964 printf(" <%s>", argv[cnt]);
965 printf("\n");
966}
This page took 0.194879 seconds and 5 git commands to generate.