]> andersk Git - moira.git/blob - clients/stella/stella.c
Merge changes from ip-billing-dev branch.
[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)
698       {
699         fprintf(stderr, "\nWarning:  This host is on a private subnet.\n");
700         fprintf(stderr, "Billing information shown is superceded by billing information for the subnet.\n");
701       }
702   }
703
704   /* list cluster mappings if needed */
705   if (list_map_flag) {
706     char *args[3];
707
708     args[0] = canonicalize_hostname(strdup(hostname));
709     args[1] = "*";
710     status = wrap_mr_query("get_machine_to_cluster_map", 2, args,
711                       show_machine_in_cluster, NULL);
712     if (status)
713       if (status != MR_NO_MATCH) {
714         com_err(whoami, status, "while getting cluster mappings");
715         exit(1);
716       }
717   }
718
719   /* list container mappings if needed */
720   if (list_container_flag) {
721     char *argv[1];
722
723     argv[0] = canonicalize_hostname(strdup(hostname));
724     status = wrap_mr_query("get_machine_to_container_map", 1, argv,
725                            show_machine_in_container, NULL);
726
727     if (status)
728       if (status != MR_NO_MATCH) {
729         com_err(whoami, status, "while getting container mappings");
730         exit(1);
731       }
732   }
733
734   if (delete_flag) {
735     char *argv[1];
736
737     argv[0] = canonicalize_hostname(strdup(hostname));
738     status = wrap_mr_query("delete_host", 1, argv, NULL, NULL);
739     if (status) {
740       com_err(whoami, status, "while deleting host");
741       exit(1);
742     }
743   }
744
745   /* We're done! */
746   mr_disconnect();
747   exit(success ? 0 : 1);
748 }
749
750 void usage(char **argv)
751 {
752 #define USAGE_OPTIONS_FORMAT "  %-39s%s\n"
753   fprintf(stderr, "Usage: %s hostname [options]\n", argv[0]);
754   fprintf(stderr, "Options are\n");
755   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C   | -create",
756           "-O   | -owner owner");
757   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-D   | -delete",
758           "-S   | -status status");
759   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-R   | -rename newname",
760           "-V   | -vendor vendor");
761   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-a   | -addalias alias",
762           "-M   | -model model");
763   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-d   | -deletealias alias",
764           "-L   | -location location");
765   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-i   | -info",
766           "-o   | -os os");
767   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-oc  | -opcmt op_cmt",
768           "-c   | -contact contact");
769   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ac  | -admcmt adm_cmt",
770           "-bc  | -billingcontact billing_contact");
771   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-an  | -accountnumber account_number",          "-A   | -address address");
772   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-N   | -network network",
773           "-am  | -addmap cluster");
774   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-dm  | deletemap cluster",
775           "-acn | -addcontainer container");
776   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-dcn | -deletecontainer container",
777           "-lm  | -listmap");
778   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-lcn | -listcontainer",
779           "-u   | -unformatted");
780   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v   | -verbose",
781           "-n   | -noauth");
782   fprintf(stderr, "  %-39s\n" , "-db  | -database host[:port]");
783   exit(1);
784 }
785
786 /* Show alias information */
787
788 static int show_has_aliases;
789
790 int show_alias_info(int argc, char **argv, void *hint)
791 {
792   if(!show_has_aliases++)
793     printf("Aliases:  %s", argv[0]);
794   else
795     printf(", %s", argv[0]);
796
797   return MR_CONT;
798 }
799
800 int show_alias_info_unformatted(int argc, char **argv, void *hint)
801 {
802   if(!show_has_aliases++)
803     printf("Alias:            %s", argv[0]);
804   else
805     printf(", %s", argv[0]);
806
807   return MR_CONT;
808 }
809
810 static char *states[] = {
811   "Reserved (0)",
812   "Active (1)",
813   "None (2)",
814   "Deleted (3)"
815 };
816
817 static char *MacState(int state)
818 {
819   static char buf[BUFSIZ];
820
821   if (state < 0 || state > 3)
822     {
823       sprintf(buf, "Unknown (%d)", state);
824       return buf;
825     }
826   return states[state];
827 }
828
829 /* Retrieve information about a host */
830
831 int store_host_info(int argc, char **argv, void *hint)
832 {
833   int i;
834   char **nargv = hint;
835
836   for(i=0; i<argc; i++)
837     nargv[i] = strdup(argv[i]);
838
839   return MR_CONT;
840 }
841
842 void show_host_info(char **argv)
843 {
844   char tbuf[256];
845   char *args[3];
846   struct mqelem *elem = NULL;
847   int stat;
848
849   printf("Machine:  %s\n", argv[M_NAME]);
850   args[0] = "*";
851   args[1] = argv[M_NAME];
852   show_has_aliases = 0;
853   stat = wrap_mr_query("get_hostalias", 2, args, show_alias_info, &elem);
854   printf("\n");
855   if (stat) {
856     if (stat != MR_NO_MATCH)
857       com_err(whoami, stat, "while getting aliases");
858   } else {
859     printf("\n");
860   }
861   sprintf(tbuf, "%s %s", argv[M_OWNER_TYPE],
862           strcmp(argv[M_OWNER_TYPE], "NONE") ? argv[M_OWNER_NAME] : "");
863   printf("Address:  %-16s    Network:    %-16s\n",
864           argv[M_ADDR], argv[M_SUBNET]);
865   printf("Owner:    %-16s    Use data:   %s\n", tbuf, argv[M_INUSE]);
866   printf("Status:   %-16s    Changed:    %s\n",
867           MacState(atoi(argv[M_STAT])), argv[M_STAT_CHNG]);
868   printf("\n");
869   printf("Vendor:   %-16s    Location:        %s\n", argv[M_VENDOR], 
870          argv[M_LOC]);
871   printf("Model:    %-16s    Contact:         %s\n", argv[M_MODEL], 
872          argv[M_CONTACT]);
873   printf("OS:       %-16s    Billing Contact: %s\n", argv[M_OS], 
874          argv[M_BILL_CONTACT]);
875   printf("Opt:      %-16s    Account Number:  %s\n", argv[M_USE],
876          argv[M_ACCT_NUMBER]);
877   printf("\nAdm cmt: %s\n", argv[M_ACOMMENT]);
878   printf("Op cmt:  %s\n", argv[M_OCOMMENT]);
879   printf("\n");
880   printf("Created  by %s on %s\n", argv[M_CREATOR], argv[M_CREATED]);
881   printf("Last mod by %s at %s with %s.\n", argv[M_MODBY], argv[M_MODTIME], argv[M_MODWITH]);
882 }
883
884 void show_host_info_unformatted(char **argv)
885 {
886   char *args[3];
887   struct mqelem *elem = NULL;
888   int stat;
889
890   printf("Machine:          %s\n", argv[M_NAME]);
891   args[0] = "*";
892   args[1] = argv[M_NAME];
893   show_has_aliases = 0;
894   stat = wrap_mr_query("get_hostalias", 2, args, show_alias_info_unformatted, 
895                        &elem);
896   if (stat && stat != MR_NO_MATCH)
897     com_err(whoami, stat, "while getting aliases");
898   else
899     printf("\n");
900   printf("Address:          %s\n", argv[M_ADDR]);
901   printf("Network:          %s\n", argv[M_SUBNET]);
902   printf("Owner Type:       %s\n", argv[M_OWNER_TYPE]);
903   printf("Owner:            %s\n", argv[M_OWNER_NAME]);
904   printf("Status:           %s\n", MacState(atoi(argv[M_STAT])));
905   printf("Changed:          %s\n", argv[M_STAT_CHNG]);
906   printf("Use data:         %s\n", argv[M_INUSE]);
907   printf("Vendor:           %s\n", argv[M_VENDOR]);
908   printf("Model:            %s\n", argv[M_MODEL]);
909   printf("OS:               %s\n", argv[M_OS]);
910   printf("Location:         %s\n", argv[M_LOC]);
911   printf("Contact:          %s\n", argv[M_CONTACT]);
912   printf("Billing Contact:  %s\n", argv[M_BILL_CONTACT]);
913   printf("Opt:              %s\n", argv[M_USE]);
914   printf("Adm cmt:          %s\n", argv[M_ACOMMENT]);
915   printf("Op cmt:           %s\n", argv[M_OCOMMENT]);
916   printf("Created by:       %s\n", argv[M_CREATOR]);
917   printf("Created on:       %s\n", argv[M_CREATED]);
918   printf("Last mod by:      %s\n", argv[M_MODBY]);
919   printf("Last mod on:      %s\n", argv[M_MODTIME]);
920   printf("Last mod with:    %s\n", argv[M_MODWITH]);
921 }
922
923 int show_machine_in_cluster(int argc, char **argv, void *hint)
924 {
925   printf("Machine: %-30s Cluster: %-30s\n", argv[0], argv[1]);
926
927   return MR_CONT;
928 }
929
930 int show_machine_in_container(int argc, char **argv, void *hint)
931 {
932   printf("Machine: %-30s Container: %-25s\n", argv[0], argv[1]); 
933
934   return MR_CONT;
935 }
936
937 /* Parse a line of input, fetching a member.  NULL is returned if a member
938  * is not found.  ';' is a comment character.
939  */
940
941 struct owner_type *parse_member(char *s)
942 {
943   struct owner_type *m;
944   char *p, *lastchar;
945
946   while (*s && isspace(*s))
947     s++;
948   lastchar = p = s;
949   while (*p && *p != '\n' && *p != ';')
950     {
951       if (isprint(*p) && !isspace(*p))
952         lastchar = p++;
953       else
954         p++;
955     }
956   lastchar++;
957   *lastchar = '\0';
958   if (p == s || strlen(s) == 0)
959     return NULL;
960
961   if (!(m = malloc(sizeof(struct owner_type))))
962     return NULL;
963
964   if ((p = strchr(s, ':')))
965     {
966       *p = '\0';
967       m->name = ++p;
968       if (!strcasecmp("user", s))
969         m->type = M_USER;
970       else if (!strcasecmp("list", s))
971         m->type = M_LIST;
972       else if (!strcasecmp("kerberos", s))
973         m->type = M_KERBEROS;
974       else if (!strcasecmp("none", s))
975         m->type = M_NONE;
976       else
977         {
978           m->type = M_ANY;
979           *(--p) = ':';
980           m->name = s;
981         }
982       m->name = strdup(m->name);
983     }
984   else
985     {
986       m->name = strdup(s);
987       m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
988     }
989   return m;
990 }
991
992 struct string_list *add_to_string_list(struct string_list *old_list, char *s) {
993   struct string_list *new_list;
994
995   new_list = (struct string_list *)malloc(sizeof(struct string_list *));
996   new_list->next = old_list;
997   new_list->string = s;
998
999   return new_list;
1000 }
1001
1002 int wrap_mr_query(char *handle, int argc, char **argv,
1003                   int (*callback)(int, char **, void *), void *callarg) {
1004   if (verbose)
1005     print_query(handle, argc, argv);
1006
1007   return mr_query(handle, argc, argv, callback, callarg);
1008 }
1009
1010 void print_query(char *query_name, int argc, char **argv) {
1011   int cnt;
1012
1013   printf("qy %s", query_name);
1014   for(cnt=0; cnt<argc; cnt++)
1015     printf(" <%s>", argv[cnt]);
1016   printf("\n");
1017 }
This page took 0.114303 seconds and 5 git commands to generate.