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