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++)
242 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
243 process_form(form, FALSE);
247 int CollectData(argc, argv, form)
252 struct save_queue *sq;
254 sq = (struct save_queue *) form->extrastuff;
255 sq_save_data(sq, strsave(argv[0]));
260 /* callback when form is complete to process the data */
262 process_form(form, remove)
266 char *qy, *argv[32], buf[256], *s, **aargv;
267 int (*retfunc)(), argc, i;
270 retfunc = DisplayCallback;
273 for (i = 0; form->inputlines[i]; i++)
274 argv[i] = StringValue(form, i);
275 qy = form->menu->query;
276 argc = form->menu->argc;
278 switch (form->menu->operation) {
280 if (*stringval(form, 0)) {
281 qy = "get_user_account_by_login";
282 argv[0] = stringval(form, 0);
284 } else if (*stringval(form, 3)) {
285 qy = "get_user_account_by_uid";
286 argv[0] = stringval(form, 3);
288 } else if (*stringval(form, 4)) {
289 qy = "get_user_account_by_class";
290 argv[0] = stringval(form, 4);
292 } else if (*stringval(form, 1) == 0 &&
293 *stringval(form, 2) == 0) {
294 display_error("Must fill in at least one blank.");
297 if (*stringval(form, 1) == 0)
298 StoreField(form, 1, "*");
299 if (*stringval(form, 2) == 0)
300 StoreField(form, 2, "*");
301 qy = "get_user_account_by_name";
302 argv[0] = stringval(form, 1);
303 argv[1] = stringval(form, 2);
308 argv[U_STATE][1] = 0;
309 argv[U_SECURE] = argv[U_SIGNATURE];
314 if (!strcmp(form->formname, "mod_user")) {
315 qy = "update_user_account";
316 for (i = 0; i < U_SIGNATURE; i++)
317 argv[i + 1] = StringValue(form, i);
318 argv[0] = form->extrastuff;
319 argv[U_STATE + 1][1] = 0;
320 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
321 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
322 if (*argv[U_SECURE + 1] == '1')
323 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
324 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
328 gettimeofday(&tv, NULL);
329 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
330 sprintf(buf, "%ld", tv.tv_sec);
331 argv[U_SECURE + 1] = strsave(buf);
334 argc = U_MODTIME + 1;
337 form->extrastuff = (caddr_t) "mod_user";
338 retfunc = ModifyCallback;
341 if (*stringval(form, 2)) {
342 argv[0] = stringval(form, 2);
344 argv[0] = stringval(form, 0);
345 argv[1] = stringval(form, 1);
346 form->extrastuff = NULL;
347 i = MoiraQuery("get_user_account_by_name", 2, argv,
348 ModifyCallback, (char *)form);
350 com_err(program_name, i, " looking up user by name");
353 if (form->extrastuff == NULL) {
354 display_error("Ambiguous user specification");
357 argv[0] = (char *)form->extrastuff;
359 qy = "register_user";
360 argv[1] = stringval(form, 3);
368 display_error("Expunge is not yet implemented");
372 if (!strcmp(form->formname, "mod_finger")) {
373 qy = "update_finger_by_login";
374 for (i = 0; i < F_MODTIME - 1; i++)
375 argv[i + 1] = StringValue(form, i);
376 argv[0] = form->extrastuff;
380 form->extrastuff = (caddr_t) "mod_finger";
381 retfunc = ModifyCallback;
384 if (!*stringval(form, 0))
386 if (!*stringval(form, 1))
388 AppendToLog("Kerberos mappings:\n");
391 if (!strcmp(argv[1], "POP"))
392 argv[2] = stringval(form, 3);
394 case MM_SHOW_ACE_USE:
395 if (boolval(form, 2)) {
396 sprintf(buf, "R%s", stringval(form, 0));
397 argv[0] = strsave(buf);
399 sprintf(buf, "Objects %s %s can administer\n",
400 stringval(form, 0), stringval(form, 1));
404 if (!strcmp(form->formname, "mod_list")) {
406 for (i = 0; i < L_MODTIME; i++)
407 argv[i + 1] = StringValue(form, i);
408 argv[0] = form->extrastuff;
409 argc = L_MODTIME + 1;
412 form->extrastuff = (caddr_t) "mod_list";
413 retfunc = ModifyCallback;
415 case MM_SHOW_MEMBERS:
416 if (!*stringval(form, 0)) {
417 qy = "get_lists_of_member";
418 argv[0] = stringval(form, 1);
419 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
421 if (boolval(form, 3)) {
422 sprintf(buf, "R%s", stringval(form, 1));
425 argv[1] = stringval(form, 2);
428 if (boolval(form, 3)) {
429 qy = "get_end_members_of_list";
430 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
432 sprintf(buf, "Members of list: %s\n", argv[0]);
436 case MM_DEL_ALL_MEMBER:
437 form->extrastuff = (caddr_t) sq_create();
438 retfunc = CollectData;
441 if (*stringval(form, 0)) {
442 qy = "get_filesys_by_label";
443 argv[0] = stringval(form, 0);
445 } else if (*stringval(form, 1)) {
446 StoreHost(form, 1, &argv[0]);
447 if (*stringval(form, 2)) {
448 qy = "get_filesys_by_nfsphys";
449 argv[1] = stringval(form, 2);
452 qy = "get_filesys_by_machine";
455 } else if (*stringval(form, 3)) {
456 qy = "get_filesys_by_group";
457 argv[0] = stringval(form, 3);
459 } else if (*stringval(form, 4)) {
460 qy = "get_filesys_by_path";
461 argv[0] = stringval(form, 4);
464 /* fall through to */
465 case MM_SHOW_FSGROUP:
466 form->extrastuff = (caddr_t) sq_create();
469 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
470 if (!strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
471 !strcmp(stringval(form, FS_TYPE), "MUL"))
472 argv[FS_MACHINE] = "\\[NONE\\]";
475 if (!strcmp(form->formname, "mod_filsys")) {
476 qy = "update_filesys";
477 for (i = 0; i < FS_MODTIME; i++)
478 argv[i + 1] = StringValue(form, i);
479 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
480 argv[0] = form->extrastuff;
481 argc = FS_MODTIME + 1;
484 form->extrastuff = (caddr_t) "mod_filsys";
485 retfunc = ModifyCallback;
488 argv[1] = strsave(stringval(form, 1));
489 s = index(argv[1], ' ');
491 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
494 com_err(program_name, i, " removing filesystem from FS group");
498 /* fall through to: */
500 /* find the two keys to sort between */
501 argv[2] = strsave(argv[2]);
502 s = index(argv[2], ' ');
505 s = index(argv[2], ')');
509 if (*argv[2] == 0) argv[2] = "A";
510 /* Finding the after key is gross. We look through the widgets
511 * in the radiobox to find the one selected and the one after
512 * it. The name of the widget is also the member name.
518 w = form->inputlines[2]->mywidget;
519 for (i = 0; i < NumChildren(w); i++) {
520 kid = NthChild(w, i);
521 if (!strcmp(XtName(kid), stringval(form, 2))) {
523 if (i < NumChildren(w)) {
524 argv[3] = strsave(XtName(NthChild(w, i)));
525 s = index(argv[3], ' ');
528 s = index(argv[3], ')');
537 printf("Don't know how to do this\007\007!\n");
539 if (*argv[3] == 0) argv[3] = "Z";
541 printf("Got before key of \"%s\" and after key of \"%s\"\n",
544 /* copy the matching chars */
545 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
547 /* and set the last char */
553 if (*argv[3] == 0) *argv[3] = 'Z';
554 if (*argv[3] - *argv[2] > 1) {
555 *s++ = (*argv[3] + *argv[2])/2;
561 argv[2] = strsave(buf);
564 argv[1] = strsave(stringval(form, 1));
565 s = index(argv[1], ' ');
568 case MM_SHOW_FS_ALIAS:
569 if (!*stringval(form, 0))
572 argv[2] = stringval(form, 0);
573 if (!*stringval(form, 1))
576 argv[0] = stringval(form, 1);
579 case MM_ADD_FS_ALIAS:
580 case MM_DEL_FS_ALIAS:
581 argv[0] = stringval(form, 1);
583 argv[2] = stringval(form, 0);
586 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
587 if (!*stringval(form, 1))
591 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
592 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
593 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
594 argv[NFS_STATUS] = buf;
595 argv[NFS_ALLOC] = stringval(form, 5);
596 argv[NFS_SIZE] = stringval(form, 6);
599 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
600 if (!strcmp(form->formname, "mod_nfs")) {
601 qy = "update_nfsphys";
603 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
604 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
605 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
606 argv[NFS_STATUS] = buf;
607 argv[NFS_ALLOC] = stringval(form, 5);
608 argv[NFS_SIZE] = stringval(form, 6);
611 form->extrastuff = (caddr_t) "mod_nfs";
612 retfunc = ModifyCallback;
615 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
618 if (!*stringval(form, 0))
620 if (*stringval(form, 1)) {
622 argv[2] = stringval(form, 1);
623 } else if (*stringval(form, 2)) {
625 argv[2] = stringval(form, 2);
626 } else if (!*stringval(form, 0)) {
627 display_error("Must specify something.");
630 qy = "get_quota_by_filesys";
637 StoreHost(form, 0, &argv[0]);
640 if (!strcmp(form->formname, "mod_machine")) {
641 qy = "update_machine";
642 for (i = 0; i < M_MODTIME; i++)
643 argv[i + 1] = StringValue(form, i);
644 argv[0] = form->extrastuff;
645 argc = M_MODTIME + 1;
648 StoreHost(form, 0, &argv[0]);
649 form->extrastuff = (caddr_t) "mod_machine";
650 retfunc = ModifyCallback;
653 if (!strcmp(form->formname, "mod_cluster")) {
654 qy = "update_cluster";
655 for (i = 0; i < C_MODTIME; i++)
656 argv[i + 1] = StringValue(form, i);
657 argv[0] = form->extrastuff;
658 argc = C_MODTIME + 1;
661 form->extrastuff = (caddr_t) "mod_cluster";
662 retfunc = ModifyCallback;
665 if (!*stringval(form, 0))
668 StoreHost(form, 0, &argv[0]);
669 if (!*stringval(form, 1))
671 AppendToLog("Cluster mappings:\n");
675 StoreHost(form, 0, &argv[0]);
678 if (!*stringval(form, 1))
680 AppendToLog("Cluster data:\n");
683 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
684 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
687 if (!strcmp(form->formname, "mod_printer")) {
688 qy = "update_printcap_entry";
692 form->extrastuff = (caddr_t) "mod_printer";
693 retfunc = ModifyCallback;
696 if (!strcmp(form->formname, "mod_service")) {
697 qy = "update_server_info";
701 form->extrastuff = (caddr_t) "mod_service";
702 retfunc = ModifyCallback;
704 case MM_RESET_SERVICE:
705 argv[1] = argv[2] = argv[3] = argv[4] = "0";
709 StoreHost(form, 1, &argv[1]);
710 argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
714 if (!*stringval(form, 0))
716 if (!*stringval(form, 1))
719 StoreHost(form, 1, &argv[1]);
722 if (!strcmp(form->formname, "mod_host")) {
723 qy = "update_server_host_info";
727 StoreHost(form, 1, &argv[1]);
728 form->extrastuff = (caddr_t) "mod_host";
729 retfunc = ModifyCallback;
732 if (!write_log_to_file(stringval(form, 0)) && remove)
733 XtUnmanageChild(form->formpointer);
736 argv[0] = form->extrastuff;
738 argv[2] = StringValue(form, 0);
739 for (s = argv[2]; *s; s++)
740 if (islower(*s)) *s = toupper(*s);
745 display_error("Unknown function in form callback.\n");
748 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
750 com_err(program_name, i, " executing database query");
755 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
756 if (form->formpointer)
757 XtUnmanageChild(form->formpointer);
758 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
759 f->menu = form->menu;
762 switch (form->menu->operation) {
765 f->inputlines[U_STATE]->keywords = user_states;
766 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
767 GetKeywords(f, U_CLASS, "class");
769 AppendToLog("Done.\n");
774 AppendToLog("Done.\n");
778 GetKeywords(f, L_ACE_TYPE, "ace_type");
779 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
780 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
782 AppendToLog("Done.\n");
786 GetKeywords(f, SC_TYPE, "service");
787 GetKeywords(f, SC_ACE_TYPE, "ace_type");
792 GetKeywords(f, FS_TYPE, "filesys");
793 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
794 GetKeywords(f, FS_ACCESS, buf);
795 GetKeywords(f, FS_L_TYPE, "lockertype");
796 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
797 StoreField(f, FS_MACHINE, "\\[NONE\\]");
798 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
800 AppendToLog("Done.\n");
804 GetKeywords(f, 1, "mac_type");
806 AppendToLog("Done.\n");
810 f->inputlines[3]->keywords = nfs_states;
812 AppendToLog("Done.\n");
814 case MM_DEL_ALL_MEMBER:
815 argv[1] = StringValue(form, 0);
816 argv[2] = StringValue(form, 1);
817 while (sq_get_data(form->extrastuff, &(argv[0]))) {
818 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
819 StringValue(form, 1), argv[0]);
820 if (!boolval(form, 2) ||
821 AskQuestion(buf, "confirm_del_all")) {
822 i = MoiraQuery("delete_member_from_list", 3, argv,
823 DisplayCallback, NULL);
825 com_err(program_name, i, " while removing member from list");
827 sprintf(buf, "Member %s %s removed from list %s.\n",
828 argv[1], argv[2], argv[0]);
834 AppendToLog("Done.\n");
837 case MM_SHOW_FSGROUP:
838 while (sq_get_data(form->extrastuff, &aargv)) {
841 sq_destroy(form->extrastuff);
849 case MM_CLEAR_SERVICE:
850 case MM_RESET_SERVICE:
874 case MM_ADD_FS_ALIAS:
875 case MM_DEL_FS_ALIAS:
890 AppendToLog("Done.\n");
895 case MM_SHOW_MEMBERS:
898 case MM_SHOW_ACE_USE:
902 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
903 form->extrastuff, StringValue(form, 0));
906 if (remove && form->formpointer)
907 XtUnmanageChild(form->formpointer);
922 int (*retfunc)(), argc, i;
925 retfunc = DisplayCallback;
931 switch (m->operation) {
932 case MM_SHOW_MAILLIST:
933 argv[0] = argv[1] = argv[3] = "TRUE";
935 argv[4] = "DONTCARE";
936 AppendToLog("Public Mailinglists:\n");
939 argv[0] = "def_quota";
942 AppendToLog("Services and Hosts with failed updates:\n");
943 argv[0] = argv[2] = "DONTCARE";
945 i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
947 if (i && i != MR_NO_MATCH)
948 com_err(program_name, i, " executing database query");
950 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
952 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
954 if (i && i != MR_NO_MATCH)
955 com_err(program_name, i, " executing database query");
959 case MM_HELP_WILDCARDS:
960 case MM_HELP_AUTHORS:
963 case MM_HELP_KEYBOARD:
971 display_error("Unknown function in menu callback.\n");
974 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
976 com_err(program_name, i, " executing database query");