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