]> andersk Git - moira.git/blob - clients/mmoira/queries.c
make mod_service & mod_host work
[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       count++;
241     while (count-- > 1)
242       _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
243     process_form(form, FALSE);
244 }
245
246
247 int CollectData(argc, argv, form)
248 int argc;
249 char **argv;
250 EntryForm *form;
251 {
252     struct save_queue *sq;
253
254     sq = (struct save_queue *) form->extrastuff;
255     sq_save_data(sq, strsave(argv[0]));
256     return(MR_CONT);
257 }
258
259
260 /* callback when form is complete to process the data */
261
262 process_form(form, remove)
263 EntryForm *form;
264 int remove;
265 {
266     char *qy, *argv[32], buf[256], *s, **aargv;
267     int (*retfunc)(), argc, i;
268     EntryForm *f;
269
270     retfunc = DisplayCallback;
271     argc = -1;
272
273     for (i = 0; form->inputlines[i]; i++)
274       argv[i] = StringValue(form, i);
275     qy = form->menu->query;
276     argc = form->menu->argc;
277
278     switch (form->menu->operation) {
279     case MM_SHOW_USER:
280         if (*stringval(form, 0)) {
281             qy = "get_user_account_by_login";
282             argv[0] = stringval(form, 0);
283             argc = 1;
284         } else if (*stringval(form, 3)) {
285             qy = "get_user_account_by_uid";
286             argv[0] = stringval(form, 3);
287             argc = 1;
288         } else if (*stringval(form, 4)) {
289             qy = "get_user_account_by_class";
290             argv[0] = stringval(form, 4);
291             argc = 1;
292         } else if (*stringval(form, 1) == 0 &&
293                    *stringval(form, 2) == 0) {
294             display_error("Must fill in at least one blank.");
295             return;
296         } else {
297             if (*stringval(form, 1) == 0)
298               StoreField(form, 1, "*");
299             if (*stringval(form, 2) == 0)
300               StoreField(form, 2, "*");
301             qy = "get_user_account_by_name";
302             argv[0] = stringval(form, 1);
303             argv[1] = stringval(form, 2);
304             argc = 2;
305         }
306         break;
307     case MM_ADD_USER:
308         argv[U_STATE][1] = 0;
309         argv[U_SECURE] = argv[U_SIGNATURE];
310         SignUser(argv, 0);
311         argc = U_MODTIME;
312         break;
313     case MM_MOD_USER:
314         if (!strcmp(form->formname, "mod_user")) {
315             qy = "update_user_account";
316             for (i = 0; i < U_SIGNATURE; i++)
317               argv[i + 1] = StringValue(form, i);
318             argv[0] = form->extrastuff;
319             argv[U_STATE + 1][1] = 0;
320             argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
321             argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
322             if (*argv[U_SECURE + 1] == '1')
323               if (atoi(form->inputlines[U_COMMENT]->keyword_name))
324                 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
325               else {
326                   struct timeval tv;
327                   char buf[32];
328                   gettimeofday(&tv, NULL);
329                   printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
330                   sprintf(buf, "%ld", tv.tv_sec);
331                   argv[U_SECURE + 1] = strsave(buf);
332               }
333             SignUser(argv, 1);
334             argc = U_MODTIME + 1;
335             break;
336         }
337         form->extrastuff = (caddr_t) "mod_user";
338         retfunc = ModifyCallback;
339         break;
340     case MM_REGISTER:
341         if (*stringval(form, 2)) {
342             argv[0] = stringval(form, 2);
343         } else {
344             argv[0] = stringval(form, 0);
345             argv[1] = stringval(form, 1);
346             form->extrastuff = NULL;
347             i = MoiraQuery("get_user_account_by_name", 2, argv,
348                            ModifyCallback, (char *)form);
349             if (i) {
350                 com_err(program_name, i, " looking up user by name");
351                 return;
352             }
353             if (form->extrastuff == NULL) {
354                 display_error("Ambiguous user specification");
355                 return;
356             }
357             argv[0] = (char *)form->extrastuff;
358         }
359         qy = "register_user";
360         argv[1] = stringval(form, 3);
361         argv[2] = "1";
362         argc = 3;
363         break;
364     case MM_DEACTIVATE:
365         argv[1] = "3";
366         break;
367     case MM_EXPUNGE:
368         display_error("Expunge is not yet implemented");
369         return;
370         break;
371     case MM_MOD_FINGER:
372         if (!strcmp(form->formname, "mod_finger")) {
373             qy = "update_finger_by_login";
374             for (i = 0; i < F_MODTIME - 1; i++)
375               argv[i + 1] = StringValue(form, i);
376             argv[0] = form->extrastuff;
377             argc = F_MODTIME;
378             break;
379         }
380         form->extrastuff = (caddr_t) "mod_finger";
381         retfunc = ModifyCallback;
382         break;
383     case MM_SHOW_KRBMAP:
384         if (!*stringval(form, 0))
385           argv[0] = "*";
386         if (!*stringval(form, 1))
387           argv[1] = "*";
388         break;
389     case MM_SET_POBOX:
390         if (!strcmp(argv[1], "POP"))
391           argv[2] = stringval(form, 3);
392         break;
393     case MM_SHOW_ACE_USE:
394         if (boolval(form, 2)) {
395             sprintf(buf, "R%s", stringval(form, 0));
396             argv[0] = buf;
397         }
398         break;
399     case MM_MOD_LIST:
400         if (!strcmp(form->formname, "mod_list")) {
401             qy = "update_list";
402             for (i = 0; i < L_MODTIME; i++)
403               argv[i + 1] = StringValue(form, i);
404             argv[0] = form->extrastuff;
405             argc = L_MODTIME + 1;
406             break;
407         }
408         form->extrastuff = (caddr_t) "mod_list";
409         retfunc = ModifyCallback;
410         break;
411     case MM_SHOW_MEMBERS:
412         if (!*stringval(form, 0)) {
413             qy = "get_lists_of_member";
414             argv[0] = stringval(form, 1);
415             sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
416             AppendToLog(buf);
417             if (boolval(form, 3)) {
418                 sprintf(buf, "R%s", stringval(form, 1));
419                 argv[0] = buf;
420             }
421             argv[1] = stringval(form, 2);
422             argc = 2;
423         } else {
424             if (boolval(form, 3)) {
425                 qy = "get_end_members_of_list";
426                 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
427             } else 
428               sprintf(buf, "Members of list: %s\n", argv[0]);
429             AppendToLog(buf);
430         }
431         break;
432     case MM_DEL_ALL_MEMBER:
433         form->extrastuff = (caddr_t) sq_create();
434         retfunc = CollectData;
435         break;
436     case MM_SHOW_FILSYS:
437         if (*stringval(form, 0)) {
438             qy = "get_filesys_by_label";
439             argv[0] = stringval(form, 0);
440             argc = 1;
441         } else if (*stringval(form, 1)) {
442             StoreHost(form, 1, &argv[0]);
443             if (*stringval(form, 2)) {
444                 qy = "get_filesys_by_nfsphys";
445                 argv[1] = stringval(form, 2);
446                 argc = 2;
447             } else {
448                 qy = "get_filesys_by_machine";
449                 argc = 1;
450             }
451         } else if (*stringval(form, 3)) {
452             qy = "get_filesys_by_group";
453             argv[0] = stringval(form, 3);
454             argc = 1;
455         } else if (*stringval(form, 4)) {
456             qy = "get_filesys_by_path";
457             argv[0] = stringval(form, 4);
458             argc = 1;
459         }
460         /* fall through to */
461     case MM_SHOW_FSGROUP:
462         form->extrastuff = (caddr_t) sq_create();
463         break;
464     case MM_ADD_FILSYS:
465         StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
466         if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
467             !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
468             !strcmp(stringval(form, FS_TYPE), "MUL"))
469           argv[FS_MACHINE] = "\\[NONE\\]";
470         break;
471     case MM_MOD_FILSYS:
472         if (!strcmp(form->formname, "mod_filsys")) {
473             qy = "update_filesys";
474             for (i = 0; i < FS_MODTIME; i++)
475               argv[i + 1] = StringValue(form, i);
476             StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
477             argv[0] = form->extrastuff;
478             argc = FS_MODTIME + 1;
479             break;
480         }
481         form->extrastuff = (caddr_t) "mod_filsys";
482         retfunc = ModifyCallback;
483         break;
484     case MM_MOV_FSGROUP:
485         argv[1] = strsave(stringval(form, 1));
486         s = index(argv[1], ' ');
487         if (s) *s = 0;
488         i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
489                        (char *)form);
490         if (i) {
491             com_err(program_name, i, " removing filesystem from FS group");
492             return;
493         }
494         argc = 3;
495         /* fall through to: */
496     case MM_ADD_FSGROUP:
497         /* find the two keys to sort between */
498         argv[2] = strsave(argv[2]);
499         s = index(argv[2], ' ');
500         if (s) {
501             argv[2] = s+2;
502             s = index(argv[2], ')');
503             if (s) *s = 0;
504         } else
505           argv[2] = "";
506         if (*argv[2] == 0) argv[2] = "A";
507         /* Finding the after key is gross.  We look through the widgets
508          * in the radiobox to find the one selected and the one after
509          * it.  The name of the widget is also the member name.
510          */
511         { 
512             Widget w, kid;
513
514             argv[3] = "";
515             w = form->inputlines[2]->mywidget;
516             for (i = 0; i < NumChildren(w); i++) {
517                 kid = NthChild(w, i);
518                 if (!strcmp(XtName(kid), stringval(form, 2))) {
519                     i++;
520                     if (i < NumChildren(w)) {
521                         argv[3] = strsave(XtName(NthChild(w, i)));
522                         s = index(argv[3], ' ');
523                         if (s) {
524                             argv[3] = s+2;
525                             s = index(argv[3], ')');
526                             if (s) *s = 0;
527                         } else
528                           argv[3] = "";
529                     }
530                     break;
531                 }
532             }
533         }
534         if (*argv[3] == 0) argv[3] = "Z";
535 #ifdef DEBUG
536         printf("Got before key of \"%s\" and after key of \"%s\"\n",
537                argv[2], argv[3]);
538 #endif /* DEBUG */
539         /* copy the matching chars */
540         for  (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
541           *s++ = *argv[2]++;
542         /* and set the last char */
543         if (*argv[2] == 0)
544           *argv[2] = i = 'A';
545         else
546           i = argv[2][1];
547         if (i == 0) i = 'A';
548         if (*argv[3] == 0) *argv[3] = 'Z';
549         if (*argv[3] - *argv[2] > 1) {
550             *s++ = (*argv[3] + *argv[2])/2;
551         } else {
552             *s++ = *argv[2];
553             *s++ = (i + 'Z')/2;
554         }
555         *s = 0;
556         argv[2] = strsave(buf);
557         break;
558     case MM_DEL_FSGROUP:
559         argv[1] = strsave(stringval(form, 1));
560         s = index(argv[1], ' ');
561         if (s) *s = 0;
562         break;
563     case MM_SHOW_FS_ALIAS:
564         if (!*stringval(form, 0))
565           argv[2] = "*";
566         else
567           argv[2] = stringval(form, 0);
568         if (!*stringval(form, 1))
569           argv[0] = "*";
570         else
571           argv[0] = stringval(form, 1);
572         argv[1] = "FILESYS";
573         break;
574     case MM_ADD_FS_ALIAS:
575     case MM_DEL_FS_ALIAS:
576         argv[0] = stringval(form, 1);
577         argv[1] = "FILESYS";
578         argv[2] = stringval(form, 0);
579         break;
580     case MM_SHOW_NFS:
581         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
582         if (!*stringval(form, 1))
583           argv[1] = "*";
584         break;
585     case MM_ADD_NFS:
586         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
587         sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
588                 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
589         argv[NFS_STATUS] = buf;
590         argv[NFS_ALLOC] = stringval(form, 5);
591         argv[NFS_SIZE] = stringval(form, 6);
592         break;
593     case MM_MOD_NFS:
594         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
595         if (!strcmp(form->formname, "mod_nfs")) {
596             qy = "update_nfsphys";
597             argc = NFS_MODTIME;
598             StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
599             sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
600                     (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
601             argv[NFS_STATUS] = buf;
602             argv[NFS_ALLOC] = stringval(form, 5);
603             argv[NFS_SIZE] = stringval(form, 6);
604             break;
605         }
606         form->extrastuff = (caddr_t) "mod_nfs";
607         retfunc = ModifyCallback;
608         break;
609     case MM_DEL_NFS:
610         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
611         break;
612     case MM_SHOW_QUOTA:
613         if (!*stringval(form, 0))
614           argv[0] = "*";
615         if (*stringval(form, 1)) {
616             argv[1] = "USER";
617             argv[2] = stringval(form, 1);
618         } else if (*stringval(form, 2)) {
619             argv[1] = "GROUP";
620             argv[2] = stringval(form, 2);
621         } else if (!*stringval(form, 0)) {
622             display_error("Must specify something.");
623             return;
624         } else {
625             qy = "get_quota_by_filesys";
626             argc = 1;
627         }
628         break;
629     case MM_SHOW_MACH:
630     case MM_ADD_MACH:
631     case MM_DEL_MACH:
632         StoreHost(form, 0, &argv[0]);
633         break;
634     case MM_MOD_MACH:
635         if (!strcmp(form->formname, "mod_machine")) {
636             qy = "update_machine";
637             for (i = 0; i < M_MODTIME; i++)
638               argv[i + 1] = StringValue(form, i);
639             argv[0] = form->extrastuff;
640             argc = M_MODTIME + 1;
641             break;
642         }
643         StoreHost(form, 0, &argv[0]);
644         form->extrastuff = (caddr_t) "mod_machine";
645         retfunc = ModifyCallback;
646         break;
647     case MM_MOD_CLUSTER:
648         if (!strcmp(form->formname, "mod_cluster")) {
649             qy = "update_cluster";
650             for (i = 0; i < C_MODTIME; i++)
651               argv[i + 1] = StringValue(form, i);
652             argv[0] = form->extrastuff;
653             argc = C_MODTIME + 1;
654             break;
655         }
656         form->extrastuff = (caddr_t) "mod_cluster";
657         retfunc = ModifyCallback;
658         break;
659     case MM_SHOW_MCMAP:
660         if (!*stringval(form, 0))
661           argv[0] = "*";
662         else
663           StoreHost(form, 0, &argv[0]);
664         if (!*stringval(form, 1))
665           argv[1] = "*";
666         AppendToLog("Cluster mappings:\n");
667         break;
668     case MM_ADD_MCMAP:
669     case MM_DEL_MCMAP:
670         StoreHost(form, 0, &argv[0]);
671         break;
672     case MM_SHOW_CLDATA:
673         if (!*stringval(form, 1))
674           argv[1] = "*";
675         break;
676     case MM_ADD_PCAP:
677         StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
678         StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
679         break;
680     case MM_MOD_PCAP:
681         if (!strcmp(form->formname, "mod_printer")) {
682             qy = "update_printcap_entry";
683             argc = PCAP_MODTIME;
684             break;
685         }
686         form->extrastuff = (caddr_t) "mod_printer";
687         retfunc = ModifyCallback;
688         break;
689     case MM_MOD_SERVICE:
690         if (!strcmp(form->formname, "mod_service")) {
691             qy = "update_server_info";
692             argc = SC_END;
693             break;
694         }
695         form->extrastuff = (caddr_t) "mod_service";
696         retfunc = ModifyCallback;
697         break;
698     case MM_SHOW_HOST:
699         if (!*stringval(form, 0))
700           argv[0] = "*";
701         if (!*stringval(form, 1))
702           argv[1] = "*";
703         else
704           StoreHost(form, 1, &argv[1]);
705         break;
706     case MM_MOD_HOST:
707         if (!strcmp(form->formname, "mod_host")) {
708             qy = "update_server_host_info";
709             argc = SHI_END;
710             break;
711         }
712         StoreHost(form, 1, &argv[1]);
713         form->extrastuff = (caddr_t)  "mod_host";
714         retfunc = ModifyCallback;
715         break;
716     case MM_SAVE_LOG:
717         if (!write_log_to_file(stringval(form, 0)) && remove)
718           XtUnmanageChild(form->formpointer);
719         return;
720     case MM_NEW_VALUE:
721         argv[0] = form->extrastuff;
722         argv[1] = "TYPE";
723         argv[2] = StringValue(form, 0);
724         for (s = argv[2]; *s; s++)
725           if (islower(*s)) *s = toupper(*s);
726         break;
727     }
728
729     if (argc == -1) {
730         display_error("Unknown function in form callback.\n");
731         return;
732     }
733     i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
734     if (i) {
735         com_err(program_name, i, " executing database query");
736         return;
737     }
738     
739     f = NULL;
740     if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
741         if (form->formpointer)
742           XtUnmanageChild(form->formpointer);
743         f->extrastuff = (caddr_t) strsave(stringval(form, 0));
744         f->menu = form->menu;
745     }
746
747     switch (form->menu->operation) {
748     case MM_MOD_USER:
749         if (f) {
750             f->inputlines[U_STATE]->keywords = user_states;
751             StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
752             GetKeywords(f, U_CLASS, "class");
753         } else
754           AppendToLog("Done.\n");
755         break;
756     case MM_MOD_FINGER:
757     case MM_MOD_CLUSTER:
758         if (!f)
759           AppendToLog("Done.\n");         
760         break;
761     case MM_MOD_LIST:
762         if (f) {
763             GetKeywords(f, L_ACE_TYPE, "ace_type");
764             f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
765             f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
766         } else
767           AppendToLog("Done.\n");         
768         break;
769     case MM_MOD_SERVICE:
770         if (f) {
771             GetKeywords(f, SC_TYPE, "service");
772             GetKeywords(f, SC_ACE_TYPE, "ace_type");
773         }
774         break;
775     case MM_MOD_FILSYS:
776         if (f) {
777             GetKeywords(f, FS_TYPE, "filesys");
778             sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
779             GetKeywords(f, FS_ACCESS, buf);
780             GetKeywords(f, FS_L_TYPE, "lockertype");
781             if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
782               StoreField(f, FS_MACHINE, "\\[NONE\\]");
783             f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
784         } else
785           AppendToLog("Done.\n");         
786         break;
787     case MM_MOD_MACH:
788         if (f)
789           GetKeywords(f, 1, "mac_type");
790         else
791           AppendToLog("Done.\n");         
792         break;
793     case MM_MOD_NFS:
794         if (f)
795           f->inputlines[3]->keywords = nfs_states;
796         else
797           AppendToLog("Done.\n");         
798         break;
799     case MM_DEL_ALL_MEMBER:
800         argv[1] = StringValue(form, 0);
801         argv[2] = StringValue(form, 1);
802         while (sq_get_data(form->extrastuff, &(argv[0]))) {
803             sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
804                     StringValue(form, 1), argv[0]);
805             if (!boolval(form, 2) ||
806                 AskQuestion(buf, "confirm_del_all")) {
807                 i = MoiraQuery("delete_member_from_list", 3, argv,
808                                DisplayCallback, NULL);
809                 if (i)
810                   com_err(program_name, i, " while removing member from list");
811                 else {
812                     sprintf(buf, "Member %s %s removed from list %s.\n",
813                             argv[1], argv[2], argv[0]);
814                     AppendToLog(buf);
815                 }
816             }
817             free(argv[0]);
818         }
819         AppendToLog("Done.\n");
820         break;
821     case MM_SHOW_FILSYS:
822     case MM_SHOW_FSGROUP:
823         while (sq_get_data(form->extrastuff, &aargv)) {
824             ShowFilsys(aargv);
825         }
826         sq_destroy(form->extrastuff);
827         break;
828     case MM_ADD_HOST:
829     case MM_DEL_HOST:
830     case MM_CLEAR_HOST:
831     case MM_RESET_HOST:
832     case MM_ADD_SERVICE:
833     case MM_DEL_SERVICE:
834     case MM_CLEAR_SERVICE:
835     case MM_RESET_SERVICE:
836     case MM_ENABLE_DCM:
837     case MM_TRIGGER_DCM:
838     case MM_ADD_ZEPHYR:
839     case MM_DEL_ZEPHYR:
840     case MM_ADD_PCAP:
841     case MM_DEL_PCAP:
842     case MM_ADD_CLDATA:
843     case MM_DEL_CLDATA:
844     case MM_ADD_MCMAP:
845     case MM_DEL_MCMAP:
846     case MM_ADD_CLUSTER:
847     case MM_DEL_CLUSTER:
848     case MM_ADD_MACH:
849     case MM_DEL_MACH:
850     case MM_ADD_MEMBER:
851     case MM_DEL_MEMBER:
852     case MM_ADD_LIST:
853     case MM_DEL_LIST:
854     case MM_ADD_QUOTA:
855     case MM_DEL_QUOTA:
856     case MM_SET_DQUOTA:
857     case MM_ADD_NFS:
858     case MM_DEL_NFS:
859     case MM_ADD_FS_ALIAS:
860     case MM_DEL_FS_ALIAS:
861     case MM_ADD_FSGROUP:
862     case MM_MOV_FSGROUP:
863     case MM_DEL_FSGROUP:
864     case MM_ADD_FILSYS:
865     case MM_DEL_FILSYS:
866     case MM_ADD_KRBMAP:
867     case MM_DEL_KRBMAP:
868     case MM_SET_POBOX:
869     case MM_DEL_POBOX:
870     case MM_ADD_USER:
871     case MM_REGISTER:
872     case MM_DEACTIVATE:
873     case MM_EXPUNGE:
874     case MM_RESET_POBOX:
875         AppendToLog("Done.\n");
876         break;
877     case MM_NEW_VALUE:
878         CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
879                       form->extrastuff, StringValue(form, 0));
880     }
881
882     if (remove && form->formpointer)
883       XtUnmanageChild(form->formpointer);
884
885     if (f)
886       DisplayForm(f);
887 }
888
889
890 MoiraMenuComplete(m)
891 MenuItem *m;
892 {
893     char *qy, *argv[32];
894     int (*retfunc)(), argc, i;
895     EntryForm dummy;
896
897     retfunc = DisplayCallback;
898     argc = -1;
899     dummy.menu = m;
900     qy = m->query;
901     argc = m->argc;
902
903     switch (m->operation) {
904     case MM_SHOW_MAILLIST:
905         argv[0] = argv[1] = argv[3] = "TRUE";
906         argv[2] = "FALSE";
907         argv[4] = "DONTCARE";
908         AppendToLog("Public Mailinglists:\n");
909         break;
910     case MM_SHOW_DQUOTA:
911         argv[0] = "def_quota";
912         break;
913     case MM_SHOW_DCM:
914         AppendToLog("Services and Hosts with failed updates:\n");
915         argv[0] = argv[2] = "DONTCARE";
916         argv[1] = "TRUE";
917         i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
918         if (i && i != MR_NO_MATCH)
919           com_err(program_name, i, " executing database query");
920         argv[0] = "*";
921         argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
922         argv[4] = "TRUE";
923         i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
924         if (i && i != MR_NO_MATCH)
925           com_err(program_name, i, " executing database query");
926         AppendToLog("\n");
927         return;
928     case MM_HELP_MOIRA:
929     case MM_HELP_WILDCARDS:
930     case MM_HELP_AUTHORS:
931     case MM_HELP_BUGS:
932     case MM_HELP_MOUSE:
933     case MM_HELP_KEYBOARD:
934         help(m->query);
935         return;
936     case MM_QUIT:
937         mr_disconnect();
938         exit(0);
939     }
940     if (argc == -1) {
941         display_error("Unknown function in menu callback.\n");
942         return;
943     }
944     i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
945     if (i)
946       com_err(program_name, i, " executing database query");
947     AppendToLog("\n");
948 }
This page took 0.578167 seconds and 5 git commands to generate.