6 #include <moira_site.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
15 /* Called with moira data that is to be modified. */
17 int ModifyCallback(argc, argv, form)
28 switch (form->menu->operation) {
35 count = F_MODTIME - 1;
40 form->extrastuff = NULL;
42 form->extrastuff = strsave(argv[U_UID]);
54 f = GetAndClearForm("mod_nfs");
56 display_error("Unknown form in ModifyCallback of mod_nfs\n");
59 f->extrastuff = form->extrastuff;
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]);
85 f = GetAndClearForm(fn);
87 display_error("Unknown form in ModifyCallback!\n");
90 f->extrastuff = form->extrastuff;
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;
97 StoreField(f, i, argv[i + offset]);
99 display_error("Unknown function in ModifyCallback!\n");
106 /* callback when form is complete to process the data */
108 MoiraFormComplete(dummy1, form)
112 char *qy, *argv[32], buf[256], *s;
113 int (*retfunc)(), argc, i;
115 static int persistant_forms = 0;
117 retfunc = DisplayCallback;
120 for (i = 0; form->inputlines[i]; i++)
121 argv[i] = StringValue(form, i);
122 qy = form->menu->query;
123 argc = form->menu->argc;
125 switch (form->menu->operation) {
127 if (*stringval(form, 0)) {
128 qy = "get_user_by_login";
129 argv[0] = stringval(form, 0);
131 } else if (*stringval(form, 3)) {
132 qy = "get_user_by_uid";
133 argv[0] = stringval(form, 3);
135 } else if (*stringval(form, 4)) {
136 qy = "get_user_by_class";
137 argv[0] = stringval(form, 4);
139 } else if (*stringval(form, 1) == 0 &&
140 *stringval(form, 2) == 0) {
141 display_error("Must fill in at least one blank.");
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);
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));
160 EncryptID(argv[U_MITID], argv[U_MITID], argv[U_FIRST], argv[U_LAST]);
163 if (*stringval(form, 2)) {
164 argv[0] = stringval(form, 2);
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);
172 com_err(program_name, i, " looking up user by name");
175 if (form->extrastuff == NULL) {
176 display_error("Ambiguous user specification");
179 argv[0] = (char *)form->extrastuff;
181 qy = "register_user";
182 argv[1] = stringval(form, 3);
187 if (!strcmp(form->formname, "mod_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;
197 EncryptID(argv[U_MITID + 1], argv[U_MITID + 1],
198 argv[U_FIRST + 1], argv[U_LAST + 1]);
199 argc = U_MODTIME + 1;
202 form->extrastuff = (caddr_t) "mod_user";
203 retfunc = ModifyCallback;
209 display_error("Expunge is not yet implemented");
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;
221 form->extrastuff = (caddr_t) "mod_finger";
222 retfunc = ModifyCallback;
225 if (!*stringval(form, 0))
227 if (!*stringval(form, 1))
231 if (!strcmp(argv[1], "POP"))
232 argv[2] = stringval(form, 3);
234 case MM_SHOW_ACE_USE:
235 if (boolval(form, 2)) {
236 sprintf(buf, "R%s", stringval(form, 0));
241 if (!strcmp(form->formname, "mod_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;
249 form->extrastuff = (caddr_t) "mod_list";
250 retfunc = ModifyCallback;
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]);
258 if (boolval(form, 3)) {
259 sprintf(buf, "R%s", stringval(form, 1));
262 argv[1] = stringval(form, 2);
265 sprintf(buf, "Members of list %s:\n", argv[0]);
269 case MM_DEL_ALL_MEMBER:
270 display_error("Not yet implemented.");
274 if (*stringval(form, 0)) {
275 qy = "get_filesys_by_label";
276 argv[0] = stringval(form, 0);
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);
285 qy = "get_filesys_by_machine";
288 } else if (*stringval(form, 3)) {
289 qy = "get_filesys_by_group";
290 argv[0] = stringval(form, 3);
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\\]";
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;
310 form->extrastuff = (caddr_t) "mod_filsys";
311 retfunc = ModifyCallback;
316 case MM_SHOW_FS_ALIAS:
317 case MM_ADD_FS_ALIAS:
318 case MM_DEL_FS_ALIAS:
320 argv[2] = stringval(form, 1);
323 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
324 if (!*stringval(form, 1))
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);
336 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
337 if (!strcmp(form->formname, "mod_nfs")) {
338 qy = "update_nfsphys";
342 form->extrastuff = (caddr_t) "mod_nfs";
343 retfunc = ModifyCallback;
346 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
349 if (!*stringval(form, 0))
351 if (*stringval(form, 1)) {
353 argv[2] = stringval(form, 1);
354 } else if (*stringval(form, 2)) {
356 argv[2] = stringval(form, 2);
357 } else if (!*stringval(form, 0)) {
358 display_error("Must specify something.");
361 qy = "get_quota_by_filesys";
368 StoreHost(form, 0, &argv[0]);
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;
379 StoreHost(form, 0, &argv[0]);
380 form->extrastuff = (caddr_t) "mod_machine";
381 retfunc = ModifyCallback;
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;
392 form->extrastuff = (caddr_t) "mod_cluster";
393 retfunc = ModifyCallback;
396 if (!*stringval(form, 0))
399 StoreHost(form, 0, &argv[0]);
400 if (!*stringval(form, 1))
402 AppendToLog("Cluster mappings:\n");
406 StoreHost(form, 0, &argv[0]);
409 if (!*stringval(form, 1))
413 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
414 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
417 display_error("Not yet implemented.");
419 case MM_PERSISTANT_FORMS:
420 persistant_forms = boolval(form, 0);
421 if (!persistant_forms)
422 XtUnmanageChild(form->formpointer);
427 display_error("Unknown function in form callback.\n");
430 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
432 com_err(program_name, i, " executing database query");
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;
443 switch (form->menu->operation) {
446 qy = strsave(stringval(f, U_MITID));
447 sprintf(stringval(f, U_MITID), "\"%s\"", 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");
453 AppendToLog("Done.\n");
458 AppendToLog("Done.\n");
462 GetKeywords(f, L_ACE_TYPE, "ace_type");
464 AppendToLog("Done.\n");
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\\]");
475 AppendToLog("Done.\n");
479 GetKeywords(f, 1, "mac_type");
481 AppendToLog("Done.\n");
485 f->inputlines[3]->keywords = nfs_states;
487 AppendToLog("Done.\n");
495 case MM_CLEAR_SERVICE:
496 case MM_RESET_SERVICE:
513 case MM_DEL_ALL_MEMBER:
521 case MM_ADD_FS_ALIAS:
522 case MM_DEL_FS_ALIAS:
537 AppendToLog("Done.\n");
540 if (!persistant_forms)
541 XtUnmanageChild(form->formpointer);
554 int (*retfunc)(), argc, i;
557 retfunc = DisplayCallback;
563 switch (m->operation) {
564 case MM_SHOW_MAILLIST:
565 argv[0] = argv[1] = argv[3] = "TRUE";
567 argv[4] = "DONTCARE";
568 AppendToLog("Public Mailinglists:\n");
571 argv[0] = "def_quota";
574 AppendToLog("Services and Hosts with failed updates:\n");
575 argv[0] = argv[2] = "DONTCARE";
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");
581 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
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");
589 case MM_HELP_WILDCARDS:
590 case MM_HELP_AUTHORS:
599 display_error("Unknown function in menu callback.\n");
602 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
604 com_err(program_name, i, " executing database query");
609 /******* temporary ********/
610 display_error(msg) char *msg; { PopupErrorMessage(msg, "Sorry, no help is available"); }