]>
Commit | Line | Data |
---|---|---|
5d429b61 | 1 | /* |
2 | * Command line oriented Moira users tool. | |
3 | * | |
4 | * zacheiss@mit.edu, September 2001 | |
5 | * | |
6 | * Inspired by blanche | |
7 | * | |
8 | * Copyright (C) 2000, 2001 by the Massachusetts Institute of Technology. | |
9 | * For copying and distribution information, please see the file | |
10 | * <mit-copyright.h>. | |
11 | */ | |
12 | ||
13 | #include <mit-copyright.h> | |
14 | #include <moira.h> | |
15 | #include <moira_site.h> | |
16 | #include <mrclient.h> | |
17 | ||
18 | #include <ctype.h> | |
19 | #include <errno.h> | |
20 | #include <stdio.h> | |
21 | #include <stdlib.h> | |
22 | #include <string.h> | |
23 | ||
24 | RCSID("$Header$"); | |
25 | ||
7902e669 | 26 | struct owner_type { |
27 | int type; | |
28 | char *name; | |
29 | }; | |
30 | ||
5d429b61 | 31 | struct string_list { |
32 | char *string; | |
33 | struct string_list *next; | |
34 | }; | |
35 | ||
7902e669 | 36 | #define M_ANY 0 |
37 | #define M_USER 1 | |
38 | #define M_LIST 2 | |
39 | #define M_KERBEROS 3 | |
40 | #define M_NONE 4 | |
41 | ||
5d429b61 | 42 | /* argument parsing macro */ |
43 | #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b)) | |
44 | ||
45 | /* flags from command line */ | |
46 | int info_flag, update_flag, create_flag, deact_flag, reg_flag; | |
47 | int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth; | |
48 | ||
7902e669 | 49 | struct owner_type *sponsor; |
5d429b61 | 50 | struct string_list *reservation_add_queue, *reservation_remove_queue; |
51 | ||
52 | char *username, *whoami; | |
53 | ||
54 | char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status; | |
00fef14d | 55 | char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration; |
5d429b61 | 56 | |
7902e669 | 57 | struct owner_type *parse_member(char *s); |
58 | ||
5d429b61 | 59 | static char *states[] = { |
60 | "Registerable (0)", | |
61 | "Active (1)", | |
62 | "Half Registered (2)", | |
63 | "Deleted (3)", | |
64 | "Not registerable (4)", | |
65 | "Enrolled/Registerable (5)", | |
66 | "Enrolled/Not Registerable (6)", | |
2860a176 | 67 | "Half Enrolled (7)", |
68 | "Registerable, Kerberos only (8)", | |
69 | "Active, Kerberos only (9)" | |
5d429b61 | 70 | }; |
71 | ||
72 | static char *UserState(int state) | |
73 | { | |
74 | static char buf[BUFSIZ]; | |
75 | ||
76 | if (state < 0 || state >= US_END) | |
77 | { | |
78 | sprintf(buf, "Unknown (%d)", state); | |
79 | return buf; | |
80 | } | |
81 | return states[state]; | |
82 | } | |
83 | ||
84 | void usage(char **argv); | |
85 | int save_query_info(int argc, char **argv, void *hint); | |
86 | int show_reservations(int argc, char **argv, void *hint); | |
87 | void show_user_info(char **argv); | |
88 | void show_user_info_unformatted(char **argv); | |
89 | struct string_list *add_to_string_list(struct string_list *old_list, char *s); | |
90 | int wrap_mr_query(char *handle, int argc, char **argv, | |
91 | int (*callback)(int, char **, void *), void *callarg); | |
92 | void print_query(char *query_name, int argc, char **argv); | |
93 | ||
94 | int main(int argc, char **argv) | |
95 | { | |
96 | int status; | |
97 | char **arg = argv; | |
98 | char *server = NULL; | |
99 | ||
100 | /* clear all flags & lists */ | |
101 | info_flag = update_flag = create_flag = deact_flag = reg_flag = 0; | |
102 | list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0; | |
103 | newlogin = uid = shell = winshell = last = first = middle = NULL; | |
104 | u_status = clearid = class = comment = secure = NULL; | |
00fef14d | 105 | winhomedir = winprofiledir = expiration = NULL; |
5d429b61 | 106 | reservation_add_queue = reservation_remove_queue = NULL; |
7902e669 | 107 | sponsor = NULL; |
5d429b61 | 108 | whoami = argv[0]; |
109 | ||
110 | /* parse args */ | |
111 | while (++arg - argv < argc) | |
112 | { | |
113 | if (**arg == '-') | |
114 | { | |
115 | if (argis("i", "info")) | |
116 | info_flag++; | |
117 | else if (argis("C", "create")) | |
118 | create_flag++; | |
119 | else if (argis("D", "deact")) | |
120 | deact_flag++; | |
121 | else if (argis("r", "register")) | |
122 | reg_flag++; | |
123 | else if (argis("R", "rename")) { | |
124 | if (arg - argv < argc - 1) { | |
125 | arg++; | |
126 | update_flag++; | |
127 | newlogin = *arg; | |
128 | } else | |
129 | usage(argv); | |
130 | } | |
131 | else if (argis("U", "uid")) { | |
132 | if (arg - argv < argc - 1) { | |
133 | arg++; | |
134 | update_flag++; | |
135 | uid = *arg; | |
136 | } else | |
137 | usage(argv); | |
138 | } | |
139 | else if (argis("s", "shell")) { | |
140 | if (arg - argv < argc - 1) { | |
141 | arg++; | |
142 | update_flag++; | |
143 | shell = *arg; | |
144 | } else | |
145 | usage(argv); | |
146 | } | |
147 | else if (argis("w", "winshell")) { | |
148 | if (arg - argv < argc - 1) { | |
149 | arg++; | |
150 | update_flag++; | |
151 | winshell = *arg; | |
152 | } else | |
153 | usage(argv); | |
154 | } | |
155 | else if (argis("L", "last")) { | |
156 | if (arg - argv < argc - 1) { | |
157 | arg++; | |
158 | update_flag++; | |
159 | last = *arg; | |
160 | } else | |
161 | usage(argv); | |
162 | } | |
163 | else if (argis("F", "first")) { | |
164 | if (arg - argv < argc - 1) { | |
165 | arg++; | |
166 | update_flag++; | |
167 | first = *arg; | |
168 | } else | |
169 | usage(argv); | |
170 | } | |
171 | else if (argis("M", "middle")) { | |
172 | if (arg - argv < argc - 1) { | |
173 | arg++; | |
174 | update_flag++; | |
175 | middle = *arg; | |
176 | } else | |
177 | usage(argv); | |
178 | } | |
179 | else if (argis("S", "status")) { | |
180 | if (arg - argv < argc - 1) { | |
181 | int i; | |
182 | int len; | |
183 | ||
184 | arg++; | |
185 | update_flag++; | |
186 | u_status = *arg; | |
187 | len = strlen(u_status); | |
188 | for (i = 0; i < len; i++) { | |
189 | if (!isdigit(u_status[i])) { | |
190 | printf("Error: status code %s is not numeric.\n", u_status); | |
191 | exit(1); | |
192 | } | |
193 | } | |
194 | } else | |
195 | usage(argv); | |
196 | } | |
484f87be | 197 | else if (argis("I", "mitid")) { |
5d429b61 | 198 | if (arg - argv < argc - 1) { |
199 | arg++; | |
200 | update_flag++; | |
201 | clearid = *arg; | |
202 | } else | |
203 | usage(argv); | |
204 | } | |
205 | else if (argis("cl", "class")) { | |
206 | if (arg - argv < argc - 1) { | |
207 | arg++; | |
208 | update_flag++; | |
209 | class = *arg; | |
210 | } else | |
211 | usage(argv); | |
212 | } | |
213 | else if (argis("c", "comment")) { | |
214 | if (arg - argv < argc - 1) { | |
215 | arg++; | |
216 | update_flag++; | |
217 | comment = *arg; | |
218 | } else | |
219 | usage(argv); | |
220 | } | |
221 | else if (argis("6", "secure")) { | |
222 | if (arg - argv < argc - 1) { | |
223 | arg++; | |
224 | update_flag++; | |
225 | secure = *arg; | |
226 | } else | |
227 | usage(argv); | |
228 | } | |
aec7d432 | 229 | else if (argis("wh", "winhomedir")) { |
230 | if (arg - argv < argc - 1) { | |
231 | arg++; | |
232 | update_flag++; | |
233 | winhomedir = *arg; | |
234 | } else | |
235 | usage(argv); | |
236 | } | |
237 | else if (argis("wp", "winprofiledir")) { | |
238 | if (arg - argv < argc - 1) { | |
239 | arg++; | |
240 | update_flag++; | |
241 | winprofiledir = *arg; | |
242 | } else | |
243 | usage(argv); | |
244 | } | |
7902e669 | 245 | else if (argis("sp", "sponsor")) { |
246 | if (arg - argv < argc - 1) { | |
247 | arg++; | |
248 | update_flag++; | |
249 | sponsor = parse_member(*arg); | |
250 | } else | |
251 | usage(argv); | |
252 | } | |
00fef14d | 253 | else if (argis("e", "expiration")) { |
254 | if (arg - argv < argc - 1) { | |
255 | arg++; | |
256 | update_flag++; | |
257 | expiration = *arg; | |
258 | } else | |
259 | usage(argv); | |
260 | } | |
5d429b61 | 261 | else if (argis("ar", "addreservation")) { |
262 | if (arg - argv < argc - 1) { | |
263 | arg++; | |
264 | reservation_add_queue = add_to_string_list(reservation_add_queue, | |
265 | *arg); | |
266 | } else | |
267 | usage(argv); | |
268 | update_res_flag++; | |
269 | } | |
270 | else if (argis("dr", "deletereservation")) { | |
271 | if (arg - argv < argc - 1) { | |
272 | arg++; | |
273 | reservation_remove_queue = add_to_string_list(reservation_remove_queue, *arg); | |
274 | } else | |
275 | usage(argv); | |
276 | update_res_flag++; | |
277 | } | |
ec7f0346 | 278 | else if (argis("lr", "listreservation")) |
5d429b61 | 279 | list_res_flag++; |
280 | else if (argis("u", "unformatted")) | |
281 | unformatted_flag++; | |
282 | else if (argis("n", "noauth")) | |
283 | noauth++; | |
284 | else if (argis("v", "verbose")) | |
285 | verbose++; | |
286 | else if (argis("db", "database")) | |
287 | { | |
288 | if (arg - argv < argc - 1) | |
289 | { | |
290 | ++arg; | |
291 | server = *arg; | |
292 | } | |
293 | else | |
294 | usage(argv); | |
295 | } | |
296 | else | |
297 | usage(argv); | |
298 | } | |
299 | else if (username == NULL) | |
300 | username = *arg; | |
301 | else | |
302 | usage(argv); | |
303 | } | |
ec7f0346 | 304 | if (username == NULL && !create_flag) |
5d429b61 | 305 | usage(argv); |
306 | ||
307 | /* default to info_flag if nothing else was specified */ | |
308 | if(!(info_flag || update_flag || create_flag || \ | |
309 | deact_flag || reg_flag || list_res_flag || \ | |
310 | update_res_flag)) { | |
311 | info_flag++; | |
312 | } | |
313 | ||
314 | /* fire up Moira */ | |
7902e669 | 315 | status = mrcl_connect(server, "stanley", 12, !noauth); |
5d429b61 | 316 | if (status == MRCL_AUTH_ERROR) |
317 | { | |
318 | com_err(whoami, 0, "Try the -noauth flag if you don't " | |
319 | "need authentication."); | |
320 | } | |
321 | if (status) | |
322 | exit(2); | |
323 | ||
324 | /* create if needed */ | |
325 | if (create_flag) | |
326 | { | |
327 | char *argv[20]; | |
328 | int cnt; | |
329 | ||
b63c8263 | 330 | for (cnt = 0; cnt < 20; cnt++) { |
ec7f0346 | 331 | argv[cnt] = ""; |
5d429b61 | 332 | } |
333 | ||
ec7f0346 | 334 | if (username) |
335 | argv[U_NAME] = username; | |
336 | else | |
337 | argv[U_NAME] = UNIQUE_LOGIN; | |
5d429b61 | 338 | if (uid) |
339 | argv[U_UID] = uid; | |
340 | else | |
341 | argv[U_UID] = UNIQUE_UID; | |
342 | if (shell) | |
343 | argv[U_SHELL] = shell; | |
344 | else | |
78364700 | 345 | argv[U_SHELL] = "/bin/athena/bash"; |
5d429b61 | 346 | if (winshell) |
347 | argv[U_WINCONSOLESHELL] = winshell; | |
348 | else | |
349 | argv[U_WINCONSOLESHELL] = "cmd"; | |
350 | if (last) | |
351 | argv[U_LAST] = last; | |
352 | if (first) | |
353 | argv[U_FIRST] = first; | |
354 | if (middle) | |
355 | argv[U_MIDDLE] = middle; | |
356 | if (u_status) | |
357 | argv[U_STATE] = u_status; | |
358 | else | |
359 | argv[U_STATE] = "0"; | |
360 | if (clearid) | |
361 | argv[U_MITID] = clearid; | |
362 | if (class) | |
363 | argv[U_CLASS] = class; | |
364 | if (comment) | |
365 | argv[U_COMMENT] = comment; | |
366 | /* Signature field always is the empty string */ | |
367 | argv[U_SIGNATURE] = ""; | |
368 | if (secure) | |
369 | argv[U_SECURE] = secure; | |
370 | else | |
371 | argv[U_SECURE] = "0"; | |
aec7d432 | 372 | if (winhomedir) |
373 | argv[U_WINHOMEDIR] = winhomedir; | |
374 | else | |
e20b02d1 | 375 | argv[U_WINHOMEDIR] = "[DFS]"; |
aec7d432 | 376 | if (winprofiledir) |
377 | argv[U_WINPROFILEDIR] = winprofiledir; | |
378 | else | |
e20b02d1 | 379 | argv[U_WINPROFILEDIR] = "[DFS]"; |
00fef14d | 380 | if (expiration) |
381 | argv[U_EXPIRATION] = expiration; | |
7902e669 | 382 | if (sponsor) |
383 | { | |
384 | argv[U_SPONSOR_NAME] = sponsor->name; | |
385 | switch (sponsor->type) | |
386 | { | |
387 | case M_ANY: | |
388 | case M_USER: | |
389 | argv[U_SPONSOR_TYPE] = "USER"; | |
00fef14d | 390 | status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL); |
7902e669 | 391 | if (sponsor->type != M_ANY || status != MR_USER) |
392 | break; | |
393 | ||
394 | case M_LIST: | |
395 | argv[U_SPONSOR_TYPE] = "LIST"; | |
00fef14d | 396 | status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL); |
7902e669 | 397 | break; |
398 | ||
399 | case M_KERBEROS: | |
400 | argv[U_SPONSOR_TYPE] = "KERBEROS"; | |
401 | status = mrcl_validate_kerberos_member(argv[U_SPONSOR_NAME], | |
402 | &argv[U_SPONSOR_NAME]); | |
403 | if (mrcl_get_message()) | |
404 | mrcl_com_err(whoami); | |
405 | if (status == MRCL_REJECT) | |
406 | exit(1); | |
00fef14d | 407 | status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL); |
7902e669 | 408 | break; |
409 | ||
410 | case M_NONE: | |
411 | argv[U_SPONSOR_TYPE] = "NONE"; | |
00fef14d | 412 | status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL); |
7902e669 | 413 | break; |
414 | } | |
415 | } | |
416 | else | |
417 | { | |
418 | argv[U_SPONSOR_TYPE] = "NONE"; | |
419 | argv[U_SPONSOR_NAME] = "NONE"; | |
420 | ||
00fef14d | 421 | status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL); |
7902e669 | 422 | } |
423 | ||
5d429b61 | 424 | if (status) |
425 | { | |
426 | com_err(whoami, status, "while adding user account."); | |
427 | exit(1); | |
428 | } | |
429 | } | |
430 | else if (update_flag) | |
431 | { | |
432 | char *old_argv[20]; | |
433 | char *argv[20]; | |
434 | char *args[5]; | |
435 | ||
436 | args[0] = username; | |
437 | ||
438 | status = wrap_mr_query("get_user_account_by_login", 1, args, | |
439 | save_query_info, old_argv); | |
440 | if (status) | |
441 | { | |
442 | com_err(whoami, status, "while getting user information."); | |
443 | exit(1); | |
444 | } | |
445 | ||
446 | argv[1] = old_argv[0]; | |
447 | argv[2] = old_argv[1]; | |
448 | argv[3] = old_argv[2]; | |
449 | argv[4] = old_argv[3]; | |
450 | argv[5] = old_argv[4]; | |
451 | argv[6] = old_argv[5]; | |
452 | argv[7] = old_argv[6]; | |
453 | argv[8] = old_argv[7]; | |
454 | argv[9] = old_argv[8]; | |
455 | argv[10] = old_argv[9]; | |
456 | argv[11] = old_argv[10]; | |
457 | argv[12] = old_argv[11]; | |
458 | argv[13] = old_argv[12]; | |
aec7d432 | 459 | argv[14] = old_argv[13]; |
460 | argv[15] = old_argv[14]; | |
7902e669 | 461 | argv[16] = old_argv[15]; |
462 | argv[17] = old_argv[16]; | |
00fef14d | 463 | argv[18] = old_argv[17]; |
5d429b61 | 464 | |
465 | argv[0] = username; | |
466 | if (newlogin) | |
467 | argv[1] = newlogin; | |
468 | if (uid) | |
469 | argv[2] = uid; | |
470 | if (shell) | |
471 | argv[3] = shell; | |
472 | if (winshell) | |
473 | argv[4] = winshell; | |
474 | if (last) | |
475 | argv[5] = last; | |
476 | if (first) | |
477 | argv[6] = first; | |
478 | if (middle) | |
479 | argv[7] = middle; | |
480 | if (u_status) | |
481 | argv[8] = u_status; | |
482 | if (clearid) | |
483 | argv[9] = clearid; | |
484 | if (class) | |
485 | argv[10] = class; | |
486 | if (comment) | |
487 | argv[11] = comment; | |
488 | if (secure) | |
489 | argv[13] = secure; | |
aec7d432 | 490 | if (winhomedir) |
491 | argv[14] = winhomedir; | |
492 | if (winprofiledir) | |
493 | argv[15] = winprofiledir; | |
00fef14d | 494 | if (expiration) |
495 | argv[18] = expiration; | |
7902e669 | 496 | if (sponsor) |
497 | { | |
498 | argv[17] = sponsor->name; | |
499 | switch (sponsor->type) | |
500 | { | |
501 | case M_ANY: | |
502 | case M_USER: | |
503 | argv[16] = "USER"; | |
00fef14d | 504 | status = wrap_mr_query("update_user_account", 19, argv, NULL, |
7902e669 | 505 | NULL); |
506 | if (sponsor->type != M_ANY || status != MR_USER) | |
507 | break; | |
508 | ||
509 | case M_LIST: | |
510 | argv[16] = "LIST"; | |
00fef14d | 511 | status = wrap_mr_query("update_user_account", 19, argv, NULL, |
7902e669 | 512 | NULL); |
513 | break; | |
514 | ||
515 | case M_KERBEROS: | |
516 | argv[16] = "KERBEROS"; | |
517 | status = mrcl_validate_kerberos_member(argv[17], &argv[17]); | |
518 | if (mrcl_get_message()) | |
519 | mrcl_com_err(whoami); | |
520 | if (status == MRCL_REJECT) | |
521 | exit(1); | |
00fef14d | 522 | status = wrap_mr_query("update_user_account", 19, argv, NULL, |
7902e669 | 523 | NULL); |
524 | break; | |
525 | ||
526 | case M_NONE: | |
527 | argv[16] = "NONE"; | |
00fef14d | 528 | status = wrap_mr_query("update_user_account", 19, argv, NULL, |
7902e669 | 529 | NULL); |
530 | break; | |
531 | } | |
532 | } | |
533 | else | |
00fef14d | 534 | status = wrap_mr_query("update_user_account", 19, argv, NULL, NULL); |
5d429b61 | 535 | |
536 | if (status) | |
537 | com_err(whoami, status, "while updating user."); | |
538 | else if (newlogin) | |
539 | username = newlogin; | |
540 | } | |
541 | ||
ec7f0346 | 542 | /* Deactivate a user, and the matching list and filesystem if they exist */ |
5d429b61 | 543 | if (deact_flag) |
544 | { | |
545 | char *args[2]; | |
546 | char *argv[20]; | |
547 | int i; | |
548 | ||
549 | args[0] = username; | |
550 | args[1] = "3"; | |
551 | ||
552 | status = wrap_mr_query("update_user_status", 2, args, NULL, NULL); | |
553 | if (status) | |
554 | { | |
555 | com_err(whoami, status, "while deactivating user."); | |
556 | exit(1); | |
557 | } | |
558 | ||
ec7f0346 | 559 | status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv); |
560 | if (status == MR_SUCCESS) | |
5d429b61 | 561 | { |
e6dfe8f9 | 562 | for (i = 15; i > 0; i--) |
ec7f0346 | 563 | argv[i + 1] = argv[i]; |
564 | argv[1] = username; | |
565 | argv[L_ACTIVE + 1] = "0"; | |
566 | ||
e6dfe8f9 | 567 | status = wrap_mr_query("update_list", 16, argv, NULL, NULL); |
ec7f0346 | 568 | if (status) |
569 | { | |
570 | com_err(whoami, status, "while updating list, " | |
571 | "not deactivating list or filesystem."); | |
572 | exit(1); | |
573 | } | |
5d429b61 | 574 | } |
ec7f0346 | 575 | else if (status && status != MR_NO_MATCH) |
5d429b61 | 576 | { |
ec7f0346 | 577 | com_err(whoami, status, "while retrieving list information."); |
5d429b61 | 578 | exit(1); |
579 | } | |
580 | ||
581 | status = wrap_mr_query("get_filesys_by_label", 1, args, save_query_info, | |
582 | argv); | |
ec7f0346 | 583 | if (status == MR_SUCCESS) |
5d429b61 | 584 | { |
ec7f0346 | 585 | for (i = 11; i > 0; i--) |
586 | argv[i + 1] = argv[i]; | |
587 | argv[1] = username; | |
588 | argv[FS_TYPE + 1] = "ERR"; | |
589 | argv[FS_COMMENTS + 1] = "Locker disabled; call 3-1325 for help"; | |
590 | ||
591 | status = wrap_mr_query("update_filesys", 12, argv, NULL, NULL); | |
592 | if (status) | |
593 | { | |
594 | com_err(whoami, status, "while updating filesystem, " | |
595 | "not deactivating filesystem."); | |
596 | exit(1); | |
597 | } | |
5d429b61 | 598 | } |
ec7f0346 | 599 | else if (status && status != MR_NO_MATCH) |
5d429b61 | 600 | { |
ec7f0346 | 601 | com_err(whoami, status, "while retrieving filesystem information."); |
5d429b61 | 602 | exit(1); |
603 | } | |
604 | } | |
605 | ||
606 | /* Display user info */ | |
607 | if (info_flag) | |
608 | { | |
609 | char *args[2]; | |
610 | char *argv[20]; | |
611 | ||
612 | args[0] = username; | |
613 | status = wrap_mr_query("get_user_account_by_login", 1, args, | |
614 | save_query_info, argv); | |
615 | if (status) | |
616 | { | |
617 | com_err(whoami, status, "while getting user information."); | |
618 | exit(1); | |
619 | } | |
620 | if (unformatted_flag) | |
621 | show_user_info_unformatted(argv); | |
622 | else | |
623 | show_user_info(argv); | |
624 | } | |
625 | ||
626 | /* register a user */ | |
627 | if (reg_flag) | |
628 | { | |
629 | char *args[3]; | |
630 | char *argv[20]; | |
5d429b61 | 631 | |
632 | args[0] = username; | |
633 | status = wrap_mr_query("get_user_account_by_login", 1, args, | |
634 | save_query_info, argv); | |
635 | if (status) | |
636 | { | |
637 | com_err(whoami, status, "while looking up uid."); | |
638 | exit(1); | |
639 | } | |
640 | ||
641 | args[0] = argv[U_UID]; | |
ec7f0346 | 642 | args[1] = username; |
643 | args[2] = "IMAP"; | |
5d429b61 | 644 | |
645 | status = wrap_mr_query("register_user", 3, args, NULL, NULL); | |
646 | if (status) | |
647 | { | |
648 | com_err(whoami, status, "while registering user."); | |
649 | exit(1); | |
650 | } | |
651 | } | |
652 | ||
653 | /* list user reservations */ | |
654 | if (list_res_flag) | |
655 | { | |
656 | char *args[1]; | |
657 | ||
658 | args[0] = username; | |
659 | status = wrap_mr_query("get_user_reservations", 1, args, | |
660 | show_reservations, NULL); | |
661 | if (status) | |
662 | if (status != MR_NO_MATCH) { | |
663 | com_err(whoami, status, "while getting user reservations."); | |
664 | exit(1); | |
665 | } | |
666 | } | |
667 | ||
668 | /* add user reservations */ | |
669 | if (reservation_add_queue) | |
670 | { | |
671 | struct string_list *q = reservation_add_queue; | |
672 | ||
673 | while (q) | |
674 | { | |
675 | char *reservation = q->string; | |
676 | char *args[2]; | |
677 | ||
678 | args[0] = username; | |
679 | args[1] = reservation; | |
680 | status = wrap_mr_query("add_user_reservation", 2, args, NULL, NULL); | |
681 | if (status) | |
682 | { | |
683 | com_err(whoami, status, "while adding user reservation."); | |
684 | exit(1); | |
685 | } | |
686 | ||
687 | q = q->next; | |
688 | } | |
689 | } | |
690 | ||
691 | /* delete user reservations */ | |
692 | if (reservation_remove_queue) | |
693 | { | |
694 | struct string_list *q = reservation_remove_queue; | |
695 | ||
696 | while (q) | |
697 | { | |
698 | char *reservation = q->string; | |
699 | char *args[2]; | |
700 | ||
701 | args[0] = username; | |
702 | args[1] = reservation; | |
703 | status = wrap_mr_query("delete_user_reservation", 2, args, NULL, | |
704 | NULL); | |
705 | if (status) | |
706 | { | |
707 | com_err(whoami, status, "while deleting user reservation."); | |
708 | exit(1); | |
709 | } | |
710 | ||
711 | q = q->next; | |
712 | } | |
713 | } | |
714 | /* We're done! */ | |
715 | mr_disconnect(); | |
716 | exit(0); | |
717 | } | |
718 | ||
719 | int save_query_info(int argc, char **argv, void *hint) | |
720 | { | |
721 | int i; | |
722 | char **nargv = hint; | |
723 | ||
724 | for(i = 0; i < argc; i++) | |
725 | nargv[i] = strdup(argv[i]); | |
726 | ||
727 | return MR_CONT; | |
728 | } | |
729 | ||
730 | int show_reservations(int argc, char **argv, void *hint) | |
731 | { | |
732 | printf("Reservation: %s\n", argv[0]); | |
733 | ||
734 | return MR_CONT; | |
735 | } | |
736 | ||
737 | struct string_list *add_to_string_list(struct string_list *old_list, char *s) { | |
738 | struct string_list *new_list; | |
739 | ||
740 | new_list = (struct string_list *)malloc(sizeof(struct string_list *)); | |
741 | new_list->next = old_list; | |
742 | new_list->string = s; | |
743 | ||
744 | return new_list; | |
745 | } | |
746 | ||
747 | int wrap_mr_query(char *handle, int argc, char **argv, | |
748 | int (*callback)(int, char **, void *), void *callarg) { | |
749 | if (verbose) | |
750 | print_query(handle, argc, argv); | |
751 | ||
752 | return mr_query(handle, argc, argv, callback, callarg); | |
753 | } | |
754 | ||
755 | void print_query(char *query_name, int argc, char **argv) { | |
756 | int cnt; | |
757 | ||
758 | printf("qy %s", query_name); | |
759 | for(cnt = 0; cnt < argc; cnt++) | |
760 | printf(" <%s>", argv[cnt]); | |
761 | printf("\n"); | |
762 | } | |
763 | ||
5d429b61 | 764 | void show_user_info(char **argv) |
765 | { | |
766 | char tbuf[BUFSIZ]; | |
767 | int status; | |
768 | ||
769 | sprintf(tbuf, "%s, %s %s", argv[U_LAST], argv[U_FIRST], argv[U_MIDDLE]); | |
770 | printf("Login name: %-20s Full name: %s\n", argv[U_NAME], tbuf); | |
771 | printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]); | |
772 | printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS], | |
773 | argv[U_WINCONSOLESHELL]); | |
7902e669 | 774 | sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE], |
775 | strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : ""); | |
00fef14d | 776 | printf("Sponsor: %-23s Expiration date: %s\n", tbuf, argv[U_EXPIRATION]); |
5d429b61 | 777 | printf("Account is: %-20s MIT ID number: %s\n", |
778 | UserState(atoi(argv[U_STATE])), argv[U_MITID]); | |
aec7d432 | 779 | printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]); |
780 | printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]); | |
5d429b61 | 781 | status = atoi(argv[U_STATE]); |
782 | if (status == 0 || status == 2) | |
783 | { | |
ec7f0346 | 784 | printf("User %s secure Account Coupon to register\n", |
5d429b61 | 785 | atoi(argv[U_SECURE]) ? "needs" : "does not need"); |
786 | } | |
787 | printf("Comments: %s\n", argv[U_COMMENT]); | |
cfeeecec | 788 | printf("Created by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]); |
5d429b61 | 789 | printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME], |
790 | argv[U_MODWITH]); | |
791 | } | |
792 | ||
793 | void show_user_info_unformatted(char **argv) | |
794 | { | |
7902e669 | 795 | char tbuf[BUFSIZ]; |
8598c363 | 796 | int status; |
797 | ||
aec7d432 | 798 | printf("Login name: %s\n", argv[U_NAME]); |
799 | printf("Full name: %s, %s %s\n", argv[U_LAST], argv[U_FIRST], | |
5d429b61 | 800 | argv[U_MIDDLE]); |
aec7d432 | 801 | printf("User id: %s\n", argv[U_UID]); |
802 | printf("Class: %s\n", argv[U_CLASS]); | |
7902e669 | 803 | sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE], |
804 | strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : ""); | |
805 | printf("Sponsor: %s\n", tbuf); | |
00fef14d | 806 | printf("Expiration date: %s\n", argv[U_EXPIRATION]); |
aec7d432 | 807 | printf("Login shell: %s\n", argv[U_SHELL]); |
808 | printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]); | |
809 | printf("Account is: %s\n", UserState(atoi(argv[U_STATE]))); | |
810 | printf("MIT ID number: %s\n", argv[U_MITID]); | |
811 | printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]); | |
812 | printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]); | |
8598c363 | 813 | status = atoi(argv[U_STATE]); |
814 | if (status == 0 || status == 2) | |
aec7d432 | 815 | printf("Secure: %s secure Account Coupon to register\n", |
8598c363 | 816 | atoi(argv[U_SECURE]) ? "Needs" : "Does not need"); |
aec7d432 | 817 | printf("Comments: %s\n", argv[U_COMMENT]); |
818 | printf("Created by: %s\n", argv[U_CREATOR]); | |
819 | printf("Created on: %s\n", argv[U_CREATED]); | |
820 | printf("Last mod by: %s\n", argv[U_MODBY]); | |
821 | printf("Last mod on: %s\n", argv[U_MODTIME]); | |
822 | printf("Last mod with: %s\n", argv[U_MODWITH]); | |
5d429b61 | 823 | } |
ec7f0346 | 824 | |
825 | void usage(char **argv) | |
826 | { | |
827 | #define USAGE_OPTIONS_FORMAT " %-39s%s\n" | |
828 | fprintf(stderr, "Usage: %s username [options]\n", argv[0]); | |
829 | fprintf(stderr, "Options are\n"); | |
b30ed58c | 830 | fprintf(stderr, " %-39s\n", "-i | -info"); |
ec7f0346 | 831 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-C | -create", |
832 | "-D | -deact"); | |
833 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-r | -register", | |
834 | "-R | -rename newname"); | |
835 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-U | -uid uid", | |
836 | "-s | -shell shell"); | |
837 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S | -status status", | |
838 | "-w | -winshell winshell"); | |
839 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F | -first firstname", | |
840 | "-L | -last lastname"); | |
841 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M | -middle middlename", | |
484f87be | 842 | "-I | -mitid mitid"); |
ec7f0346 | 843 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl | -class class", |
844 | "-c | -comment comment"); | |
845 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6 | -secure 0|1", | |
846 | "-lr | -listreservation"); | |
847 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar | -addreservation reservation", | |
848 | "-dr | -deletereservation reservation"); | |
aec7d432 | 849 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-wh | -winhomedir winhomedir", |
850 | "-wp | -winprofiledir winprofiledir"); | |
7902e669 | 851 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-sp | -sponsor sponsor", |
67294605 | 852 | "-e | -expiration expiration date"); |
853 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u | -unformatted", | |
854 | "-n | -noauth"); | |
855 | fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v | -verbose", | |
856 | "-db | -database host[:port]"); | |
ec7f0346 | 857 | |
858 | exit(1); | |
859 | } | |
7902e669 | 860 | |
861 | /* Parse a line of input, fetching a member. NULL is returned if a member | |
862 | * is not found. ';' is a comment character. | |
863 | */ | |
864 | struct owner_type *parse_member(char *s) | |
865 | { | |
866 | struct owner_type *m; | |
867 | char *p, *lastchar; | |
868 | ||
869 | while (*s && isspace(*s)) | |
870 | s++; | |
871 | lastchar = p = s; | |
872 | while (*p && *p != '\n' && *p != ';') | |
873 | { | |
874 | if (isprint(*p) && !isspace(*p)) | |
875 | lastchar = p++; | |
876 | else | |
877 | p++; | |
878 | } | |
879 | lastchar++; | |
880 | *lastchar = '\0'; | |
881 | if (p == s || strlen(s) == 0) | |
882 | return NULL; | |
883 | ||
884 | if (!(m = malloc(sizeof(struct owner_type)))) | |
885 | return NULL; | |
886 | ||
887 | if ((p = strchr(s, ':'))) | |
888 | { | |
889 | *p = '\0'; | |
890 | m->name = ++p; | |
891 | if (!strcasecmp("user", s)) | |
892 | m->type = M_USER; | |
893 | else if (!strcasecmp("list", s)) | |
894 | m->type = M_LIST; | |
895 | else if (!strcasecmp("kerberos", s)) | |
896 | m->type = M_KERBEROS; | |
897 | else if (!strcasecmp("none", s)) | |
898 | m->type = M_NONE; | |
899 | else | |
900 | { | |
901 | m->type = M_ANY; | |
902 | *(--p) = ':'; | |
903 | m->name = s; | |
904 | } | |
905 | m->name = strdup(m->name); | |
906 | } | |
907 | else | |
908 | { | |
909 | m->name = strdup(s); | |
910 | m->type = strcasecmp(s, "none") ? M_ANY : M_NONE; | |
911 | } | |
912 | return m; | |
913 | } |