]> andersk Git - moira.git/blame - clients/mmoira/queries.c
tty mode; clean up output formatting
[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>
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;
4fcd30d3 107 case MM_MOD_PCAP:
108 fn = "mod_printer";
109 count = PCAP_MODTIME;
110 break;
111 case MM_MOD_SERVICE:
743a37a2 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;
4fcd30d3 141 break;
83d3aa0c 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
4d9aea5d 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
61fda611 213/* when OK pressed */
83d3aa0c 214
215MoiraFormComplete(dummy1, form)
216int dummy1;
217EntryForm *form;
61fda611 218{
219 process_form(form, TRUE);
220}
221
222
223/* when APPLY pressed */
224
225MoiraFormApply(dummy1, form)
226int dummy1;
227EntryForm *form;
228{
4d9aea5d 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);
61fda611 243 process_form(form, FALSE);
244}
245
246
4d9aea5d 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
61fda611 260/* callback when form is complete to process the data */
261
262process_form(form, remove)
263EntryForm *form;
264int remove;
83d3aa0c 265{
4d9aea5d 266 char *qy, *argv[32], buf[256], *s, **aargv;
83d3aa0c 267 int (*retfunc)(), argc, i;
268 EntryForm *f;
269
270 retfunc = DisplayCallback;
271 argc = -1;
272
273 for (i = 0; form->inputlines[i]; i++)
892c98b2 274 argv[i] = StringValue(form, i);
275 qy = form->menu->query;
276 argc = form->menu->argc;
83d3aa0c 277
278 switch (form->menu->operation) {
279 case MM_SHOW_USER:
280 if (*stringval(form, 0)) {
61fda611 281 qy = "get_user_account_by_login";
83d3aa0c 282 argv[0] = stringval(form, 0);
283 argc = 1;
284 } else if (*stringval(form, 3)) {
61fda611 285 qy = "get_user_account_by_uid";
83d3aa0c 286 argv[0] = stringval(form, 3);
287 argc = 1;
288 } else if (*stringval(form, 4)) {
61fda611 289 qy = "get_user_account_by_class";
83d3aa0c 290 argv[0] = stringval(form, 4);
291 argc = 1;
292 } else if (*stringval(form, 1) == 0 &&
293 *stringval(form, 2) == 0) {
892c98b2 294 display_error("Must fill in at least one blank.");
83d3aa0c 295 return;
296 } else {
297 if (*stringval(form, 1) == 0)
298 StoreField(form, 1, "*");
299 if (*stringval(form, 2) == 0)
300 StoreField(form, 2, "*");
61fda611 301 qy = "get_user_account_by_name";
83d3aa0c 302 argv[0] = stringval(form, 1);
303 argv[1] = stringval(form, 2);
304 argc = 2;
305 }
306 break;
307 case MM_ADD_USER:
83d3aa0c 308 argv[U_STATE][1] = 0;
4d9aea5d 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;
83d3aa0c 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;
61fda611 347 i = MoiraQuery("get_user_account_by_name", 2, argv,
83d3aa0c 348 ModifyCallback, (char *)form);
349 if (i) {
b2d21e59 350 com_err(program_name, i, " looking up user by name");
83d3aa0c 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;
83d3aa0c 364 case MM_DEACTIVATE:
83d3aa0c 365 argv[1] = "3";
83d3aa0c 366 break;
367 case MM_EXPUNGE:
368 display_error("Expunge is not yet implemented");
369 return;
370 break;
83d3aa0c 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++)
892c98b2 375 argv[i + 1] = StringValue(form, i);
83d3aa0c 376 argv[0] = form->extrastuff;
377 argc = F_MODTIME;
378 break;
379 }
83d3aa0c 380 form->extrastuff = (caddr_t) "mod_finger";
381 retfunc = ModifyCallback;
382 break;
383 case MM_SHOW_KRBMAP:
83d3aa0c 384 if (!*stringval(form, 0))
385 argv[0] = "*";
386 if (!*stringval(form, 1))
387 argv[1] = "*";
a90d16c2 388 AppendToLog("Kerberos mappings:\n");
83d3aa0c 389 break;
390 case MM_SET_POBOX:
83d3aa0c 391 if (!strcmp(argv[1], "POP"))
392 argv[2] = stringval(form, 3);
83d3aa0c 393 break;
394 case MM_SHOW_ACE_USE:
83d3aa0c 395 if (boolval(form, 2)) {
396 sprintf(buf, "R%s", stringval(form, 0));
a90d16c2 397 argv[0] = strsave(buf);
83d3aa0c 398 }
a90d16c2 399 sprintf(buf, "Objects %s %s can administer\n",
400 stringval(form, 0), stringval(form, 1));
401 AppendToLog(buf);
83d3aa0c 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++)
892c98b2 407 argv[i + 1] = StringValue(form, i);
83d3aa0c 408 argv[0] = form->extrastuff;
409 argc = L_MODTIME + 1;
410 break;
411 }
83d3aa0c 412 form->extrastuff = (caddr_t) "mod_list";
413 retfunc = ModifyCallback;
414 break;
83d3aa0c 415 case MM_SHOW_MEMBERS:
892c98b2 416 if (!*stringval(form, 0)) {
83d3aa0c 417 qy = "get_lists_of_member";
418 argv[0] = stringval(form, 1);
61fda611 419 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
b2d21e59 420 AppendToLog(buf);
83d3aa0c 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;
b2d21e59 427 } else {
743a37a2 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]);
b2d21e59 433 AppendToLog(buf);
83d3aa0c 434 }
435 break;
83d3aa0c 436 case MM_DEL_ALL_MEMBER:
4d9aea5d 437 form->extrastuff = (caddr_t) sq_create();
438 retfunc = CollectData;
83d3aa0c 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)) {
b2d21e59 446 StoreHost(form, 1, &argv[0]);
83d3aa0c 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;
35ddfe09 459 } else if (*stringval(form, 4)) {
460 qy = "get_filesys_by_path";
461 argv[0] = stringval(form, 4);
462 argc = 1;
83d3aa0c 463 }
4d9aea5d 464 /* fall through to */
465 case MM_SHOW_FSGROUP:
466 form->extrastuff = (caddr_t) sq_create();
83d3aa0c 467 break;
468 case MM_ADD_FILSYS:
b2d21e59 469 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
a90d16c2 470 if (!strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
61fda611 471 !strcmp(stringval(form, FS_TYPE), "MUL"))
83d3aa0c 472 argv[FS_MACHINE] = "\\[NONE\\]";
83d3aa0c 473 break;
474 case MM_MOD_FILSYS:
475 if (!strcmp(form->formname, "mod_filsys")) {
b2d21e59 476 qy = "update_filesys";
83d3aa0c 477 for (i = 0; i < FS_MODTIME; i++)
892c98b2 478 argv[i + 1] = StringValue(form, i);
b2d21e59 479 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
83d3aa0c 480 argv[0] = form->extrastuff;
481 argc = FS_MODTIME + 1;
482 break;
483 }
83d3aa0c 484 form->extrastuff = (caddr_t) "mod_filsys";
485 retfunc = ModifyCallback;
486 break;
bae3d620 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: */
b2d21e59 499 case MM_ADD_FSGROUP:
bae3d620 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 */
a90d16c2 514 if (!tty) {
bae3d620 515 Widget w, kid;
bae3d620 516
517 argv[3] = "";
743a37a2 518 w = form->inputlines[2]->mywidget;
519 for (i = 0; i < NumChildren(w); i++) {
520 kid = NthChild(w, i);
bae3d620 521 if (!strcmp(XtName(kid), stringval(form, 2))) {
522 i++;
743a37a2 523 if (i < NumChildren(w)) {
524 argv[3] = strsave(XtName(NthChild(w, i)));
bae3d620 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 }
a90d16c2 536 } else {
537 printf("Don't know how to do this\007\007!\n");
bae3d620 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;
b2d21e59 567 break;
568 case MM_SHOW_FS_ALIAS:
35ddfe09 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;
b2d21e59 579 case MM_ADD_FS_ALIAS:
580 case MM_DEL_FS_ALIAS:
35ddfe09 581 argv[0] = stringval(form, 1);
b2d21e59 582 argv[1] = "FILESYS";
35ddfe09 583 argv[2] = stringval(form, 0);
b2d21e59 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;
8f0dfcd4 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);
b2d21e59 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;
892c98b2 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:
b2d21e59 637 StoreHost(form, 0, &argv[0]);
892c98b2 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 }
b2d21e59 648 StoreHost(form, 0, &argv[0]);
892c98b2 649 form->extrastuff = (caddr_t) "mod_machine";
650 retfunc = ModifyCallback;
651 break;
b2d21e59 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] = "*";
a90d16c2 680 AppendToLog("Cluster data:\n");
b2d21e59 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;
4fcd30d3 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")) {
743a37a2 697 qy = "update_server_info";
698 argc = SC_END;
4fcd30d3 699 break;
700 }
701 form->extrastuff = (caddr_t) "mod_service";
702 retfunc = ModifyCallback;
703 break;
a90d16c2 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;
743a37a2 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;
b2d21e59 731 case MM_SAVE_LOG:
61fda611 732 if (!write_log_to_file(stringval(form, 0)) && remove)
b2d21e59 733 XtUnmanageChild(form->formpointer);
734 return;
61fda611 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;
83d3aa0c 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) {
b2d21e59 750 com_err(program_name, i, " executing database query");
83d3aa0c 751 return;
752 }
753
754 f = NULL;
755 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
4d9aea5d 756 if (form->formpointer)
757 XtUnmanageChild(form->formpointer);
83d3aa0c 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) {
83d3aa0c 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:
b2d21e59 772 case MM_MOD_CLUSTER:
83d3aa0c 773 if (!f)
774 AppendToLog("Done.\n");
775 break;
776 case MM_MOD_LIST:
61fda611 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
83d3aa0c 782 AppendToLog("Done.\n");
783 break;
743a37a2 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;
83d3aa0c 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\\]");
61fda611 798 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
83d3aa0c 799 } else
800 AppendToLog("Done.\n");
801 break;
892c98b2 802 case MM_MOD_MACH:
803 if (f)
804 GetKeywords(f, 1, "mac_type");
805 else
806 AppendToLog("Done.\n");
807 break;
b2d21e59 808 case MM_MOD_NFS:
809 if (f)
810 f->inputlines[3]->keywords = nfs_states;
811 else
812 AppendToLog("Done.\n");
813 break;
4d9aea5d 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) ||
8f0dfcd4 821 AskQuestion(buf, "confirm_del_all")) {
4d9aea5d 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;
83d3aa0c 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:
83d3aa0c 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:
892c98b2 889 case MM_RESET_POBOX:
83d3aa0c 890 AppendToLog("Done.\n");
61fda611 891 break;
a90d16c2 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;
61fda611 901 case MM_NEW_VALUE:
902 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
903 form->extrastuff, StringValue(form, 0));
83d3aa0c 904 }
905
4d9aea5d 906 if (remove && form->formpointer)
b2d21e59 907 XtUnmanageChild(form->formpointer);
908
a90d16c2 909 if (f) {
910 if (tty)
911 TtyForm(f);
912 else
913 DisplayForm(f);
914 }
83d3aa0c 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;
892c98b2 928 qy = m->query;
929 argc = m->argc;
83d3aa0c 930
931 switch (m->operation) {
932 case MM_SHOW_MAILLIST:
83d3aa0c 933 argv[0] = argv[1] = argv[3] = "TRUE";
934 argv[2] = "FALSE";
935 argv[4] = "DONTCARE";
b2d21e59 936 AppendToLog("Public Mailinglists:\n");
83d3aa0c 937 break;
938 case MM_SHOW_DQUOTA:
83d3aa0c 939 argv[0] = "def_quota";
83d3aa0c 940 break;
941 case MM_SHOW_DCM:
b2d21e59 942 AppendToLog("Services and Hosts with failed updates:\n");
83d3aa0c 943 argv[0] = argv[2] = "DONTCARE";
944 argv[1] = "TRUE";
a90d16c2 945 i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
946 (char *)&dummy);
83d3aa0c 947 if (i && i != MR_NO_MATCH)
b2d21e59 948 com_err(program_name, i, " executing database query");
83d3aa0c 949 argv[0] = "*";
950 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
951 argv[4] = "TRUE";
a90d16c2 952 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
953 (char *)&dummy);
b2d21e59 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:
8f0dfcd4 962 case MM_HELP_MOUSE:
963 case MM_HELP_KEYBOARD:
b2d21e59 964 help(m->query);
965 return;
966 case MM_QUIT:
967 mr_disconnect();
968 exit(0);
83d3aa0c 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)
b2d21e59 976 com_err(program_name, i, " executing database query");
977 AppendToLog("\n");
83d3aa0c 978}
This page took 0.203468 seconds and 5 git commands to generate.