]> andersk Git - moira.git/blame_incremental - clients/mmoira/queries.c
tty mode; clean up output formatting
[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 fn = "mod_filsys";
75 count = FS_MODTIME;
76 break;
77 case MM_MOD_NFS:
78 f = GetAndClearForm("mod_nfs");
79 if (f == NULL) {
80 display_error("Unknown form in ModifyCallback of mod_nfs\n");
81 return;
82 }
83 f->extrastuff = form->extrastuff;
84 f->menu = form->menu;
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;
94 else
95 f->inputlines[4]->returnvalue.booleanvalue = 0;
96 StoreField(f, 5, argv[4]);
97 StoreField(f, 6, argv[5]);
98 return;
99 case MM_MOD_MACH:
100 fn = "mod_machine";
101 count = M_MODTIME;
102 break;
103 case MM_MOD_CLUSTER:
104 fn = "mod_cluster";
105 count = C_MODTIME;
106 break;
107 case MM_MOD_PCAP:
108 fn = "mod_printer";
109 count = PCAP_MODTIME;
110 break;
111 case MM_MOD_SERVICE:
112 f = GetAndClearForm("mod_service");
113 if (f == NULL) {
114 display_error("Unknown form in ModifyCallback of mod_service\n");
115 return;
116 }
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]);
124 return;
125 break;
126 case MM_MOD_HOST:
127 f = GetAndClearForm("mod_host");
128 if (f == NULL) {
129 display_error("Unknown form in ModifyCallback of mod_host\n");
130 return;
131 }
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]);
140 return;
141 break;
142 }
143
144 if (count > 0) {
145 f = GetAndClearForm(fn);
146 if (f == NULL) {
147 display_error("Unknown form in ModifyCallback!\n");
148 return;
149 }
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;
156 else
157 StoreField(f, i, argv[i + offset]);
158 } else {
159 display_error("Unknown function in ModifyCallback!\n");
160 return;
161 }
162}
163
164
165/* Generate a new cryptographic signature for the user record */
166SignUser(argv, offset)
167char **argv;
168int offset;
169{
170#ifdef GDSS
171 char buf[256];
172 SigInfo si;
173 int i;
174
175 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
176 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
177 si.rawsig = NULL;
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);
183 sign_again:
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");
188 else {
189 unsigned char newbuf[256];
190 si.rawsig = newbuf;
191 i = GDSS_Verify(buf, strlen(buf),
192 argv[U_SIGNATURE + offset], &si);
193 if (strlen(newbuf) > 68) {
194#ifdef DEBUG
195 AppendLog("Signature too long, trying again\n");
196#endif /* DEBUG */
197 goto sign_again;
198 }
199 }
200#ifdef DEBUG
201 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
202 } else {
203 AppendLog("Don't need to remake signature\n");
204#endif /* DEBUG */
205 }
206 }
207#else /* GDSS */
208 argv[U_SIGNATURE + offset] = strsave("");
209#endif /* GDSS */
210}
211
212
213/* when OK pressed */
214
215MoiraFormComplete(dummy1, form)
216int dummy1;
217EntryForm *form;
218{
219 process_form(form, TRUE);
220}
221
222
223/* when APPLY pressed */
224
225MoiraFormApply(dummy1, form)
226int dummy1;
227EntryForm *form;
228{
229 UserPrompt **p;
230 int count;
231
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.
237 */
238 count = 0;
239 for (p = form->inputlines; *p; p++)
240 count++;
241 while (count-- > 1)
242 _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
243 process_form(form, FALSE);
244}
245
246
247int CollectData(argc, argv, form)
248int argc;
249char **argv;
250EntryForm *form;
251{
252 struct save_queue *sq;
253
254 sq = (struct save_queue *) form->extrastuff;
255 sq_save_data(sq, strsave(argv[0]));
256 return(MR_CONT);
257}
258
259
260/* callback when form is complete to process the data */
261
262process_form(form, remove)
263EntryForm *form;
264int remove;
265{
266 char *qy, *argv[32], buf[256], *s, **aargv;
267 int (*retfunc)(), argc, i;
268 EntryForm *f;
269
270 retfunc = DisplayCallback;
271 argc = -1;
272
273 for (i = 0; form->inputlines[i]; i++)
274 argv[i] = StringValue(form, i);
275 qy = form->menu->query;
276 argc = form->menu->argc;
277
278 switch (form->menu->operation) {
279 case MM_SHOW_USER:
280 if (*stringval(form, 0)) {
281 qy = "get_user_account_by_login";
282 argv[0] = stringval(form, 0);
283 argc = 1;
284 } else if (*stringval(form, 3)) {
285 qy = "get_user_account_by_uid";
286 argv[0] = stringval(form, 3);
287 argc = 1;
288 } else if (*stringval(form, 4)) {
289 qy = "get_user_account_by_class";
290 argv[0] = stringval(form, 4);
291 argc = 1;
292 } else if (*stringval(form, 1) == 0 &&
293 *stringval(form, 2) == 0) {
294 display_error("Must fill in at least one blank.");
295 return;
296 } else {
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);
304 argc = 2;
305 }
306 break;
307 case MM_ADD_USER:
308 argv[U_STATE][1] = 0;
309 argv[U_SECURE] = argv[U_SIGNATURE];
310 SignUser(argv, 0);
311 argc = U_MODTIME;
312 break;
313 case MM_MOD_USER:
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;
325 else {
326 struct timeval tv;
327 char buf[32];
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);
332 }
333 SignUser(argv, 1);
334 argc = U_MODTIME + 1;
335 break;
336 }
337 form->extrastuff = (caddr_t) "mod_user";
338 retfunc = ModifyCallback;
339 break;
340 case MM_REGISTER:
341 if (*stringval(form, 2)) {
342 argv[0] = stringval(form, 2);
343 } else {
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);
349 if (i) {
350 com_err(program_name, i, " looking up user by name");
351 return;
352 }
353 if (form->extrastuff == NULL) {
354 display_error("Ambiguous user specification");
355 return;
356 }
357 argv[0] = (char *)form->extrastuff;
358 }
359 qy = "register_user";
360 argv[1] = stringval(form, 3);
361 argv[2] = "1";
362 argc = 3;
363 break;
364 case MM_DEACTIVATE:
365 argv[1] = "3";
366 break;
367 case MM_EXPUNGE:
368 display_error("Expunge is not yet implemented");
369 return;
370 break;
371 case MM_MOD_FINGER:
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;
377 argc = F_MODTIME;
378 break;
379 }
380 form->extrastuff = (caddr_t) "mod_finger";
381 retfunc = ModifyCallback;
382 break;
383 case MM_SHOW_KRBMAP:
384 if (!*stringval(form, 0))
385 argv[0] = "*";
386 if (!*stringval(form, 1))
387 argv[1] = "*";
388 AppendToLog("Kerberos mappings:\n");
389 break;
390 case MM_SET_POBOX:
391 if (!strcmp(argv[1], "POP"))
392 argv[2] = stringval(form, 3);
393 break;
394 case MM_SHOW_ACE_USE:
395 if (boolval(form, 2)) {
396 sprintf(buf, "R%s", stringval(form, 0));
397 argv[0] = strsave(buf);
398 }
399 sprintf(buf, "Objects %s %s can administer\n",
400 stringval(form, 0), stringval(form, 1));
401 AppendToLog(buf);
402 break;
403 case MM_MOD_LIST:
404 if (!strcmp(form->formname, "mod_list")) {
405 qy = "update_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;
410 break;
411 }
412 form->extrastuff = (caddr_t) "mod_list";
413 retfunc = ModifyCallback;
414 break;
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]);
420 AppendToLog(buf);
421 if (boolval(form, 3)) {
422 sprintf(buf, "R%s", stringval(form, 1));
423 argv[0] = buf;
424 }
425 argv[1] = stringval(form, 2);
426 argc = 2;
427 } else {
428 if (boolval(form, 3)) {
429 qy = "get_end_members_of_list";
430 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
431 } else
432 sprintf(buf, "Members of list: %s\n", argv[0]);
433 AppendToLog(buf);
434 }
435 break;
436 case MM_DEL_ALL_MEMBER:
437 form->extrastuff = (caddr_t) sq_create();
438 retfunc = CollectData;
439 break;
440 case MM_SHOW_FILSYS:
441 if (*stringval(form, 0)) {
442 qy = "get_filesys_by_label";
443 argv[0] = stringval(form, 0);
444 argc = 1;
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);
450 argc = 2;
451 } else {
452 qy = "get_filesys_by_machine";
453 argc = 1;
454 }
455 } else if (*stringval(form, 3)) {
456 qy = "get_filesys_by_group";
457 argv[0] = stringval(form, 3);
458 argc = 1;
459 } else if (*stringval(form, 4)) {
460 qy = "get_filesys_by_path";
461 argv[0] = stringval(form, 4);
462 argc = 1;
463 }
464 /* fall through to */
465 case MM_SHOW_FSGROUP:
466 form->extrastuff = (caddr_t) sq_create();
467 break;
468 case MM_ADD_FILSYS:
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\\]";
473 break;
474 case MM_MOD_FILSYS:
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;
482 break;
483 }
484 form->extrastuff = (caddr_t) "mod_filsys";
485 retfunc = ModifyCallback;
486 break;
487 case MM_MOV_FSGROUP:
488 argv[1] = strsave(stringval(form, 1));
489 s = index(argv[1], ' ');
490 if (s) *s = 0;
491 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
492 (char *)form);
493 if (i) {
494 com_err(program_name, i, " removing filesystem from FS group");
495 return;
496 }
497 argc = 3;
498 /* fall through to: */
499 case MM_ADD_FSGROUP:
500 /* find the two keys to sort between */
501 argv[2] = strsave(argv[2]);
502 s = index(argv[2], ' ');
503 if (s) {
504 argv[2] = s+2;
505 s = index(argv[2], ')');
506 if (s) *s = 0;
507 } else
508 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.
513 */
514 if (!tty) {
515 Widget w, kid;
516
517 argv[3] = "";
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))) {
522 i++;
523 if (i < NumChildren(w)) {
524 argv[3] = strsave(XtName(NthChild(w, i)));
525 s = index(argv[3], ' ');
526 if (s) {
527 argv[3] = s+2;
528 s = index(argv[3], ')');
529 if (s) *s = 0;
530 } else
531 argv[3] = "";
532 }
533 break;
534 }
535 }
536 } else {
537 printf("Don't know how to do this\007\007!\n");
538 }
539 if (*argv[3] == 0) argv[3] = "Z";
540#ifdef DEBUG
541 printf("Got before key of \"%s\" and after key of \"%s\"\n",
542 argv[2], argv[3]);
543#endif /* DEBUG */
544 /* copy the matching chars */
545 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
546 *s++ = *argv[2]++;
547 /* and set the last char */
548 if (*argv[2] == 0)
549 *argv[2] = i = 'A';
550 else
551 i = argv[2][1];
552 if (i == 0) i = 'A';
553 if (*argv[3] == 0) *argv[3] = 'Z';
554 if (*argv[3] - *argv[2] > 1) {
555 *s++ = (*argv[3] + *argv[2])/2;
556 } else {
557 *s++ = *argv[2];
558 *s++ = (i + 'Z')/2;
559 }
560 *s = 0;
561 argv[2] = strsave(buf);
562 break;
563 case MM_DEL_FSGROUP:
564 argv[1] = strsave(stringval(form, 1));
565 s = index(argv[1], ' ');
566 if (s) *s = 0;
567 break;
568 case MM_SHOW_FS_ALIAS:
569 if (!*stringval(form, 0))
570 argv[2] = "*";
571 else
572 argv[2] = stringval(form, 0);
573 if (!*stringval(form, 1))
574 argv[0] = "*";
575 else
576 argv[0] = stringval(form, 1);
577 argv[1] = "FILESYS";
578 break;
579 case MM_ADD_FS_ALIAS:
580 case MM_DEL_FS_ALIAS:
581 argv[0] = stringval(form, 1);
582 argv[1] = "FILESYS";
583 argv[2] = stringval(form, 0);
584 break;
585 case MM_SHOW_NFS:
586 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
587 if (!*stringval(form, 1))
588 argv[1] = "*";
589 break;
590 case MM_ADD_NFS:
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);
597 break;
598 case MM_MOD_NFS:
599 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
600 if (!strcmp(form->formname, "mod_nfs")) {
601 qy = "update_nfsphys";
602 argc = NFS_MODTIME;
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);
609 break;
610 }
611 form->extrastuff = (caddr_t) "mod_nfs";
612 retfunc = ModifyCallback;
613 break;
614 case MM_DEL_NFS:
615 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
616 break;
617 case MM_SHOW_QUOTA:
618 if (!*stringval(form, 0))
619 argv[0] = "*";
620 if (*stringval(form, 1)) {
621 argv[1] = "USER";
622 argv[2] = stringval(form, 1);
623 } else if (*stringval(form, 2)) {
624 argv[1] = "GROUP";
625 argv[2] = stringval(form, 2);
626 } else if (!*stringval(form, 0)) {
627 display_error("Must specify something.");
628 return;
629 } else {
630 qy = "get_quota_by_filesys";
631 argc = 1;
632 }
633 break;
634 case MM_SHOW_MACH:
635 case MM_ADD_MACH:
636 case MM_DEL_MACH:
637 StoreHost(form, 0, &argv[0]);
638 break;
639 case MM_MOD_MACH:
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;
646 break;
647 }
648 StoreHost(form, 0, &argv[0]);
649 form->extrastuff = (caddr_t) "mod_machine";
650 retfunc = ModifyCallback;
651 break;
652 case MM_MOD_CLUSTER:
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;
659 break;
660 }
661 form->extrastuff = (caddr_t) "mod_cluster";
662 retfunc = ModifyCallback;
663 break;
664 case MM_SHOW_MCMAP:
665 if (!*stringval(form, 0))
666 argv[0] = "*";
667 else
668 StoreHost(form, 0, &argv[0]);
669 if (!*stringval(form, 1))
670 argv[1] = "*";
671 AppendToLog("Cluster mappings:\n");
672 break;
673 case MM_ADD_MCMAP:
674 case MM_DEL_MCMAP:
675 StoreHost(form, 0, &argv[0]);
676 break;
677 case MM_SHOW_CLDATA:
678 if (!*stringval(form, 1))
679 argv[1] = "*";
680 AppendToLog("Cluster data:\n");
681 break;
682 case MM_ADD_PCAP:
683 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
684 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
685 break;
686 case MM_MOD_PCAP:
687 if (!strcmp(form->formname, "mod_printer")) {
688 qy = "update_printcap_entry";
689 argc = PCAP_MODTIME;
690 break;
691 }
692 form->extrastuff = (caddr_t) "mod_printer";
693 retfunc = ModifyCallback;
694 break;
695 case MM_MOD_SERVICE:
696 if (!strcmp(form->formname, "mod_service")) {
697 qy = "update_server_info";
698 argc = SC_END;
699 break;
700 }
701 form->extrastuff = (caddr_t) "mod_service";
702 retfunc = ModifyCallback;
703 break;
704 case MM_RESET_SERVICE:
705 argv[1] = argv[2] = argv[3] = argv[4] = "0";
706 argv[5] = "";
707 break;
708 case MM_RESET_HOST:
709 StoreHost(form, 1, &argv[1]);
710 argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
711 argv[6] = "";
712 break;
713 case MM_SHOW_HOST:
714 if (!*stringval(form, 0))
715 argv[0] = "*";
716 if (!*stringval(form, 1))
717 argv[1] = "*";
718 else
719 StoreHost(form, 1, &argv[1]);
720 break;
721 case MM_MOD_HOST:
722 if (!strcmp(form->formname, "mod_host")) {
723 qy = "update_server_host_info";
724 argc = SHI_END;
725 break;
726 }
727 StoreHost(form, 1, &argv[1]);
728 form->extrastuff = (caddr_t) "mod_host";
729 retfunc = ModifyCallback;
730 break;
731 case MM_SAVE_LOG:
732 if (!write_log_to_file(stringval(form, 0)) && remove)
733 XtUnmanageChild(form->formpointer);
734 return;
735 case MM_NEW_VALUE:
736 argv[0] = form->extrastuff;
737 argv[1] = "TYPE";
738 argv[2] = StringValue(form, 0);
739 for (s = argv[2]; *s; s++)
740 if (islower(*s)) *s = toupper(*s);
741 break;
742 }
743
744 if (argc == -1) {
745 display_error("Unknown function in form callback.\n");
746 return;
747 }
748 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
749 if (i) {
750 com_err(program_name, i, " executing database query");
751 return;
752 }
753
754 f = NULL;
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;
760 }
761
762 switch (form->menu->operation) {
763 case MM_MOD_USER:
764 if (f) {
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");
768 } else
769 AppendToLog("Done.\n");
770 break;
771 case MM_MOD_FINGER:
772 case MM_MOD_CLUSTER:
773 if (!f)
774 AppendToLog("Done.\n");
775 break;
776 case MM_MOD_LIST:
777 if (f) {
778 GetKeywords(f, L_ACE_TYPE, "ace_type");
779 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
780 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
781 } else
782 AppendToLog("Done.\n");
783 break;
784 case MM_MOD_SERVICE:
785 if (f) {
786 GetKeywords(f, SC_TYPE, "service");
787 GetKeywords(f, SC_ACE_TYPE, "ace_type");
788 }
789 break;
790 case MM_MOD_FILSYS:
791 if (f) {
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;
799 } else
800 AppendToLog("Done.\n");
801 break;
802 case MM_MOD_MACH:
803 if (f)
804 GetKeywords(f, 1, "mac_type");
805 else
806 AppendToLog("Done.\n");
807 break;
808 case MM_MOD_NFS:
809 if (f)
810 f->inputlines[3]->keywords = nfs_states;
811 else
812 AppendToLog("Done.\n");
813 break;
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);
824 if (i)
825 com_err(program_name, i, " while removing member from list");
826 else {
827 sprintf(buf, "Member %s %s removed from list %s.\n",
828 argv[1], argv[2], argv[0]);
829 AppendToLog(buf);
830 }
831 }
832 free(argv[0]);
833 }
834 AppendToLog("Done.\n");
835 break;
836 case MM_SHOW_FILSYS:
837 case MM_SHOW_FSGROUP:
838 while (sq_get_data(form->extrastuff, &aargv)) {
839 ShowFilsys(aargv);
840 }
841 sq_destroy(form->extrastuff);
842 break;
843 case MM_ADD_HOST:
844 case MM_DEL_HOST:
845 case MM_CLEAR_HOST:
846 case MM_RESET_HOST:
847 case MM_ADD_SERVICE:
848 case MM_DEL_SERVICE:
849 case MM_CLEAR_SERVICE:
850 case MM_RESET_SERVICE:
851 case MM_ENABLE_DCM:
852 case MM_TRIGGER_DCM:
853 case MM_ADD_ZEPHYR:
854 case MM_DEL_ZEPHYR:
855 case MM_ADD_PCAP:
856 case MM_DEL_PCAP:
857 case MM_ADD_CLDATA:
858 case MM_DEL_CLDATA:
859 case MM_ADD_MCMAP:
860 case MM_DEL_MCMAP:
861 case MM_ADD_CLUSTER:
862 case MM_DEL_CLUSTER:
863 case MM_ADD_MACH:
864 case MM_DEL_MACH:
865 case MM_ADD_MEMBER:
866 case MM_DEL_MEMBER:
867 case MM_ADD_LIST:
868 case MM_DEL_LIST:
869 case MM_ADD_QUOTA:
870 case MM_DEL_QUOTA:
871 case MM_SET_DQUOTA:
872 case MM_ADD_NFS:
873 case MM_DEL_NFS:
874 case MM_ADD_FS_ALIAS:
875 case MM_DEL_FS_ALIAS:
876 case MM_ADD_FSGROUP:
877 case MM_MOV_FSGROUP:
878 case MM_DEL_FSGROUP:
879 case MM_ADD_FILSYS:
880 case MM_DEL_FILSYS:
881 case MM_ADD_KRBMAP:
882 case MM_DEL_KRBMAP:
883 case MM_SET_POBOX:
884 case MM_DEL_POBOX:
885 case MM_ADD_USER:
886 case MM_REGISTER:
887 case MM_DEACTIVATE:
888 case MM_EXPUNGE:
889 case MM_RESET_POBOX:
890 AppendToLog("Done.\n");
891 break;
892 case MM_SHOW_KRBMAP:
893 case MM_SHOW_CLDATA:
894 case MM_SHOW_MCMAP:
895 case MM_SHOW_MEMBERS:
896 case MM_STATS:
897 case MM_CLIENTS:
898 case MM_SHOW_ACE_USE:
899 AppendToLog("\n");
900 break;
901 case MM_NEW_VALUE:
902 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
903 form->extrastuff, StringValue(form, 0));
904 }
905
906 if (remove && form->formpointer)
907 XtUnmanageChild(form->formpointer);
908
909 if (f) {
910 if (tty)
911 TtyForm(f);
912 else
913 DisplayForm(f);
914 }
915}
916
917
918MoiraMenuComplete(m)
919MenuItem *m;
920{
921 char *qy, *argv[32];
922 int (*retfunc)(), argc, i;
923 EntryForm dummy;
924
925 retfunc = DisplayCallback;
926 argc = -1;
927 dummy.menu = m;
928 qy = m->query;
929 argc = m->argc;
930
931 switch (m->operation) {
932 case MM_SHOW_MAILLIST:
933 argv[0] = argv[1] = argv[3] = "TRUE";
934 argv[2] = "FALSE";
935 argv[4] = "DONTCARE";
936 AppendToLog("Public Mailinglists:\n");
937 break;
938 case MM_SHOW_DQUOTA:
939 argv[0] = "def_quota";
940 break;
941 case MM_SHOW_DCM:
942 AppendToLog("Services and Hosts with failed updates:\n");
943 argv[0] = argv[2] = "DONTCARE";
944 argv[1] = "TRUE";
945 i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
946 (char *)&dummy);
947 if (i && i != MR_NO_MATCH)
948 com_err(program_name, i, " executing database query");
949 argv[0] = "*";
950 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
951 argv[4] = "TRUE";
952 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
953 (char *)&dummy);
954 if (i && i != MR_NO_MATCH)
955 com_err(program_name, i, " executing database query");
956 AppendToLog("\n");
957 return;
958 case MM_HELP_MOIRA:
959 case MM_HELP_WILDCARDS:
960 case MM_HELP_AUTHORS:
961 case MM_HELP_BUGS:
962 case MM_HELP_MOUSE:
963 case MM_HELP_KEYBOARD:
964 help(m->query);
965 return;
966 case MM_QUIT:
967 mr_disconnect();
968 exit(0);
969 }
970 if (argc == -1) {
971 display_error("Unknown function in menu callback.\n");
972 return;
973 }
974 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
975 if (i)
976 com_err(program_name, i, " executing database query");
977 AppendToLog("\n");
978}
This page took 0.051961 seconds and 5 git commands to generate.