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