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>
25 #define DEFAULT_SHELL "/bin/athena/tcsh"
27 #define DEFAULT_SHELL "/bin/csh"
30 #define DEFAULT_WINCONSOLESHELL "cmd"
32 /* flags from command line */
33 char *class, *comment, *status_str, *shell, *winconsoleshell, *filename;
34 int reg_only, reg, verbose, nodupcheck, securereg, nocaps;
36 /* argument parsing macro */
37 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
40 int duplicate, errors;
42 void usage(char **argv);
43 int usercheck(int argc, char **argv, void *qargv);
44 int get_uid(int argc, char **argv, void *qargv);
46 int main(int argc, char **argv)
49 char **arg = argv, *qargv[U_END];
50 char *p, *first, *middle, *last, *id, *login, *server;
54 /* clear all flags & lists */
55 reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = nocaps = 0;
58 shell = DEFAULT_SHELL;
59 winconsoleshell = DEFAULT_WINCONSOLESHELL;
67 while (++arg - argv < argc)
71 if (argis("c", "class"))
73 if (arg - argv < argc - 1)
81 else if (argis("C", "comment"))
83 if (arg - argv < argc - 1)
91 else if (argis("s", "status"))
93 if (arg - argv < argc - 1)
101 else if (argis("h", "shell"))
103 if (arg - argv < argc - 1)
111 else if (argis("w", "winshell"))
113 if (arg - argv < argc - 1)
116 winconsoleshell = *arg;
121 else if (argis("6", "secure"))
123 else if (argis("r", "reg_only"))
125 else if (argis("R", "register"))
127 else if (argis("f", "file"))
129 if (arg - argv < argc - 1)
137 else if (argis("v", "verbose"))
139 else if (argis("d", "nodupcheck"))
141 else if (argis("n", "nocaps"))
143 else if (argis("S", "server") || argis("db", "database"))
145 if (arg - argv < argc - 1)
160 if (!strcmp(filename, "-"))
164 input = fopen(filename, "r");
167 com_err(whoami, errno, "opening input file %s", filename);
173 if (mrcl_connect(server, "addusr", 3, 1) != MRCL_SUCCESS)
176 qargv[U_NAME] = UNIQUE_LOGIN;
177 qargv[U_UID] = UNIQUE_UID;
178 qargv[U_SHELL] = shell;
179 qargv[U_WINCONSOLESHELL] = winconsoleshell;
180 qargv[U_STATE] = status_str;
181 qargv[U_CLASS] = class;
182 qargv[U_COMMENT] = comment;
183 qargv[U_SIGNATURE] = "";
184 qargv[U_SECURE] = securereg ? "1" : "0";
185 while (fgets(buf, BUFSIZ, input))
187 /* throw away terminating newline */
188 p = &buf[strlen(buf) - 1];
192 if (strlen(buf) == 0)
194 /* Last name is first thing on line */
196 /* First name follows a comma */
197 p = strchr(last, ',');
200 com_err(whoami, MR_BAD_CHAR, "Missing comma on line %d", lineno);
206 while (*p) /* find end-of-line */
214 com_err(whoami, 0, "Missing login on line %d", lineno);
218 login = strtrim(&p[1]);
223 /* ID is last thing on line */
232 com_err(whoami, 0, "Missing ID on line %d", lineno);
238 /* If something between first name & ID, it's middle name */
250 qargv[U_FIRST] = strtrim(first);
251 qargv[U_MIDDLE] = strtrim(middle);
252 qargv[U_LAST] = strtrim(last);
253 qargv[U_MITID] = strtrim(id);
256 FixCase(qargv[U_FIRST]);
257 FixCase(qargv[U_MIDDLE]);
258 FixCase(qargv[U_LAST]);
260 RemoveHyphens(qargv[U_MITID]);
267 dargv[0] = qargv[U_FIRST];
268 dargv[1] = qargv[U_LAST];
270 status = mr_query("get_user_account_by_name", 2, dargv,
272 if (status && status != MR_NO_MATCH)
274 com_err(whoami, status,
275 "checking to see if user %s %s already exists",
276 qargv[U_FIRST], qargv[U_LAST]);
277 com_err(whoami, 0, "NOT ADDING USER");
283 com_err(whoami, MR_EXISTS, "user %s %s already exists",
284 qargv[U_FIRST], qargv[U_LAST]);
285 com_err(whoami, 0, "NOT ADDING USER");
289 else if (duplicate < 0)
291 com_err(whoami, MR_EXISTS,
292 "user %s %s already exists with different ID number",
293 qargv[U_FIRST], qargv[U_LAST]);
294 com_err(whoami, 0, "ADDING user anyway");
297 status = mr_query("add_user_account", U_SECURE + 1, qargv,
301 com_err(whoami, status, "adding user %s %s", first, last);
306 printf("Added user %s %s %s (%s)\n", qargv[U_FIRST],
307 qargv[U_MIDDLE], qargv[U_LAST], qargv[U_MITID]);
312 char *gargv[2], *rargv[3], uid[10];
315 gargv[0] = qargv[U_FIRST];
316 gargv[1] = qargv[U_LAST];
317 status = mr_query("get_user_account_by_name", 2, gargv,
321 com_err(whoami, status, "while looking up uid for %s %s",
322 qargv[U_FIRST], qargv[U_LAST]);
331 status = mr_query("register_user", 3, rargv, NULL, NULL);
334 com_err(whoami, status, "while registering (login) %s %s",
335 qargv[U_FIRST], qargv[U_LAST]);
341 printf("Registered user %s %s as %s\n", qargv[U_FIRST],
342 qargv[U_LAST], login);
351 void usage(char **argv)
353 fprintf(stderr, "Usage: %s [options]\n", argv[0]);
354 fprintf(stderr, "Options are\n");
355 fprintf(stderr, " -f | -file filename (default STDIN)\n");
356 fprintf(stderr, " -c | -class class (default TEMP)\n");
357 fprintf(stderr, " -C | -comment \"comment\" (default \"\")\n");
358 fprintf(stderr, " -s | -status status (default 0)\n");
359 fprintf(stderr, " -h | -shell shell (default %s)\n", DEFAULT_SHELL);
360 fprintf(stderr, " -w | -winshell windows console shell (default %s)\n",
361 DEFAULT_WINCONSOLESHELL);
362 fprintf(stderr, " -r | -reg_only\n");
363 fprintf(stderr, " -R | -register (and add to database)\n");
364 fprintf(stderr, " -v | -verbose\n");
365 fprintf(stderr, " -d | -nodupcheck (don't check for duplicates)\n");
366 fprintf(stderr, " -n | -nocaps (don't fix capitalization of names)\n");
367 fprintf(stderr, " -db | -database host:port\n");
372 /* query callback routine to check for duplicate users */
374 int usercheck(int argc, char **argv, void *qargv)
376 if (!strcmp(argv[U_MITID], ((char **)qargv)[U_MITID]))
384 /* query callback to get uid of a just-added account */
385 int get_uid(int argc, char **argv, void *uidv)
390 strcpy(uid, argv[U_UID]);
393 if (!strcmp(argv[U_MODWITH], "addusr"))
394 strcpy(uid, argv[U_UID]);