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