RCSID("$Header$");
+struct owner_type {
+ int type;
+ char *name;
+};
+
struct string_list {
char *string;
struct string_list *next;
};
+#define M_ANY 0
+#define M_USER 1
+#define M_LIST 2
+#define M_KERBEROS 3
+#define M_NONE 4
+
/* argument parsing macro */
#define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
int info_flag, update_flag, create_flag, deact_flag, reg_flag;
int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
+struct owner_type *sponsor;
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;
+char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration;
+
+struct owner_type *parse_member(char *s);
static char *states[] = {
"Registerable (0)",
"Not registerable (4)",
"Enrolled/Registerable (5)",
"Enrolled/Not Registerable (6)",
- "Half Enrolled (7)"
+ "Half Enrolled (7)",
+ "Registerable, Kerberos only (8)",
+ "Active, Kerberos only (9)"
};
static char *UserState(int state)
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;
+ winhomedir = winprofiledir = expiration = NULL;
reservation_add_queue = reservation_remove_queue = NULL;
+ sponsor = NULL;
whoami = argv[0];
/* parse args */
} else
usage(argv);
}
- else if (argis("I", "clearid")) {
+ else if (argis("I", "mitid")) {
if (arg - argv < argc - 1) {
arg++;
update_flag++;
} else
usage(argv);
}
+ else if (argis("wh", "winhomedir")) {
+ if (arg - argv < argc - 1) {
+ arg++;
+ update_flag++;
+ winhomedir = *arg;
+ } else
+ usage(argv);
+ }
+ else if (argis("wp", "winprofiledir")) {
+ if (arg - argv < argc - 1) {
+ arg++;
+ update_flag++;
+ winprofiledir = *arg;
+ } else
+ usage(argv);
+ }
+ else if (argis("sp", "sponsor")) {
+ if (arg - argv < argc - 1) {
+ arg++;
+ update_flag++;
+ sponsor = parse_member(*arg);
+ } else
+ usage(argv);
+ }
+ else if (argis("e", "expiration")) {
+ if (arg - argv < argc - 1) {
+ arg++;
+ update_flag++;
+ expiration = *arg;
+ } else
+ usage(argv);
+ }
else if (argis("ar", "addreservation")) {
if (arg - argv < argc - 1) {
arg++;
}
/* fire up Moira */
- status = mrcl_connect(server, "stanley", 8, !noauth);
+ status = mrcl_connect(server, "stanley", 12, !noauth);
if (status == MRCL_AUTH_ERROR)
{
com_err(whoami, 0, "Try the -noauth flag if you don't "
char *argv[20];
int cnt;
- for (cnt = 0; cnt < 14; cnt++) {
+ for (cnt = 0; cnt < 20; cnt++) {
argv[cnt] = "";
}
if (shell)
argv[U_SHELL] = shell;
else
- argv[U_SHELL] = "/bin/athena/tcsh";
+ argv[U_SHELL] = "/bin/athena/bash";
if (winshell)
argv[U_WINCONSOLESHELL] = winshell;
else
argv[U_SECURE] = secure;
else
argv[U_SECURE] = "0";
-
- status = wrap_mr_query("add_user_account", 13, argv, NULL, NULL);
+ if (winhomedir)
+ argv[U_WINHOMEDIR] = winhomedir;
+ else
+ argv[U_WINHOMEDIR] = "[DFS]";
+ if (winprofiledir)
+ argv[U_WINPROFILEDIR] = winprofiledir;
+ else
+ argv[U_WINPROFILEDIR] = "[DFS]";
+ if (expiration)
+ argv[U_EXPIRATION] = expiration;
+ if (sponsor)
+ {
+ argv[U_SPONSOR_NAME] = sponsor->name;
+ switch (sponsor->type)
+ {
+ case M_ANY:
+ case M_USER:
+ argv[U_SPONSOR_TYPE] = "USER";
+ status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+ if (sponsor->type != M_ANY || status != MR_USER)
+ break;
+
+ case M_LIST:
+ argv[U_SPONSOR_TYPE] = "LIST";
+ status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+ break;
+
+ case M_KERBEROS:
+ argv[U_SPONSOR_TYPE] = "KERBEROS";
+ status = mrcl_validate_kerberos_member(argv[U_SPONSOR_NAME],
+ &argv[U_SPONSOR_NAME]);
+ if (mrcl_get_message())
+ mrcl_com_err(whoami);
+ if (status == MRCL_REJECT)
+ exit(1);
+ status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+ break;
+
+ case M_NONE:
+ argv[U_SPONSOR_TYPE] = "NONE";
+ status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+ break;
+ }
+ }
+ else
+ {
+ argv[U_SPONSOR_TYPE] = "NONE";
+ argv[U_SPONSOR_NAME] = "NONE";
+
+ status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+ }
+
if (status)
{
com_err(whoami, status, "while adding user account.");
argv[11] = old_argv[10];
argv[12] = old_argv[11];
argv[13] = old_argv[12];
+ argv[14] = old_argv[13];
+ argv[15] = old_argv[14];
+ argv[16] = old_argv[15];
+ argv[17] = old_argv[16];
+ argv[18] = old_argv[17];
argv[0] = username;
if (newlogin)
argv[11] = comment;
if (secure)
argv[13] = secure;
-
- status = wrap_mr_query("update_user_account", 14, argv, NULL, NULL);
+ if (winhomedir)
+ argv[14] = winhomedir;
+ if (winprofiledir)
+ argv[15] = winprofiledir;
+ if (expiration)
+ argv[18] = expiration;
+ if (sponsor)
+ {
+ argv[17] = sponsor->name;
+ switch (sponsor->type)
+ {
+ case M_ANY:
+ case M_USER:
+ argv[16] = "USER";
+ status = wrap_mr_query("update_user_account", 19, argv, NULL,
+ NULL);
+ if (sponsor->type != M_ANY || status != MR_USER)
+ break;
+
+ case M_LIST:
+ argv[16] = "LIST";
+ status = wrap_mr_query("update_user_account", 19, argv, NULL,
+ NULL);
+ break;
+
+ case M_KERBEROS:
+ argv[16] = "KERBEROS";
+ status = mrcl_validate_kerberos_member(argv[17], &argv[17]);
+ if (mrcl_get_message())
+ mrcl_com_err(whoami);
+ if (status == MRCL_REJECT)
+ exit(1);
+ status = wrap_mr_query("update_user_account", 19, argv, NULL,
+ NULL);
+ break;
+
+ case M_NONE:
+ argv[16] = "NONE";
+ status = wrap_mr_query("update_user_account", 19, argv, NULL,
+ NULL);
+ break;
+ }
+ }
+ else
+ status = wrap_mr_query("update_user_account", 19, argv, NULL, NULL);
if (status)
com_err(whoami, status, "while updating user.");
status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
if (status == MR_SUCCESS)
{
- for (i = 13; i > 0; i--)
+ for (i = 15; i > 0; i--)
argv[i + 1] = argv[i];
argv[1] = username;
argv[L_ACTIVE + 1] = "0";
- status = wrap_mr_query("update_list", 14, argv, NULL, NULL);
+ status = wrap_mr_query("update_list", 16, argv, NULL, NULL);
if (status)
{
com_err(whoami, status, "while updating list, "
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]);
+ sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
+ strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
+ printf("Sponsor: %-23s Expiration date: %s\n", tbuf, argv[U_EXPIRATION]);
printf("Account is: %-20s MIT ID number: %s\n",
UserState(atoi(argv[U_STATE])), argv[U_MITID]);
+ printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
+ printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
status = atoi(argv[U_STATE]);
if (status == 0 || status == 2)
{
atoi(argv[U_SECURE]) ? "needs" : "does not need");
}
printf("Comments: %s\n", argv[U_COMMENT]);
+ printf("Created by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]);
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)
{
- printf("Login name: %s\n", argv[U_NAME]);
- printf("Full name: %s, %s %s\n", argv[U_LAST], argv[U_FIRST],
+ char tbuf[BUFSIZ];
+ 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]);
+ printf("User id: %s\n", argv[U_UID]);
+ printf("Class: %s\n", argv[U_CLASS]);
+ sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
+ strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
+ printf("Sponsor: %s\n", tbuf);
+ printf("Expiration date: %s\n", argv[U_EXPIRATION]);
+ 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("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
+ printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
+ status = atoi(argv[U_STATE]);
+ if (status == 0 || status == 2)
+ printf("Secure: %s secure Account Coupon to register\n",
+ atoi(argv[U_SECURE]) ? "Needs" : "Does not need");
+ printf("Comments: %s\n", argv[U_COMMENT]);
+ printf("Created by: %s\n", argv[U_CREATOR]);
+ printf("Created on: %s\n", argv[U_CREATED]);
+ 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]);
}
void usage(char **argv)
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F | -first firstname",
"-L | -last lastname");
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M | -middle middlename",
- "-I | -clearid mitid");
+ "-I | -mitid mitid");
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl | -class class",
"-c | -comment comment");
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6 | -secure 0|1",
"-lr | -listreservation");
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar | -addreservation reservation",
"-dr | -deletereservation reservation");
+ fprintf(stderr, USAGE_OPTIONS_FORMAT, "-wh | -winhomedir winhomedir",
+ "-wp | -winprofiledir winprofiledir");
+ fprintf(stderr, USAGE_OPTIONS_FORMAT, "-sp | -sponsor sponsor",
+ "-e | -expiration expiration date");
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u | -unformatted",
- "-n | -noauth");
+ "-n | -noauth");
fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v | -verbose",
"-db | -database host[:port]");
exit(1);
}
+
+/* Parse a line of input, fetching a member. NULL is returned if a member
+ * is not found. ';' is a comment character.
+ */
+struct owner_type *parse_member(char *s)
+{
+ struct owner_type *m;
+ char *p, *lastchar;
+
+ while (*s && isspace(*s))
+ s++;
+ lastchar = p = s;
+ while (*p && *p != '\n' && *p != ';')
+ {
+ if (isprint(*p) && !isspace(*p))
+ lastchar = p++;
+ else
+ p++;
+ }
+ lastchar++;
+ *lastchar = '\0';
+ if (p == s || strlen(s) == 0)
+ return NULL;
+
+ if (!(m = malloc(sizeof(struct owner_type))))
+ return NULL;
+
+ if ((p = strchr(s, ':')))
+ {
+ *p = '\0';
+ m->name = ++p;
+ if (!strcasecmp("user", s))
+ m->type = M_USER;
+ else if (!strcasecmp("list", s))
+ m->type = M_LIST;
+ else if (!strcasecmp("kerberos", s))
+ m->type = M_KERBEROS;
+ else if (!strcasecmp("none", s))
+ m->type = M_NONE;
+ else
+ {
+ m->type = M_ANY;
+ *(--p) = ':';
+ m->name = s;
+ }
+ m->name = strdup(m->name);
+ }
+ else
+ {
+ m->name = strdup(s);
+ m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
+ }
+ return m;
+}