]> andersk Git - moira.git/blame - clients/stanley/stanley.c
tcsh is dead. Long live bash.
[moira.git] / clients / stanley / stanley.c
CommitLineData
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
24RCSID("$Header$");
25
7902e669 26struct owner_type {
27 int type;
28 char *name;
29};
30
5d429b61 31struct 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 */
46int info_flag, update_flag, create_flag, deact_flag, reg_flag;
47int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
48
7902e669 49struct owner_type *sponsor;
5d429b61 50struct string_list *reservation_add_queue, *reservation_remove_queue;
51
52char *username, *whoami;
53
54char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
00fef14d 55char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration;
5d429b61 56
7902e669 57struct owner_type *parse_member(char *s);
58
5d429b61 59static 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
72static 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
84void usage(char **argv);
85int save_query_info(int argc, char **argv, void *hint);
86int show_reservations(int argc, char **argv, void *hint);
87void show_user_info(char **argv);
88void show_user_info_unformatted(char **argv);
89struct string_list *add_to_string_list(struct string_list *old_list, char *s);
90int wrap_mr_query(char *handle, int argc, char **argv,
91 int (*callback)(int, char **, void *), void *callarg);
92void print_query(char *query_name, int argc, char **argv);
93
94int 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
719int 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
730int show_reservations(int argc, char **argv, void *hint)
731{
732 printf("Reservation: %s\n", argv[0]);
733
734 return MR_CONT;
735}
736
737struct 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
747int 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
755void 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 764void 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
793void 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
825void 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 */
864struct 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}
This page took 0.188983 seconds and 5 git commands to generate.