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>
24 #define DEFAULT_SHELL "/bin/athena/tcsh"
26 #define DEFAULT_SHELL "/bin/csh"
29 /* flags from command line */
30 char *class, *comment, *status_str, *shell, *filename;
31 int reg_only, reg, verbose, nodupcheck, securereg;
33 /* argument parsing macro */
34 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
37 int duplicate, errors;
39 void usage(char **argv);
40 int usercheck(int argc, char **argv, void *qargv);
42 int main(int argc, char **argv)
45 char **arg = argv, *qargv[U_END];
46 char *motd, *p, *first, *middle, *last, *id, *login, *server;
47 char buf[BUFSIZ], idbuf[32];
50 /* clear all flags & lists */
51 reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = 0;
54 shell = DEFAULT_SHELL;
62 while (++arg - argv < argc)
66 if (argis("c", "class"))
68 if (arg - argv < argc - 1)
76 else if (argis("C", "comment"))
78 if (arg - argv < argc - 1)
86 else if (argis("s", "status"))
88 if (arg - argv < argc - 1)
96 else if (argis("h", "shell"))
98 if (arg - argv < argc - 1)
106 else if (argis("6", "secure"))
108 else if (argis("r", "reg_only"))
110 else if (argis("R", "register"))
112 else if (argis("f", "file"))
114 if (arg - argv < argc - 1)
122 else if (argis("v", "verbose"))
124 else if (argis("d", "nodupcheck"))
126 else if (argis("S", "server") || argis("db", "database"))
128 if (arg - argv < argc - 1)
143 if (!strcmp(filename, "-"))
147 input = fopen(filename, "r");
150 com_err(whoami, errno, "opening input file %s", filename);
158 if ((status = mr_connect(server)))
160 com_err(whoami, status, "unable to connect to the Moira server");
163 if ((status = mr_motd(&motd)))
165 com_err(whoami, status, "unable to check server status");
170 fprintf(stderr, "The Moira server is currently unavailable:\n%s\n",
176 if ((status = mr_auth("addusr")))
178 if (status == MR_USER_AUTH)
179 com_err(whoami, status, "");
182 com_err(whoami, status, "unable to authenticate to Moira");
188 qargv[U_NAME] = UNIQUE_LOGIN;
189 qargv[U_UID] = UNIQUE_UID;
190 qargv[U_SHELL] = shell;
191 qargv[U_STATE] = status_str;
192 qargv[U_CLASS] = class;
193 qargv[U_COMMENT] = comment;
194 qargv[U_SIGNATURE] = "";
195 qargv[U_SECURE] = securereg ? "1" : "0";
196 while (fgets(buf, BUFSIZ, input))
198 /* throw away terminating newline */
199 p = &buf[strlen(buf) - 1];
203 if (strlen(buf) == 0)
205 /* Last name is first thing on line */
207 /* First name follows a comma */
208 p = strchr(last, ',');
211 com_err(whoami, MR_BAD_CHAR, "Missing comma on line %d", lineno);
217 while (*p) /* find end-of-line */
225 com_err(whoami, 0, "Missing login on line %d", lineno);
229 login = strtrim(&p[1]);
234 /* ID is last thing on line */
243 com_err(whoami, 0, "Missing ID on line %d", lineno);
249 /* If something between first name & ID, it's middle name */
261 qargv[U_FIRST] = strtrim(first);
262 qargv[U_MIDDLE] = strtrim(middle);
263 qargv[U_LAST] = strtrim(last);
264 qargv[U_MITID] = strtrim(id);
265 FixCase(qargv[U_FIRST]);
266 FixCase(qargv[U_MIDDLE]);
267 FixCase(qargv[U_LAST]);
268 RemoveHyphens(qargv[U_MITID]);
275 dargv[0] = qargv[U_FIRST];
276 dargv[1] = qargv[U_LAST];
278 status = mr_query("get_user_account_by_name", 2, dargv,
280 if (status && status != MR_NO_MATCH)
282 com_err(whoami, status,
283 "checking to see if user %s %s already exists",
285 com_err(whoami, 0, "NOT ADDING USER");
291 com_err(whoami, MR_EXISTS, "user %s %s already exists",
293 com_err(whoami, 0, "NOT ADDING USER");
297 else if (duplicate < 0)
299 com_err(whoami, MR_EXISTS,
300 "user %s %s already exists with different ID number",
301 qargv[U_FIRST], qargv[U_LAST]);
302 com_err(whoami, 0, "ADDING user anyway");
305 status = mr_query("add_user_account", U_SECURE + 1, qargv,
309 com_err(whoami, status, "adding user %s %s", first, last);
314 printf("Added user %s %s %s (%s)\n", qargv[U_FIRST],
315 qargv[U_MIDDLE], qargv[U_LAST], qargv[U_MITID]);
322 rargv[0] = qargv[U_MITID];
326 status = mr_query("register_user", 2, rargv, NULL, NULL);
329 com_err(whoami, status, "while registering (login) %s %s",
330 qargv[U_FIRST], qargv[U_LAST]);
336 printf("Registered user %s %s as %s\n", qargv[U_FIRST],
337 qargv[U_LAST], login);
346 void usage(char **argv)
348 fprintf(stderr, "Usage: %s [options]\n", argv[0]);
349 fprintf(stderr, "Options are\n");
350 fprintf(stderr, " -f | -file filename (default STDIN)\n");
351 fprintf(stderr, " -c | -class class (default TEMP)\n");
352 fprintf(stderr, " -C | -comment \"comment\" (default \"\")\n");
353 fprintf(stderr, " -s | -status status (default 0)\n");
354 fprintf(stderr, " -h | -shell shell (default %s)\n", DEFAULT_SHELL);
355 fprintf(stderr, " -r | -reg_only\n");
356 fprintf(stderr, " -R | -register (and add to database)\n");
357 fprintf(stderr, " -v | -verbose\n");
358 fprintf(stderr, " -d | -nodupcheck (don't check for duplicates)\n");
359 fprintf(stderr, " -db | -database host:port\n");
364 /* query callback routine to check for duplicate users */
366 int usercheck(int argc, char **argv, void *qargv)
368 if (!strcmp(argv[U_MITID], ((char **)qargv)[U_MITID]))