8 #include <moira_site.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>
23 /* Called with moira data that is to be modified. */
25 int ModifyCallback(argc, argv, form)
36 switch (form->menu->operation) {
39 f = GetAndClearForm("mod_user");
41 display_error("Unknown form in ModifyCallback!\n");
44 f->extrastuff = form->extrastuff;
46 for (i = 0; i < U_SIGNATURE; i++)
47 if (f->inputlines[i]->type == FT_BOOLEAN)
48 f->inputlines[i]->returnvalue.booleanvalue =
49 strcmp(argv[i + offset], "0") ? 1 : 0;
51 StoreField(f, i, argv[i + offset]);
52 f->inputlines[U_SIGNATURE]->keyword_name = strsave(argv[U_SIGNATURE]);
53 f->inputlines[U_SIGNATURE]->returnvalue.booleanvalue =
54 strcmp(argv[U_SECURE], "0") ? 1 : 0;
55 f->inputlines[U_COMMENT]->keyword_name = strsave(argv[U_SECURE]);
59 count = F_MODTIME - 1;
64 form->extrastuff = NULL;
66 form->extrastuff = strsave(argv[U_UID]);
78 f = GetAndClearForm("mod_nfs");
80 display_error("Unknown form in ModifyCallback of mod_nfs\n");
83 f->extrastuff = form->extrastuff;
85 StoreField(f, 0, argv[0]);
86 StoreField(f, 1, argv[1]);
87 StoreField(f, 2, argv[2]);
88 f->inputlines[3]->keywords = nfs_states;
89 for (i = 0; nfs_states[i]; i++)
90 if (atoi(nfs_states[i]) & atoi(argv[3]))
91 StoreField(f, 3, nfs_states[i]);
92 if (atoi(argv[3]) & MR_FS_GROUPQUOTA)
93 f->inputlines[4]->returnvalue.booleanvalue = 1;
95 f->inputlines[4]->returnvalue.booleanvalue = 0;
96 StoreField(f, 5, argv[4]);
97 StoreField(f, 6, argv[5]);
109 count = PCAP_MODTIME;
112 f = GetAndClearForm("mod_service");
114 display_error("Unknown form in ModifyCallback of mod_service\n");
117 f->extrastuff = form->extrastuff;
118 f->menu = form->menu;
119 for (i = 0; i < 4; i++) StoreField(f, i, argv[i]);
120 StoreField(f, 4, argv[6]);
121 f->inputlines[5]->returnvalue.booleanvalue = atoi(argv[7]);
122 StoreField(f, 6, argv[11]);
123 StoreField(f, 7, argv[12]);
127 f = GetAndClearForm("mod_host");
129 display_error("Unknown form in ModifyCallback of mod_host\n");
132 f->extrastuff = form->extrastuff;
133 f->menu = form->menu;
134 StoreField(f, 0, argv[0]);
135 StoreField(f, 1, argv[1]);
136 f->inputlines[2]->returnvalue.booleanvalue = atoi(argv[2]);
137 StoreField(f, 3, argv[10]);
138 StoreField(f, 4, argv[11]);
139 StoreField(f, 5, argv[12]);
145 f = GetAndClearForm(fn);
147 display_error("Unknown form in ModifyCallback!\n");
150 f->extrastuff = form->extrastuff;
151 f->menu = form->menu;
152 for (i = 0; i < count; i++)
153 if (f->inputlines[i]->type == FT_BOOLEAN)
154 f->inputlines[i]->returnvalue.booleanvalue =
155 strcmp(argv[i + offset], "0") ? 1 : 0;
157 StoreField(f, i, argv[i + offset]);
159 display_error("Unknown function in ModifyCallback!\n");
165 /* Generate a new cryptographic signature for the user record */
166 SignUser(argv, offset)
175 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
176 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
178 i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
179 /* If it's already signed OK, don't resign it. */
180 if (i != GDSS_SUCCESS) {
181 free(argv[U_SIGNATURE + offset]);
182 argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
184 i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
185 if (i != GDSS_SUCCESS)
186 com_err(program_name, gdss2et(i),
187 "Failed to create signature");
189 unsigned char newbuf[256];
191 i = GDSS_Verify(buf, strlen(buf),
192 argv[U_SIGNATURE + offset], &si);
193 if (strlen(newbuf) > 68) {
195 AppendLog("Signature too long, trying again\n");
201 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
203 AppendLog("Don't need to remake signature\n");
208 argv[U_SIGNATURE + offset] = strsave("");
213 /* when OK pressed */
215 MoiraFormComplete(dummy1, form)
219 process_form(form, TRUE);
223 /* when APPLY pressed */
225 MoiraFormApply(dummy1, form)
232 /* undocumented Motif internal routine to advance in tab group.
233 * In this case we're going backwards because for some reason
234 * the form advances whenever this button is pressed.
235 * However, it doesn't seem to go backwards even though source
236 * implies that it should. So we go forward until we wrap.
239 for (p = form->inputlines; *p; p++)
240 if (!((*p)->insensitive))
243 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
244 MoiraFocusOut(form->inputlines[0]->mywidget,
245 (XEvent *)NULL, (String *)NULL, 0);
246 process_form(form, FALSE);
250 int CollectData(argc, argv, form)
255 struct save_queue *sq;
257 sq = (struct save_queue *) form->extrastuff;
258 sq_save_data(sq, strsave(argv[0]));
263 /* callback when form is complete to process the data */
265 process_form(form, remove)
269 char *qy, *argv[32], buf[256], *s, **aargv;
270 int (*retfunc)(), argc, i;
273 retfunc = DisplayCallback;
276 for (i = 0; form->inputlines[i]; i++)
277 argv[i] = StringValue(form, i);
278 qy = form->menu->query;
279 argc = form->menu->argc;
281 switch (form->menu->operation) {
283 if (*stringval(form, 0)) {
284 qy = "get_user_account_by_login";
285 argv[0] = stringval(form, 0);
287 } else if (*stringval(form, 3)) {
288 qy = "get_user_account_by_uid";
289 argv[0] = stringval(form, 3);
291 } else if (*stringval(form, 4)) {
292 qy = "get_user_account_by_class";
293 argv[0] = stringval(form, 4);
295 } else if (*stringval(form, 1) == 0 &&
296 *stringval(form, 2) == 0) {
297 display_error("Must fill in at least one blank.");
300 if (*stringval(form, 1) == 0)
301 StoreField(form, 1, "*");
302 if (*stringval(form, 2) == 0)
303 StoreField(form, 2, "*");
304 qy = "get_user_account_by_name";
305 argv[0] = stringval(form, 1);
306 argv[1] = stringval(form, 2);
311 argv[U_STATE][1] = 0;
312 argv[U_SECURE] = argv[U_SIGNATURE];
317 if (!strcmp(form->formname, "mod_user")) {
318 qy = "update_user_account";
319 for (i = 0; i < U_SIGNATURE; i++)
320 argv[i + 1] = StringValue(form, i);
321 argv[0] = form->extrastuff;
322 argv[U_STATE + 1][1] = 0;
323 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
324 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
325 if (*argv[U_SECURE + 1] == '1')
326 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
327 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
331 gettimeofday(&tv, NULL);
332 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
333 sprintf(buf, "%ld", tv.tv_sec);
334 argv[U_SECURE + 1] = strsave(buf);
337 argc = U_MODTIME + 1;
340 form->extrastuff = (caddr_t) "mod_user";
341 retfunc = ModifyCallback;
344 if (*stringval(form, 2)) {
345 argv[0] = stringval(form, 2);
347 argv[0] = stringval(form, 0);
348 argv[1] = stringval(form, 1);
349 form->extrastuff = NULL;
350 i = MoiraQuery("get_user_account_by_name", 2, argv,
351 ModifyCallback, (char *)form);
353 com_err(program_name, i, " looking up user by name");
356 if (form->extrastuff == NULL) {
357 display_error("Ambiguous user specification");
360 argv[0] = (char *)form->extrastuff;
362 qy = "register_user";
363 argv[1] = stringval(form, 3);
371 display_error("Expunge is not yet implemented");
375 if (!strcmp(form->formname, "mod_finger")) {
376 qy = "update_finger_by_login";
377 for (i = 0; i < F_MODTIME - 1; i++)
378 argv[i + 1] = StringValue(form, i);
379 argv[0] = form->extrastuff;
383 form->extrastuff = (caddr_t) "mod_finger";
384 retfunc = ModifyCallback;
387 if (!*stringval(form, 0))
389 if (!*stringval(form, 1))
391 AppendToLog("Kerberos mappings:\n");
394 if (!strcmp(argv[1], "POP"))
395 argv[2] = stringval(form, 3);
397 case MM_SHOW_ACE_USE:
398 if (boolval(form, 2)) {
399 sprintf(buf, "R%s", stringval(form, 0));
400 argv[0] = strsave(buf);
402 sprintf(buf, "Objects %s %s can administer\n",
403 stringval(form, 0), stringval(form, 1));
407 if (!strcmp(form->formname, "mod_list")) {
409 for (i = 0; i < L_MODTIME; i++)
410 argv[i + 1] = StringValue(form, i);
411 argv[0] = form->extrastuff;
412 argc = L_MODTIME + 1;
415 form->extrastuff = (caddr_t) "mod_list";
416 retfunc = ModifyCallback;
418 case MM_SHOW_MEMBERS:
419 if (!*stringval(form, 0)) {
420 qy = "get_lists_of_member";
421 argv[0] = stringval(form, 1);
422 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
424 if (boolval(form, 3)) {
425 sprintf(buf, "R%s", stringval(form, 1));
428 argv[1] = stringval(form, 2);
431 if (boolval(form, 3)) {
432 qy = "get_end_members_of_list";
433 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
435 sprintf(buf, "Members of list: %s\n", argv[0]);
439 case MM_DEL_ALL_MEMBER:
440 form->extrastuff = (caddr_t) sq_create();
441 retfunc = CollectData;
444 if (*stringval(form, 0)) {
445 qy = "get_filesys_by_label";
446 argv[0] = stringval(form, 0);
448 } else if (*stringval(form, 1)) {
449 StoreHost(form, 1, &argv[0]);
450 if (*stringval(form, 2)) {
451 qy = "get_filesys_by_nfsphys";
452 argv[1] = stringval(form, 2);
455 qy = "get_filesys_by_machine";
458 } else if (*stringval(form, 3)) {
459 qy = "get_filesys_by_group";
460 argv[0] = stringval(form, 3);
462 } else if (*stringval(form, 4)) {
463 qy = "get_filesys_by_path";
464 argv[0] = stringval(form, 4);
467 /* fall through to */
468 case MM_SHOW_FSGROUP:
469 form->extrastuff = (caddr_t) sq_create();
472 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
473 if (!strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
474 !strcmp(stringval(form, FS_TYPE), "MUL"))
475 argv[FS_MACHINE] = "\\[NONE\\]";
478 if (!strcmp(form->formname, "mod_filsys")) {
479 qy = "update_filesys";
480 for (i = 0; i < FS_MODTIME; i++)
481 argv[i + 1] = StringValue(form, i);
482 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
483 argv[0] = form->extrastuff;
484 argc = FS_MODTIME + 1;
487 form->extrastuff = (caddr_t) "mod_filsys";
488 retfunc = ModifyCallback;
491 argv[1] = strsave(stringval(form, 1));
492 s = index(argv[1], ' ');
494 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
497 com_err(program_name, i, " removing filesystem from FS group");
501 /* fall through to: */
503 /* find the two keys to sort between */
504 argv[2] = strsave(argv[2]);
505 s = index(argv[2], ' ');
508 s = index(argv[2], ')');
512 if (*argv[2] == 0) argv[2] = "A";
513 /* Finding the after key is gross. We look through the widgets
514 * in the radiobox to find the one selected and the one after
515 * it. The name of the widget is also the member name.
521 w = form->inputlines[2]->mywidget;
522 for (i = 0; i < NumChildren(w); i++) {
523 kid = NthChild(w, i);
524 if (!strcmp(XtName(kid), stringval(form, 2))) {
526 if (i < NumChildren(w)) {
527 argv[3] = strsave(XtName(NthChild(w, i)));
528 s = index(argv[3], ' ');
531 s = index(argv[3], ')');
540 printf("Don't know how to do this\007\007!\n");
542 if (*argv[3] == 0) argv[3] = "Z";
544 printf("Got before key of \"%s\" and after key of \"%s\"\n",
547 /* copy the matching chars */
548 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
550 /* and set the last char */
556 if (*argv[3] == 0) *argv[3] = 'Z';
557 if (*argv[3] - *argv[2] > 1) {
558 *s++ = (*argv[3] + *argv[2])/2;
564 argv[2] = strsave(buf);
567 argv[1] = strsave(stringval(form, 1));
568 s = index(argv[1], ' ');
571 case MM_SHOW_FS_ALIAS:
572 if (!*stringval(form, 0))
575 argv[2] = stringval(form, 0);
576 if (!*stringval(form, 1))
579 argv[0] = stringval(form, 1);
582 case MM_ADD_FS_ALIAS:
583 case MM_DEL_FS_ALIAS:
584 argv[0] = stringval(form, 1);
586 argv[2] = stringval(form, 0);
589 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
590 if (!*stringval(form, 1))
594 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
595 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
596 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
597 argv[NFS_STATUS] = buf;
598 argv[NFS_ALLOC] = stringval(form, 5);
599 argv[NFS_SIZE] = stringval(form, 6);
602 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
603 if (!strcmp(form->formname, "mod_nfs")) {
604 qy = "update_nfsphys";
606 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
607 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
608 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
609 argv[NFS_STATUS] = buf;
610 argv[NFS_ALLOC] = stringval(form, 5);
611 argv[NFS_SIZE] = stringval(form, 6);
614 form->extrastuff = (caddr_t) "mod_nfs";
615 retfunc = ModifyCallback;
618 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
621 if (!*stringval(form, 0))
623 if (*stringval(form, 1)) {
625 argv[2] = stringval(form, 1);
626 } else if (*stringval(form, 2)) {
628 argv[2] = stringval(form, 2);
629 } else if (!*stringval(form, 0)) {
630 display_error("Must specify something.");
633 qy = "get_quota_by_filesys";
640 StoreHost(form, 0, &argv[0]);
643 if (!strcmp(form->formname, "mod_machine")) {
644 qy = "update_machine";
645 for (i = 0; i < M_MODTIME; i++)
646 argv[i + 1] = StringValue(form, i);
647 argv[0] = form->extrastuff;
648 argc = M_MODTIME + 1;
651 StoreHost(form, 0, &argv[0]);
652 form->extrastuff = (caddr_t) "mod_machine";
653 retfunc = ModifyCallback;
656 if (!strcmp(form->formname, "mod_cluster")) {
657 qy = "update_cluster";
658 for (i = 0; i < C_MODTIME; i++)
659 argv[i + 1] = StringValue(form, i);
660 argv[0] = form->extrastuff;
661 argc = C_MODTIME + 1;
664 form->extrastuff = (caddr_t) "mod_cluster";
665 retfunc = ModifyCallback;
668 if (!*stringval(form, 0))
671 StoreHost(form, 0, &argv[0]);
672 if (!*stringval(form, 1))
674 AppendToLog("Cluster mappings:\n");
678 StoreHost(form, 0, &argv[0]);
681 if (!*stringval(form, 1))
683 AppendToLog("Cluster data:\n");
686 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
687 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
690 if (!strcmp(form->formname, "mod_printer")) {
691 qy = "update_printcap_entry";
695 form->extrastuff = (caddr_t) "mod_printer";
696 retfunc = ModifyCallback;
699 if (!strcmp(form->formname, "mod_service")) {
700 qy = "update_server_info";
704 form->extrastuff = (caddr_t) "mod_service";
705 retfunc = ModifyCallback;
707 case MM_RESET_SERVICE:
708 argv[1] = argv[2] = argv[3] = argv[4] = "0";
712 StoreHost(form, 1, &argv[1]);
713 argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
717 StoreHost(form, 1, &argv[1]);
720 if (!*stringval(form, 0))
722 if (!*stringval(form, 1))
725 StoreHost(form, 1, &argv[1]);
728 if (!strcmp(form->formname, "mod_host")) {
729 qy = "update_server_host_info";
733 StoreHost(form, 1, &argv[1]);
734 form->extrastuff = (caddr_t) "mod_host";
735 retfunc = ModifyCallback;
738 if (!write_log_to_file(stringval(form, 0)) && remove)
739 XtUnmanageChild(form->formpointer);
742 argv[0] = form->extrastuff;
744 argv[2] = StringValue(form, 0);
745 for (s = argv[2]; *s; s++)
746 if (islower(*s)) *s = toupper(*s);
749 if (form->inputlines[0]->returnvalue.booleanvalue) {
752 com_err(program_name, i, " starting DCM");
754 AppendToLog("DCM started.\n");
757 XtUnmanageChild(form->formpointer);
762 display_error("Unknown function in form callback.\n");
765 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
767 com_err(program_name, i, " executing database query");
772 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
773 if (form->formpointer)
774 XtUnmanageChild(form->formpointer);
775 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
776 f->menu = form->menu;
779 switch (form->menu->operation) {
782 f->inputlines[U_STATE]->keywords = user_states;
783 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
784 GetKeywords(f, U_CLASS, "class");
786 AppendToLog("Done.\n");
791 AppendToLog("Done.\n");
795 GetKeywords(f, L_ACE_TYPE, "ace_type");
796 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
797 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
799 AppendToLog("Done.\n");
803 GetKeywords(f, SC_TYPE, "service");
804 GetKeywords(f, SC_ACE_TYPE, "ace_type");
809 GetKeywords(f, FS_TYPE, "filesys");
810 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
811 GetKeywords(f, FS_ACCESS, buf);
812 GetKeywords(f, FS_L_TYPE, "lockertype");
813 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
814 StoreField(f, FS_MACHINE, "\\[NONE\\]");
815 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
817 AppendToLog("Done.\n");
821 GetKeywords(f, 1, "mac_type");
823 AppendToLog("Done.\n");
827 f->inputlines[3]->keywords = nfs_states;
829 AppendToLog("Done.\n");
831 case MM_DEL_ALL_MEMBER:
832 argv[1] = StringValue(form, 0);
833 argv[2] = StringValue(form, 1);
834 while (sq_get_data(form->extrastuff, &(argv[0]))) {
835 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
836 StringValue(form, 1), argv[0]);
837 if (!boolval(form, 2) ||
838 AskQuestion(buf, "confirm_del_all")) {
839 i = MoiraQuery("delete_member_from_list", 3, argv,
840 DisplayCallback, NULL);
842 com_err(program_name, i, " while removing member from list");
844 sprintf(buf, "Member %s %s removed from list %s.\n",
845 argv[1], argv[2], argv[0]);
851 AppendToLog("Done.\n");
854 case MM_SHOW_FSGROUP:
855 while (sq_get_data(form->extrastuff, &aargv)) {
858 sq_destroy(form->extrastuff);
866 case MM_CLEAR_SERVICE:
867 case MM_RESET_SERVICE:
890 case MM_ADD_FS_ALIAS:
891 case MM_DEL_FS_ALIAS:
906 AppendToLog("Done.\n");
911 case MM_SHOW_MEMBERS:
914 case MM_SHOW_ACE_USE:
918 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
919 form->extrastuff, StringValue(form, 0));
922 if (remove && form->formpointer)
923 XtUnmanageChild(form->formpointer);
938 int (*retfunc)(), argc, i;
941 retfunc = DisplayCallback;
947 switch (m->operation) {
948 case MM_SHOW_MAILLIST:
949 argv[0] = argv[1] = argv[3] = "TRUE";
951 argv[4] = "DONTCARE";
952 AppendToLog("Public Mailinglists:\n");
955 argv[0] = "def_quota";
958 AppendToLog("Services and Hosts with failed updates:\n");
959 argv[0] = argv[2] = "DONTCARE";
961 i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
963 if (i && i != MR_NO_MATCH)
964 com_err(program_name, i, " executing database query");
966 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
968 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
970 if (i && i != MR_NO_MATCH)
971 com_err(program_name, i, " executing database query");
975 case MM_HELP_WILDCARDS:
976 case MM_HELP_AUTHORS:
979 case MM_HELP_KEYBOARD:
987 display_error("Unknown function in menu callback.\n");
990 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
992 com_err(program_name, i, " executing database query");