source: trunk/third/moira/clients/stanley/stanley.c @ 24319

Revision 24319, 23.7 KB checked in by broder, 14 years ago (diff)
New Moira snapshot from SVN.
Line 
1/* $Id: stanley.c 3979 2010-02-16 20:26:57Z zacheiss $
2 *
3 * Command line oriented Moira users tool.
4 *
5 * zacheiss@mit.edu, September 2001
6 *
7 * Inspired by blanche
8 *
9 * Copyright (C) 2000, 2001 by the Massachusetts Institute of Technology.
10 * For copying and distribution information, please see the file
11 * <mit-copyright.h>.
12 */
13
14#include <mit-copyright.h>
15#include <moira.h>
16#include <moira_site.h>
17#include <mrclient.h>
18
19#include <ctype.h>
20#include <errno.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24
25RCSID("$HeadURL: svn+ssh://svn.mit.edu/moira/trunk/moira/clients/stanley/stanley.c $ $Id: stanley.c 3979 2010-02-16 20:26:57Z zacheiss $");
26
27struct owner_type {
28  int type;
29  char *name;
30};
31
32struct string_list {
33  char *string;
34  struct string_list *next;
35};
36
37#define M_ANY           0
38#define M_USER          1
39#define M_LIST          2
40#define M_KERBEROS      3
41#define M_NONE          4
42
43/* argument parsing macro */
44#define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
45
46/* flags from command line */
47int info_flag, update_flag, create_flag, deact_flag, reg_flag;
48int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
49
50struct owner_type *sponsor;
51struct string_list *reservation_add_queue, *reservation_remove_queue;
52
53char *username, *whoami;
54
55char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
56char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration;
57char *alternate_email, *alternate_phone;
58
59struct owner_type *parse_member(char *s);
60
61static char *states[] = {
62  "Registerable (0)",
63  "Active (1)",
64  "Half Registered (2)",
65  "Deleted (3)",
66  "Not registerable (4)",
67  "Enrolled/Registerable (5)",
68  "Enrolled/Not Registerable (6)",
69  "Half Enrolled (7)",
70  "Registerable, Kerberos only (8)",
71  "Active, Kerberos only (9)"
72};
73
74static char *UserState(int state)
75{
76  static char buf[BUFSIZ];
77
78  if (state < 0 || state >= US_END)
79    {
80      sprintf(buf, "Unknown (%d)", state);
81      return buf;
82    }
83  return states[state];
84}
85
86void usage(char **argv);
87int save_query_info(int argc, char **argv, void *hint);
88int show_reservations(int argc, char **argv, void *hint);
89void show_user_info(char **argv);
90void show_user_info_unformatted(char **argv);
91struct string_list *add_to_string_list(struct string_list *old_list, char *s);
92int wrap_mr_query(char *handle, int argc, char **argv,
93                  int (*callback)(int, char **, void *), void *callarg);
94void print_query(char *query_name, int argc, char **argv);
95
96int main(int argc, char **argv)
97{
98  int status;
99  char **arg = argv;
100  char *server = NULL;
101
102  /* clear all flags & lists */
103  info_flag = update_flag = create_flag = deact_flag = reg_flag = 0;
104  list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0;
105  newlogin = uid = shell = winshell = last = first = middle = NULL;
106  u_status = clearid = class = comment = secure = NULL;
107  winhomedir = winprofiledir = expiration = alternate_email = alternate_phone = NULL;
108  reservation_add_queue = reservation_remove_queue = NULL;
109  sponsor = NULL;
110  whoami = argv[0];
111
112  /* parse args */
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", "deact"))
122            deact_flag++;
123          else if (argis("r", "register"))
124            reg_flag++;
125          else if (argis("R", "rename")) {
126            if (arg - argv < argc - 1) {
127              arg++;
128              update_flag++;
129              newlogin = *arg;
130            } else
131              usage(argv);
132          }
133          else if (argis("U", "uid")) {
134            if (arg - argv < argc - 1) {
135              arg++;
136              update_flag++;
137              uid = *arg;
138            } else
139              usage(argv);
140          }
141          else if (argis("s", "shell")) {
142            if (arg - argv < argc - 1) {
143              arg++;
144              update_flag++;
145              shell = *arg;
146            } else
147              usage(argv);
148          }
149          else if (argis("w", "winshell")) {
150            if (arg - argv < argc - 1) {
151              arg++;
152              update_flag++;
153              winshell = *arg;
154            } else
155              usage(argv);
156          }
157          else if (argis("L", "last")) {
158            if (arg - argv < argc - 1) {
159              arg++;
160              update_flag++;
161              last = *arg;
162            } else
163              usage(argv);
164          }
165          else if (argis("F", "first")) {
166            if (arg - argv < argc - 1) {
167              arg++;
168              update_flag++;
169              first = *arg;
170            } else
171              usage(argv);
172          }
173          else if (argis("M", "middle")) {
174            if (arg - argv < argc - 1) {
175              arg++;
176              update_flag++;
177              middle = *arg;
178            } else
179              usage(argv);
180          }
181          else if (argis("S", "status")) {
182            if (arg - argv < argc - 1) {
183              int i;
184              int len;
185
186              arg++;
187              update_flag++;
188              u_status = *arg;
189              len = strlen(u_status);
190              for (i = 0; i < len; i++) {
191                if (!isdigit(u_status[i])) {
192                  printf("Error:  status code %s is not numeric.\n", u_status);
193                  exit(1);
194                }
195              }
196            } else
197              usage(argv);
198          }
199          else if (argis("I", "mitid")) {
200            if (arg - argv < argc - 1) {
201              arg++;
202              update_flag++;
203              clearid = *arg;
204            } else
205              usage(argv);
206          }
207          else if (argis("cl", "class")) {
208            if (arg - argv < argc - 1) {
209              arg++;
210              update_flag++;
211              class = *arg;
212            } else
213              usage(argv);
214          }
215          else if (argis("c", "comment")) {
216            if (arg - argv < argc - 1) {
217              arg++;
218              update_flag++;
219              comment = *arg;
220            } else
221              usage(argv);
222          }
223          else if (argis("6", "secure")) {
224            if (arg - argv < argc - 1) {
225              arg++;
226              update_flag++;
227              secure = *arg;
228            } else
229              usage(argv);
230          }
231          else if (argis("wh", "winhomedir")) {
232            if (arg - argv < argc - 1) {
233              arg++;
234              update_flag++;
235              winhomedir = *arg;
236            } else
237              usage(argv);
238          }
239          else if (argis("wp", "winprofiledir")) {
240            if (arg - argv < argc - 1) {
241              arg++;
242              update_flag++;
243              winprofiledir = *arg;
244            } else
245              usage(argv);
246          }
247          else if (argis("sp", "sponsor")) {
248            if (arg - argv < argc - 1) {
249              arg++;
250              update_flag++;
251              sponsor = parse_member(*arg);
252            } else
253              usage(argv);
254          }
255          else if (argis("e", "expiration")) {
256            if (arg - argv < argc - 1) {
257              arg++;
258              update_flag++;
259              expiration = *arg;
260            } else
261              usage(argv);
262          }
263          else if (argis("ae", "alternateemail")) {
264            if (arg - argv < argc - 1) {
265              arg++;
266              update_flag++;
267              alternate_email = *arg;
268            } else
269              usage(argv);
270          }
271          else if (argis("ap", "alternatephone")) {
272            if (arg - argv < argc - 1) {
273              arg++;
274              update_flag++;
275              alternate_phone = *arg;
276            } else
277              usage(argv);
278          }
279          else if (argis("ar", "addreservation")) {
280            if (arg - argv < argc - 1) {
281              arg++;
282              reservation_add_queue = add_to_string_list(reservation_add_queue,
283                                                         *arg);
284            } else
285              usage(argv);
286            update_res_flag++;
287          }
288          else if (argis("dr", "deletereservation")) {
289            if (arg - argv < argc - 1) {
290              arg++;
291              reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg);
292            } else
293              usage(argv);
294            update_res_flag++;
295          }
296          else if (argis("lr", "listreservation"))
297            list_res_flag++;
298          else if (argis("u", "unformatted"))
299            unformatted_flag++;
300          else if (argis("n", "noauth"))
301            noauth++;
302          else if (argis("v", "verbose"))
303            verbose++;
304          else if (argis("db", "database"))
305            {
306              if (arg - argv < argc - 1)
307                {
308                  ++arg;
309                  server = *arg;
310                }
311              else
312                usage(argv);
313            }
314          else
315            usage(argv);
316        }
317      else if (username == NULL)
318        username = *arg;
319      else
320        usage(argv);
321    }
322  if (username == NULL && !create_flag)
323    usage(argv);
324
325  /* default to info_flag if nothing else was specified */
326  if(!(info_flag       || update_flag || create_flag   || \
327       deact_flag      || reg_flag    || list_res_flag || \
328       update_res_flag)) {
329    info_flag++;
330  }
331
332  /* fire up Moira */
333  status = mrcl_connect(server, "stanley", 14, !noauth);
334  if (status == MRCL_AUTH_ERROR)
335    {
336      com_err(whoami, 0, "Try the -noauth flag if you don't "
337              "need authentication.");
338    }
339  if (status)
340    exit(2);
341
342  /* create if needed */
343  if (create_flag)
344    {
345      char *argv[25];
346      int cnt;
347
348      for (cnt = 0; cnt < 25; cnt++) {
349        argv[cnt] = "";
350      }
351
352      if (username)
353        argv[U_NAME] = username;
354      else
355        argv[U_NAME] = UNIQUE_LOGIN;
356      if (uid)
357        argv[U_UID] = uid;
358      else
359        argv[U_UID] = UNIQUE_UID;
360      if (shell)
361        argv[U_SHELL] = shell;
362      else
363        argv[U_SHELL] = "/bin/athena/bash";
364      if (winshell)
365        argv[U_WINCONSOLESHELL] = winshell;
366      else
367        argv[U_WINCONSOLESHELL] = "cmd";
368      if (last)
369        argv[U_LAST] = last;
370      if (first)
371        argv[U_FIRST] = first;
372      if (middle)
373        argv[U_MIDDLE] = middle;
374      if (u_status)
375        argv[U_STATE] = u_status;
376      else
377        argv[U_STATE] = "0";
378      if (clearid)
379        argv[U_MITID] = clearid;
380      if (class)
381        argv[U_CLASS] = class;
382      if (comment)
383        argv[U_COMMENT] = comment;
384      /* Signature field always is the empty string */
385      argv[U_SIGNATURE] = "";
386      if (secure)
387        argv[U_SECURE] = secure;
388      else
389        argv[U_SECURE] = "0";
390      if (winhomedir)
391        argv[U_WINHOMEDIR] = winhomedir;
392      else
393        argv[U_WINHOMEDIR] = "[DFS]";
394      if (winprofiledir)
395        argv[U_WINPROFILEDIR] = winprofiledir;
396      else
397        argv[U_WINPROFILEDIR] = "[DFS]";
398      if (expiration)
399        argv[U_EXPIRATION] = expiration;
400      if (alternate_email)
401        argv[U_ALT_EMAIL] = alternate_email;
402      if (alternate_phone)
403        argv[U_ALT_PHONE] = alternate_phone;
404      if (sponsor)
405        {
406          argv[U_SPONSOR_NAME] = sponsor->name;
407          switch (sponsor->type)
408            {
409            case M_ANY:
410            case M_USER:
411              argv[U_SPONSOR_TYPE] = "USER";
412              status = wrap_mr_query("add_user_account", 20, argv, NULL, NULL);
413              if (sponsor->type != M_ANY || status != MR_USER)
414                break;
415
416            case M_LIST:
417              argv[U_SPONSOR_TYPE] = "LIST";
418              status = wrap_mr_query("add_user_account", 20, argv, NULL, NULL);
419              break;
420
421            case M_KERBEROS:
422              argv[U_SPONSOR_TYPE] = "KERBEROS";
423              status = mrcl_validate_kerberos_member(argv[U_SPONSOR_NAME],
424                                                     &argv[U_SPONSOR_NAME]);
425              if (mrcl_get_message())
426                mrcl_com_err(whoami);
427              if (status == MRCL_REJECT)
428                exit(1);
429              status = wrap_mr_query("add_user_account", 20, argv, NULL, NULL);
430              break;
431
432            case M_NONE:
433              argv[U_SPONSOR_TYPE] = "NONE";
434              status = wrap_mr_query("add_user_account", 20, argv, NULL, NULL);
435              break;
436            }
437        }
438      else
439        {
440          argv[U_SPONSOR_TYPE] = "NONE";
441          argv[U_SPONSOR_NAME] = "NONE";
442         
443          status = wrap_mr_query("add_user_account", 20, argv, NULL, NULL);
444        }
445
446      if (status)
447        {
448          com_err(whoami, status, "while adding user account.");
449          exit(1);
450        }
451    }
452  else if (update_flag)
453    {
454      char *old_argv[25];
455      char *argv[25];
456      char *args[5];
457
458      args[0] = username;
459     
460      status = wrap_mr_query("get_user_account_by_login", 1, args,
461                             save_query_info, old_argv);
462      if (status)
463        {
464          com_err(whoami, status, "while getting user information.");
465          exit(1);
466        }
467
468      argv[1] = old_argv[0];
469      argv[2] = old_argv[1];
470      argv[3] = old_argv[2];
471      argv[4] = old_argv[3];
472      argv[5] = old_argv[4];
473      argv[6] = old_argv[5];
474      argv[7] = old_argv[6];
475      argv[8] = old_argv[7];
476      argv[9] = old_argv[8];
477      argv[10] = old_argv[9];
478      argv[11] = old_argv[10];
479      argv[12] = old_argv[11];
480      argv[13] = old_argv[12];
481      argv[14] = old_argv[13];
482      argv[15] = old_argv[14];
483      argv[16] = old_argv[15];
484      argv[17] = old_argv[16];
485      argv[18] = old_argv[17];
486      argv[19] = old_argv[18];
487      argv[20] = old_argv[19];
488
489      argv[0] = username;
490      if (newlogin)
491        argv[1] = newlogin;
492      if (uid)
493        argv[2] = uid;
494      if (shell)
495        argv[3] = shell;
496      if (winshell)
497        argv[4] = winshell;
498      if (last)
499        argv[5] = last;
500      if (first)
501        argv[6] = first;
502      if (middle)
503        argv[7] = middle;
504      if (u_status)
505        argv[8] = u_status;
506      if (clearid)
507        argv[9] = clearid;
508      if (class)
509        argv[10] = class;
510      if (comment)
511        argv[11] = comment;
512      if (secure)
513        argv[13] = secure;
514      if (winhomedir)
515        argv[14] = winhomedir;
516      if (winprofiledir)
517        argv[15] = winprofiledir;
518      if (expiration)
519        argv[18] = expiration;
520      if (alternate_email)
521        argv[19] = alternate_email;
522      if (alternate_phone)
523        argv[20] = alternate_phone;
524      if (sponsor)
525        {
526          argv[17] = sponsor->name;
527          switch (sponsor->type)
528            {
529            case M_ANY:
530            case M_USER:
531              argv[16] = "USER";
532              status = wrap_mr_query("update_user_account", 21, argv, NULL,
533                                     NULL);
534              if (sponsor->type != M_ANY || status != MR_USER)
535                break;
536
537            case M_LIST:
538              argv[16] = "LIST";
539              status = wrap_mr_query("update_user_account", 21, argv, NULL,
540                                     NULL);
541              break;
542
543            case M_KERBEROS:
544              argv[16] = "KERBEROS";
545              status = mrcl_validate_kerberos_member(argv[17], &argv[17]);
546              if (mrcl_get_message())
547                mrcl_com_err(whoami);
548              if (status == MRCL_REJECT)
549                exit(1);
550              status = wrap_mr_query("update_user_account", 21, argv, NULL,
551                                     NULL);
552              break;
553
554            case M_NONE:
555              argv[16] = "NONE";
556              status = wrap_mr_query("update_user_account", 21, argv, NULL,
557                                     NULL);
558              break;
559            }
560        }
561      else
562        status = wrap_mr_query("update_user_account", 21, argv, NULL, NULL);
563
564      if (status)
565        com_err(whoami, status, "while updating user.");
566      else if (newlogin)
567        username = newlogin;
568    }
569
570  /* Deactivate a user, and the matching list and filesystem if they exist */
571  if (deact_flag)
572    {
573      char *args[2];
574      char *argv[20];
575      int i;
576
577      args[0] = username;
578      args[1] = "3";
579
580      status = wrap_mr_query("update_user_status", 2, args, NULL, NULL);
581      if (status)
582        {
583          com_err(whoami, status, "while deactivating user.");
584          exit(1);
585        }
586
587      status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
588      if (status == MR_SUCCESS)
589        {
590          for (i = 15; i > 0; i--)
591            argv[i + 1] = argv[i];
592          argv[1] = username;
593          argv[L_ACTIVE + 1] = "0";
594         
595          status = wrap_mr_query("update_list", 16, argv, NULL, NULL);
596          if (status)
597            {
598              com_err(whoami, status, "while updating list, "
599                      "not deactivating list or filesystem.");
600              exit(1);
601            }
602        }
603      else if (status && status != MR_NO_MATCH)
604        {
605          com_err(whoami, status, "while retrieving list information.");
606          exit(1);
607        }
608
609      status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info,
610                             argv);
611      if (status == MR_SUCCESS)
612        {
613          for (i = 11; i > 0; i--)
614            argv[i + 1] = argv[i];
615          argv[1] = username;
616          argv[FS_TYPE + 1] = "ERR";
617          argv[FS_COMMENTS + 1] = "Locker disabled; call 3-1325 for help";
618         
619          status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL);
620          if (status)
621            {
622              com_err(whoami, status, "while updating filesystem, "
623                      "not deactivating filesystem.");
624              exit(1);
625            }
626        }
627      else if (status && status != MR_NO_MATCH)
628        {
629          com_err(whoami, status, "while retrieving filesystem information.");
630          exit(1);
631        }
632    }
633
634  /* Display user info */
635  if (info_flag)
636    {
637      char *args[2];
638      char *argv[25];
639
640      args[0] = username;
641      status = wrap_mr_query("get_user_account_by_login", 1, args,
642                             save_query_info, argv);
643      if (status)
644        {
645          com_err(whoami, status, "while getting user information.");
646          exit(1);
647        }
648      if (unformatted_flag)
649        show_user_info_unformatted(argv);
650      else
651        show_user_info(argv);
652    }
653
654  /* register a user */
655  if (reg_flag)
656    {
657      char *args[3];
658      char *argv[25];
659
660      args[0] = username;
661      status = wrap_mr_query("get_user_account_by_login", 1, args,
662                             save_query_info, argv);
663      if (status)
664        {
665          com_err(whoami, status, "while looking up uid.");
666          exit(1);
667        }
668
669      args[0] = argv[U_UID];
670      args[1] = username;
671      args[2] = "EXCHANGE";
672
673      status = wrap_mr_query("register_user", 3, args, NULL, NULL);
674      if (status)
675        {
676          com_err(whoami, status, "while registering user.");
677          exit(1);
678        }
679    }
680
681  /* list user reservations */
682  if (list_res_flag)
683    {
684      char *args[1];
685
686      args[0] = username;
687      status = wrap_mr_query("get_user_reservations", 1, args,
688                             show_reservations, NULL);
689      if (status)
690        if (status != MR_NO_MATCH) {
691          com_err(whoami, status, "while getting user reservations.");
692          exit(1);
693        }
694    }
695
696  /* add user reservations */
697  if (reservation_add_queue)
698    {
699      struct string_list *q = reservation_add_queue;
700
701      while (q)
702        {
703          char *reservation = q->string;
704          char *args[2];
705
706          args[0] = username;
707          args[1] = reservation;
708          status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL);
709          if (status)
710            {
711              com_err(whoami, status, "while adding user reservation.");
712              exit(1);
713            }
714
715          q = q->next;
716        }
717    }
718
719  /* delete user reservations */
720  if (reservation_remove_queue)
721    {
722      struct string_list *q = reservation_remove_queue;
723
724      while (q)
725        {
726          char *reservation = q->string;
727          char *args[2];
728
729          args[0] = username;
730          args[1] = reservation;
731          status = wrap_mr_query("delete_user_reservation", 2, args, NULL,
732                                 NULL);
733          if (status)
734            {
735              com_err(whoami, status, "while deleting user reservation.");
736              exit(1);
737            }
738         
739          q = q->next;
740        }
741    }
742  /* We're done! */
743  mr_disconnect();
744  exit(0);
745}
746
747int save_query_info(int argc, char **argv, void *hint)
748{
749  int i;
750  char **nargv = hint;
751
752  for(i = 0; i < argc; i++)
753    nargv[i] = strdup(argv[i]);
754 
755  return MR_CONT;
756}
757
758int show_reservations(int argc, char **argv, void *hint)
759{
760  printf("Reservation: %s\n", argv[0]);
761
762  return MR_CONT;
763}
764
765struct string_list *add_to_string_list(struct string_list *old_list, char *s) {
766  struct string_list *new_list;
767
768  new_list = (struct string_list *)malloc(sizeof(struct string_list *));
769  new_list->next = old_list;
770  new_list->string = s;
771
772  return new_list;
773}
774
775int wrap_mr_query(char *handle, int argc, char **argv,
776                  int (*callback)(int, char **, void *), void *callarg) {
777  if (verbose)
778    print_query(handle, argc, argv);
779
780  return mr_query(handle, argc, argv, callback, callarg);
781}
782
783void print_query(char *query_name, int argc, char **argv) {
784  int cnt;
785
786  printf("qy %s", query_name);
787  for(cnt = 0; cnt < argc; cnt++)
788    printf(" <%s>", argv[cnt]);
789  printf("\n");
790}
791
792void show_user_info(char **argv)
793{
794  char tbuf[BUFSIZ];
795  int status;
796
797  sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]);
798  printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf);
799  printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]);
800  printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS],
801         argv[U_WINCONSOLESHELL]);
802  printf("Account is: %-20s MIT ID number: %s\n",
803         UserState(atoi(argv[U_STATE])), argv[U_MITID]);
804  sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
805          strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
806  printf("Sponsor: %-23s Expiration date: %s\n", tbuf, argv[U_EXPIRATION]);
807  printf("Alternate Email: %s\n", argv[U_ALT_EMAIL]);
808  printf("Alternate Phone: %s\n", argv[U_ALT_PHONE]);
809  printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
810  printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
811  status = atoi(argv[U_STATE]);
812  if (status == 0 || status == 2)
813    {
814      printf("User %s secure Account Coupon to register\n",
815              atoi(argv[U_SECURE]) ? "needs" : "does not need");
816    }
817  printf("Comments: %s\n", argv[U_COMMENT]);
818  printf("Created  by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]);
819  printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME],
820         argv[U_MODWITH]);
821}
822
823void show_user_info_unformatted(char **argv)
824{
825  char tbuf[BUFSIZ];
826  int status;
827
828  printf("Login name:                %s\n", argv[U_NAME]);
829  printf("Full name:                 %s, %s %s\n", argv[U_LAST], argv[U_FIRST],
830         argv[U_MIDDLE]);
831  printf("User id:                   %s\n", argv[U_UID]);
832  printf("Class:                     %s\n", argv[U_CLASS]);
833  sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
834          strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
835  printf("Sponsor:                   %s\n", tbuf);
836  printf("Expiration date:           %s\n", argv[U_EXPIRATION]);
837  printf("Alternate Email:           %s\n", argv[U_ALT_EMAIL]);
838  printf("Alternate Phone:           %s\n", argv[U_ALT_PHONE]);
839  printf("Login shell:               %s\n", argv[U_SHELL]);
840  printf("Windows Console Shell:     %s\n", argv[U_WINCONSOLESHELL]);
841  printf("Account is:                %s\n", UserState(atoi(argv[U_STATE])));
842  printf("MIT ID number:             %s\n", argv[U_MITID]);
843  printf("Windows Home Directory:    %s\n", argv[U_WINHOMEDIR]);
844  printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
845  status = atoi(argv[U_STATE]);
846  if (status == 0 || status == 2)
847    printf("Secure:                  %s secure Account Coupon to register\n",
848           atoi(argv[U_SECURE]) ? "Needs" : "Does not need");
849  printf("Comments:                  %s\n", argv[U_COMMENT]);
850  printf("Created by:                %s\n", argv[U_CREATOR]);
851  printf("Created on:                %s\n", argv[U_CREATED]);
852  printf("Last mod by:               %s\n", argv[U_MODBY]);
853  printf("Last mod on:               %s\n", argv[U_MODTIME]);
854  printf("Last mod with:             %s\n", argv[U_MODWITH]);
855}
856
857void usage(char **argv)
858{
859#define USAGE_OPTIONS_FORMAT "  %-39s%s\n"
860  fprintf(stderr, "Usage: %s username [options]\n", argv[0]);
861  fprintf(stderr, "Options are\n");
862  fprintf(stderr, "  %-39s\n", "-i   | -info");
863  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C   | -create",
864          "-D   | -deact");
865  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r   | -register",
866          "-R   | -rename newname");
867  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U   | -uid uid",
868          "-s   | -shell shell");
869  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S   | -status status",
870          "-w   | -winshell winshell");
871  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F   | -first firstname",
872          "-L   | -last lastname");
873  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M   | -middle middlename",
874          "-I   | -mitid mitid");
875  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl  | -class class",
876          "-c   | -comment comment");
877  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6   | -secure 0|1",
878          "-lr  | -listreservation");
879  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar  | -addreservation reservation",
880          "-dr  | -deletereservation reservation");
881  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-wh  | -winhomedir winhomedir",
882          "-wp  | -winprofiledir winprofiledir");
883  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-sp  | -sponsor sponsor",
884          "-e   | -expiration expiration date");
885  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ae  | -alternateemail address",
886          "-ap  | -alternatephone phone number");
887  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u   | -unformatted",
888          "-n   | -noauth");
889  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v   | -verbose",
890          "-db  | -database host[:port]");
891
892  exit(1);
893}
894
895/* Parse a line of input, fetching a member.  NULL is returned if a member
896 * is not found.  ';' is a comment character.
897 */
898struct owner_type *parse_member(char *s)
899{
900  struct owner_type *m;
901  char *p, *lastchar;
902
903  while (*s && isspace(*s))
904    s++;
905  lastchar = p = s;
906  while (*p && *p != '\n' && *p != ';')
907    {
908      if (isprint(*p) && !isspace(*p))
909        lastchar = p++;
910      else
911        p++;
912    }
913  lastchar++;
914  *lastchar = '\0';
915  if (p == s || strlen(s) == 0)
916    return NULL;
917
918  if (!(m = malloc(sizeof(struct owner_type))))
919    return NULL;
920
921  if ((p = strchr(s, ':')))
922    {
923      *p = '\0';
924      m->name = ++p;
925      if (!strcasecmp("user", s))
926        m->type = M_USER;
927      else if (!strcasecmp("list", s))
928        m->type = M_LIST;
929      else if (!strcasecmp("kerberos", s))
930        m->type = M_KERBEROS;
931      else if (!strcasecmp("none", s))
932        m->type = M_NONE;
933      else
934        {
935          m->type = M_ANY;
936          *(--p) = ':';
937          m->name = s;
938        }
939      m->name = strdup(m->name);
940    }
941  else
942    {
943      m->name = strdup(s);
944      m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
945    }
946  return m;
947}
Note: See TracBrowser for help on using the repository browser.