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