2 * Command line oriented Moira users tool.
4 * zacheiss@mit.edu, September 2001
8 * Copyright (C) 2000, 2001 by the Massachusetts Institute of Technology.
9 * For copying and distribution information, please see the file
13 #include <mit-copyright.h>
15 #include <moira_site.h>
28 struct string_list *next;
31 /* argument parsing macro */
32 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
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;
38 struct string_list *reservation_add_queue, *reservation_remove_queue;
40 char *username, *whoami;
42 char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
43 char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir;
45 static char *states[] = {
48 "Half Registered (2)",
50 "Not registerable (4)",
51 "Enrolled/Registerable (5)",
52 "Enrolled/Not Registerable (6)",
54 "Registerable, Kerberos only (8)",
55 "Active, Kerberos only (9)"
58 static char *UserState(int state)
60 static char buf[BUFSIZ];
62 if (state < 0 || state >= US_END)
64 sprintf(buf, "Unknown (%d)", state);
70 void usage(char **argv);
71 int save_query_info(int argc, char **argv, void *hint);
72 int show_reservations(int argc, char **argv, void *hint);
73 void show_user_info(char **argv);
74 void show_user_info_unformatted(char **argv);
75 struct string_list *add_to_string_list(struct string_list *old_list, char *s);
76 int wrap_mr_query(char *handle, int argc, char **argv,
77 int (*callback)(int, char **, void *), void *callarg);
78 void print_query(char *query_name, int argc, char **argv);
80 int main(int argc, char **argv)
86 /* clear all flags & lists */
87 info_flag = update_flag = create_flag = deact_flag = reg_flag = 0;
88 list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0;
89 newlogin = uid = shell = winshell = last = first = middle = NULL;
90 u_status = clearid = class = comment = secure = NULL;
91 winhomedir = winprofiledir = NULL;
92 reservation_add_queue = reservation_remove_queue = NULL;
96 while (++arg - argv < argc)
100 if (argis("i", "info"))
102 else if (argis("C", "create"))
104 else if (argis("D", "deact"))
106 else if (argis("r", "register"))
108 else if (argis("R", "rename")) {
109 if (arg - argv < argc - 1) {
116 else if (argis("U", "uid")) {
117 if (arg - argv < argc - 1) {
124 else if (argis("s", "shell")) {
125 if (arg - argv < argc - 1) {
132 else if (argis("w", "winshell")) {
133 if (arg - argv < argc - 1) {
140 else if (argis("L", "last")) {
141 if (arg - argv < argc - 1) {
148 else if (argis("F", "first")) {
149 if (arg - argv < argc - 1) {
156 else if (argis("M", "middle")) {
157 if (arg - argv < argc - 1) {
164 else if (argis("S", "status")) {
165 if (arg - argv < argc - 1) {
172 len = strlen(u_status);
173 for (i = 0; i < len; i++) {
174 if (!isdigit(u_status[i])) {
175 printf("Error: status code %s is not numeric.\n", u_status);
182 else if (argis("I", "mitid")) {
183 if (arg - argv < argc - 1) {
190 else if (argis("cl", "class")) {
191 if (arg - argv < argc - 1) {
198 else if (argis("c", "comment")) {
199 if (arg - argv < argc - 1) {
206 else if (argis("6", "secure")) {
207 if (arg - argv < argc - 1) {
214 else if (argis("wh", "winhomedir")) {
215 if (arg - argv < argc - 1) {
222 else if (argis("wp", "winprofiledir")) {
223 if (arg - argv < argc - 1) {
226 winprofiledir = *arg;
230 else if (argis("ar", "addreservation")) {
231 if (arg - argv < argc - 1) {
233 reservation_add_queue = add_to_string_list(reservation_add_queue,
239 else if (argis("dr", "deletereservation")) {
240 if (arg - argv < argc - 1) {
242 reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg);
247 else if (argis("lr", "listreservation"))
249 else if (argis("u", "unformatted"))
251 else if (argis("n", "noauth"))
253 else if (argis("v", "verbose"))
255 else if (argis("db", "database"))
257 if (arg - argv < argc - 1)
268 else if (username == NULL)
273 if (username == NULL && !create_flag)
276 /* default to info_flag if nothing else was specified */
277 if(!(info_flag || update_flag || create_flag || \
278 deact_flag || reg_flag || list_res_flag || \
284 status = mrcl_connect(server, "stanley", 11, !noauth);
285 if (status == MRCL_AUTH_ERROR)
287 com_err(whoami, 0, "Try the -noauth flag if you don't "
288 "need authentication.");
293 /* create if needed */
299 for (cnt = 0; cnt < 14; cnt++) {
304 argv[U_NAME] = username;
306 argv[U_NAME] = UNIQUE_LOGIN;
310 argv[U_UID] = UNIQUE_UID;
312 argv[U_SHELL] = shell;
314 argv[U_SHELL] = "/bin/athena/tcsh";
316 argv[U_WINCONSOLESHELL] = winshell;
318 argv[U_WINCONSOLESHELL] = "cmd";
322 argv[U_FIRST] = first;
324 argv[U_MIDDLE] = middle;
326 argv[U_STATE] = u_status;
330 argv[U_MITID] = clearid;
332 argv[U_CLASS] = class;
334 argv[U_COMMENT] = comment;
335 /* Signature field always is the empty string */
336 argv[U_SIGNATURE] = "";
338 argv[U_SECURE] = secure;
340 argv[U_SECURE] = "0";
342 argv[U_WINHOMEDIR] = winhomedir;
344 argv[U_WINHOMEDIR] = "[DFS]";
346 argv[U_WINPROFILEDIR] = winprofiledir;
348 argv[U_WINPROFILEDIR] = "[DFS]";
350 status = wrap_mr_query("add_user_account", 15, argv, NULL, NULL);
353 com_err(whoami, status, "while adding user account.");
357 else if (update_flag)
365 status = wrap_mr_query("get_user_account_by_login", 1, args,
366 save_query_info, old_argv);
369 com_err(whoami, status, "while getting user information.");
373 argv[1] = old_argv[0];
374 argv[2] = old_argv[1];
375 argv[3] = old_argv[2];
376 argv[4] = old_argv[3];
377 argv[5] = old_argv[4];
378 argv[6] = old_argv[5];
379 argv[7] = old_argv[6];
380 argv[8] = old_argv[7];
381 argv[9] = old_argv[8];
382 argv[10] = old_argv[9];
383 argv[11] = old_argv[10];
384 argv[12] = old_argv[11];
385 argv[13] = old_argv[12];
386 argv[14] = old_argv[13];
387 argv[15] = old_argv[14];
415 argv[14] = winhomedir;
417 argv[15] = winprofiledir;
419 status = wrap_mr_query("update_user_account", 16, argv, NULL, NULL);
422 com_err(whoami, status, "while updating user.");
427 /* Deactivate a user, and the matching list and filesystem if they exist */
437 status = wrap_mr_query("update_user_status", 2, args, NULL, NULL);
440 com_err(whoami, status, "while deactivating user.");
444 status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
445 if (status == MR_SUCCESS)
447 for (i = 15; i > 0; i--)
448 argv[i + 1] = argv[i];
450 argv[L_ACTIVE + 1] = "0";
452 status = wrap_mr_query("update_list", 16, argv, NULL, NULL);
455 com_err(whoami, status, "while updating list, "
456 "not deactivating list or filesystem.");
460 else if (status && status != MR_NO_MATCH)
462 com_err(whoami, status, "while retrieving list information.");
466 status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info,
468 if (status == MR_SUCCESS)
470 for (i = 11; i > 0; i--)
471 argv[i + 1] = argv[i];
473 argv[FS_TYPE + 1] = "ERR";
474 argv[FS_COMMENTS + 1] = "Locker disabled; call 3-1325 for help";
476 status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL);
479 com_err(whoami, status, "while updating filesystem, "
480 "not deactivating filesystem.");
484 else if (status && status != MR_NO_MATCH)
486 com_err(whoami, status, "while retrieving filesystem information.");
491 /* Display user info */
498 status = wrap_mr_query("get_user_account_by_login", 1, args,
499 save_query_info, argv);
502 com_err(whoami, status, "while getting user information.");
505 if (unformatted_flag)
506 show_user_info_unformatted(argv);
508 show_user_info(argv);
511 /* register a user */
518 status = wrap_mr_query("get_user_account_by_login", 1, args,
519 save_query_info, argv);
522 com_err(whoami, status, "while looking up uid.");
526 args[0] = argv[U_UID];
530 status = wrap_mr_query("register_user", 3, args, NULL, NULL);
533 com_err(whoami, status, "while registering user.");
538 /* list user reservations */
544 status = wrap_mr_query("get_user_reservations", 1, args,
545 show_reservations, NULL);
547 if (status != MR_NO_MATCH) {
548 com_err(whoami, status, "while getting user reservations.");
553 /* add user reservations */
554 if (reservation_add_queue)
556 struct string_list *q = reservation_add_queue;
560 char *reservation = q->string;
564 args[1] = reservation;
565 status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL);
568 com_err(whoami, status, "while adding user reservation.");
576 /* delete user reservations */
577 if (reservation_remove_queue)
579 struct string_list *q = reservation_remove_queue;
583 char *reservation = q->string;
587 args[1] = reservation;
588 status = wrap_mr_query("delete_user_reservation", 2, args, NULL,
592 com_err(whoami, status, "while deleting user reservation.");
604 int save_query_info(int argc, char **argv, void *hint)
609 for(i = 0; i < argc; i++)
610 nargv[i] = strdup(argv[i]);
615 int show_reservations(int argc, char **argv, void *hint)
617 printf("Reservation: %s\n", argv[0]);
622 struct string_list *add_to_string_list(struct string_list *old_list, char *s) {
623 struct string_list *new_list;
625 new_list = (struct string_list *)malloc(sizeof(struct string_list *));
626 new_list->next = old_list;
627 new_list->string = s;
632 int wrap_mr_query(char *handle, int argc, char **argv,
633 int (*callback)(int, char **, void *), void *callarg) {
635 print_query(handle, argc, argv);
637 return mr_query(handle, argc, argv, callback, callarg);
640 void print_query(char *query_name, int argc, char **argv) {
643 printf("qy %s", query_name);
644 for(cnt = 0; cnt < argc; cnt++)
645 printf(" <%s>", argv[cnt]);
649 void show_user_info(char **argv)
654 sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]);
655 printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf);
656 printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]);
657 printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS],
658 argv[U_WINCONSOLESHELL]);
659 printf("Account is: %-20s MIT ID number: %s\n",
660 UserState(atoi(argv[U_STATE])), argv[U_MITID]);
661 printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
662 printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
663 status = atoi(argv[U_STATE]);
664 if (status == 0 || status == 2)
666 printf("User %s secure Account Coupon to register\n",
667 atoi(argv[U_SECURE]) ? "needs" : "does not need");
669 printf("Comments: %s\n", argv[U_COMMENT]);
670 printf("Created by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]);
671 printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME],
675 void show_user_info_unformatted(char **argv)
679 printf("Login name: %s\n", argv[U_NAME]);
680 printf("Full name: %s, %s %s\n", argv[U_LAST], argv[U_FIRST],
682 printf("User id: %s\n", argv[U_UID]);
683 printf("Class: %s\n", argv[U_CLASS]);
684 printf("Login shell: %s\n", argv[U_SHELL]);
685 printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]);
686 printf("Account is: %s\n", UserState(atoi(argv[U_STATE])));
687 printf("MIT ID number: %s\n", argv[U_MITID]);
688 printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
689 printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
690 status = atoi(argv[U_STATE]);
691 if (status == 0 || status == 2)
692 printf("Secure: %s secure Account Coupon to register\n",
693 atoi(argv[U_SECURE]) ? "Needs" : "Does not need");
694 printf("Comments: %s\n", argv[U_COMMENT]);
695 printf("Created by: %s\n", argv[U_CREATOR]);
696 printf("Created on: %s\n", argv[U_CREATED]);
697 printf("Last mod by: %s\n", argv[U_MODBY]);
698 printf("Last mod on: %s\n", argv[U_MODTIME]);
699 printf("Last mod with: %s\n", argv[U_MODWITH]);
702 void usage(char **argv)
704 #define USAGE_OPTIONS_FORMAT " %-39s%s\n"
705 fprintf(stderr, "Usage: %s username [options]\n", argv[0]);
706 fprintf(stderr, "Options are\n");
707 fprintf(stderr, " %-39s\n", "-i | -info");
708 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C | -create",
710 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r | -register",
711 "-R | -rename newname");
712 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U | -uid uid",
713 "-s | -shell shell");
714 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S | -status status",
715 "-w | -winshell winshell");
716 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F | -first firstname",
717 "-L | -last lastname");
718 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M | -middle middlename",
719 "-I | -mitid mitid");
720 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl | -class class",
721 "-c | -comment comment");
722 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6 | -secure 0|1",
723 "-lr | -listreservation");
724 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar | -addreservation reservation",
725 "-dr | -deletereservation reservation");
726 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-wh | -winhomedir winhomedir",
727 "-wp | -winprofiledir winprofiledir");
728 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u | -unformatted",
730 fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v | -verbose",
731 "-db | -database host[:port]");