]> andersk Git - moira.git/blame - clients/addusr/addusr.c
Thus endeth the lie of /bin/csh
[moira.git] / clients / addusr / addusr.c
CommitLineData
93d0b3bf 1/* $Header$
2 *
3 * Program to add users en batch to the moira database
4 *
5 * by Mark Rosenstein, July 1992.
6 *
7 * Copyright 1992 by the Massachusetts Institute of Technology.
8 *
9 * (c) Copyright 1992 by the Massachusetts Institute of Technology.
10 * For copying and distribution information, please see the file
11 * <mit-copyright.h>.
12 */
13
14#include <mit-copyright.h>
698271c7 15#include <string.h>
93d0b3bf 16#include <stdio.h>
17#include <ctype.h>
18#include <des.h>
19#include <krb.h>
93d0b3bf 20#include <moira.h>
21#include <moira_site.h>
22
23#ifndef LINT
24static char adduser_rcsid[] = "$Header$";
25#endif
26
17490e42 27#ifdef ATHENA
28#define DEFAULT_SHELL "/bin/athena/tcsh"
29#else
30#define DEFAULT_SHELL "/bin/csh"
31#endif
32
93d0b3bf 33/* flags from command line */
34char *class, *comment, *status_str, *shell, *filename;
35int reg_only, reg, verbose, nodupcheck;
36
37/* argument parsing macro */
38#define argis(a,b) ((strcmp(*arg+1, a) == 0) || (strcmp(*arg+1, b) == 0))
39
40char *whoami;
41int duplicate, errors;
42
93d0b3bf 43extern char *FixCase(), *RemoveHyphens(), *strtrim();
44extern int errno;
45int usercheck(), scream();
46
47
48main(argc, argv)
49int argc;
50char **argv;
51{
52 int status, lineno;
53 char **arg = argv, *qargv[U_END];
54 char *motd, *p, *first, *middle, *last, *id, *login, *passwd, *server;
55 char buf[BUFSIZ], idbuf[32];
56 FILE *input;
57
58 /* clear all flags & lists */
59 reg_only = reg = verbose = lineno = nodupcheck = errors = 0;
60 server = NULL;
61 filename = "-";
17490e42 62 shell = DEFAULT_SHELL;
93d0b3bf 63 class = "TEMP";
64 comment = "";
65 status_str = "0";
66
67 whoami = argv[0];
68
69 /* parse args */
70 while (++arg - argv < argc) {
71 if (**arg == '-')
72 {
73 if (argis("c", "class"))
74 if (arg - argv < argc - 1) {
75 ++arg;
76 class = *arg;
77 } else
78 usage(argv);
79 else if (argis("C", "comment"))
80 if (arg - argv < argc - 1) {
81 ++arg;
82 comment = *arg;
83 } else
84 usage(argv);
85 else if (argis("s", "status"))
86 if (arg - argv < argc - 1) {
87 ++arg;
88 status_str = *arg;
89 } else
90 usage(argv);
91 else if (argis("h", "shell"))
92 if (arg - argv < argc - 1) {
93 ++arg;
94 shell = *arg;
95 } else
96 usage(argv);
97 else if (argis("r", "reg_only"))
98 reg_only++;
99 else if (argis("R", "register"))
100 reg++;
101 else if (argis("f", "file"))
102 if (arg - argv < argc - 1) {
103 ++arg;
104 filename = *arg;
105 } else
106 usage(argv);
107 else if (argis("v","verbose"))
108 verbose++;
109 else if (argis("d","nodupcheck"))
110 nodupcheck++;
17490e42 111 else if (argis("S","server") || argis("db","database"))
93d0b3bf 112 if (arg - argv < argc - 1) {
113 ++arg;
114 server = *arg;
115 } else
116 usage(argv);
117 else
118 usage(argv);
119 } else
120 usage(argv);
121 }
122
123 if (!strcmp(filename, "-"))
124 input = stdin;
125 else {
126 input = fopen(filename, "r");
127 if (input == NULL) {
128 com_err(whoami, errno, "opening input file %s", filename);
129 exit(2);
130 }
131 }
132
133 if (!reg_only) {
134 /* fire up Moira */
135 if (status = mr_connect(server)) {
136 com_err(whoami, status, "unable to connect to the Moira server");
137 exit(2);
138 }
139 if ( status = mr_motd(&motd) ) {
140 com_err(whoami, status, "unable to check server status");
141 exit(2);
142 }
143 if (motd) {
144 fprintf(stderr, "The Moira server is currently unavailable:\n%s\n", motd);
145 mr_disconnect();
146 exit(2);
147 }
148
149 if (status = mr_auth("addusr")) {
150 if (status == MR_USER_AUTH)
151 com_err(whoami, status, "");
152 else {
153 com_err(whoami, status, "unable to authenticate to Moira");
154 exit(2);
155 }
156 }
157 }
158
159 if (reg || reg_only)
160 ureg_init();
161
162 qargv[U_NAME] = UNIQUE_LOGIN;
163 qargv[U_UID] = UNIQUE_UID;
164 qargv[U_SHELL] = shell;
165 qargv[U_STATE] = status_str;
166 qargv[U_CLASS] = class;
167 qargv[U_COMMENT] = comment;
168 qargv[U_SIGNATURE] = "";
169 qargv[U_SECURE] = "0";
170 while (fgets(buf, BUFSIZ, input)) {
171 /* throw away terminating newline */
172 p = &buf[strlen(buf) - 1];
173 if (*p == '\n')
174 *p = 0;
175 lineno++;
176 if (strlen(buf) == 0)
177 continue;
178 /* Last name is first thing on line */
179 last = buf;
180 /* First name follows a comma */
698271c7 181 p = strchr(last, ',');
93d0b3bf 182 if (!p) {
183 com_err(whoami, MR_BAD_CHAR, "Missing comma on line %d", lineno);
184 errors++;
185 continue;
186 }
187 *p++ = 0;
188 first = p;
189 while (*p) p++; /* find end-of-line */
190 if (reg_only || reg) {
191 while (!isspace(*p)) p--;
192 if (p <= first) {
193 com_err(whoami, 0, "Missing password on line %d", lineno);
194 errors++;
195 continue;
196 }
197 passwd = strtrim(&p[1]);
198 *p-- = 0;
199 /* previous field is login name */
200 while (isspace(*p)) p--;
201 while (!isspace(*p)) p--;
202 if (p <= first) {
203 com_err(whoami, 0, "Missing login on line %d", lineno);
204 errors++;
205 continue;
206 }
207 login = strtrim(&p[1]);
208 *p-- = 0;
209 } else {
210 /* ID is last thing on line */
211 p--;
212 }
213 while (isspace(*p)) p--;
214 while (!isspace(*p)) p--;
215 if (p <= first) {
216 com_err(whoami, 0, "Missing ID on line %d", lineno);
217 errors++;
218 continue;
219 }
220 id = &p[1];
221 *p-- = 0;
222 /* If something between first name & ID, it's middle name */
223 while (isspace(*p)) p--;
224 while (!isspace(*p)) p--;
225 if (p <= first)
226 middle = "";
227 else {
228 middle = &p[1];
229 *p = 0;
230 }
231 qargv[U_FIRST] = strtrim(first);
232 qargv[U_MIDDLE] = strtrim(middle);
233 qargv[U_LAST] = strtrim(last);
234 qargv[U_MITID] = strtrim(id);
235 FixCase(qargv[U_FIRST]);
236 FixCase(qargv[U_MIDDLE]);
237 FixCase(qargv[U_LAST]);
238 RemoveHyphens(qargv[U_MITID]);
239 if (!reg_only) {
240 if (!nodupcheck) {
241 char *dargv[2];
242
243 dargv[0] = qargv[U_FIRST];
244 dargv[1] = qargv[U_LAST];
245 duplicate = 0;
246 status = mr_query("get_user_account_by_name", 2, dargv,
247 usercheck, (char *) qargv);
248 if (status && status != MR_NO_MATCH) {
249 com_err(whoami, status,
250 "checking to see if user %s %s already exists",
251 qargv[0], qargv[1]);
252 com_err(whoami, 0, "NOT ADDING USER");
253 errors++;
254 continue;
255 }
256 if (duplicate > 0) {
257 com_err(whoami, MR_EXISTS, "user %s %s already exists",
258 qargv[0], qargv[1]);
259 com_err(whoami, 0, "NOT ADDING USER");
260 errors++;
261 continue;
262 } else if (duplicate < 0) {
263 com_err(whoami, MR_EXISTS,
264 "user %s %s already exists with different ID number",
2847bd65 265 qargv[U_FIRST], qargv[U_LAST]);
93d0b3bf 266 com_err(whoami, 0, "ADDING user anyway");
267 }
268 }
269 status = mr_query("add_user_account", U_SECURE + 1, qargv,
270 scream, NULL);
271 if (status) {
272 com_err(whoami, status, "adding user %s %s", first, last);
273 errors++;
274 } else if (verbose)
275 printf("Added user %s %s %s (%s)\n", qargv[U_FIRST],
276 qargv[U_MIDDLE], qargv[U_LAST], qargv[U_MITID]);
277 }
278 if (reg || reg_only) {
279 EncryptID(idbuf, qargv[U_MITID], qargv[U_FIRST], qargv[U_LAST]);
280 status = grab_login(qargv[U_FIRST], qargv[U_LAST],
281 qargv[U_MITID], idbuf, login);
282 if (status) {
2847bd65 283 com_err(whoami, status, "while registering (login) %s %s",
93d0b3bf 284 qargv[U_FIRST], qargv[U_LAST]);
285 errors++;
286 continue;
287 } else if (verbose)
288 printf("Registered user %s %s as %s\n", qargv[U_FIRST],
289 qargv[U_LAST], login);
290 status = set_password(qargv[U_FIRST], qargv[U_LAST],
291 qargv[U_MITID], idbuf, passwd);
292 if (status) {
293 com_err(whoami, status, "While registering (passwd) %s %s",
294 qargv[U_FIRST], qargv[U_LAST]);
295 errors++;
296 continue;
297 } else if (verbose)
298 printf("Set password for user %s\n", login);
299 }
300 }
301
302 exit(errors);
303}
304
305
306usage(argv)
307char **argv;
308{
309 fprintf(stderr, "Usage: %s [options]\n",argv[0]);
310 fprintf(stderr, "Options are\n");
311 fprintf(stderr, " -f | -file filename (default STDIN)\n");
312 fprintf(stderr, " -c | -class class (default TEMP)\n");
313 fprintf(stderr, " -C | -comment \"comment\" (default \"\")\n");
314 fprintf(stderr, " -s | -status status (default 0)\n");
17490e42 315 fprintf(stderr, " -h | -shell shell (default %s)\n", DEFAULT_SHELL);
93d0b3bf 316 fprintf(stderr, " -r | -reg_only\n");
317 fprintf(stderr, " -R | -register (and add to database)\n");
318 fprintf(stderr, " -v | -verbose\n");
319 fprintf(stderr, " -d | -nodupcheck (don't check for duplicates)\n");
320 fprintf(stderr, " -S | -server servername\n");
321 exit(1);
322}
323
324
325/* Called only if a query returns a value that we weren't expecting */
326
327scream()
328{
329 fprintf(stderr, "Programmer botch\n");
330 exit(3);
331}
332
333
334/* query callback routine to check for duplicate users */
335
336usercheck(argc, argv, qargv)
337int argc;
338char **argv;
339char **qargv;
340{
341 if (!strcmp(argv[U_MITID], qargv[U_MITID]))
342 duplicate++;
343 else
344 duplicate--;
345}
This page took 0.124369 seconds and 5 git commands to generate.