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