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