]> andersk Git - moira.git/blame_incremental - clients/mmoira/queries.c
reorder fields in filsys forms; don't try to remove window in tty mode
[moira.git] / clients / mmoira / queries.c
... / ...
CommitLineData
1/* $Header$
2 */
3
4#include <stdio.h>
5#include <strings.h>
6#include <ctype.h>
7#include <moira.h>
8#include <moira_site.h>
9#include <sys/types.h>
10#include <sys/time.h>
11#include <netdb.h>
12#include <sys/socket.h>
13#include <netinet/in.h>
14#include <Xm/Xm.h>
15#include "mmoira.h"
16#ifdef GDSS
17#include <des.h>
18#include <krb.h>
19#include <gdss.h>
20#endif /* GDSS */
21
22
23/* Called with moira data that is to be modified. */
24
25int ModifyCallback(argc, argv, form)
26int argc;
27char **argv;
28EntryForm *form;
29{
30 EntryForm *f;
31 char *fn;
32 int count, i, offset;
33
34 count = -1;
35 offset = 0;
36 switch (form->menu->operation) {
37 case MM_MOD_USER:
38 count = 0;
39 f = GetAndClearForm("mod_user");
40 if (f == NULL) {
41 display_error("Unknown form in ModifyCallback!\n");
42 return;
43 }
44 f->extrastuff = form->extrastuff;
45 f->menu = form->menu;
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;
50 else
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]);
56 return;
57 case MM_MOD_FINGER:
58 fn = "mod_finger";
59 count = F_MODTIME - 1;
60 offset = 1;
61 break;
62 case MM_REGISTER:
63 if (form->extrastuff)
64 form->extrastuff = NULL;
65 else
66 form->extrastuff = strsave(argv[U_UID]);
67 return;
68 break;
69 case MM_MOD_LIST:
70 fn = "mod_list";
71 count = L_MODTIME;
72 break;
73 case MM_MOD_FILSYS:
74 f = GetAndClearForm("mod_filsys");
75 if (f == NULL) {
76 display_error("Unknown form in ModifyCallback!\n");
77 return;
78 }
79 f->extrastuff = form->extrastuff;
80 f->menu = form->menu;
81 StoreField(f, FS_NAME, argv[FS_NAME + offset]);
82 StoreField(f, FS_TYPE, argv[FS_TYPE + offset]);
83 for (i = FS_TYPE+1; i < FS_MODTIME-1; i++)
84 if (f->inputlines[i+1]->type == FT_BOOLEAN)
85 f->inputlines[i+1]->returnvalue.booleanvalue =
86 strcmp(argv[i + offset], "0") ? 1 : 0;
87 else
88 StoreField(f, i+1, argv[i + offset]);
89 StoreField(f, FS_TYPE+1, argv[FS_L_TYPE + offset]);
90 return;
91 break;
92 case MM_MOD_NFS:
93 f = GetAndClearForm("mod_nfs");
94 if (f == NULL) {
95 display_error("Unknown form in ModifyCallback of mod_nfs\n");
96 return;
97 }
98 f->extrastuff = form->extrastuff;
99 f->menu = form->menu;
100 StoreField(f, 0, argv[0]);
101 StoreField(f, 1, argv[1]);
102 StoreField(f, 2, argv[2]);
103 f->inputlines[3]->keywords = nfs_states;
104 for (i = 0; nfs_states[i]; i++)
105 if (atoi(nfs_states[i]) & atoi(argv[3]))
106 StoreField(f, 3, nfs_states[i]);
107 if (atoi(argv[3]) & MR_FS_GROUPQUOTA)
108 f->inputlines[4]->returnvalue.booleanvalue = 1;
109 else
110 f->inputlines[4]->returnvalue.booleanvalue = 0;
111 StoreField(f, 5, argv[4]);
112 StoreField(f, 6, argv[5]);
113 return;
114 case MM_MOD_MACH:
115 fn = "mod_machine";
116 count = M_MODTIME;
117 break;
118 case MM_MOD_CLUSTER:
119 fn = "mod_cluster";
120 count = C_MODTIME;
121 break;
122 case MM_MOD_PCAP:
123 fn = "mod_printer";
124 count = PCAP_MODTIME;
125 break;
126 case MM_MOD_SERVICE:
127 f = GetAndClearForm("mod_service");
128 if (f == NULL) {
129 display_error("Unknown form in ModifyCallback of mod_service\n");
130 return;
131 }
132 f->extrastuff = form->extrastuff;
133 f->menu = form->menu;
134 for (i = 0; i < 4; i++) StoreField(f, i, argv[i]);
135 StoreField(f, 4, argv[6]);
136 f->inputlines[5]->returnvalue.booleanvalue = atoi(argv[7]);
137 StoreField(f, 6, argv[11]);
138 StoreField(f, 7, argv[12]);
139 return;
140 break;
141 case MM_MOD_HOST:
142 f = GetAndClearForm("mod_host");
143 if (f == NULL) {
144 display_error("Unknown form in ModifyCallback of mod_host\n");
145 return;
146 }
147 f->extrastuff = form->extrastuff;
148 f->menu = form->menu;
149 StoreField(f, 0, argv[0]);
150 StoreField(f, 1, argv[1]);
151 f->inputlines[2]->returnvalue.booleanvalue = atoi(argv[2]);
152 StoreField(f, 3, argv[10]);
153 StoreField(f, 4, argv[11]);
154 StoreField(f, 5, argv[12]);
155 return;
156 break;
157 }
158
159 if (count > 0) {
160 f = GetAndClearForm(fn);
161 if (f == NULL) {
162 display_error("Unknown form in ModifyCallback!\n");
163 return;
164 }
165 f->extrastuff = form->extrastuff;
166 f->menu = form->menu;
167 for (i = 0; i < count; i++)
168 if (f->inputlines[i]->type == FT_BOOLEAN)
169 f->inputlines[i]->returnvalue.booleanvalue =
170 strcmp(argv[i + offset], "0") ? 1 : 0;
171 else
172 StoreField(f, i, argv[i + offset]);
173 } else {
174 display_error("Unknown function in ModifyCallback!\n");
175 return;
176 }
177}
178
179
180/* Generate a new cryptographic signature for the user record */
181SignUser(argv, offset)
182char **argv;
183int offset;
184{
185#ifdef GDSS
186 char buf[256];
187 SigInfo si;
188 int i;
189
190 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
191 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
192 si.rawsig = NULL;
193 i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
194 /* If it's already signed OK, don't resign it. */
195 if (i != GDSS_SUCCESS) {
196 free(argv[U_SIGNATURE + offset]);
197 argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
198 sign_again:
199 i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
200 if (i != GDSS_SUCCESS)
201 com_err(program_name, gdss2et(i),
202 "Failed to create signature");
203 else {
204 unsigned char newbuf[256];
205 si.rawsig = newbuf;
206 i = GDSS_Verify(buf, strlen(buf),
207 argv[U_SIGNATURE + offset], &si);
208 if (strlen(newbuf) > 68) {
209#ifdef DEBUG
210 AppendLog("Signature too long, trying again\n");
211#endif /* DEBUG */
212 goto sign_again;
213 }
214 }
215#ifdef DEBUG
216 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
217 } else {
218 AppendLog("Don't need to remake signature\n");
219#endif /* DEBUG */
220 }
221 }
222#else /* GDSS */
223 argv[U_SIGNATURE + offset] = strsave("");
224#endif /* GDSS */
225}
226
227
228/* when OK pressed */
229
230MoiraFormComplete(dummy1, form)
231int dummy1;
232EntryForm *form;
233{
234 process_form(form, TRUE);
235}
236
237
238/* when APPLY pressed */
239
240MoiraFormApply(dummy1, form)
241int dummy1;
242EntryForm *form;
243{
244 UserPrompt **p;
245 int count;
246
247 /* undocumented Motif internal routine to advance in tab group.
248 * In this case we're going backwards because for some reason
249 * the form advances whenever this button is pressed.
250 * However, it doesn't seem to go backwards even though source
251 * implies that it should. So we go forward until we wrap.
252 */
253 count = 0;
254 for (p = form->inputlines; *p; p++)
255 if (!((*p)->insensitive))
256 count++;
257 while (count-- > 1)
258 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
259 MoiraFocusOut(form->inputlines[0]->mywidget,
260 (XEvent *)NULL, (String *)NULL, 0);
261 process_form(form, FALSE);
262}
263
264
265int CollectData(argc, argv, form)
266int argc;
267char **argv;
268EntryForm *form;
269{
270 struct save_queue *sq;
271
272 sq = (struct save_queue *) form->extrastuff;
273 sq_save_data(sq, strsave(argv[0]));
274 return(MR_CONT);
275}
276
277
278/* callback when form is complete to process the data */
279
280process_form(form, remove)
281EntryForm *form;
282int remove;
283{
284 char *qy, *argv[32], buf[256], *s, **aargv;
285 int (*retfunc)(), argc, i;
286 EntryForm *f;
287
288 retfunc = DisplayCallback;
289 argc = -1;
290
291 for (i = 0; form->inputlines[i]; i++)
292 argv[i] = StringValue(form, i);
293 qy = form->menu->query;
294 argc = form->menu->argc;
295
296 switch (form->menu->operation) {
297 case MM_SHOW_USER:
298 if (*stringval(form, 0)) {
299 qy = "get_user_account_by_login";
300 argv[0] = stringval(form, 0);
301 argc = 1;
302 } else if (*stringval(form, 3)) {
303 qy = "get_user_account_by_uid";
304 argv[0] = stringval(form, 3);
305 argc = 1;
306 } else if (*stringval(form, 4)) {
307 qy = "get_user_account_by_class";
308 argv[0] = stringval(form, 4);
309 argc = 1;
310 } else if (*stringval(form, 1) == 0 &&
311 *stringval(form, 2) == 0) {
312 display_error("Must fill in at least one blank.");
313 return;
314 } else {
315 if (*stringval(form, 1) == 0)
316 StoreField(form, 1, "*");
317 if (*stringval(form, 2) == 0)
318 StoreField(form, 2, "*");
319 qy = "get_user_account_by_name";
320 argv[0] = stringval(form, 1);
321 argv[1] = stringval(form, 2);
322 argc = 2;
323 }
324 break;
325 case MM_ADD_USER:
326 argv[U_STATE][1] = 0;
327 argv[U_SECURE] = argv[U_SIGNATURE];
328 SignUser(argv, 0);
329 argc = U_MODTIME;
330 break;
331 case MM_MOD_USER:
332 if (!strcmp(form->formname, "mod_user")) {
333 qy = "update_user_account";
334 for (i = 0; i < U_SIGNATURE; i++)
335 argv[i + 1] = StringValue(form, i);
336 argv[0] = form->extrastuff;
337 argv[U_STATE + 1][1] = 0;
338 argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
339 argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
340 if (*argv[U_SECURE + 1] == '1')
341 if (atoi(form->inputlines[U_COMMENT]->keyword_name))
342 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
343 else {
344 struct timeval tv;
345 char buf[32];
346 gettimeofday(&tv, NULL);
347 printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
348 sprintf(buf, "%ld", tv.tv_sec);
349 argv[U_SECURE + 1] = strsave(buf);
350 }
351 SignUser(argv, 1);
352 argc = U_MODTIME + 1;
353 break;
354 }
355 form->extrastuff = (caddr_t) "mod_user";
356 retfunc = ModifyCallback;
357 break;
358 case MM_REGISTER:
359 if (*stringval(form, 2)) {
360 argv[0] = stringval(form, 2);
361 } else {
362 argv[0] = stringval(form, 0);
363 argv[1] = stringval(form, 1);
364 form->extrastuff = NULL;
365 i = MoiraQuery("get_user_account_by_name", 2, argv,
366 ModifyCallback, (char *)form);
367 if (i) {
368 com_err(program_name, i, " looking up user by name");
369 return;
370 }
371 if (form->extrastuff == NULL) {
372 display_error("Ambiguous user specification");
373 return;
374 }
375 argv[0] = (char *)form->extrastuff;
376 }
377 qy = "register_user";
378 argv[1] = stringval(form, 3);
379 argv[2] = "1";
380 argc = 3;
381 break;
382 case MM_DEACTIVATE:
383 argv[1] = "3";
384 break;
385 case MM_EXPUNGE:
386 display_error("Expunge is not yet implemented");
387 return;
388 break;
389 case MM_MOD_FINGER:
390 if (!strcmp(form->formname, "mod_finger")) {
391 qy = "update_finger_by_login";
392 for (i = 0; i < F_MODTIME - 1; i++)
393 argv[i + 1] = StringValue(form, i);
394 argv[0] = form->extrastuff;
395 argc = F_MODTIME;
396 break;
397 }
398 form->extrastuff = (caddr_t) "mod_finger";
399 retfunc = ModifyCallback;
400 break;
401 case MM_SHOW_KRBMAP:
402 if (!*stringval(form, 0))
403 argv[0] = "*";
404 if (!*stringval(form, 1))
405 argv[1] = "*";
406 AppendToLog("Kerberos mappings:\n");
407 break;
408 case MM_SET_POBOX:
409 if (!strcmp(argv[1], "POP"))
410 argv[2] = stringval(form, 3);
411 break;
412 case MM_SHOW_ACE_USE:
413 if (boolval(form, 2)) {
414 sprintf(buf, "R%s", stringval(form, 0));
415 argv[0] = strsave(buf);
416 }
417 sprintf(buf, "Objects %s %s can administer\n",
418 stringval(form, 0), stringval(form, 1));
419 AppendToLog(buf);
420 break;
421 case MM_MOD_LIST:
422 if (!strcmp(form->formname, "mod_list")) {
423 qy = "update_list";
424 for (i = 0; i < L_MODTIME; i++)
425 argv[i + 1] = StringValue(form, i);
426 argv[0] = form->extrastuff;
427 argc = L_MODTIME + 1;
428 break;
429 }
430 form->extrastuff = (caddr_t) "mod_list";
431 retfunc = ModifyCallback;
432 break;
433 case MM_SHOW_MEMBERS:
434 if (!*stringval(form, 0)) {
435 qy = "get_lists_of_member";
436 argv[0] = stringval(form, 1);
437 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
438 AppendToLog(buf);
439 if (boolval(form, 3)) {
440 sprintf(buf, "R%s", stringval(form, 1));
441 argv[0] = buf;
442 }
443 argv[1] = stringval(form, 2);
444 argc = 2;
445 } else {
446 if (boolval(form, 3)) {
447 qy = "get_end_members_of_list";
448 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
449 } else
450 sprintf(buf, "Members of list: %s\n", argv[0]);
451 AppendToLog(buf);
452 }
453 break;
454 case MM_DEL_ALL_MEMBER:
455 form->extrastuff = (caddr_t) sq_create();
456 retfunc = CollectData;
457 break;
458 case MM_SHOW_FILSYS:
459 if (*stringval(form, 0)) {
460 qy = "get_filesys_by_label";
461 argv[0] = stringval(form, 0);
462 argc = 1;
463 } else if (*stringval(form, 1)) {
464 StoreHost(form, 1, &argv[0]);
465 if (*stringval(form, 2)) {
466 qy = "get_filesys_by_nfsphys";
467 argv[1] = stringval(form, 2);
468 argc = 2;
469 } else {
470 qy = "get_filesys_by_machine";
471 argc = 1;
472 }
473 } else if (*stringval(form, 3)) {
474 qy = "get_filesys_by_group";
475 argv[0] = stringval(form, 3);
476 argc = 1;
477 } else if (*stringval(form, 4)) {
478 qy = "get_filesys_by_path";
479 argv[0] = stringval(form, 4);
480 argc = 1;
481 }
482 /* fall through to */
483 case MM_SHOW_FSGROUP:
484 form->extrastuff = (caddr_t) sq_create();
485 break;
486 case MM_ADD_FILSYS:
487 for (i = FS_TYPE+1; i < FS_MODTIME-1; i++)
488 argv[i] = StringValue(form, i+1);
489 argv[FS_L_TYPE] = StringValue(form, FS_TYPE+1);
490 StoreHost(form, FS_MACHINE+1, &argv[FS_MACHINE]);
491 if (!strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
492 !strcmp(stringval(form, FS_TYPE), "MUL"))
493 argv[FS_MACHINE+1] = "\\[NONE\\]";
494 break;
495 case MM_MOD_FILSYS:
496 if (!strcmp(form->formname, "mod_filsys")) {
497 qy = "update_filesys";
498 argv[0] = form->extrastuff;
499 argv[1] = StringValue(form, 0);
500 argv[2] = StringValue(form, 1);
501 argv[FS_L_TYPE+1] = StringValue(form, 2);
502 StoreHost(form, FS_MACHINE+1, &argv[FS_MACHINE + 1]);
503 for (i = FS_MACHINE+1; i < FS_L_TYPE; i++)
504 argv[i] = StringValue(form, i);
505 argc = FS_MODTIME + 1;
506 break;
507 }
508 form->extrastuff = (caddr_t) "mod_filsys";
509 retfunc = ModifyCallback;
510 break;
511 case MM_MOV_FSGROUP:
512 argv[1] = strsave(stringval(form, 1));
513 s = index(argv[1], ' ');
514 if (s) *s = 0;
515 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
516 (char *)form);
517 if (i) {
518 com_err(program_name, i, " removing filesystem from FS group");
519 return;
520 }
521 argc = 3;
522 /* fall through to: */
523 case MM_ADD_FSGROUP:
524 /* find the two keys to sort between */
525 argv[2] = strsave(argv[2]);
526 s = index(argv[2], ' ');
527 if (s) {
528 argv[2] = s+2;
529 s = index(argv[2], ')');
530 if (s) *s = 0;
531 } else
532 argv[2] = "";
533 if (*argv[2] == 0) argv[2] = "A";
534 /* Finding the after key is gross. We look through the widgets
535 * in the radiobox to find the one selected and the one after
536 * it. The name of the widget is also the member name.
537 */
538 if (!tty) {
539 Widget w, kid;
540
541 argv[3] = "";
542 w = form->inputlines[2]->mywidget;
543 for (i = 0; i < NumChildren(w); i++) {
544 kid = NthChild(w, i);
545 if (!strcmp(XtName(kid), stringval(form, 2))) {
546 i++;
547 if (i < NumChildren(w)) {
548 argv[3] = strsave(XtName(NthChild(w, i)));
549 s = index(argv[3], ' ');
550 if (s) {
551 argv[3] = s+2;
552 s = index(argv[3], ')');
553 if (s) *s = 0;
554 } else
555 argv[3] = "";
556 }
557 break;
558 }
559 }
560 } else {
561 printf("Don't know how to do this\007\007!\n");
562 }
563 if (*argv[3] == 0) argv[3] = "Z";
564#ifdef DEBUG
565 printf("Got before key of \"%s\" and after key of \"%s\"\n",
566 argv[2], argv[3]);
567#endif /* DEBUG */
568 /* copy the matching chars */
569 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
570 *s++ = *argv[2]++;
571 /* and set the last char */
572 if (*argv[2] == 0)
573 *argv[2] = i = 'A';
574 else
575 i = argv[2][1];
576 if (i == 0) i = 'A';
577 if (*argv[3] == 0) *argv[3] = 'Z';
578 if (*argv[3] - *argv[2] > 1) {
579 *s++ = (*argv[3] + *argv[2])/2;
580 } else {
581 *s++ = *argv[2];
582 *s++ = (i + 'Z')/2;
583 }
584 *s = 0;
585 argv[2] = strsave(buf);
586 break;
587 case MM_DEL_FSGROUP:
588 argv[1] = strsave(stringval(form, 1));
589 s = index(argv[1], ' ');
590 if (s) *s = 0;
591 break;
592 case MM_SHOW_FS_ALIAS:
593 if (!*stringval(form, 0))
594 argv[2] = "*";
595 else
596 argv[2] = stringval(form, 0);
597 if (!*stringval(form, 1))
598 argv[0] = "*";
599 else
600 argv[0] = stringval(form, 1);
601 argv[1] = "FILESYS";
602 break;
603 case MM_ADD_FS_ALIAS:
604 case MM_DEL_FS_ALIAS:
605 argv[0] = stringval(form, 1);
606 argv[1] = "FILESYS";
607 argv[2] = stringval(form, 0);
608 break;
609 case MM_SHOW_NFS:
610 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
611 if (!*stringval(form, 1))
612 argv[1] = "*";
613 break;
614 case MM_ADD_NFS:
615 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
616 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
617 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
618 argv[NFS_STATUS] = buf;
619 argv[NFS_ALLOC] = stringval(form, 5);
620 argv[NFS_SIZE] = stringval(form, 6);
621 break;
622 case MM_MOD_NFS:
623 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
624 if (!strcmp(form->formname, "mod_nfs")) {
625 qy = "update_nfsphys";
626 argc = NFS_MODTIME;
627 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
628 sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
629 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
630 argv[NFS_STATUS] = buf;
631 argv[NFS_ALLOC] = stringval(form, 5);
632 argv[NFS_SIZE] = stringval(form, 6);
633 break;
634 }
635 form->extrastuff = (caddr_t) "mod_nfs";
636 retfunc = ModifyCallback;
637 break;
638 case MM_DEL_NFS:
639 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
640 break;
641 case MM_SHOW_QUOTA:
642 if (!*stringval(form, 0))
643 argv[0] = "*";
644 if (*stringval(form, 1)) {
645 argv[1] = "USER";
646 argv[2] = stringval(form, 1);
647 } else if (*stringval(form, 2)) {
648 argv[1] = "GROUP";
649 argv[2] = stringval(form, 2);
650 } else if (!*stringval(form, 0)) {
651 display_error("Must specify something.");
652 return;
653 } else {
654 qy = "get_quota_by_filesys";
655 argc = 1;
656 }
657 break;
658 case MM_SHOW_MACH:
659 case MM_ADD_MACH:
660 case MM_DEL_MACH:
661 StoreHost(form, 0, &argv[0]);
662 break;
663 case MM_MOD_MACH:
664 if (!strcmp(form->formname, "mod_machine")) {
665 qy = "update_machine";
666 for (i = 0; i < M_MODTIME; i++)
667 argv[i + 1] = StringValue(form, i);
668 argv[0] = form->extrastuff;
669 argc = M_MODTIME + 1;
670 break;
671 }
672 StoreHost(form, 0, &argv[0]);
673 form->extrastuff = (caddr_t) "mod_machine";
674 retfunc = ModifyCallback;
675 break;
676 case MM_MOD_CLUSTER:
677 if (!strcmp(form->formname, "mod_cluster")) {
678 qy = "update_cluster";
679 for (i = 0; i < C_MODTIME; i++)
680 argv[i + 1] = StringValue(form, i);
681 argv[0] = form->extrastuff;
682 argc = C_MODTIME + 1;
683 break;
684 }
685 form->extrastuff = (caddr_t) "mod_cluster";
686 retfunc = ModifyCallback;
687 break;
688 case MM_SHOW_MCMAP:
689 if (!*stringval(form, 0))
690 argv[0] = "*";
691 else
692 StoreHost(form, 0, &argv[0]);
693 if (!*stringval(form, 1))
694 argv[1] = "*";
695 AppendToLog("Cluster mappings:\n");
696 break;
697 case MM_ADD_MCMAP:
698 case MM_DEL_MCMAP:
699 StoreHost(form, 0, &argv[0]);
700 break;
701 case MM_SHOW_CLDATA:
702 if (!*stringval(form, 1))
703 argv[1] = "*";
704 AppendToLog("Cluster data:\n");
705 break;
706 case MM_ADD_PCAP:
707 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
708 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
709 break;
710 case MM_MOD_PCAP:
711 if (!strcmp(form->formname, "mod_printer")) {
712 qy = "update_printcap_entry";
713 argc = PCAP_MODTIME;
714 break;
715 }
716 form->extrastuff = (caddr_t) "mod_printer";
717 retfunc = ModifyCallback;
718 break;
719 case MM_MOD_SERVICE:
720 if (!strcmp(form->formname, "mod_service")) {
721 qy = "update_server_info";
722 argc = SC_END;
723 break;
724 }
725 form->extrastuff = (caddr_t) "mod_service";
726 retfunc = ModifyCallback;
727 break;
728 case MM_RESET_SERVICE:
729 argv[1] = argv[2] = argv[3] = argv[4] = "0";
730 argv[5] = "";
731 break;
732 case MM_RESET_HOST:
733 StoreHost(form, 1, &argv[1]);
734 argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
735 argv[6] = "";
736 break;
737 case MM_CLEAR_HOST:
738 StoreHost(form, 1, &argv[1]);
739 break;
740 case MM_SHOW_HOST:
741 if (!*stringval(form, 0))
742 argv[0] = "*";
743 if (!*stringval(form, 1))
744 argv[1] = "*";
745 else
746 StoreHost(form, 1, &argv[1]);
747 break;
748 case MM_MOD_HOST:
749 if (!strcmp(form->formname, "mod_host")) {
750 qy = "update_server_host_info";
751 argc = SHI_END;
752 break;
753 }
754 StoreHost(form, 1, &argv[1]);
755 form->extrastuff = (caddr_t) "mod_host";
756 retfunc = ModifyCallback;
757 break;
758 case MM_SAVE_LOG:
759 if (!write_log_to_file(stringval(form, 0)) && !tty && remove)
760 XtUnmanageChild(form->formpointer);
761 return;
762 case MM_NEW_VALUE:
763 argv[0] = form->extrastuff;
764 argv[1] = "TYPE";
765 argv[2] = StringValue(form, 0);
766 for (s = argv[2]; *s; s++)
767 if (islower(*s)) *s = toupper(*s);
768 break;
769 case MM_TRIGGER_DCM:
770 if (form->inputlines[0]->returnvalue.booleanvalue) {
771 i = mr_do_update();
772 if (i)
773 com_err(program_name, i, " starting DCM");
774 else
775 AppendToLog("DCM started.\n");
776 }
777 if (!tty && remove)
778 XtUnmanageChild(form->formpointer);
779 return;
780 }
781
782 if (argc == -1) {
783 display_error("Unknown function in form callback.\n");
784 return;
785 }
786 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
787 if (i) {
788 com_err(program_name, i, " executing database query");
789 return;
790 }
791
792 f = NULL;
793 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
794 if (form->formpointer)
795 XtUnmanageChild(form->formpointer);
796 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
797 f->menu = form->menu;
798 }
799
800 switch (form->menu->operation) {
801 case MM_MOD_USER:
802 if (f) {
803 f->inputlines[U_STATE]->keywords = user_states;
804 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
805 GetKeywords(f, U_CLASS, "class");
806 } else
807 AppendToLog("Done.\n");
808 break;
809 case MM_MOD_FINGER:
810 case MM_MOD_CLUSTER:
811 if (!f)
812 AppendToLog("Done.\n");
813 break;
814 case MM_MOD_LIST:
815 if (f) {
816 GetKeywords(f, L_ACE_TYPE, "ace_type");
817 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
818 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
819 } else
820 AppendToLog("Done.\n");
821 break;
822 case MM_MOD_SERVICE:
823 if (f) {
824 GetKeywords(f, SC_TYPE, "service");
825 GetKeywords(f, SC_ACE_TYPE, "ace_type");
826 }
827 break;
828 case MM_MOD_FILSYS:
829 if (f) {
830 GetKeywords(f, FS_TYPE, "filesys");
831 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
832 GetKeywords(f, FS_ACCESS+1, buf);
833 GetKeywords(f, FS_TYPE+1, "lockertype");
834 if (!strcmp(stringval(f, FS_MACHINE+1), "[NONE]"))
835 StoreField(f, FS_MACHINE+1, "\\[NONE\\]");
836 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
837 } else
838 AppendToLog("Done.\n");
839 break;
840 case MM_MOD_MACH:
841 if (f)
842 GetKeywords(f, 1, "mac_type");
843 else
844 AppendToLog("Done.\n");
845 break;
846 case MM_MOD_NFS:
847 if (f)
848 f->inputlines[3]->keywords = nfs_states;
849 else
850 AppendToLog("Done.\n");
851 break;
852 case MM_DEL_ALL_MEMBER:
853 argv[1] = StringValue(form, 0);
854 argv[2] = StringValue(form, 1);
855 while (sq_get_data(form->extrastuff, &(argv[0]))) {
856 sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
857 StringValue(form, 1), argv[0]);
858 if (!boolval(form, 2) ||
859 AskQuestion(buf, "confirm_del_all")) {
860 i = MoiraQuery("delete_member_from_list", 3, argv,
861 DisplayCallback, NULL);
862 if (i)
863 com_err(program_name, i, " while removing member from list");
864 else {
865 sprintf(buf, "Member %s %s removed from list %s.\n",
866 argv[1], argv[2], argv[0]);
867 AppendToLog(buf);
868 }
869 }
870 free(argv[0]);
871 }
872 AppendToLog("Done.\n");
873 break;
874 case MM_SHOW_FILSYS:
875 case MM_SHOW_FSGROUP:
876 while (sq_get_data(form->extrastuff, &aargv)) {
877 ShowFilsys(aargv);
878 }
879 sq_destroy(form->extrastuff);
880 break;
881 case MM_ADD_HOST:
882 case MM_DEL_HOST:
883 case MM_CLEAR_HOST:
884 case MM_RESET_HOST:
885 case MM_ADD_SERVICE:
886 case MM_DEL_SERVICE:
887 case MM_CLEAR_SERVICE:
888 case MM_RESET_SERVICE:
889 case MM_ENABLE_DCM:
890 case MM_ADD_ZEPHYR:
891 case MM_DEL_ZEPHYR:
892 case MM_ADD_PCAP:
893 case MM_DEL_PCAP:
894 case MM_ADD_CLDATA:
895 case MM_DEL_CLDATA:
896 case MM_ADD_MCMAP:
897 case MM_DEL_MCMAP:
898 case MM_ADD_CLUSTER:
899 case MM_DEL_CLUSTER:
900 case MM_ADD_MACH:
901 case MM_DEL_MACH:
902 case MM_ADD_MEMBER:
903 case MM_DEL_MEMBER:
904 case MM_ADD_LIST:
905 case MM_DEL_LIST:
906 case MM_ADD_QUOTA:
907 case MM_DEL_QUOTA:
908 case MM_SET_DQUOTA:
909 case MM_ADD_NFS:
910 case MM_DEL_NFS:
911 case MM_ADD_FS_ALIAS:
912 case MM_DEL_FS_ALIAS:
913 case MM_ADD_FSGROUP:
914 case MM_MOV_FSGROUP:
915 case MM_DEL_FSGROUP:
916 case MM_ADD_FILSYS:
917 case MM_DEL_FILSYS:
918 case MM_ADD_KRBMAP:
919 case MM_DEL_KRBMAP:
920 case MM_SET_POBOX:
921 case MM_DEL_POBOX:
922 case MM_ADD_USER:
923 case MM_REGISTER:
924 case MM_DEACTIVATE:
925 case MM_EXPUNGE:
926 case MM_RESET_POBOX:
927 AppendToLog("Done.\n");
928 break;
929 case MM_SHOW_KRBMAP:
930 case MM_SHOW_CLDATA:
931 case MM_SHOW_MCMAP:
932 case MM_SHOW_MEMBERS:
933 case MM_STATS:
934 case MM_CLIENTS:
935 case MM_SHOW_ACE_USE:
936 AppendToLog("\n");
937 break;
938 case MM_NEW_VALUE:
939 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
940 form->extrastuff, StringValue(form, 0));
941 }
942
943 if (remove && form->formpointer)
944 XtUnmanageChild(form->formpointer);
945
946 if (f) {
947 if (tty)
948 TtyForm(f);
949 else
950 DisplayForm(f);
951 }
952}
953
954
955MoiraMenuComplete(m)
956MenuItem *m;
957{
958 char *qy, *argv[32];
959 int (*retfunc)(), argc, i;
960 EntryForm dummy;
961
962 retfunc = DisplayCallback;
963 argc = -1;
964 dummy.menu = m;
965 qy = m->query;
966 argc = m->argc;
967
968 switch (m->operation) {
969 case MM_SHOW_MAILLIST:
970 argv[0] = argv[1] = argv[3] = "TRUE";
971 argv[2] = "FALSE";
972 argv[4] = "DONTCARE";
973 AppendToLog("Public Mailinglists:\n");
974 break;
975 case MM_SHOW_DQUOTA:
976 argv[0] = "def_quota";
977 break;
978 case MM_SHOW_DCM:
979 AppendToLog("Services and Hosts with failed updates:\n");
980 argv[0] = argv[2] = "DONTCARE";
981 argv[1] = "TRUE";
982 i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
983 (char *)&dummy);
984 if (i && i != MR_NO_MATCH)
985 com_err(program_name, i, " executing database query");
986 argv[0] = "*";
987 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
988 argv[4] = "TRUE";
989 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
990 (char *)&dummy);
991 if (i && i != MR_NO_MATCH)
992 com_err(program_name, i, " executing database query");
993 AppendToLog("\n");
994 return;
995 case MM_HELP_MOIRA:
996 case MM_HELP_WILDCARDS:
997 case MM_HELP_AUTHORS:
998 case MM_HELP_BUGS:
999 case MM_HELP_MOUSE:
1000 case MM_HELP_KEYBOARD:
1001 help(m->query);
1002 return;
1003 case MM_QUIT:
1004 mr_disconnect();
1005 exit(0);
1006 }
1007 if (argc == -1) {
1008 display_error("Unknown function in menu callback.\n");
1009 return;
1010 }
1011 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
1012 if (i)
1013 com_err(program_name, i, " executing database query");
1014 AppendToLog("\n");
1015}
This page took 0.045246 seconds and 5 git commands to generate.