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