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, *winhomedir, *winprofiledir;
+char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration;
+
+struct owner_type *parse_member(char *s);
static char *states[] = {
"Registerable (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;
- winhomedir = winprofiledir = 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("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", 11, !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
if (winhomedir)
argv[U_WINHOMEDIR] = winhomedir;
else
- argv[U_WINHOMEDIR] = "[AFS]";
+ argv[U_WINHOMEDIR] = "[DFS]";
if (winprofiledir)
argv[U_WINPROFILEDIR] = winprofiledir;
else
- argv[U_WINPROFILEDIR] = "[AFS]";
-
- status = wrap_mr_query("add_user_account", 15, argv, NULL, NULL);
+ 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[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[14] = winhomedir;
if (winprofiledir)
argv[15] = winprofiledir;
-
- status = wrap_mr_query("update_user_account", 16, argv, NULL, NULL);
+ 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]);
void show_user_info_unformatted(char **argv)
{
+ char tbuf[BUFSIZ];
int status;
printf("Login name: %s\n", argv[U_NAME]);
argv[U_MIDDLE]);
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])));
"-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;
+}