From: zacheiss Date: Tue, 25 Sep 2001 23:00:01 +0000 (+0000) Subject: First cut of stanley, a command line client for the users table, and a X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/commitdiff_plain/5d429b61b58329212ba5bb644626f4bb16f2e37b First cut of stanley, a command line client for the users table, and a boilerplate Makefile.in to build it. --- diff --git a/clients/stanley/Makefile.in b/clients/stanley/Makefile.in new file mode 100644 index 00000000..dd5265bd --- /dev/null +++ b/clients/stanley/Makefile.in @@ -0,0 +1,46 @@ +# $Id$ + +SHELL=/bin/sh +@SET_MAKE@ + +CC=@CC@ +CPPFLAGS=@CPPFLAGS@ +CFLAGS=@CFLAGS@ +DEFS=@DEFS@ +ALL_CFLAGS=$(CPPFLAGS) $(CFLAGS) $(DEFS) +LDFLAGS=@LDFLAGS@ +LIBS=../lib/libmrclient.a @LIBS@ +MR_LIBDEP=@MR_LIBDEP@ +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ + +srcdir=@srcdir@ +VPATH=@srcdir@ +SRCTOP=@top_srcdir@ +BUILDTOP=../.. +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ + +OBJS=stanley.o + +TARGET=stanley + +.c.o: + $(CC) -c $(ALL_CFLAGS) $< + +all: $(TARGET) + +clean: + rm -f $(OBJS) $(TARGET) + +cleandir distclean: clean + rm -f Makefile + +depend: + +install: all + $(INSTALL_PROGRAM) stanley $(bindir) + +$(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP) + $(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS) diff --git a/clients/stanley/stanley.c b/clients/stanley/stanley.c new file mode 100644 index 00000000..c9c2029d --- /dev/null +++ b/clients/stanley/stanley.c @@ -0,0 +1,659 @@ +/* + * Command line oriented Moira users tool. + * + * zacheiss@mit.edu, September 2001 + * + * Inspired by blanche + * + * Copyright (C) 2000, 2001 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +RCSID("$Header$"); + +struct string_list { + char *string; + struct string_list *next; +}; + +/* argument parsing macro */ +#define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b)) + +/* flags from command line */ +int info_flag, update_flag, create_flag, deact_flag, reg_flag; +int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth; + +struct string_list *reservation_add_queue, *reservation_remove_queue; + +char *username, *whoami; + +char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status; +char *clearid, *class, *comment, *secure; + +static char *states[] = { + "Registerable (0)", + "Active (1)", + "Half Registered (2)", + "Deleted (3)", + "Not registerable (4)", + "Enrolled/Registerable (5)", + "Enrolled/Not Registerable (6)", + "Half Enrolled (7)" +}; + +static char *UserState(int state) +{ + static char buf[BUFSIZ]; + + if (state < 0 || state >= US_END) + { + sprintf(buf, "Unknown (%d)", state); + return buf; + } + return states[state]; +} + +void usage(char **argv); +int save_query_info(int argc, char **argv, void *hint); +int show_reservations(int argc, char **argv, void *hint); +void show_user_info(char **argv); +void show_user_info_unformatted(char **argv); +struct string_list *add_to_string_list(struct string_list *old_list, char *s); +int wrap_mr_query(char *handle, int argc, char **argv, + int (*callback)(int, char **, void *), void *callarg); +void print_query(char *query_name, int argc, char **argv); + +int main(int argc, char **argv) +{ + int status; + char **arg = argv; + char *server = NULL; + + /* clear all flags & lists */ + info_flag = update_flag = create_flag = deact_flag = reg_flag = 0; + list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0; + newlogin = uid = shell = winshell = last = first = middle = NULL; + u_status = clearid = class = comment = secure = NULL; + reservation_add_queue = reservation_remove_queue = NULL; + whoami = argv[0]; + + /* parse args */ + while (++arg - argv < argc) + { + if (**arg == '-') + { + if (argis("i", "info")) + info_flag++; + else if (argis("C", "create")) + create_flag++; + else if (argis("D", "deact")) + deact_flag++; + else if (argis("r", "register")) + reg_flag++; + else if (argis("R", "rename")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + newlogin = *arg; + } else + usage(argv); + } + else if (argis("U", "uid")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + uid = *arg; + } else + usage(argv); + } + else if (argis("s", "shell")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + shell = *arg; + } else + usage(argv); + } + else if (argis("w", "winshell")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + winshell = *arg; + } else + usage(argv); + } + else if (argis("L", "last")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + last = *arg; + } else + usage(argv); + } + else if (argis("F", "first")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + first = *arg; + } else + usage(argv); + } + else if (argis("M", "middle")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + middle = *arg; + } else + usage(argv); + } + else if (argis("S", "status")) { + if (arg - argv < argc - 1) { + int i; + int len; + + arg++; + update_flag++; + u_status = *arg; + len = strlen(u_status); + for (i = 0; i < len; i++) { + if (!isdigit(u_status[i])) { + printf("Error: status code %s is not numeric.\n", u_status); + exit(1); + } + } + } else + usage(argv); + } + else if (argis("I", "clearid")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + clearid = *arg; + } else + usage(argv); + } + else if (argis("cl", "class")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + class = *arg; + } else + usage(argv); + } + else if (argis("c", "comment")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + comment = *arg; + } else + usage(argv); + } + else if (argis("6", "secure")) { + if (arg - argv < argc - 1) { + arg++; + update_flag++; + secure = *arg; + } else + usage(argv); + } + else if (argis("ar", "addreservation")) { + if (arg - argv < argc - 1) { + arg++; + reservation_add_queue = add_to_string_list(reservation_add_queue, + *arg); + } else + usage(argv); + update_res_flag++; + } + else if (argis("dr", "deletereservation")) { + if (arg - argv < argc - 1) { + arg++; + reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg); + } else + usage(argv); + update_res_flag++; + } + else if (argis("lr", "listreservations")) + list_res_flag++; + else if (argis("u", "unformatted")) + unformatted_flag++; + else if (argis("n", "noauth")) + noauth++; + else if (argis("v", "verbose")) + verbose++; + else if (argis("db", "database")) + { + if (arg - argv < argc - 1) + { + ++arg; + server = *arg; + } + else + usage(argv); + } + else + usage(argv); + } + else if (username == NULL) + username = *arg; + else + usage(argv); + } + if (username == NULL) + usage(argv); + + /* default to info_flag if nothing else was specified */ + if(!(info_flag || update_flag || create_flag || \ + deact_flag || reg_flag || list_res_flag || \ + update_res_flag)) { + info_flag++; + } + + /* fire up Moira */ + status = mrcl_connect(server, "stanley", 8, !noauth); + if (status == MRCL_AUTH_ERROR) + { + com_err(whoami, 0, "Try the -noauth flag if you don't " + "need authentication."); + } + if (status) + exit(2); + + /* create if needed */ + if (create_flag) + { + char *argv[20]; + int cnt; + + for (cnt = 0; cnt < 14; cnt++) { + argv[cnt] == ""; + } + + argv[U_NAME] = username; + if (uid) + argv[U_UID] = uid; + else + argv[U_UID] = UNIQUE_UID; + if (shell) + argv[U_SHELL] = shell; + else + argv[U_SHELL] = "/bin/athena/tcsh"; + if (winshell) + argv[U_WINCONSOLESHELL] = winshell; + else + argv[U_WINCONSOLESHELL] = "cmd"; + if (last) + argv[U_LAST] = last; + if (first) + argv[U_FIRST] = first; + if (middle) + argv[U_MIDDLE] = middle; + if (u_status) + argv[U_STATE] = u_status; + else + argv[U_STATE] = "0"; + if (clearid) + argv[U_MITID] = clearid; + if (class) + argv[U_CLASS] = class; + if (comment) + argv[U_COMMENT] = comment; + /* Signature field always is the empty string */ + argv[U_SIGNATURE] = ""; + if (secure) + argv[U_SECURE] = secure; + else + argv[U_SECURE] = "0"; + + status = wrap_mr_query("add_user_account", 13, argv, NULL, NULL); + + if (status) + { + com_err(whoami, status, "while adding user account."); + exit(1); + } + } + else if (update_flag) + { + char *old_argv[20]; + char *argv[20]; + char *args[5]; + + args[0] = username; + + status = wrap_mr_query("get_user_account_by_login", 1, args, + save_query_info, old_argv); + if (status) + { + com_err(whoami, status, "while getting user information."); + exit(1); + } + + argv[1] = old_argv[0]; + argv[2] = old_argv[1]; + argv[3] = old_argv[2]; + argv[4] = old_argv[3]; + argv[5] = old_argv[4]; + argv[6] = old_argv[5]; + argv[7] = old_argv[6]; + argv[8] = old_argv[7]; + argv[9] = old_argv[8]; + argv[10] = old_argv[9]; + argv[11] = old_argv[10]; + argv[12] = old_argv[11]; + argv[13] = old_argv[12]; + + argv[0] = username; + if (newlogin) + argv[1] = newlogin; + if (uid) + argv[2] = uid; + if (shell) + argv[3] = shell; + if (winshell) + argv[4] = winshell; + if (last) + argv[5] = last; + if (first) + argv[6] = first; + if (middle) + argv[7] = middle; + if (u_status) + argv[8] = u_status; + if (clearid) + argv[9] = clearid; + if (class) + argv[10] = class; + if (comment) + argv[11] = comment; + if (secure) + argv[13] = secure; + + status = wrap_mr_query("update_user_account", 14, argv, NULL, NULL); + + if (status) + com_err(whoami, status, "while updating user."); + else if (newlogin) + username = newlogin; + } + + if (deact_flag) + { + char *args[2]; + char *argv[20]; + int i; + + args[0] = username; + args[1] = "3"; + + status = wrap_mr_query("update_user_status", 2, args, NULL, NULL); + if (status) + { + com_err(whoami, status, "while deactivating user."); + exit(1); + } + + status = wrap_mr_query("get_list_into", 1, args, save_query_info, argv); + if (status) + { + com_err(whoami, status, "while retrieving list information."); + exit(1); + } + + for (i = 13; i > 0; i--) + argv[i + 1] = argv[i]; + argv[1] = username; + argv[L_ACTIVE] = "0"; + + status = wrap_mr_query("update_list", 14, argv, NULL, NULL); + if (status) + { + com_err(whoami, status, "while updating list, " + "not deactivating list or filesystem."); + exit(1); + } + + status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info, + argv); + if (status) + { + com_err(whoami, status, "while retrieving filesystem information."); + exit(1); + } + + for (i = 11; i > 0; i--) + argv[i + 1] = argv[i]; + argv[1] = username; + argv[FS_TYPE] = "ERR"; + argv[FS_COMMENTS] = "Locker disabled; call 3-1325 for help"; + + status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL); + if (status) + { + com_err(whoami, status, "while updating filesystem, " + "not deactivating filesystem."); + exit(1); + } + } + + /* Display user info */ + if (info_flag) + { + char *args[2]; + char *argv[20]; + + args[0] = username; + status = wrap_mr_query("get_user_account_by_login", 1, args, + save_query_info, argv); + if (status) + { + com_err(whoami, status, "while getting user information."); + exit(1); + } + if (unformatted_flag) + show_user_info_unformatted(argv); + else + show_user_info(argv); + } + + /* register a user */ + if (reg_flag) + { + char *args[3]; + char *argv[20]; + char uid[10]; + + args[0] = username; + status = wrap_mr_query("get_user_account_by_login", 1, args, + save_query_info, argv); + if (status) + { + com_err(whoami, status, "while looking up uid."); + exit(1); + } + + args[0] = argv[U_UID]; + argv[1] = username; + argv[2] = "IMAP"; + + status = wrap_mr_query("register_user", 3, args, NULL, NULL); + if (status) + { + com_err(whoami, status, "while registering user."); + exit(1); + } + } + + /* list user reservations */ + if (list_res_flag) + { + char *args[1]; + + args[0] = username; + status = wrap_mr_query("get_user_reservations", 1, args, + show_reservations, NULL); + if (status) + if (status != MR_NO_MATCH) { + com_err(whoami, status, "while getting user reservations."); + exit(1); + } + } + + /* add user reservations */ + if (reservation_add_queue) + { + struct string_list *q = reservation_add_queue; + + while (q) + { + char *reservation = q->string; + char *args[2]; + + args[0] = username; + args[1] = reservation; + status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL); + if (status) + { + com_err(whoami, status, "while adding user reservation."); + exit(1); + } + + q = q->next; + } + } + + /* delete user reservations */ + if (reservation_remove_queue) + { + struct string_list *q = reservation_remove_queue; + + while (q) + { + char *reservation = q->string; + char *args[2]; + + args[0] = username; + args[1] = reservation; + status = wrap_mr_query("delete_user_reservation", 2, args, NULL, + NULL); + if (status) + { + com_err(whoami, status, "while deleting user reservation."); + exit(1); + } + + q = q->next; + } + } + /* We're done! */ + mr_disconnect(); + exit(0); +} + +int save_query_info(int argc, char **argv, void *hint) +{ + int i; + char **nargv = hint; + + for(i = 0; i < argc; i++) + nargv[i] = strdup(argv[i]); + + return MR_CONT; +} + +int show_reservations(int argc, char **argv, void *hint) +{ + printf("Reservation: %s\n", argv[0]); + + return MR_CONT; +} + +struct string_list *add_to_string_list(struct string_list *old_list, char *s) { + struct string_list *new_list; + + new_list = (struct string_list *)malloc(sizeof(struct string_list *)); + new_list->next = old_list; + new_list->string = s; + + return new_list; +} + +int wrap_mr_query(char *handle, int argc, char **argv, + int (*callback)(int, char **, void *), void *callarg) { + if (verbose) + print_query(handle, argc, argv); + + return mr_query(handle, argc, argv, callback, callarg); +} + +void print_query(char *query_name, int argc, char **argv) { + int cnt; + + printf("qy %s", query_name); + for(cnt = 0; cnt < argc; cnt++) + printf(" <%s>", argv[cnt]); + printf("\n"); +} + +void usage(char **argv) +{ +#define USAGE_OPTIONS_FORMAT " %-39s%s\n" + fprintf(stderr, "Usage: %s username [options]\n", argv[0]); + /* More here. Just want this this to compile now. */ + exit(1); +} + +void show_user_info(char **argv) +{ + char tbuf[BUFSIZ]; + int status; + + sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]); + printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf); + printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]); + printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS], + argv[U_WINCONSOLESHELL]); + printf("Account is: %-20s MIT ID number: %s\n", + UserState(atoi(argv[U_STATE])), argv[U_MITID]); + status = atoi(argv[U_STATE]); + if (status == 0 || status == 2) + { + sprintf(tbuf, "User %s secure Account Coupon to register\n", + atoi(argv[U_SECURE]) ? "needs" : "does not need"); + } + printf("Comments: %s\n", argv[U_COMMENT]); + printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME], + argv[U_MODWITH]); +} + +void show_user_info_unformatted(char **argv) +{ + int status; + + printf("Login name: %s\n", argv[U_NAME]); + printf("Full name: %s, %s %s\n", argv[U_LAST], argv[U_FIRST], + argv[U_MIDDLE]); + printf("User id: %s\n", argv[U_UID]); + printf("Class: %s\n", argv[U_CLASS]); + printf("Login shell: %s\n", argv[U_SHELL]); + printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]); + printf("Account is: %s\n", UserState(atoi(argv[U_STATE]))); + printf("MIT ID number: %s\n", argv[U_MITID]); + printf("Secure: %s\n", argv[U_SECURE]); + printf("Comments: %s\n", argv[U_COMMENT]); + printf("Last mod by: %s\n", argv[U_MODBY]); + printf("Last mod on: %s\n", argv[U_MODTIME]); + printf("Last mod with: %s\n", argv[U_MODWITH]); +}