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