]> andersk Git - moira.git/blame - clients/mmoira/queries.c
New database and column names for Moira2.
[moira.git] / clients / mmoira / queries.c
CommitLineData
83d3aa0c 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
17int ModifyCallback(argc, argv, form)
18int argc;
19char **argv;
20EntryForm *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;
b2d21e59 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;
83d3aa0c 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
108MoiraFormComplete(dummy1, form)
109int dummy1;
110EntryForm *form;
111{
b2d21e59 112 char *qy, *argv[32], buf[256], *s;
83d3aa0c 113 int (*retfunc)(), argc, i;
114 EntryForm *f;
b2d21e59 115 static int persistant_forms = 0;
83d3aa0c 116
117 retfunc = DisplayCallback;
118 argc = -1;
119
120 for (i = 0; form->inputlines[i]; i++)
892c98b2 121 argv[i] = StringValue(form, i);
122 qy = form->menu->query;
123 argc = form->menu->argc;
83d3aa0c 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) {
892c98b2 141 display_error("Must fill in at least one blank.");
83d3aa0c 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:
83d3aa0c 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]);
83d3aa0c 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) {
b2d21e59 172 com_err(program_name, i, " looking up user by name");
83d3aa0c 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++)
892c98b2 190 argv[i + 1] = StringValue(form, i);
83d3aa0c 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 }
83d3aa0c 202 form->extrastuff = (caddr_t) "mod_user";
203 retfunc = ModifyCallback;
204 break;
205 case MM_DEACTIVATE:
83d3aa0c 206 argv[1] = "3";
83d3aa0c 207 break;
208 case MM_EXPUNGE:
209 display_error("Expunge is not yet implemented");
210 return;
211 break;
83d3aa0c 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++)
892c98b2 216 argv[i + 1] = StringValue(form, i);
83d3aa0c 217 argv[0] = form->extrastuff;
218 argc = F_MODTIME;
219 break;
220 }
83d3aa0c 221 form->extrastuff = (caddr_t) "mod_finger";
222 retfunc = ModifyCallback;
223 break;
224 case MM_SHOW_KRBMAP:
83d3aa0c 225 if (!*stringval(form, 0))
226 argv[0] = "*";
227 if (!*stringval(form, 1))
228 argv[1] = "*";
83d3aa0c 229 break;
230 case MM_SET_POBOX:
83d3aa0c 231 if (!strcmp(argv[1], "POP"))
232 argv[2] = stringval(form, 3);
83d3aa0c 233 break;
234 case MM_SHOW_ACE_USE:
83d3aa0c 235 if (boolval(form, 2)) {
236 sprintf(buf, "R%s", stringval(form, 0));
237 argv[0] = buf;
238 }
83d3aa0c 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++)
892c98b2 244 argv[i + 1] = StringValue(form, i);
83d3aa0c 245 argv[0] = form->extrastuff;
246 argc = L_MODTIME + 1;
247 break;
248 }
83d3aa0c 249 form->extrastuff = (caddr_t) "mod_list";
250 retfunc = ModifyCallback;
251 break;
83d3aa0c 252 case MM_SHOW_MEMBERS:
892c98b2 253 if (!*stringval(form, 0)) {
83d3aa0c 254 qy = "get_lists_of_member";
255 argv[0] = stringval(form, 1);
b2d21e59 256 sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[1]);
257 AppendToLog(buf);
83d3aa0c 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;
b2d21e59 264 } else {
265 sprintf(buf, "Members of list %s:\n", argv[0]);
266 AppendToLog(buf);
83d3aa0c 267 }
268 break;
83d3aa0c 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)) {
b2d21e59 279 StoreHost(form, 1, &argv[0]);
83d3aa0c 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:
b2d21e59 295 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
83d3aa0c 296 if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
297 !strcmp(stringval(form, FS_TYPE), "FSGROUP"))
298 argv[FS_MACHINE] = "\\[NONE\\]";
83d3aa0c 299 break;
300 case MM_MOD_FILSYS:
301 if (!strcmp(form->formname, "mod_filsys")) {
b2d21e59 302 qy = "update_filesys";
83d3aa0c 303 for (i = 0; i < FS_MODTIME; i++)
892c98b2 304 argv[i + 1] = StringValue(form, i);
b2d21e59 305 StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
83d3aa0c 306 argv[0] = form->extrastuff;
307 argc = FS_MODTIME + 1;
308 break;
309 }
83d3aa0c 310 form->extrastuff = (caddr_t) "mod_filsys";
311 retfunc = ModifyCallback;
312 break;
b2d21e59 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;
892c98b2 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:
b2d21e59 368 StoreHost(form, 0, &argv[0]);
892c98b2 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 }
b2d21e59 379 StoreHost(form, 0, &argv[0]);
892c98b2 380 form->extrastuff = (caddr_t) "mod_machine";
381 retfunc = ModifyCallback;
382 break;
b2d21e59 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;
83d3aa0c 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) {
b2d21e59 432 com_err(program_name, i, " executing database query");
83d3aa0c 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:
b2d21e59 456 case MM_MOD_CLUSTER:
83d3aa0c 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;
892c98b2 477 case MM_MOD_MACH:
478 if (f)
479 GetKeywords(f, 1, "mac_type");
480 else
481 AppendToLog("Done.\n");
482 break;
b2d21e59 483 case MM_MOD_NFS:
484 if (f)
485 f->inputlines[3]->keywords = nfs_states;
486 else
487 AppendToLog("Done.\n");
488 break;
83d3aa0c 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:
892c98b2 536 case MM_RESET_POBOX:
83d3aa0c 537 AppendToLog("Done.\n");
538 }
539
b2d21e59 540 if (!persistant_forms)
541 XtUnmanageChild(form->formpointer);
542
83d3aa0c 543 if (f)
544 DisplayForm(f);
892c98b2 545 else
546 AppendToLog("\n");
83d3aa0c 547}
548
549
550MoiraMenuComplete(m)
551MenuItem *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;
892c98b2 560 qy = m->query;
561 argc = m->argc;
83d3aa0c 562
563 switch (m->operation) {
564 case MM_SHOW_MAILLIST:
83d3aa0c 565 argv[0] = argv[1] = argv[3] = "TRUE";
566 argv[2] = "FALSE";
567 argv[4] = "DONTCARE";
b2d21e59 568 AppendToLog("Public Mailinglists:\n");
83d3aa0c 569 break;
570 case MM_SHOW_DQUOTA:
83d3aa0c 571 argv[0] = "def_quota";
83d3aa0c 572 break;
573 case MM_SHOW_DCM:
b2d21e59 574 AppendToLog("Services and Hosts with failed updates:\n");
83d3aa0c 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)
b2d21e59 579 com_err(program_name, i, " executing database query");
83d3aa0c 580 argv[0] = "*";
581 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
582 argv[4] = "TRUE";
b2d21e59 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);
83d3aa0c 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)
b2d21e59 604 com_err(program_name, i, " executing database query");
605 AppendToLog("\n");
83d3aa0c 606}
607
608
609/******* temporary ********/
892c98b2 610display_error(msg) char *msg; { PopupErrorMessage(msg, "Sorry, no help is available"); }
This page took 0.147324 seconds and 5 git commands to generate.