3 * Program to add users en masse to the moira database
5 * by Mark Rosenstein, July 1992.
7 * Copyright (C) 1992-1998 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, please see the file
12 #include <mit-copyright.h>
14 #include <moira_site.h>
36 #define DEFAULT_SHELL "/bin/athena/bash"
38 #define DEFAULT_SHELL "/bin/bash"
41 #define DEFAULT_WINCONSOLESHELL "cmd"
42 #define DEFAULT_WINHOMEDIR "[DFS]"
43 #define DEFAULT_WINPROFILEDIR "[DFS]"
45 /* flags from command line */
46 char *class, *comment, *status_str, *shell, *winconsoleshell, *filename;
48 int reg_only, reg, verbose, nodupcheck, securereg, nocaps;
49 struct owner_type *sponsor;
51 /* argument parsing macro */
52 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
55 int duplicate, errors;
57 void usage(char **argv);
58 int usercheck(int argc, char **argv, void *qargv);
59 int get_uid(int argc, char **argv, void *qargv);
60 struct owner_type *parse_member(char *s);
62 int main(int argc, char **argv)
65 char **arg = argv, *qargv[U_END];
66 char *p, *first, *middle, *last, *id, *login, *server;
70 /* clear all flags & lists */
71 reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = nocaps = 0;
75 shell = DEFAULT_SHELL;
76 winconsoleshell = DEFAULT_WINCONSOLESHELL;
85 while (++arg - argv < argc)
89 if (argis("c", "class"))
91 if (arg - argv < argc - 1)
99 else if (argis("C", "comment"))
101 if (arg - argv < argc - 1)
109 else if (argis("s", "status"))
111 if (arg - argv < argc - 1)
119 else if (argis("h", "shell"))
121 if (arg - argv < argc - 1)
129 else if (argis("w", "winshell"))
131 if (arg - argv < argc - 1)
134 winconsoleshell = *arg;
139 else if (argis("sp", "sponsor"))
141 if (arg - argv < argc - 1)
144 sponsor = parse_member(*arg);
149 else if (argis("e", "expiration"))
151 if (arg - argv < argc - 1)
159 else if (argis("6", "secure"))
161 else if (argis("r", "reg_only"))
163 else if (argis("R", "register"))
165 else if (argis("f", "file"))
167 if (arg - argv < argc - 1)
175 else if (argis("v", "verbose"))
177 else if (argis("d", "nodupcheck"))
179 else if (argis("n", "nocaps"))
181 else if (argis("S", "server") || argis("db", "database"))
183 if (arg - argv < argc - 1)
198 if (!strcmp(filename, "-"))
202 input = fopen(filename, "r");
205 com_err(whoami, errno, "opening input file %s", filename);
211 if (mrcl_connect(server, "addusr", 12, 1) != MRCL_SUCCESS)
214 qargv[U_NAME] = UNIQUE_LOGIN;
215 qargv[U_UID] = UNIQUE_UID;
216 qargv[U_SHELL] = shell;
217 qargv[U_WINCONSOLESHELL] = winconsoleshell;
218 qargv[U_WINHOMEDIR] = DEFAULT_WINHOMEDIR;
219 qargv[U_WINPROFILEDIR] = DEFAULT_WINPROFILEDIR;
220 qargv[U_EXPIRATION] = expiration;
221 qargv[U_STATE] = status_str;
222 qargv[U_CLASS] = class;
223 qargv[U_COMMENT] = comment;
224 qargv[U_SIGNATURE] = "";
225 qargv[U_SECURE] = securereg ? "1" : "0";
227 while (fgets(buf, BUFSIZ, input))
229 /* throw away terminating newline */
230 p = &buf[strlen(buf) - 1];
234 if (strlen(buf) == 0)
236 /* Last name is first thing on line */
238 /* First name follows a comma */
239 p = strchr(last, ',');
242 com_err(whoami, MR_BAD_CHAR, "Missing comma on line %d", lineno);
248 while (*p) /* find end-of-line */
256 com_err(whoami, 0, "Missing login on line %d", lineno);
260 login = strtrim(&p[1]);
265 /* ID is last thing on line */
274 com_err(whoami, 0, "Missing ID on line %d", lineno);
280 /* If something between first name & ID, it's middle name */
292 qargv[U_FIRST] = strtrim(first);
293 qargv[U_MIDDLE] = strtrim(middle);
294 qargv[U_LAST] = strtrim(last);
295 qargv[U_MITID] = strtrim(id);
298 FixCase(qargv[U_FIRST]);
299 FixCase(qargv[U_MIDDLE]);
300 FixCase(qargv[U_LAST]);
302 RemoveHyphens(qargv[U_MITID]);
309 dargv[0] = qargv[U_FIRST];
310 dargv[1] = qargv[U_LAST];
312 status = mr_query("get_user_account_by_name", 2, dargv,
314 if (status && status != MR_NO_MATCH)
316 com_err(whoami, status,
317 "checking to see if user %s %s already exists",
318 qargv[U_FIRST], qargv[U_LAST]);
319 com_err(whoami, 0, "NOT ADDING USER");
325 com_err(whoami, MR_EXISTS, "user %s %s already exists",
326 qargv[U_FIRST], qargv[U_LAST]);
327 com_err(whoami, 0, "NOT ADDING USER");
331 else if (duplicate < 0)
333 com_err(whoami, MR_EXISTS,
334 "user %s %s already exists with different ID number",
335 qargv[U_FIRST], qargv[U_LAST]);
336 com_err(whoami, 0, "ADDING user anyway");
342 qargv[U_SPONSOR_NAME] = sponsor->name;
343 switch (sponsor->type)
347 qargv[U_SPONSOR_TYPE] = "USER";
348 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
349 if (sponsor->type != M_ANY || status != MR_USER)
353 qargv[U_SPONSOR_TYPE] = "LIST";
354 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
358 qargv[U_SPONSOR_TYPE] = "KERBEROS";
359 status = mrcl_validate_kerberos_member(qargv[U_SPONSOR_NAME],
360 &qargv[U_SPONSOR_NAME]);
361 if (mrcl_get_message())
362 mrcl_com_err(whoami);
363 if (status == MRCL_REJECT)
365 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
369 qargv[U_SPONSOR_TYPE] = "NONE";
370 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
376 qargv[U_SPONSOR_TYPE] = "NONE";
377 qargv[U_SPONSOR_NAME] = "NONE";
379 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
384 com_err(whoami, status, "adding user %s %s", first, last);
389 printf("Added user %s %s %s (%s)\n", qargv[U_FIRST],
390 qargv[U_MIDDLE], qargv[U_LAST], qargv[U_MITID]);
395 char *gargv[2], *rargv[3], uid[10];
398 gargv[0] = qargv[U_FIRST];
399 gargv[1] = qargv[U_LAST];
400 status = mr_query("get_user_account_by_name", 2, gargv,
404 com_err(whoami, status, "while looking up uid for %s %s",
405 qargv[U_FIRST], qargv[U_LAST]);
414 status = mr_query("register_user", 3, rargv, NULL, NULL);
417 com_err(whoami, status, "while registering (login) %s %s",
418 qargv[U_FIRST], qargv[U_LAST]);
424 printf("Registered user %s %s as %s\n", qargv[U_FIRST],
425 qargv[U_LAST], login);
434 void usage(char **argv)
436 fprintf(stderr, "Usage: %s [options]\n", argv[0]);
437 fprintf(stderr, "Options are\n");
438 fprintf(stderr, " -f | -file filename (default STDIN)\n");
439 fprintf(stderr, " -c | -class class (default TEMP)\n");
440 fprintf(stderr, " -C | -comment \"comment\" (default \"\")\n");
441 fprintf(stderr, " -s | -status status (default 0)\n");
442 fprintf(stderr, " -h | -shell shell (default %s)\n", DEFAULT_SHELL);
443 fprintf(stderr, " -w | -winshell windows console shell (default %s)\n",
444 DEFAULT_WINCONSOLESHELL);
445 fprintf(stderr, " -sp | -sponsor sponsor (default NONE)\n");
446 fprintf(stderr, " -e | -expiration \"expiration date\" (default \"\")\n");
447 fprintf(stderr, " -r | -reg_only\n");
448 fprintf(stderr, " -R | -register (and add to database)\n");
449 fprintf(stderr, " -v | -verbose\n");
450 fprintf(stderr, " -d | -nodupcheck (don't check for duplicates)\n");
451 fprintf(stderr, " -n | -nocaps (don't fix capitalization of names)\n");
452 fprintf(stderr, " -db | -database host:port\n");
457 /* query callback routine to check for duplicate users */
459 int usercheck(int argc, char **argv, void *qargv)
461 if (!strcmp(argv[U_MITID], ((char **)qargv)[U_MITID]))
469 /* query callback to get uid of a just-added account */
470 int get_uid(int argc, char **argv, void *uidv)
475 strcpy(uid, argv[U_UID]);
478 if (!strcmp(argv[U_MODWITH], "addusr"))
479 strcpy(uid, argv[U_UID]);
485 /* Parse a line of input, fetching a member. NULL is returned if a member
486 * is not found. ';' is a comment character.
488 struct owner_type *parse_member(char *s)
490 struct owner_type *m;
493 while (*s && isspace(*s))
496 while (*p && *p != '\n' && *p != ';')
498 if (isprint(*p) && !isspace(*p))
505 if (p == s || strlen(s) == 0)
508 if (!(m = malloc(sizeof(struct owner_type))))
511 if ((p = strchr(s, ':')))
515 if (!strcasecmp("user", s))
517 else if (!strcasecmp("list", s))
519 else if (!strcasecmp("kerberos", s))
520 m->type = M_KERBEROS;
521 else if (!strcasecmp("none", s))
529 m->name = strdup(m->name);
534 m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;