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