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