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