]> andersk Git - moira.git/blob - clients/stanley/stanley.c
Remove an unused variable.
[moira.git] / clients / stanley / stanley.c
1 /*
2  * Command line oriented Moira users tool.
3  *
4  * zacheiss@mit.edu, September 2001
5  *
6  * Inspired by 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 RCSID("$Header$");
25
26 struct string_list {
27   char *string;
28   struct string_list *next;
29 };
30
31 /* argument parsing macro */
32 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
33
34 /* flags from command line */
35 int info_flag, update_flag, create_flag, deact_flag, reg_flag;
36 int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
37
38 struct string_list *reservation_add_queue, *reservation_remove_queue;
39
40 char *username, *whoami;
41
42 char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
43 char *clearid, *class, *comment, *secure;
44
45 static char *states[] = {
46   "Registerable (0)",
47   "Active (1)",
48   "Half Registered (2)",
49   "Deleted (3)",
50   "Not registerable (4)",
51   "Enrolled/Registerable (5)",
52   "Enrolled/Not Registerable (6)",
53   "Half Enrolled (7)"
54 };
55
56 static char *UserState(int state)
57 {
58   static char buf[BUFSIZ];
59
60   if (state < 0 || state >= US_END)
61     {
62       sprintf(buf, "Unknown (%d)", state);
63       return buf;
64     }
65   return states[state];
66 }
67
68 void usage(char **argv);
69 int save_query_info(int argc, char **argv, void *hint);
70 int show_reservations(int argc, char **argv, void *hint);
71 void show_user_info(char **argv);
72 void show_user_info_unformatted(char **argv);
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;
81   char **arg = argv;
82   char *server = NULL;
83
84   /* clear all flags & lists */
85   info_flag = update_flag = create_flag = deact_flag = reg_flag = 0;
86   list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0;
87   newlogin = uid = shell = winshell = last = first = middle = NULL;
88   u_status = clearid = class = comment = secure = NULL;
89   reservation_add_queue = reservation_remove_queue = NULL;
90   whoami = argv[0];
91
92   /* parse args */
93   while (++arg - argv < argc)
94     {
95       if (**arg == '-')
96         {
97           if (argis("i", "info"))
98             info_flag++;
99           else if (argis("C", "create"))
100             create_flag++;
101           else if (argis("D", "deact"))
102             deact_flag++;
103           else if (argis("r", "register"))
104             reg_flag++;
105           else if (argis("R", "rename")) {
106             if (arg - argv < argc - 1) {
107               arg++;
108               update_flag++;
109               newlogin = *arg;
110             } else
111               usage(argv);
112           }
113           else if (argis("U", "uid")) {
114             if (arg - argv < argc - 1) {
115               arg++;
116               update_flag++;
117               uid = *arg;
118             } else
119               usage(argv);
120           }
121           else if (argis("s", "shell")) {
122             if (arg - argv < argc - 1) {
123               arg++;
124               update_flag++;
125               shell = *arg;
126             } else
127               usage(argv);
128           }
129           else if (argis("w", "winshell")) {
130             if (arg - argv < argc - 1) {
131               arg++;
132               update_flag++;
133               winshell = *arg;
134             } else
135               usage(argv);
136           }
137           else if (argis("L", "last")) {
138             if (arg - argv < argc - 1) {
139               arg++;
140               update_flag++;
141               last = *arg;
142             } else
143               usage(argv);
144           }
145           else if (argis("F", "first")) {
146             if (arg - argv < argc - 1) {
147               arg++;
148               update_flag++;
149               first = *arg;
150             } else
151               usage(argv);
152           }
153           else if (argis("M", "middle")) {
154             if (arg - argv < argc - 1) {
155               arg++;
156               update_flag++;
157               middle = *arg;
158             } else
159               usage(argv);
160           }
161           else if (argis("S", "status")) {
162             if (arg - argv < argc - 1) { 
163               int i;
164               int len;
165
166               arg++;
167               update_flag++;
168               u_status = *arg;
169               len = strlen(u_status);
170               for (i = 0; i < len; i++) {
171                 if (!isdigit(u_status[i])) {
172                   printf("Error:  status code %s is not numeric.\n", u_status);
173                   exit(1);
174                 }
175               }
176             } else
177               usage(argv);
178           }
179           else if (argis("I", "clearid")) {
180             if (arg - argv < argc - 1) {
181               arg++;
182               update_flag++;
183               clearid = *arg;
184             } else
185               usage(argv);
186           }
187           else if (argis("cl", "class")) {
188             if (arg - argv < argc - 1) {
189               arg++;
190               update_flag++;
191               class = *arg;
192             } else
193               usage(argv);
194           }
195           else if (argis("c", "comment")) {
196             if (arg - argv < argc - 1) {
197               arg++;
198               update_flag++;
199               comment = *arg;
200             } else
201               usage(argv);
202           }
203           else if (argis("6", "secure")) {
204             if (arg - argv < argc - 1) {
205               arg++;
206               update_flag++;
207               secure = *arg;
208             } else
209               usage(argv);
210           }
211           else if (argis("ar", "addreservation")) {
212             if (arg - argv < argc - 1) {
213               arg++;
214               reservation_add_queue = add_to_string_list(reservation_add_queue,
215                                                          *arg);
216             } else
217               usage(argv);
218             update_res_flag++;
219           }
220           else if (argis("dr", "deletereservation")) {
221             if (arg - argv < argc - 1) {
222               arg++;
223               reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg);
224             } else
225               usage(argv);
226             update_res_flag++;
227           }
228           else if (argis("lr", "listreservation"))
229             list_res_flag++;
230           else if (argis("u", "unformatted"))
231             unformatted_flag++;
232           else if (argis("n", "noauth"))
233             noauth++;
234           else if (argis("v", "verbose"))
235             verbose++;
236           else if (argis("db", "database"))
237             {
238               if (arg - argv < argc - 1)
239                 {
240                   ++arg;
241                   server = *arg;
242                 }
243               else
244                 usage(argv);
245             }
246           else
247             usage(argv);
248         }
249       else if (username == NULL)
250         username = *arg;
251       else
252         usage(argv);
253     }
254   if (username == NULL && !create_flag)
255     usage(argv);
256
257   /* default to info_flag if nothing else was specified */
258   if(!(info_flag       || update_flag || create_flag   || \
259        deact_flag      || reg_flag    || list_res_flag || \
260        update_res_flag)) {
261     info_flag++;
262   }
263
264   /* fire up Moira */
265   status = mrcl_connect(server, "stanley", 8, !noauth);
266   if (status == MRCL_AUTH_ERROR)
267     {
268       com_err(whoami, 0, "Try the -noauth flag if you don't "
269               "need authentication.");
270     }
271   if (status)
272     exit(2);
273
274   /* create if needed */
275   if (create_flag)
276     {
277       char *argv[20];
278       int cnt;
279
280       for (cnt = 0; cnt < 14; cnt++) {
281         argv[cnt] = "";
282       }
283
284       if (username)
285         argv[U_NAME] = username;
286       else
287         argv[U_NAME] = UNIQUE_LOGIN;
288       if (uid)
289         argv[U_UID] = uid;
290       else
291         argv[U_UID] = UNIQUE_UID;
292       if (shell)
293         argv[U_SHELL] = shell;
294       else
295         argv[U_SHELL] = "/bin/athena/tcsh";
296       if (winshell)
297         argv[U_WINCONSOLESHELL] = winshell;
298       else
299         argv[U_WINCONSOLESHELL] = "cmd";
300       if (last)
301         argv[U_LAST] = last;
302       if (first)
303         argv[U_FIRST] = first;
304       if (middle)
305         argv[U_MIDDLE] = middle;
306       if (u_status)
307         argv[U_STATE] = u_status;
308       else
309         argv[U_STATE] = "0";
310       if (clearid)
311         argv[U_MITID] = clearid;
312       if (class)
313         argv[U_CLASS] = class;
314       if (comment)
315         argv[U_COMMENT] = comment;
316       /* Signature field always is the empty string */
317       argv[U_SIGNATURE] = "";
318       if (secure)
319         argv[U_SECURE] = secure;
320       else
321         argv[U_SECURE] = "0";
322
323       status = wrap_mr_query("add_user_account", 13, argv, NULL, NULL);
324       if (status)
325         {
326           com_err(whoami, status, "while adding user account.");
327           exit(1);
328         }
329     }
330   else if (update_flag)
331     {
332       char *old_argv[20];
333       char *argv[20];
334       char *args[5];
335
336       args[0] = username;
337       
338       status = wrap_mr_query("get_user_account_by_login", 1, args, 
339                              save_query_info, old_argv);
340       if (status)
341         {
342           com_err(whoami, status, "while getting user information.");
343           exit(1);
344         }
345
346       argv[1] = old_argv[0];
347       argv[2] = old_argv[1];
348       argv[3] = old_argv[2];
349       argv[4] = old_argv[3];
350       argv[5] = old_argv[4];
351       argv[6] = old_argv[5];
352       argv[7] = old_argv[6];
353       argv[8] = old_argv[7];
354       argv[9] = old_argv[8];
355       argv[10] = old_argv[9];
356       argv[11] = old_argv[10];
357       argv[12] = old_argv[11];
358       argv[13] = old_argv[12];
359       
360       argv[0] = username;
361       if (newlogin)
362         argv[1] = newlogin;
363       if (uid)
364         argv[2] = uid;
365       if (shell)
366         argv[3] = shell;
367       if (winshell)
368         argv[4] = winshell;
369       if (last)
370         argv[5] = last;
371       if (first)
372         argv[6] = first;
373       if (middle)
374         argv[7] = middle;
375       if (u_status)
376         argv[8] = u_status;
377       if (clearid)
378         argv[9] = clearid;
379       if (class)
380         argv[10] = class;
381       if (comment)
382         argv[11] = comment;
383       if (secure)
384         argv[13] = secure;
385
386       status = wrap_mr_query("update_user_account", 14, argv, NULL, NULL);
387
388       if (status)
389         com_err(whoami, status, "while updating user.");
390       else if (newlogin)
391         username = newlogin;
392     }
393
394   /* Deactivate a user, and the matching list and filesystem if they exist */
395   if (deact_flag)
396     {
397       char *args[2];
398       char *argv[20];
399       int i;
400
401       args[0] = username;
402       args[1] = "3";
403
404       status = wrap_mr_query("update_user_status", 2, args, NULL, NULL);
405       if (status)
406         {
407           com_err(whoami, status, "while deactivating user.");
408           exit(1);
409         }
410
411       status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
412       if (status == MR_SUCCESS)
413         {
414           for (i = 13; i > 0; i--)
415             argv[i + 1] = argv[i];
416           argv[1] = username;
417           argv[L_ACTIVE + 1] = "0";
418           
419           status = wrap_mr_query("update_list", 14, argv, NULL, NULL);
420           if (status)
421             {
422               com_err(whoami, status, "while updating list, "
423                       "not deactivating list or filesystem.");
424               exit(1);
425             }
426         }
427       else if (status && status != MR_NO_MATCH)
428         {
429           com_err(whoami, status, "while retrieving list information.");
430           exit(1);
431         }
432
433       status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info,
434                              argv);
435       if (status == MR_SUCCESS)
436         {
437           for (i = 11; i > 0; i--)
438             argv[i + 1] = argv[i];
439           argv[1] = username;
440           argv[FS_TYPE + 1] = "ERR";
441           argv[FS_COMMENTS + 1] = "Locker disabled; call 3-1325 for help";
442           
443           status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL);
444           if (status)
445             {
446               com_err(whoami, status, "while updating filesystem, "
447                       "not deactivating filesystem.");
448               exit(1);
449             }
450         }
451       else if (status && status != MR_NO_MATCH)
452         {
453           com_err(whoami, status, "while retrieving filesystem information.");
454           exit(1);
455         }
456     }
457
458   /* Display user info */
459   if (info_flag)
460     {
461       char *args[2];
462       char *argv[20];
463
464       args[0] = username;
465       status = wrap_mr_query("get_user_account_by_login", 1, args,
466                              save_query_info, argv);
467       if (status)
468         {
469           com_err(whoami, status, "while getting user information.");
470           exit(1);
471         }
472       if (unformatted_flag)
473         show_user_info_unformatted(argv);
474       else
475         show_user_info(argv);
476     }
477
478   /* register a user */
479   if (reg_flag)
480     {
481       char *args[3];
482       char *argv[20];
483
484       args[0] = username;
485       status = wrap_mr_query("get_user_account_by_login", 1, args,
486                              save_query_info, argv);
487       if (status)
488         {
489           com_err(whoami, status, "while looking up uid.");
490           exit(1);
491         }
492
493       args[0] = argv[U_UID];
494       args[1] = username;
495       args[2] = "IMAP";
496
497       status = wrap_mr_query("register_user", 3, args, NULL, NULL);
498       if (status)
499         {
500           com_err(whoami, status, "while registering user.");
501           exit(1);
502         }
503     }
504
505   /* list user reservations */
506   if (list_res_flag)
507     {
508       char *args[1];
509
510       args[0] = username;
511       status = wrap_mr_query("get_user_reservations", 1, args, 
512                              show_reservations, NULL);
513       if (status)
514         if (status != MR_NO_MATCH) {
515           com_err(whoami, status, "while getting user reservations.");
516           exit(1);
517         }
518     }
519
520   /* add user reservations */
521   if (reservation_add_queue)
522     {
523       struct string_list *q = reservation_add_queue;
524
525       while (q) 
526         {
527           char *reservation = q->string;
528           char *args[2];
529
530           args[0] = username;
531           args[1] = reservation;
532           status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL);
533           if (status)
534             {
535               com_err(whoami, status, "while adding user reservation.");
536               exit(1);
537             }
538
539           q = q->next;
540         }
541     }
542
543   /* delete user reservations */
544   if (reservation_remove_queue)
545     {
546       struct string_list *q = reservation_remove_queue;
547
548       while (q)
549         {
550           char *reservation = q->string;
551           char *args[2];
552
553           args[0] = username;
554           args[1] = reservation;
555           status = wrap_mr_query("delete_user_reservation", 2, args, NULL, 
556                                  NULL);
557           if (status)
558             {
559               com_err(whoami, status, "while deleting user reservation.");
560               exit(1);
561             }
562           
563           q = q->next;
564         }
565     }
566   /* We're done! */
567   mr_disconnect();
568   exit(0);
569 }
570
571 int save_query_info(int argc, char **argv, void *hint)
572 {
573   int i;
574   char **nargv = hint;
575
576   for(i = 0; i < argc; i++)
577     nargv[i] = strdup(argv[i]);
578   
579   return MR_CONT;
580 }
581
582 int show_reservations(int argc, char **argv, void *hint)
583 {
584   printf("Reservation: %s\n", argv[0]);
585
586   return MR_CONT;
587 }
588
589 struct string_list *add_to_string_list(struct string_list *old_list, char *s) {
590   struct string_list *new_list;
591
592   new_list = (struct string_list *)malloc(sizeof(struct string_list *));
593   new_list->next = old_list;
594   new_list->string = s;
595
596   return new_list;
597 }
598
599 int wrap_mr_query(char *handle, int argc, char **argv,
600                   int (*callback)(int, char **, void *), void *callarg) {
601   if (verbose)
602     print_query(handle, argc, argv);
603
604   return mr_query(handle, argc, argv, callback, callarg);
605 }
606
607 void print_query(char *query_name, int argc, char **argv) {
608   int cnt;
609
610   printf("qy %s", query_name);
611   for(cnt = 0; cnt < argc; cnt++)
612     printf(" <%s>", argv[cnt]);
613   printf("\n");
614 }
615
616 void show_user_info(char **argv)
617 {
618   char tbuf[BUFSIZ];
619   int status;
620
621   sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]);
622   printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf);
623   printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]);
624   printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS],
625          argv[U_WINCONSOLESHELL]);
626   printf("Account is: %-20s MIT ID number: %s\n",
627          UserState(atoi(argv[U_STATE])), argv[U_MITID]);
628   status = atoi(argv[U_STATE]);
629   if (status == 0 || status == 2)
630     {
631       printf("User %s secure Account Coupon to register\n",
632               atoi(argv[U_SECURE]) ? "needs" : "does not need");
633     }
634   printf("Comments: %s\n", argv[U_COMMENT]);
635   printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME],
636          argv[U_MODWITH]);
637 }
638
639 void show_user_info_unformatted(char **argv)
640 {
641   printf("Login name:            %s\n", argv[U_NAME]);
642   printf("Full name:             %s, %s %s\n", argv[U_LAST], argv[U_FIRST], 
643          argv[U_MIDDLE]);
644   printf("User id:               %s\n", argv[U_UID]);
645   printf("Class:                 %s\n", argv[U_CLASS]);
646   printf("Login shell:           %s\n", argv[U_SHELL]);
647   printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]);
648   printf("Account is:            %s\n", UserState(atoi(argv[U_STATE])));
649   printf("MIT ID number:         %s\n", argv[U_MITID]);
650   printf("Secure:                %s\n", argv[U_SECURE]);
651   printf("Comments:              %s\n", argv[U_COMMENT]);
652   printf("Last mod by:           %s\n", argv[U_MODBY]);
653   printf("Last mod on:           %s\n", argv[U_MODTIME]);
654   printf("Last mod with:         %s\n", argv[U_MODWITH]);
655 }
656
657 void usage(char **argv)
658 {
659 #define USAGE_OPTIONS_FORMAT "  %-39s%s\n"
660   fprintf(stderr, "Usage: %s username [options]\n", argv[0]);
661   fprintf(stderr, "Options are\n");
662   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C   | -create",
663           "-D   | -deact");
664   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r   | -register",
665           "-R   | -rename newname");
666   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U   | -uid uid",
667           "-s   | -shell shell");
668   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S   | -status status",
669           "-w   | -winshell winshell");
670   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F   | -first firstname",
671           "-L   | -last lastname");
672   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M   | -middle middlename",
673           "-I   | -clearid mitid");
674   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl  | -class class",
675           "-c   | -comment comment");
676   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6   | -secure 0|1",
677           "-lr  | -listreservation");
678   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar  | -addreservation reservation",
679           "-dr  | -deletereservation reservation");
680   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u   | -unformatted",
681           "-n   | -noauth");
682   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v   | -verbose",
683           "-db  | -database host[:port]");
684
685   exit(1);
686 }
This page took 0.340131 seconds and 5 git commands to generate.