8 #include <moira_site.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>
14 #include <X11/IntrinsicP.h>
15 #include <X11/CoreP.h>
16 #include <X11/CompositeP.h>
26 /* Called with moira data that is to be modified. */
28 int ModifyCallback(argc, argv, form)
39 switch (form->menu->operation) {
42 f = GetAndClearForm("mod_user");
44 display_error("Unknown form in ModifyCallback!\n");
47 f->extrastuff = form->extrastuff;
49 for (i = 0; i < U_SIGNATURE; i++)
50 if (f->inputlines[i]->type == FT_BOOLEAN)
51 f->inputlines[i]->returnvalue.booleanvalue =
52 strcmp(argv[i + offset], "0") ? 1 : 0;
54 StoreField(f, i, argv[i + offset]);
55 f->inputlines[U_SIGNATURE]->keyword_name = strsave(argv[U_SIGNATURE]);
56 f->inputlines[U_SIGNATURE]->returnvalue.booleanvalue =
57 strcmp(argv[U_SECURE], "0") ? 1 : 0;
58 f->inputlines[U_COMMENT]->keyword_name = strsave(argv[U_SECURE]);
62 count = F_MODTIME - 1;
67 form->extrastuff = NULL;
69 form->extrastuff = strsave(argv[U_UID]);
81 f = GetAndClearForm("mod_nfs");
83 display_error("Unknown form in ModifyCallback of mod_nfs\n");
86 f->extrastuff = form->extrastuff;
88 StoreField(f, 0, argv[0]);
89 StoreField(f, 1, argv[1]);
90 StoreField(f, 2, argv[2]);
91 f->inputlines[3]->keywords = nfs_states;
92 for (i = 0; nfs_states[i]; i++)
93 if (atoi(nfs_states[i]) & atoi(argv[3]))
94 StoreField(f, 3, nfs_states[i]);
95 if (atoi(argv[3]) & MR_FS_GROUPQUOTA)
96 f->inputlines[4]->returnvalue.booleanvalue = 1;
98 f->inputlines[4]->returnvalue.booleanvalue = 0;
99 StoreField(f, 5, argv[4]);
100 StoreField(f, 6, argv[5]);
112 count = PCAP_MODTIME;
121 f = GetAndClearForm(fn);
123 display_error("Unknown form in ModifyCallback!\n");
126 f->extrastuff = form->extrastuff;
127 f->menu = form->menu;
128 for (i = 0; i < count; i++)
129 if (f->inputlines[i]->type == FT_BOOLEAN)
130 f->inputlines[i]->returnvalue.booleanvalue =
131 strcmp(argv[i + offset], "0") ? 1 : 0;
133 StoreField(f, i, argv[i + offset]);
135 display_error("Unknown function in ModifyCallback!\n");
141 /* Generate a new cryptographic signature for the user record */
142 SignUser(argv, offset)
151 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
152 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
154 i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
155 /* If it's already signed OK, don't resign it. */
156 if (i != GDSS_SUCCESS) {
157 free(argv[U_SIGNATURE + offset]);
158 argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
160 i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
161 if (i != GDSS_SUCCESS)
162 com_err(program_name, gdss2et(i),
163 "Failed to create signature");
165 unsigned char newbuf[256];
167 i = GDSS_Verify(buf, strlen(buf),
168 argv[U_SIGNATURE + offset], &si);
169 if (strlen(newbuf) > 68) {
171 AppendLog("Signature too long, trying again\n");
177 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
179 AppendLog("Don't need to remake signature\n");
184 argv[U_SIGNATURE + offset] = strsave("");
189 /* when OK pressed */
191 MoiraFormComplete(dummy1, form)
195 process_form(form, TRUE);
199 /* when APPLY pressed */
201 MoiraFormApply(dummy1, form)
208 /* undocumented Motif internal routine to advance in tab group.
209 * In this case we're going backwards because for some reason
210 * the form advances whenever this button is pressed.
211 * However, it doesn't seem to go backwards even though source
212 * implies that it should. So we go forward until we wrap.
215 for (p = form->inputlines; *p; p++)
218 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
219 process_form(form, FALSE);
223 int CollectData(argc, argv, form)
228 struct save_queue *sq;
230 sq = (struct save_queue *) form->extrastuff;
231 sq_save_data(sq, strsave(argv[0]));
236 /* callback when form is complete to process the data */
238 process_form(form, remove)
242 char *qy, *argv[32], buf[256], *s, **aargv;
243 int (*retfunc)(), argc, i;
246 retfunc = DisplayCallback;
249 for (i = 0; form->inputlines[i]; i++)
250 argv[i] = StringValue(form, i);
251 qy = form->menu->query;
252 argc = form->menu->argc;
254 switch (form->menu->operation) {
256 if (*stringval(form, 0)) {
257 qy = "get_user_account_by_login";
258 argv[0] = stringval(form, 0);
260 } else if (*stringval(form, 3)) {
261 qy = "get_user_account_by_uid";
262 argv[0] = stringval(form, 3);
264 } else if (*stringval(form, 4)) {
265 qy = "get_user_account_by_class";
266 argv[0] = stringval(form, 4);
268 } else if (*stringval(form, 1) == 0 &&
269 *stringval(form, 2) == 0) {
270 display_error("Must fill in at least one blank.");
273 if (*stringval(form, 1) == 0)
274 StoreField(form, 1, "*");
275 if (*stringval(form, 2) == 0)
276 StoreField(form, 2, "*");
277 qy = "get_user_account_by_name";
278 argv[0] = stringval(form, 1);
279 argv[1] = stringval(form, 2);
284 argv[U_STATE][1] = 0;
285 argv[U_SECURE] = argv[U_SIGNATURE];
290 if (!strcmp(form->formname, "mod_user")) {
291 qy = "update_user_account";
292 for (i = 0; i < U_SIGNATURE; i++)
293 argv[i + 1] = StringValue(form, i);
294 argv[0] = form->extrastuff;
295 argv[U_STATE + 1][1] = 0;
296 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
297 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
298 if (*argv[U_SECURE + 1] == '1')
299 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
300 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
304 gettimeofday(&tv, NULL);
305 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
306 sprintf(buf, "%ld", tv.tv_sec);
307 argv[U_SECURE + 1] = strsave(buf);
310 argc = U_MODTIME + 1;
313 form->extrastuff = (caddr_t) "mod_user";
314 retfunc = ModifyCallback;
317 if (*stringval(form, 2)) {
318 argv[0] = stringval(form, 2);
320 argv[0] = stringval(form, 0);
321 argv[1] = stringval(form, 1);
322 form->extrastuff = NULL;
323 i = MoiraQuery("get_user_account_by_name", 2, argv,
324 ModifyCallback, (char *)form);
326 com_err(program_name, i, " looking up user by name");
329 if (form->extrastuff == NULL) {
330 display_error("Ambiguous user specification");
333 argv[0] = (char *)form->extrastuff;
335 qy = "register_user";
336 argv[1] = stringval(form, 3);
344 display_error("Expunge is not yet implemented");
348 if (!strcmp(form->formname, "mod_finger")) {
349 qy = "update_finger_by_login";
350 for (i = 0; i < F_MODTIME - 1; i++)
351 argv[i + 1] = StringValue(form, i);
352 argv[0] = form->extrastuff;
356 form->extrastuff = (caddr_t) "mod_finger";
357 retfunc = ModifyCallback;
360 if (!*stringval(form, 0))
362 if (!*stringval(form, 1))
366 if (!strcmp(argv[1], "POP"))
367 argv[2] = stringval(form, 3);
369 case MM_SHOW_ACE_USE:
370 if (boolval(form, 2)) {
371 sprintf(buf, "R%s", stringval(form, 0));
376 if (!strcmp(form->formname, "mod_list")) {
378 for (i = 0; i < L_MODTIME; i++)
379 argv[i + 1] = StringValue(form, i);
380 argv[0] = form->extrastuff;
381 argc = L_MODTIME + 1;
384 form->extrastuff = (caddr_t) "mod_list";
385 retfunc = ModifyCallback;
387 case MM_SHOW_MEMBERS:
388 if (!*stringval(form, 0)) {
389 qy = "get_lists_of_member";
390 argv[0] = stringval(form, 1);
391 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
393 if (boolval(form, 3)) {
394 sprintf(buf, "R%s", stringval(form, 1));
397 argv[1] = stringval(form, 2);
400 sprintf(buf, "Members of list: %s\n", argv[0]);
404 case MM_DEL_ALL_MEMBER:
405 form->extrastuff = (caddr_t) sq_create();
406 retfunc = CollectData;
409 if (*stringval(form, 0)) {
410 qy = "get_filesys_by_label";
411 argv[0] = stringval(form, 0);
413 } else if (*stringval(form, 1)) {
414 StoreHost(form, 1, &argv[0]);
415 if (*stringval(form, 2)) {
416 qy = "get_filesys_by_nfsphys";
417 argv[1] = stringval(form, 2);
420 qy = "get_filesys_by_machine";
423 } else if (*stringval(form, 3)) {
424 qy = "get_filesys_by_group";
425 argv[0] = stringval(form, 3);
428 /* fall through to */
429 case MM_SHOW_FSGROUP:
430 form->extrastuff = (caddr_t) sq_create();
433 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
434 if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
435 !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
436 !strcmp(stringval(form, FS_TYPE), "MUL"))
437 argv[FS_MACHINE] = "\\[NONE\\]";
440 if (!strcmp(form->formname, "mod_filsys")) {
441 qy = "update_filesys";
442 for (i = 0; i < FS_MODTIME; i++)
443 argv[i + 1] = StringValue(form, i);
444 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
445 argv[0] = form->extrastuff;
446 argc = FS_MODTIME + 1;
449 form->extrastuff = (caddr_t) "mod_filsys";
450 retfunc = ModifyCallback;
453 argv[1] = strsave(stringval(form, 1));
454 s = index(argv[1], ' ');
456 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
459 com_err(program_name, i, " removing filesystem from FS group");
463 /* fall through to: */
465 /* find the two keys to sort between */
466 argv[2] = strsave(argv[2]);
467 s = index(argv[2], ' ');
470 s = index(argv[2], ')');
474 if (*argv[2] == 0) argv[2] = "A";
475 /* Finding the after key is gross. We look through the widgets
476 * in the radiobox to find the one selected and the one after
477 * it. The name of the widget is also the member name.
484 cr = (CompositeRec *)form->inputlines[2]->mywidget;
485 for (i = 0; i < cr->composite.num_children; i++) {
486 kid = cr->composite.children[i];
487 if (!strcmp(XtName(kid), stringval(form, 2))) {
489 if (i < cr->composite.num_children) {
490 argv[3] = strsave(XtName(cr->composite.children[i]));
491 s = index(argv[3], ' ');
494 s = index(argv[3], ')');
503 if (*argv[3] == 0) argv[3] = "Z";
505 printf("Got before key of \"%s\" and after key of \"%s\"\n",
508 /* copy the matching chars */
509 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
511 /* and set the last char */
517 if (*argv[3] == 0) *argv[3] = 'Z';
518 if (*argv[3] - *argv[2] > 1) {
519 *s++ = (*argv[3] + *argv[2])/2;
525 argv[2] = strsave(buf);
528 argv[1] = strsave(stringval(form, 1));
529 s = index(argv[1], ' ');
532 case MM_SHOW_FS_ALIAS:
533 case MM_ADD_FS_ALIAS:
534 case MM_DEL_FS_ALIAS:
536 argv[2] = stringval(form, 1);
539 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
540 if (!*stringval(form, 1))
544 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
545 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
546 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
547 argv[NFS_STATUS] = buf;
548 argv[NFS_ALLOC] = stringval(form, 5);
549 argv[NFS_SIZE] = stringval(form, 6);
552 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
553 if (!strcmp(form->formname, "mod_nfs")) {
554 qy = "update_nfsphys";
556 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
557 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
558 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
559 argv[NFS_STATUS] = buf;
560 argv[NFS_ALLOC] = stringval(form, 5);
561 argv[NFS_SIZE] = stringval(form, 6);
564 form->extrastuff = (caddr_t) "mod_nfs";
565 retfunc = ModifyCallback;
568 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
571 if (!*stringval(form, 0))
573 if (*stringval(form, 1)) {
575 argv[2] = stringval(form, 1);
576 } else if (*stringval(form, 2)) {
578 argv[2] = stringval(form, 2);
579 } else if (!*stringval(form, 0)) {
580 display_error("Must specify something.");
583 qy = "get_quota_by_filesys";
590 StoreHost(form, 0, &argv[0]);
593 if (!strcmp(form->formname, "mod_machine")) {
594 qy = "update_machine";
595 for (i = 0; i < M_MODTIME; i++)
596 argv[i + 1] = StringValue(form, i);
597 argv[0] = form->extrastuff;
598 argc = M_MODTIME + 1;
601 StoreHost(form, 0, &argv[0]);
602 form->extrastuff = (caddr_t) "mod_machine";
603 retfunc = ModifyCallback;
606 if (!strcmp(form->formname, "mod_cluster")) {
607 qy = "update_cluster";
608 for (i = 0; i < C_MODTIME; i++)
609 argv[i + 1] = StringValue(form, i);
610 argv[0] = form->extrastuff;
611 argc = C_MODTIME + 1;
614 form->extrastuff = (caddr_t) "mod_cluster";
615 retfunc = ModifyCallback;
618 if (!*stringval(form, 0))
621 StoreHost(form, 0, &argv[0]);
622 if (!*stringval(form, 1))
624 AppendToLog("Cluster mappings:\n");
628 StoreHost(form, 0, &argv[0]);
631 if (!*stringval(form, 1))
635 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
636 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
639 if (!strcmp(form->formname, "mod_printer")) {
640 qy = "update_printcap_entry";
644 form->extrastuff = (caddr_t) "mod_printer";
645 retfunc = ModifyCallback;
648 if (!strcmp(form->formname, "mod_service")) {
649 qy = "update_server_host_info";
653 form->extrastuff = (caddr_t) "mod_service";
654 retfunc = ModifyCallback;
657 if (!write_log_to_file(stringval(form, 0)) && remove)
658 XtUnmanageChild(form->formpointer);
661 argv[0] = form->extrastuff;
663 argv[2] = StringValue(form, 0);
664 for (s = argv[2]; *s; s++)
665 if (islower(*s)) *s = toupper(*s);
670 display_error("Unknown function in form callback.\n");
673 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
675 com_err(program_name, i, " executing database query");
680 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
681 if (form->formpointer)
682 XtUnmanageChild(form->formpointer);
683 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
684 f->menu = form->menu;
687 switch (form->menu->operation) {
690 f->inputlines[U_STATE]->keywords = user_states;
691 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
692 GetKeywords(f, U_CLASS, "class");
694 AppendToLog("Done.\n");
699 AppendToLog("Done.\n");
703 GetKeywords(f, L_ACE_TYPE, "ace_type");
704 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
705 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
707 AppendToLog("Done.\n");
711 GetKeywords(f, FS_TYPE, "filesys");
712 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
713 GetKeywords(f, FS_ACCESS, buf);
714 GetKeywords(f, FS_L_TYPE, "lockertype");
715 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
716 StoreField(f, FS_MACHINE, "\\[NONE\\]");
717 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
719 AppendToLog("Done.\n");
723 GetKeywords(f, 1, "mac_type");
725 AppendToLog("Done.\n");
729 f->inputlines[3]->keywords = nfs_states;
731 AppendToLog("Done.\n");
733 case MM_DEL_ALL_MEMBER:
734 argv[1] = StringValue(form, 0);
735 argv[2] = StringValue(form, 1);
736 while (sq_get_data(form->extrastuff, &(argv[0]))) {
737 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
738 StringValue(form, 1), argv[0]);
739 if (!boolval(form, 2) ||
740 AskQuestion(buf, "confirm_del_all")) {
741 i = MoiraQuery("delete_member_from_list", 3, argv,
742 DisplayCallback, NULL);
744 com_err(program_name, i, " while removing member from list");
746 sprintf(buf, "Member %s %s removed from list %s.\n",
747 argv[1], argv[2], argv[0]);
753 AppendToLog("Done.\n");
756 case MM_SHOW_FSGROUP:
757 while (sq_get_data(form->extrastuff, &aargv)) {
760 sq_destroy(form->extrastuff);
768 case MM_CLEAR_SERVICE:
769 case MM_RESET_SERVICE:
793 case MM_ADD_FS_ALIAS:
794 case MM_DEL_FS_ALIAS:
809 AppendToLog("Done.\n");
812 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
813 form->extrastuff, StringValue(form, 0));
816 if (remove && form->formpointer)
817 XtUnmanageChild(form->formpointer);
830 int (*retfunc)(), argc, i;
833 retfunc = DisplayCallback;
839 switch (m->operation) {
840 case MM_SHOW_MAILLIST:
841 argv[0] = argv[1] = argv[3] = "TRUE";
843 argv[4] = "DONTCARE";
844 AppendToLog("Public Mailinglists:\n");
847 argv[0] = "def_quota";
850 AppendToLog("Services and Hosts with failed updates:\n");
851 argv[0] = argv[2] = "DONTCARE";
853 i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
854 if (i && i != MR_NO_MATCH)
855 com_err(program_name, i, " executing database query");
857 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
859 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
860 if (i && i != MR_NO_MATCH)
861 com_err(program_name, i, " executing database query");
865 case MM_HELP_WILDCARDS:
866 case MM_HELP_AUTHORS:
869 case MM_HELP_KEYBOARD:
877 display_error("Unknown function in menu callback.\n");
880 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
882 com_err(program_name, i, " executing database query");