]> andersk Git - moira.git/blob - clients/stella/stella.c
Add option for unformatted output (one field per line, in
[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 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 RCSID("$Header$");
25
26 struct owner_type {
27   int type;
28   char *name;
29 };
30
31 struct mqelem {
32   struct mqelem *q_forw;
33   struct mqelem *q_back;
34   void *q_data;
35 };
36
37 struct string_list {
38   char *string;
39   struct string_list *next;
40 };
41
42 #define M_ANY           0
43 #define M_USER          1
44 #define M_LIST          2
45 #define M_KERBEROS      3
46 #define M_NONE          4
47
48 /* argument parsing macro */
49 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
50
51 /* flags from command line */
52 int info_flag, update_flag, create_flag, delete_flag, list_map_flag;
53 int update_alias_flag, update_map_flag, verbose, noauth;
54 int list_container_flag, update_container_flag, unformatted_flag;
55
56 struct string_list *alias_add_queue, *alias_remove_queue;
57 struct string_list *map_add_queue, *map_remove_queue;
58 struct string_list *container_add_queue, *container_remove_queue;
59
60 char *hostname, *whoami;
61
62 char *newname, *address, *network, *h_status, *vendor, *model;
63 char *os, *location, *contact, *billing_contact, *adm_cmt, *op_cmt;
64
65 struct owner_type *owner;
66
67 void usage(char **argv);
68 int store_host_info(int argc, char **argv, void *hint);
69 void show_host_info(char **argv);
70 void show_host_info_unformatted(char **argv);
71 int show_machine_in_cluster(int argc, char **argv, void *hint);
72 int show_machine_in_container(int argc, char **argv, void *hint);
73 struct owner_type *parse_member(char *s);
74 struct string_list *add_to_string_list(struct string_list *old_list, char *s);
75 int wrap_mr_query(char *handle, int argc, char **argv,
76                   int (*callback)(int, char **, void *), void *callarg);
77 void print_query(char *query_name, int argc, char **argv);
78
79 int main(int argc, char **argv)
80 {
81   int status, success;
82   char **arg = argv;
83   char *server = NULL;
84
85   /* clear all flags & lists */
86   info_flag = update_flag = create_flag = list_map_flag = update_map_flag = 0;
87   update_alias_flag = verbose = noauth = 0;
88   list_container_flag = update_container_flag = 0;
89   newname = address = network = h_status = vendor = model = NULL;
90   os = location = contact = billing_contact = adm_cmt = op_cmt = NULL;
91   owner = NULL;
92   alias_add_queue = alias_remove_queue = NULL;
93   map_add_queue = map_remove_queue = NULL;
94   container_add_queue = container_remove_queue = NULL;
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;
145               int len;
146
147               arg++;
148               update_flag++;
149               h_status = *arg;
150
151               len = strlen(h_status);
152               for(i = 0; i < len; i++) {
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           }
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           }
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);
231             update_alias_flag++;
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);
239             update_alias_flag++;
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++;
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++;
279           else if (argis("u", "unformatted"))
280             unformatted_flag++;
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     || \
308        delete_flag || list_map_flag || update_map_flag || \
309        update_alias_flag || update_container_flag || \
310        list_container_flag)) {
311     info_flag++;
312   }
313
314   /* fire up Moira */
315   status = mrcl_connect(server, "stella", 7, !noauth);
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
330       for (cnt = 0; cnt < 16; cnt++) {
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;
346       if (billing_contact)
347         argv[6] = billing_contact;
348       /* The use field always gets set to "0" */
349       argv[7] = "0";
350       if (h_status)
351         argv[8] = h_status;
352       else
353         argv[8] = "1";
354       if (network)
355         argv[9] = network;
356       if (address)
357         argv[10] = address;
358       else
359         argv[10] = "unique";
360       if (adm_cmt)
361         argv[13] = adm_cmt;
362       if (op_cmt)
363         argv[14] = op_cmt;
364
365       if (owner)
366         {
367           argv[12] = owner->name;
368           switch (owner->type)
369             {
370             case M_ANY:
371             case M_USER:
372               argv[11] = "USER";
373               status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
374               if (owner->type != M_ANY || status != MR_USER)
375                 break;
376
377             case M_LIST:
378               argv[11] = "LIST";
379               status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
380               break;
381
382             case M_KERBEROS:
383               argv[11] = "KERBEROS";
384               status = mrcl_validate_kerberos_member(argv[12], &argv[12]);
385               if (mrcl_get_message())
386                 mrcl_com_err(whoami);
387               status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
388               break;
389
390             case M_NONE:
391               argv[11] = "NONE";
392               status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
393               break;
394             }
395         }
396       else
397         {
398           argv[11] = "NONE";
399           argv[12] = "NONE";
400
401           status = wrap_mr_query("add_host", 15, argv, NULL, NULL);
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];
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];
435       argv[9] = old_argv[8];
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];
441       argv[15] = old_argv[15];
442
443       argv[0] = canonicalize_hostname(strdup(hostname));
444       if (newname)
445         argv[1] = canonicalize_hostname(strdup(newname));
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;
456       if (billing_contact)
457         argv[7] = billing_contact;
458       if (h_status)
459         argv[9] = h_status;
460       if (network)
461         argv[10] = network;
462       if (address)
463         argv[11] = address;
464       if (adm_cmt)
465         argv[14] = adm_cmt;
466       if (op_cmt)
467         argv[15] = op_cmt;
468
469       if (owner)
470         {
471           argv[13] = owner->name;
472           switch (owner->type)
473             {
474             case M_ANY:
475             case M_USER:
476               argv[12] = "USER";
477               status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
478               if (owner->type != M_ANY || status != MR_USER)
479                 break;
480
481             case M_LIST:
482               argv[12] = "LIST";
483               status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
484               break;
485
486             case M_KERBEROS:
487               argv[12] = "KERBEROS";
488               status = mrcl_validate_kerberos_member(argv[13], &argv[13]);
489               if (mrcl_get_message())
490                 mrcl_com_err(whoami);
491               status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
492               break;
493
494             case M_NONE:
495               argv[12] = "NONE";
496               status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
497               break;
498             }
499         }
500       else
501         status = wrap_mr_query("update_host", 16, argv, NULL, NULL);
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
517       args[0] = partial_canonicalize_hostname(strdup(alias));
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
537       args[0] = partial_canonicalize_hostname(strdup(alias));
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
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
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     }
647     if (unformatted_flag)
648       show_host_info_unformatted(argv);
649     else
650       show_host_info(argv);
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
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
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
699 void usage(char **argv)
700 {
701 #define USAGE_OPTIONS_FORMAT "  %-39s%s\n"
702   fprintf(stderr, "Usage: %s hostname [options]\n", argv[0]);
703   fprintf(stderr, "Options are\n");
704   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C   | -create",
705           "-O   | -owner owner");
706   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-D   | -delete",
707           "-S   | -status status");
708   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-R   | -rename newname",
709           "-V   | -vendor vendor");
710   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-a   | -addalias alias",
711           "-M   | -model model");
712   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-d   | -deletealias alias",
713           "-L   | -location location");
714   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-i   | -info",
715           "-o   | -os os");
716   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-oc  | -opcmt op_cmt",
717           "-c   | -contact contact");
718   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ac  | -admcmt adm_cmt",
719           "-bc  | -billingcontact billing_contact");
720   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-A   | -address address",
721           "-N   | -network network");
722   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-am  | -addmap cluster",
723           "-dm  | deletemap cluster");
724   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-acn | -addcontainer container",
725           "-dcn | -deletecontainer container");
726   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-lm  | -listmap",
727           "-lcn | -listcontainer");
728   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u   | -unformatted",
729           "-v   | -verbose");
730   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-n   | -noauth", 
731           "-db  | -database host[:port]");
732   exit(1);
733 }
734
735 /* Show alias information */
736
737 static int show_has_aliases;
738
739 int 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
749 int 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
759 static char *states[] = {
760   "Reserved (0)",
761   "Active (1)",
762   "None (2)",
763   "Deleted (3)"
764 };
765
766 static 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
780 int 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
791 void 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");
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]);
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
832 void 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
872 int 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
879 int 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
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
890 struct 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;
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
941 struct 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
951 int 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
959 void 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.131854 seconds and 5 git commands to generate.