]> andersk Git - moira.git/blob - clients/mmoira/queries.c
*** empty log message ***
[moira.git] / clients / mmoira / queries.c
1 /* $Header$
2  */
3
4 #include <stdio.h>
5 #include <moira.h>
6 #include <moira_site.h>
7 #include <sys/types.h>
8 #include <netdb.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <Xm/Xm.h>
12 #include "mmoira.h"
13
14
15 /* Called with moira data that is to be modified. */
16
17 int ModifyCallback(argc, argv, form)
18 int argc;
19 char **argv;
20 EntryForm *form;
21 {
22     EntryForm *f;
23     char *fn;
24     int count, i, offset;
25
26     count = -1;
27     offset = 0;
28     switch (form->menu->operation) {
29     case MM_MOD_USER:
30         fn = "mod_user";
31         count = U_MODTIME;
32         break;
33     case MM_MOD_FINGER:
34         fn = "mod_finger";
35         count = F_MODTIME - 1;
36         offset = 1;
37         break;
38     case MM_REGISTER:
39         if (form->extrastuff)
40           form->extrastuff = NULL;
41         else
42           form->extrastuff = strsave(argv[U_UID]);
43         return;
44         break;
45     case MM_MOD_LIST:
46         fn = "mod_list";
47         count = L_MODTIME;
48         break;
49     case MM_MOD_FILSYS:
50         fn = "mod_filsys";
51         count = FS_MODTIME;
52         break;
53     case MM_MOD_NFS:
54         f = GetAndClearForm("mod_nfs");
55         if (f == NULL) {
56             display_error("Unknown form in ModifyCallback of mod_nfs\n");
57             return;
58         }
59         f->extrastuff = form->extrastuff;
60         f->menu = form->menu;
61         StoreField(f, 0, argv[0]);
62         StoreField(f, 1, argv[1]);
63         StoreField(f, 2, argv[2]);
64         f->inputlines[3]->keywords = nfs_states;
65         for (i = 0; nfs_states[i]; i++)
66           if ((atoi(nfs_states[i]) & ~MR_FS_GROUPQUOTA) == atoi(argv[3]))
67             StoreField(f, 3, nfs_states[i]);
68         StoreField(f, 3, argv[3]);
69         if (atoi(argv[3]) && MR_FS_GROUPQUOTA)
70           f->inputlines[4]->returnvalue.booleanvalue = 1;
71         StoreField(f, 5, argv[4]);
72         StoreField(f, 6, argv[5]);
73         return;
74     case MM_MOD_MACH:
75         fn = "mod_machine";
76         count = M_MODTIME;
77         break;
78     case MM_MOD_CLUSTER:
79         fn = "mod_cluster";
80         count = C_MODTIME;
81         break;
82     }
83
84     if (count > 0) {
85         f = GetAndClearForm(fn);
86         if (f == NULL) {
87             display_error("Unknown form in ModifyCallback!\n");
88             return;
89         }
90         f->extrastuff = form->extrastuff;
91         f->menu = form->menu;
92         for (i = 0; i < count; i++)
93           if (f->inputlines[i]->type == FT_BOOLEAN)
94             f->inputlines[i]->returnvalue.booleanvalue =
95               strcmp(argv[i + offset], "0") ? 1 : 0;
96           else
97             StoreField(f, i, argv[i + offset]);
98     } else {
99         display_error("Unknown function in ModifyCallback!\n");
100         return;
101     }
102 }
103
104
105
106 /* callback when form is complete to process the data */
107
108 MoiraFormComplete(dummy1, form)
109 int dummy1;
110 EntryForm *form;
111 {
112     char *qy, *argv[32], buf[256], *s;
113     int (*retfunc)(), argc, i;
114     EntryForm *f;
115     static int persistant_forms = 0;
116
117     retfunc = DisplayCallback;
118     argc = -1;
119
120     for (i = 0; form->inputlines[i]; i++)
121       argv[i] = StringValue(form, i);
122     qy = form->menu->query;
123     argc = form->menu->argc;
124
125     switch (form->menu->operation) {
126     case MM_SHOW_USER:
127         if (*stringval(form, 0)) {
128             qy = "get_user_by_login";
129             argv[0] = stringval(form, 0);
130             argc = 1;
131         } else if (*stringval(form, 3)) {
132             qy = "get_user_by_uid";
133             argv[0] = stringval(form, 3);
134             argc = 1;
135         } else if (*stringval(form, 4)) {
136             qy = "get_user_by_class";
137             argv[0] = stringval(form, 4);
138             argc = 1;
139         } else if (*stringval(form, 1) == 0 &&
140                    *stringval(form, 2) == 0) {
141             display_error("Must fill in at least one blank.");
142             return;
143         } else {
144             if (*stringval(form, 1) == 0)
145               StoreField(form, 1, "*");
146             if (*stringval(form, 2) == 0)
147               StoreField(form, 2, "*");
148             qy = "get_user_by_name";
149             argv[0] = stringval(form, 1);
150             argv[1] = stringval(form, 2);
151             argc = 2;
152         }
153         break;
154     case MM_ADD_USER:
155         argv[U_STATE][1] = 0;
156         if (argv[U_MITID][0] == '"')
157           strcpy(argv[U_MITID], stringval(form, U_MITID) + 1,
158                  strlen(stringval(form, U_MITID) - 2));
159         else
160           EncryptID(argv[U_MITID], argv[U_MITID], argv[U_FIRST], argv[U_LAST]);
161         break;
162     case MM_REGISTER:
163         if (*stringval(form, 2)) {
164             argv[0] = stringval(form, 2);
165         } else {
166             argv[0] = stringval(form, 0);
167             argv[1] = stringval(form, 1);
168             form->extrastuff = NULL;
169             i = MoiraQuery("get_user_by_name", 2, argv,
170                            ModifyCallback, (char *)form);
171             if (i) {
172                 com_err(program_name, i, " looking up user by name");
173                 return;
174             }
175             if (form->extrastuff == NULL) {
176                 display_error("Ambiguous user specification");
177                 return;
178             }
179             argv[0] = (char *)form->extrastuff;
180         }
181         qy = "register_user";
182         argv[1] = stringval(form, 3);
183         argv[2] = "1";
184         argc = 3;
185         break;
186     case MM_MOD_USER:
187         if (!strcmp(form->formname, "mod_user")) {
188             qy = "update_user";
189             for (i = 0; i < U_MODTIME; i++)
190               argv[i + 1] = StringValue(form, i);
191             argv[0] = form->extrastuff;
192             argv[U_STATE + 1][1] = 0;
193             if (argv[U_MITID + 1][0] == '"') {
194                 strcpy(argv[U_MITID + 1], stringval(form, U_MITID) + 1);
195                 stringval(form, U_MITID)[strlen(stringval(form, U_MITID))-1] = 0;
196             } else
197               EncryptID(argv[U_MITID + 1], argv[U_MITID + 1],
198                         argv[U_FIRST + 1], argv[U_LAST + 1]);
199             argc = U_MODTIME + 1;
200             break;
201         }
202         form->extrastuff = (caddr_t) "mod_user";
203         retfunc = ModifyCallback;
204         break;
205     case MM_DEACTIVATE:
206         argv[1] = "3";
207         break;
208     case MM_EXPUNGE:
209         display_error("Expunge is not yet implemented");
210         return;
211         break;
212     case MM_MOD_FINGER:
213         if (!strcmp(form->formname, "mod_finger")) {
214             qy = "update_finger_by_login";
215             for (i = 0; i < F_MODTIME - 1; i++)
216               argv[i + 1] = StringValue(form, i);
217             argv[0] = form->extrastuff;
218             argc = F_MODTIME;
219             break;
220         }
221         form->extrastuff = (caddr_t) "mod_finger";
222         retfunc = ModifyCallback;
223         break;
224     case MM_SHOW_KRBMAP:
225         if (!*stringval(form, 0))
226           argv[0] = "*";
227         if (!*stringval(form, 1))
228           argv[1] = "*";
229         break;
230     case MM_SET_POBOX:
231         if (!strcmp(argv[1], "POP"))
232           argv[2] = stringval(form, 3);
233         break;
234     case MM_SHOW_ACE_USE:
235         if (boolval(form, 2)) {
236             sprintf(buf, "R%s", stringval(form, 0));
237             argv[0] = buf;
238         }
239         break;
240     case MM_MOD_LIST:
241         if (!strcmp(form->formname, "mod_list")) {
242             qy = "update_list";
243             for (i = 0; i < L_MODTIME; i++)
244               argv[i + 1] = StringValue(form, i);
245             argv[0] = form->extrastuff;
246             argc = L_MODTIME + 1;
247             break;
248         }
249         form->extrastuff = (caddr_t) "mod_list";
250         retfunc = ModifyCallback;
251         break;
252     case MM_SHOW_MEMBERS:
253         if (!*stringval(form, 0)) {
254             qy = "get_lists_of_member";
255             argv[0] = stringval(form, 1);
256             sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[1]);
257             AppendToLog(buf);
258             if (boolval(form, 3)) {
259                 sprintf(buf, "R%s", stringval(form, 1));
260                 argv[0] = buf;
261             }
262             argv[1] = stringval(form, 2);
263             argc = 2;
264         } else {
265             sprintf(buf, "Members of list %s:\n", argv[0]);
266             AppendToLog(buf);
267         }
268         break;
269     case MM_DEL_ALL_MEMBER:
270         display_error("Not yet implemented.");
271         return;
272         break;
273     case MM_SHOW_FILSYS:
274         if (*stringval(form, 0)) {
275             qy = "get_filesys_by_label";
276             argv[0] = stringval(form, 0);
277             argc = 1;
278         } else if (*stringval(form, 1)) {
279             StoreHost(form, 1, &argv[0]);
280             if (*stringval(form, 2)) {
281                 qy = "get_filesys_by_nfsphys";
282                 argv[1] = stringval(form, 2);
283                 argc = 2;
284             } else {
285                 qy = "get_filesys_by_machine";
286                 argc = 1;
287             }
288         } else if (*stringval(form, 3)) {
289             qy = "get_filesys_by_group";
290             argv[0] = stringval(form, 3);
291             argc = 1;
292         }
293         break;
294     case MM_ADD_FILSYS:
295         StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
296         if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
297             !strcmp(stringval(form, FS_TYPE), "FSGROUP"))
298           argv[FS_MACHINE] = "\\[NONE\\]";
299         break;
300     case MM_MOD_FILSYS:
301         if (!strcmp(form->formname, "mod_filsys")) {
302             qy = "update_filesys";
303             for (i = 0; i < FS_MODTIME; i++)
304               argv[i + 1] = StringValue(form, i);
305             StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
306             argv[0] = form->extrastuff;
307             argc = FS_MODTIME + 1;
308             break;
309         }
310         form->extrastuff = (caddr_t) "mod_filsys";
311         retfunc = ModifyCallback;
312         break;
313     case MM_ADD_FSGROUP:
314         
315         break;
316     case MM_SHOW_FS_ALIAS:
317     case MM_ADD_FS_ALIAS:
318     case MM_DEL_FS_ALIAS:
319         argv[1] = "FILESYS";
320         argv[2] = stringval(form, 1);
321         break;
322     case MM_SHOW_NFS:
323         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
324         if (!*stringval(form, 1))
325           argv[1] = "*";
326         break;
327     case MM_ADD_NFS:
328         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
329         sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
330                 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
331         argv[NFS_STATUS] = buf;
332         argv[NFS_ALLOC] = stringval(form, 5);
333         argv[NFS_SIZE] = stringval(form, 6);
334         break;
335     case MM_MOD_NFS:
336         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
337         if (!strcmp(form->formname, "mod_nfs")) {
338             qy = "update_nfsphys";
339             argc = NFS_MODTIME;
340             break;
341         }
342         form->extrastuff = (caddr_t) "mod_nfs";
343         retfunc = ModifyCallback;
344         break;
345     case MM_DEL_NFS:
346         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
347         break;
348     case MM_SHOW_QUOTA:
349         if (!*stringval(form, 0))
350           argv[0] = "*";
351         if (*stringval(form, 1)) {
352             argv[1] = "USER";
353             argv[2] = stringval(form, 1);
354         } else if (*stringval(form, 2)) {
355             argv[1] = "GROUP";
356             argv[2] = stringval(form, 2);
357         } else if (!*stringval(form, 0)) {
358             display_error("Must specify something.");
359             return;
360         } else {
361             qy = "get_quota_by_filesys";
362             argc = 1;
363         }
364         break;
365     case MM_SHOW_MACH:
366     case MM_ADD_MACH:
367     case MM_DEL_MACH:
368         StoreHost(form, 0, &argv[0]);
369         break;
370     case MM_MOD_MACH:
371         if (!strcmp(form->formname, "mod_machine")) {
372             qy = "update_machine";
373             for (i = 0; i < M_MODTIME; i++)
374               argv[i + 1] = StringValue(form, i);
375             argv[0] = form->extrastuff;
376             argc = M_MODTIME + 1;
377             break;
378         }
379         StoreHost(form, 0, &argv[0]);
380         form->extrastuff = (caddr_t) "mod_machine";
381         retfunc = ModifyCallback;
382         break;
383     case MM_MOD_CLUSTER:
384         if (!strcmp(form->formname, "mod_cluster")) {
385             qy = "update_cluster";
386             for (i = 0; i < C_MODTIME; i++)
387               argv[i + 1] = StringValue(form, i);
388             argv[0] = form->extrastuff;
389             argc = C_MODTIME + 1;
390             break;
391         }
392         form->extrastuff = (caddr_t) "mod_cluster";
393         retfunc = ModifyCallback;
394         break;
395     case MM_SHOW_MCMAP:
396         if (!*stringval(form, 0))
397           argv[0] = "*";
398         else
399           StoreHost(form, 0, &argv[0]);
400         if (!*stringval(form, 1))
401           argv[1] = "*";
402         AppendToLog("Cluster mappings:\n");
403         break;
404     case MM_ADD_MCMAP:
405     case MM_DEL_MCMAP:
406         StoreHost(form, 0, &argv[0]);
407         break;
408     case MM_SHOW_CLDATA:
409         if (!*stringval(form, 1))
410           argv[1] = "*";
411         break;
412     case MM_ADD_PCAP:
413         StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
414         StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
415         break;
416     case MM_SAVE_LOG:
417         display_error("Not yet implemented.");
418         return;
419     case MM_PERSISTANT_FORMS:
420         persistant_forms = boolval(form, 0);
421         if (!persistant_forms)
422           XtUnmanageChild(form->formpointer);
423         return;
424     }
425
426     if (argc == -1) {
427         display_error("Unknown function in form callback.\n");
428         return;
429     }
430     i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
431     if (i) {
432         com_err(program_name, i, " executing database query");
433         return;
434     }
435     
436     f = NULL;
437     if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
438         XtUnmanageChild(form->formpointer);
439         f->extrastuff = (caddr_t) strsave(stringval(form, 0));
440         f->menu = form->menu;
441     }
442
443     switch (form->menu->operation) {
444     case MM_MOD_USER:
445         if (f) {
446             qy = strsave(stringval(f, U_MITID));
447             sprintf(stringval(f, U_MITID), "\"%s\"", qy);
448             free(qy);
449             f->inputlines[U_STATE]->keywords = user_states;
450             StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
451             GetKeywords(f, U_CLASS, "class");
452         } else
453           AppendToLog("Done.\n");
454         break;
455     case MM_MOD_FINGER:
456     case MM_MOD_CLUSTER:
457         if (!f)
458           AppendToLog("Done.\n");         
459         break;
460     case MM_MOD_LIST:
461         if (f)
462           GetKeywords(f, L_ACE_TYPE, "ace_type");
463         else
464           AppendToLog("Done.\n");         
465         break;
466     case MM_MOD_FILSYS:
467         if (f) {
468             GetKeywords(f, FS_TYPE, "filesys");
469             sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
470             GetKeywords(f, FS_ACCESS, buf);
471             GetKeywords(f, FS_L_TYPE, "lockertype");
472             if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
473               StoreField(f, FS_MACHINE, "\\[NONE\\]");
474         } else
475           AppendToLog("Done.\n");         
476         break;
477     case MM_MOD_MACH:
478         if (f)
479           GetKeywords(f, 1, "mac_type");
480         else
481           AppendToLog("Done.\n");         
482         break;
483     case MM_MOD_NFS:
484         if (f)
485           f->inputlines[3]->keywords = nfs_states;
486         else
487           AppendToLog("Done.\n");         
488         break;
489     case MM_ADD_HOST:
490     case MM_DEL_HOST:
491     case MM_CLEAR_HOST:
492     case MM_RESET_HOST:
493     case MM_ADD_SERVICE:
494     case MM_DEL_SERVICE:
495     case MM_CLEAR_SERVICE:
496     case MM_RESET_SERVICE:
497     case MM_ENABLE_DCM:
498     case MM_TRIGGER_DCM:
499     case MM_ADD_ZEPHYR:
500     case MM_DEL_ZEPHYR:
501     case MM_ADD_PCAP:
502     case MM_DEL_PCAP:
503     case MM_ADD_CLDATA:
504     case MM_DEL_CLDATA:
505     case MM_ADD_MCMAP:
506     case MM_DEL_MCMAP:
507     case MM_ADD_CLUSTER:
508     case MM_DEL_CLUSTER:
509     case MM_ADD_MACH:
510     case MM_DEL_MACH:
511     case MM_ADD_MEMBER:
512     case MM_DEL_MEMBER:
513     case MM_DEL_ALL_MEMBER:
514     case MM_ADD_LIST:
515     case MM_DEL_LIST:
516     case MM_ADD_QUOTA:
517     case MM_DEL_QUOTA:
518     case MM_SET_DQUOTA:
519     case MM_ADD_NFS:
520     case MM_DEL_NFS:
521     case MM_ADD_FS_ALIAS:
522     case MM_DEL_FS_ALIAS:
523     case MM_ADD_FSGROUP:
524     case MM_MOV_FSGROUP:
525     case MM_DEL_FSGROUP:
526     case MM_ADD_FILSYS:
527     case MM_DEL_FILSYS:
528     case MM_ADD_KRBMAP:
529     case MM_DEL_KRBMAP:
530     case MM_SET_POBOX:
531     case MM_DEL_POBOX:
532     case MM_ADD_USER:
533     case MM_REGISTER:
534     case MM_DEACTIVATE:
535     case MM_EXPUNGE:
536     case MM_RESET_POBOX:
537         AppendToLog("Done.\n");
538     }
539
540     if (!persistant_forms)
541       XtUnmanageChild(form->formpointer);
542
543     if (f)
544       DisplayForm(f);
545     else
546       AppendToLog("\n");
547 }
548
549
550 MoiraMenuComplete(m)
551 MenuItem *m;
552 {
553     char *qy, *argv[32];
554     int (*retfunc)(), argc, i;
555     EntryForm dummy;
556
557     retfunc = DisplayCallback;
558     argc = -1;
559     dummy.menu = m;
560     qy = m->query;
561     argc = m->argc;
562
563     switch (m->operation) {
564     case MM_SHOW_MAILLIST:
565         argv[0] = argv[1] = argv[3] = "TRUE";
566         argv[2] = "FALSE";
567         argv[4] = "DONTCARE";
568         AppendToLog("Public Mailinglists:\n");
569         break;
570     case MM_SHOW_DQUOTA:
571         argv[0] = "def_quota";
572         break;
573     case MM_SHOW_DCM:
574         AppendToLog("Services and Hosts with failed updates:\n");
575         argv[0] = argv[2] = "DONTCARE";
576         argv[1] = "TRUE";
577         i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
578         if (i && i != MR_NO_MATCH)
579           com_err(program_name, i, " executing database query");
580         argv[0] = "*";
581         argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
582         argv[4] = "TRUE";
583         i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
584         if (i && i != MR_NO_MATCH)
585           com_err(program_name, i, " executing database query");
586         AppendToLog("\n");
587         return;
588     case MM_HELP_MOIRA:
589     case MM_HELP_WILDCARDS:
590     case MM_HELP_AUTHORS:
591     case MM_HELP_BUGS:
592         help(m->query);
593         return;
594     case MM_QUIT:
595         mr_disconnect();
596         exit(0);
597     }
598     if (argc == -1) {
599         display_error("Unknown function in menu callback.\n");
600         return;
601     }
602     i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
603     if (i)
604       com_err(program_name, i, " executing database query");
605     AppendToLog("\n");
606 }
607
608
609 /******* temporary ********/
610 display_error(msg) char *msg; { PopupErrorMessage(msg, "Sorry, no help is available"); }
This page took 0.121894 seconds and 5 git commands to generate.