]> andersk Git - moira.git/blame - clients/stanley/stanley.c
Display user creation times.
[moira.git] / clients / stanley / stanley.c
CommitLineData
5d429b61 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
24RCSID("$Header$");
25
26struct 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 */
35int info_flag, update_flag, create_flag, deact_flag, reg_flag;
36int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
37
38struct string_list *reservation_add_queue, *reservation_remove_queue;
39
40char *username, *whoami;
41
42char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
43char *clearid, *class, *comment, *secure;
44
45static 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
56static 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
68void usage(char **argv);
69int save_query_info(int argc, char **argv, void *hint);
70int show_reservations(int argc, char **argv, void *hint);
71void show_user_info(char **argv);
72void show_user_info_unformatted(char **argv);
73struct string_list *add_to_string_list(struct string_list *old_list, char *s);
74int wrap_mr_query(char *handle, int argc, char **argv,
75 int (*callback)(int, char **, void *), void *callarg);
76void print_query(char *query_name, int argc, char **argv);
77
78int 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 }
484f87be 179 else if (argis("I", "mitid")) {
5d429b61 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 }
ec7f0346 228 else if (argis("lr", "listreservation"))
5d429b61 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 }
ec7f0346 254 if (username == NULL && !create_flag)
5d429b61 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++) {
ec7f0346 281 argv[cnt] = "";
5d429b61 282 }
283
ec7f0346 284 if (username)
285 argv[U_NAME] = username;
286 else
287 argv[U_NAME] = UNIQUE_LOGIN;
5d429b61 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);
5d429b61 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
ec7f0346 394 /* Deactivate a user, and the matching list and filesystem if they exist */
5d429b61 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
ec7f0346 411 status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
412 if (status == MR_SUCCESS)
5d429b61 413 {
ec7f0346 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 }
5d429b61 426 }
ec7f0346 427 else if (status && status != MR_NO_MATCH)
5d429b61 428 {
ec7f0346 429 com_err(whoami, status, "while retrieving list information.");
5d429b61 430 exit(1);
431 }
432
433 status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info,
434 argv);
ec7f0346 435 if (status == MR_SUCCESS)
5d429b61 436 {
ec7f0346 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 }
5d429b61 450 }
ec7f0346 451 else if (status && status != MR_NO_MATCH)
5d429b61 452 {
ec7f0346 453 com_err(whoami, status, "while retrieving filesystem information.");
5d429b61 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];
5d429b61 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];
ec7f0346 494 args[1] = username;
495 args[2] = "IMAP";
5d429b61 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
571int 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
582int show_reservations(int argc, char **argv, void *hint)
583{
584 printf("Reservation: %s\n", argv[0]);
585
586 return MR_CONT;
587}
588
589struct 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
599int 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
607void 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
5d429b61 616void 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 {
ec7f0346 631 printf("User %s secure Account Coupon to register\n",
5d429b61 632 atoi(argv[U_SECURE]) ? "needs" : "does not need");
633 }
634 printf("Comments: %s\n", argv[U_COMMENT]);
cfeeecec 635 printf("Created by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]);
5d429b61 636 printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME],
637 argv[U_MODWITH]);
638}
639
640void show_user_info_unformatted(char **argv)
641{
8598c363 642 int status;
643
5d429b61 644 printf("Login name: %s\n", argv[U_NAME]);
645 printf("Full name: %s, %s %s\n", argv[U_LAST], argv[U_FIRST],
646 argv[U_MIDDLE]);
647 printf("User id: %s\n", argv[U_UID]);
648 printf("Class: %s\n", argv[U_CLASS]);
649 printf("Login shell: %s\n", argv[U_SHELL]);
650 printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]);
651 printf("Account is: %s\n", UserState(atoi(argv[U_STATE])));
652 printf("MIT ID number: %s\n", argv[U_MITID]);
8598c363 653 status = atoi(argv[U_STATE]);
654 if (status == 0 || status == 2)
655 printf("Secure: %s secure Account Coupon to register\n",
656 atoi(argv[U_SECURE]) ? "Needs" : "Does not need");
5d429b61 657 printf("Comments: %s\n", argv[U_COMMENT]);
cfeeecec 658 printf("Created by: %s\n", argv[U_CREATOR]);
659 printf("Created on: %s\n", argv[U_CREATED]);
5d429b61 660 printf("Last mod by: %s\n", argv[U_MODBY]);
661 printf("Last mod on: %s\n", argv[U_MODTIME]);
662 printf("Last mod with: %s\n", argv[U_MODWITH]);
663}
ec7f0346 664
665void usage(char **argv)
666{
667#define USAGE_OPTIONS_FORMAT " %-39s%s\n"
668 fprintf(stderr, "Usage: %s username [options]\n", argv[0]);
669 fprintf(stderr, "Options are\n");
b30ed58c 670 fprintf(stderr, " %-39s\n", "-i | -info");
ec7f0346 671 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C | -create",
672 "-D | -deact");
673 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r | -register",
674 "-R | -rename newname");
675 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U | -uid uid",
676 "-s | -shell shell");
677 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S | -status status",
678 "-w | -winshell winshell");
679 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F | -first firstname",
680 "-L | -last lastname");
681 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M | -middle middlename",
484f87be 682 "-I | -mitid mitid");
ec7f0346 683 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl | -class class",
684 "-c | -comment comment");
685 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6 | -secure 0|1",
686 "-lr | -listreservation");
687 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar | -addreservation reservation",
688 "-dr | -deletereservation reservation");
689 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u | -unformatted",
690 "-n | -noauth");
691 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v | -verbose",
692 "-db | -database host[:port]");
693
694 exit(1);
695}
This page took 1.100546 seconds and 5 git commands to generate.