]> 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     }
54
55     if (count > 0) {
56         f = GetAndClearForm(fn);
57         if (f == NULL) {
58             display_error("Unknown form in ModifyCallback!\n");
59             return;
60         }
61         f->extrastuff = form->extrastuff;
62         f->menu = form->menu;
63         for (i = 0; i < count; i++)
64           if (f->inputlines[i]->type == FT_BOOLEAN)
65             f->inputlines[i]->returnvalue.booleanvalue =
66               strcmp(argv[i + offset], "0") ? 1 : 0;
67           else
68             StoreField(f, i, argv[i + offset]);
69     } else {
70         display_error("Unknown function in ModifyCallback!\n");
71         return;
72     }
73 }
74
75
76
77 /* callback when form is complete to process the data */
78
79 MoiraFormComplete(dummy1, form)
80 int dummy1;
81 EntryForm *form;
82 {
83     char *qy, *argv[32], buf[256];
84     int (*retfunc)(), argc, i;
85     EntryForm *f;
86
87     retfunc = DisplayCallback;
88     argc = -1;
89
90     for (i = 0; form->inputlines[i]; i++)
91       argv[i] = StringValue(form, i);
92     qy = form->menu->query;
93     argc = form->menu->argc;
94
95     switch (form->menu->operation) {
96     case MM_SHOW_USER:
97         if (*stringval(form, 0)) {
98             qy = "get_user_by_login";
99             argv[0] = stringval(form, 0);
100             argc = 1;
101         } else if (*stringval(form, 3)) {
102             qy = "get_user_by_uid";
103             argv[0] = stringval(form, 3);
104             argc = 1;
105         } else if (*stringval(form, 4)) {
106             qy = "get_user_by_class";
107             argv[0] = stringval(form, 4);
108             argc = 1;
109         } else if (*stringval(form, 1) == 0 &&
110                    *stringval(form, 2) == 0) {
111             display_error("Must fill in at least one blank.");
112             return;
113         } else {
114             if (*stringval(form, 1) == 0)
115               StoreField(form, 1, "*");
116             if (*stringval(form, 2) == 0)
117               StoreField(form, 2, "*");
118             qy = "get_user_by_name";
119             argv[0] = stringval(form, 1);
120             argv[1] = stringval(form, 2);
121             argc = 2;
122         }
123         break;
124     case MM_ADD_USER:
125         argv[U_STATE][1] = 0;
126         if (argv[U_MITID][0] == '"')
127           strcpy(argv[U_MITID], stringval(form, U_MITID) + 1,
128                  strlen(stringval(form, U_MITID) - 2));
129         else
130           EncryptID(argv[U_MITID], argv[U_MITID], argv[U_FIRST], argv[U_LAST]);
131         break;
132     case MM_REGISTER:
133         if (*stringval(form, 2)) {
134             argv[0] = stringval(form, 2);
135         } else {
136             argv[0] = stringval(form, 0);
137             argv[1] = stringval(form, 1);
138             form->extrastuff = NULL;
139             i = MoiraQuery("get_user_by_name", 2, argv,
140                            ModifyCallback, (char *)form);
141             if (i) {
142                 com_err(program_name, i, "looking up user by name");
143                 return;
144             }
145             if (form->extrastuff == NULL) {
146                 display_error("Ambiguous user specification");
147                 return;
148             }
149             argv[0] = (char *)form->extrastuff;
150         }
151         qy = "register_user";
152         argv[1] = stringval(form, 3);
153         argv[2] = "1";
154         argc = 3;
155         break;
156     case MM_MOD_USER:
157         if (!strcmp(form->formname, "mod_user")) {
158             qy = "update_user";
159             for (i = 0; i < U_MODTIME; i++)
160               argv[i + 1] = StringValue(form, i);
161             argv[0] = form->extrastuff;
162             argv[U_STATE + 1][1] = 0;
163             if (argv[U_MITID + 1][0] == '"') {
164                 strcpy(argv[U_MITID + 1], stringval(form, U_MITID) + 1);
165                 stringval(form, U_MITID)[strlen(stringval(form, U_MITID))-1] = 0;
166             } else
167               EncryptID(argv[U_MITID + 1], argv[U_MITID + 1],
168                         argv[U_FIRST + 1], argv[U_LAST + 1]);
169             argc = U_MODTIME + 1;
170             break;
171         }
172         form->extrastuff = (caddr_t) "mod_user";
173         retfunc = ModifyCallback;
174         break;
175     case MM_DEACTIVATE:
176         argv[1] = "3";
177         break;
178     case MM_EXPUNGE:
179         display_error("Expunge is not yet implemented");
180         return;
181         break;
182     case MM_MOD_FINGER:
183         if (!strcmp(form->formname, "mod_finger")) {
184             qy = "update_finger_by_login";
185             for (i = 0; i < F_MODTIME - 1; i++)
186               argv[i + 1] = StringValue(form, i);
187             argv[0] = form->extrastuff;
188             argc = F_MODTIME;
189             break;
190         }
191         form->extrastuff = (caddr_t) "mod_finger";
192         retfunc = ModifyCallback;
193         break;
194     case MM_SHOW_KRBMAP:
195         if (!*stringval(form, 0))
196           argv[0] = "*";
197         if (!*stringval(form, 1))
198           argv[1] = "*";
199         break;
200     case MM_SET_POBOX:
201         if (!strcmp(argv[1], "POP"))
202           argv[2] = stringval(form, 3);
203         break;
204     case MM_SHOW_ACE_USE:
205         if (boolval(form, 2)) {
206             sprintf(buf, "R%s", stringval(form, 0));
207             argv[0] = buf;
208         }
209         break;
210     case MM_MOD_LIST:
211         if (!strcmp(form->formname, "mod_list")) {
212             qy = "update_list";
213             for (i = 0; i < L_MODTIME; i++)
214               argv[i + 1] = StringValue(form, i);
215             argv[0] = form->extrastuff;
216             argc = L_MODTIME + 1;
217             break;
218         }
219         form->extrastuff = (caddr_t) "mod_list";
220         retfunc = ModifyCallback;
221         break;
222     case MM_SHOW_MEMBERS:
223         if (!*stringval(form, 0)) {
224             qy = "get_lists_of_member";
225             argv[0] = stringval(form, 1);
226             if (boolval(form, 3)) {
227                 sprintf(buf, "R%s", stringval(form, 1));
228                 argv[0] = buf;
229             }
230             argv[1] = stringval(form, 2);
231             argc = 2;
232         }
233         break;
234     case MM_DEL_ALL_MEMBER:
235         display_error("Not yet implemented.");
236         return;
237         break;
238     case MM_SHOW_FILSYS:
239         if (*stringval(form, 0)) {
240             qy = "get_filesys_by_label";
241             argv[0] = stringval(form, 0);
242             argc = 1;
243         } else if (*stringval(form, 1)) {
244             argv[0] = canonicalize_hostname(stringval(form, 1));
245             if (*stringval(form, 2)) {
246                 qy = "get_filesys_by_nfsphys";
247                 argv[1] = stringval(form, 2);
248                 argc = 2;
249             } else {
250                 qy = "get_filesys_by_machine";
251                 argc = 1;
252             }
253         } else if (*stringval(form, 3)) {
254             qy = "get_filesys_by_group";
255             argv[0] = stringval(form, 3);
256             argc = 1;
257         }
258         break;
259     case MM_ADD_FILSYS:
260         argv[FS_MACHINE] = canonicalize_hostname(stringval(form, FS_MACHINE));
261         if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
262             !strcmp(stringval(form, FS_TYPE), "FSGROUP"))
263           argv[FS_MACHINE] = "\\[NONE\\]";
264         break;
265     case MM_MOD_FILSYS:
266         if (!strcmp(form->formname, "mod_filsys")) {
267             qy = "update_filsys";
268             for (i = 0; i < FS_MODTIME; i++)
269               argv[i + 1] = StringValue(form, i);
270             argv[0] = form->extrastuff;
271             argc = FS_MODTIME + 1;
272             break;
273         }
274         form->extrastuff = (caddr_t) "mod_filsys";
275         retfunc = ModifyCallback;
276         break;
277     case MM_SHOW_QUOTA:
278         if (!*stringval(form, 0))
279           argv[0] = "*";
280         if (*stringval(form, 1)) {
281             argv[1] = "USER";
282             argv[2] = stringval(form, 1);
283         } else if (*stringval(form, 2)) {
284             argv[1] = "GROUP";
285             argv[2] = stringval(form, 2);
286         } else if (!*stringval(form, 0)) {
287             display_error("Must specify something.");
288             return;
289         } else {
290             qy = "get_quota_by_filesys";
291             argc = 1;
292         }
293         break;
294     case MM_SHOW_MACH:
295     case MM_ADD_MACH:
296     case MM_DEL_MACH:
297         argv[0] = canonicalize_hostname(stringval(form, 0));    
298         break;
299     case MM_MOD_MACH:
300         if (!strcmp(form->formname, "mod_machine")) {
301             qy = "update_machine";
302             for (i = 0; i < M_MODTIME; i++)
303               argv[i + 1] = StringValue(form, i);
304             argv[0] = form->extrastuff;
305             argc = M_MODTIME + 1;
306             break;
307         }
308         argv[0] = canonicalize_hostname(stringval(form, 0));    
309         form->extrastuff = (caddr_t) "mod_machine";
310         retfunc = ModifyCallback;
311         break;
312
313     }
314
315     if (argc == -1) {
316         display_error("Unknown function in form callback.\n");
317         return;
318     }
319     i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
320     if (i) {
321         com_err(program_name, i, "executing database query");
322         return;
323     }
324     
325     f = NULL;
326     if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
327         XtUnmanageChild(form->formpointer);
328         f->extrastuff = (caddr_t) strsave(stringval(form, 0));
329         f->menu = form->menu;
330     }
331
332     switch (form->menu->operation) {
333     case MM_MOD_USER:
334         if (f) {
335             qy = strsave(stringval(f, U_MITID));
336             sprintf(stringval(f, U_MITID), "\"%s\"", qy);
337             free(qy);
338             f->inputlines[U_STATE]->keywords = user_states;
339             StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
340             GetKeywords(f, U_CLASS, "class");
341         } else
342           AppendToLog("Done.\n");
343         break;
344     case MM_MOD_FINGER:
345         if (!f)
346           AppendToLog("Done.\n");         
347         break;
348     case MM_MOD_LIST:
349         if (f)
350           GetKeywords(f, L_ACE_TYPE, "ace_type");
351         else
352           AppendToLog("Done.\n");         
353         break;
354     case MM_MOD_FILSYS:
355         if (f) {
356             GetKeywords(f, FS_TYPE, "filesys");
357             sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
358             GetKeywords(f, FS_ACCESS, buf);
359             GetKeywords(f, FS_L_TYPE, "lockertype");
360             if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
361               StoreField(f, FS_MACHINE, "\\[NONE\\]");
362         } else
363           AppendToLog("Done.\n");         
364         break;
365     case MM_MOD_MACH:
366         if (f)
367           GetKeywords(f, 1, "mac_type");
368         else
369           AppendToLog("Done.\n");         
370         break;
371     case MM_ADD_HOST:
372     case MM_DEL_HOST:
373     case MM_CLEAR_HOST:
374     case MM_RESET_HOST:
375     case MM_ADD_SERVICE:
376     case MM_DEL_SERVICE:
377     case MM_CLEAR_SERVICE:
378     case MM_RESET_SERVICE:
379     case MM_ENABLE_DCM:
380     case MM_TRIGGER_DCM:
381     case MM_ADD_ZEPHYR:
382     case MM_DEL_ZEPHYR:
383     case MM_ADD_PCAP:
384     case MM_DEL_PCAP:
385     case MM_ADD_CLDATA:
386     case MM_DEL_CLDATA:
387     case MM_ADD_MCMAP:
388     case MM_DEL_MCMAP:
389     case MM_ADD_CLUSTER:
390     case MM_DEL_CLUSTER:
391     case MM_ADD_MACH:
392     case MM_DEL_MACH:
393     case MM_ADD_MEMBER:
394     case MM_DEL_MEMBER:
395     case MM_DEL_ALL_MEMBER:
396     case MM_ADD_LIST:
397     case MM_DEL_LIST:
398     case MM_ADD_QUOTA:
399     case MM_DEL_QUOTA:
400     case MM_SET_DQUOTA:
401     case MM_ADD_NFS:
402     case MM_DEL_NFS:
403     case MM_ADD_FS_ALIAS:
404     case MM_DEL_FS_ALIAS:
405     case MM_ADD_FSGROUP:
406     case MM_MOV_FSGROUP:
407     case MM_DEL_FSGROUP:
408     case MM_ADD_FILSYS:
409     case MM_DEL_FILSYS:
410     case MM_ADD_KRBMAP:
411     case MM_DEL_KRBMAP:
412     case MM_SET_POBOX:
413     case MM_DEL_POBOX:
414     case MM_ADD_USER:
415     case MM_REGISTER:
416     case MM_DEACTIVATE:
417     case MM_EXPUNGE:
418     case MM_RESET_POBOX:
419         AppendToLog("Done.\n");
420     }
421
422     if (f)
423       DisplayForm(f);
424     else
425       AppendToLog("\n");
426 }
427
428
429 MoiraMenuComplete(m)
430 MenuItem *m;
431 {
432     char *qy, *argv[32];
433     int (*retfunc)(), argc, i;
434     EntryForm dummy;
435
436     retfunc = DisplayCallback;
437     argc = -1;
438     dummy.menu = m;
439     qy = m->query;
440     argc = m->argc;
441
442     switch (m->operation) {
443     case MM_SHOW_MAILLIST:
444         argv[0] = argv[1] = argv[3] = "TRUE";
445         argv[2] = "FALSE";
446         argv[4] = "DONTCARE";
447         break;
448     case MM_SHOW_DQUOTA:
449         argv[0] = "def_quota";
450         break;
451     case MM_SHOW_DCM:
452         AppendToLog("Services and Hosts with failed updates:");
453         argv[0] = argv[2] = "DONTCARE";
454         argv[1] = "TRUE";
455         i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
456         if (i && i != MR_NO_MATCH)
457           com_err(program_name, i, "executing database query");
458         qy = "qualified_get_server_host";
459         argv[0] = "*";
460         argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
461         argv[4] = "TRUE";
462         argc = 6;
463         break;
464     }
465     if (argc == -1) {
466         display_error("Unknown function in menu callback.\n");
467         return;
468     }
469     i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
470     if (i)
471       com_err(program_name, i, "executing database query");
472 }
473
474
475 /******* temporary ********/
476 display_error(msg) char *msg; { PopupErrorMessage(msg, "Sorry, no help is available"); }
This page took 0.073888 seconds and 5 git commands to generate.