]>
Commit | Line | Data |
---|---|---|
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> | |
bae3d620 | 11 | #include <X11/IntrinsicP.h> |
12 | #include <X11/CoreP.h> | |
13 | #include <X11/CompositeP.h> | |
83d3aa0c | 14 | #include <Xm/Xm.h> |
15 | #include "mmoira.h" | |
4d9aea5d | 16 | #ifdef GDSS |
17 | #include <des.h> | |
18 | #include <krb.h> | |
19 | #include <gdss.h> | |
20 | #endif /* GDSS */ | |
83d3aa0c | 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: | |
4d9aea5d | 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; | |
83d3aa0c | 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; | |
b2d21e59 | 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++) | |
8f0dfcd4 | 90 | if (atoi(nfs_states[i]) & atoi(argv[3])) |
b2d21e59 | 91 | StoreField(f, 3, nfs_states[i]); |
8f0dfcd4 | 92 | if (atoi(argv[3]) & MR_FS_GROUPQUOTA) |
b2d21e59 | 93 | f->inputlines[4]->returnvalue.booleanvalue = 1; |
8f0dfcd4 | 94 | else |
95 | f->inputlines[4]->returnvalue.booleanvalue = 0; | |
b2d21e59 | 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; | |
83d3aa0c | 107 | } |
108 | ||
109 | if (count > 0) { | |
110 | f = GetAndClearForm(fn); | |
111 | if (f == NULL) { | |
112 | display_error("Unknown form in ModifyCallback!\n"); | |
113 | return; | |
114 | } | |
115 | f->extrastuff = form->extrastuff; | |
116 | f->menu = form->menu; | |
117 | for (i = 0; i < count; i++) | |
118 | if (f->inputlines[i]->type == FT_BOOLEAN) | |
119 | f->inputlines[i]->returnvalue.booleanvalue = | |
120 | strcmp(argv[i + offset], "0") ? 1 : 0; | |
121 | else | |
122 | StoreField(f, i, argv[i + offset]); | |
123 | } else { | |
124 | display_error("Unknown function in ModifyCallback!\n"); | |
125 | return; | |
126 | } | |
127 | } | |
128 | ||
129 | ||
4d9aea5d | 130 | /* Generate a new cryptographic signature for the user record */ |
131 | SignUser(argv, offset) | |
132 | char **argv; | |
133 | int offset; | |
134 | { | |
135 | #ifdef GDSS | |
136 | char buf[256]; | |
137 | SigInfo si; | |
138 | int i; | |
139 | ||
140 | if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) { | |
141 | sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]); | |
142 | si.rawsig = NULL; | |
143 | i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si); | |
144 | /* If it's already signed OK, don't resign it. */ | |
145 | if (i != GDSS_SUCCESS) { | |
146 | free(argv[U_SIGNATURE + offset]); | |
147 | argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2); | |
148 | sign_again: | |
149 | i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]); | |
150 | if (i != GDSS_SUCCESS) | |
151 | com_err(program_name, gdss2et(i), | |
152 | "Failed to create signature"); | |
153 | else { | |
154 | unsigned char newbuf[256]; | |
155 | si.rawsig = newbuf; | |
156 | i = GDSS_Verify(buf, strlen(buf), | |
157 | argv[U_SIGNATURE + offset], &si); | |
158 | if (strlen(newbuf) > 68) { | |
159 | #ifdef DEBUG | |
160 | AppendLog("Signature too long, trying again\n"); | |
161 | #endif /* DEBUG */ | |
162 | goto sign_again; | |
163 | } | |
164 | } | |
165 | #ifdef DEBUG | |
166 | AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]); | |
167 | } else { | |
168 | AppendLog("Don't need to remake signature\n"); | |
169 | #endif /* DEBUG */ | |
170 | } | |
171 | } | |
172 | #else /* GDSS */ | |
173 | argv[U_SIGNATURE + offset] = strsave(""); | |
174 | #endif /* GDSS */ | |
175 | } | |
176 | ||
177 | ||
61fda611 | 178 | /* when OK pressed */ |
83d3aa0c | 179 | |
180 | MoiraFormComplete(dummy1, form) | |
181 | int dummy1; | |
182 | EntryForm *form; | |
61fda611 | 183 | { |
184 | process_form(form, TRUE); | |
185 | } | |
186 | ||
187 | ||
188 | /* when APPLY pressed */ | |
189 | ||
190 | MoiraFormApply(dummy1, form) | |
191 | int dummy1; | |
192 | EntryForm *form; | |
193 | { | |
4d9aea5d | 194 | UserPrompt **p; |
195 | int count; | |
196 | ||
197 | /* undocumented Motif internal routine to advance in tab group. | |
198 | * In this case we're going backwards because for some reason | |
199 | * the form advances whenever this button is pressed. | |
200 | * However, it doesn't seem to go backwards even though source | |
201 | * implies that it should. So we go forward until we wrap. | |
202 | */ | |
203 | count = 0; | |
204 | for (p = form->inputlines; *p; p++) | |
205 | count++; | |
206 | while (count-- > 1) | |
207 | _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP); | |
61fda611 | 208 | process_form(form, FALSE); |
209 | } | |
210 | ||
211 | ||
4d9aea5d | 212 | int CollectData(argc, argv, form) |
213 | int argc; | |
214 | char **argv; | |
215 | EntryForm *form; | |
216 | { | |
217 | struct save_queue *sq; | |
218 | ||
219 | sq = (struct save_queue *) form->extrastuff; | |
220 | sq_save_data(sq, strsave(argv[0])); | |
221 | return(MR_CONT); | |
222 | } | |
223 | ||
224 | ||
61fda611 | 225 | /* callback when form is complete to process the data */ |
226 | ||
227 | process_form(form, remove) | |
228 | EntryForm *form; | |
229 | int remove; | |
83d3aa0c | 230 | { |
4d9aea5d | 231 | char *qy, *argv[32], buf[256], *s, **aargv; |
83d3aa0c | 232 | int (*retfunc)(), argc, i; |
233 | EntryForm *f; | |
234 | ||
235 | retfunc = DisplayCallback; | |
236 | argc = -1; | |
237 | ||
238 | for (i = 0; form->inputlines[i]; i++) | |
892c98b2 | 239 | argv[i] = StringValue(form, i); |
240 | qy = form->menu->query; | |
241 | argc = form->menu->argc; | |
83d3aa0c | 242 | |
243 | switch (form->menu->operation) { | |
244 | case MM_SHOW_USER: | |
245 | if (*stringval(form, 0)) { | |
61fda611 | 246 | qy = "get_user_account_by_login"; |
83d3aa0c | 247 | argv[0] = stringval(form, 0); |
248 | argc = 1; | |
249 | } else if (*stringval(form, 3)) { | |
61fda611 | 250 | qy = "get_user_account_by_uid"; |
83d3aa0c | 251 | argv[0] = stringval(form, 3); |
252 | argc = 1; | |
253 | } else if (*stringval(form, 4)) { | |
61fda611 | 254 | qy = "get_user_account_by_class"; |
83d3aa0c | 255 | argv[0] = stringval(form, 4); |
256 | argc = 1; | |
257 | } else if (*stringval(form, 1) == 0 && | |
258 | *stringval(form, 2) == 0) { | |
892c98b2 | 259 | display_error("Must fill in at least one blank."); |
83d3aa0c | 260 | return; |
261 | } else { | |
262 | if (*stringval(form, 1) == 0) | |
263 | StoreField(form, 1, "*"); | |
264 | if (*stringval(form, 2) == 0) | |
265 | StoreField(form, 2, "*"); | |
61fda611 | 266 | qy = "get_user_account_by_name"; |
83d3aa0c | 267 | argv[0] = stringval(form, 1); |
268 | argv[1] = stringval(form, 2); | |
269 | argc = 2; | |
270 | } | |
271 | break; | |
272 | case MM_ADD_USER: | |
83d3aa0c | 273 | argv[U_STATE][1] = 0; |
4d9aea5d | 274 | argv[U_SECURE] = argv[U_SIGNATURE]; |
275 | SignUser(argv, 0); | |
276 | argc = U_MODTIME; | |
277 | break; | |
278 | case MM_MOD_USER: | |
279 | if (!strcmp(form->formname, "mod_user")) { | |
280 | qy = "update_user_account"; | |
281 | for (i = 0; i < U_SIGNATURE; i++) | |
282 | argv[i + 1] = StringValue(form, i); | |
283 | argv[0] = form->extrastuff; | |
284 | argv[U_STATE + 1][1] = 0; | |
285 | argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name; | |
286 | argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE); | |
287 | if (*argv[U_SECURE + 1] == '1') | |
288 | if (atoi(form->inputlines[U_COMMENT]->keyword_name)) | |
289 | argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name; | |
290 | else { | |
291 | struct timeval tv; | |
292 | char buf[32]; | |
293 | gettimeofday(&tv, NULL); | |
294 | printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec); | |
295 | sprintf(buf, "%ld", tv.tv_sec); | |
296 | argv[U_SECURE + 1] = strsave(buf); | |
297 | } | |
298 | SignUser(argv, 1); | |
299 | argc = U_MODTIME + 1; | |
300 | break; | |
301 | } | |
302 | form->extrastuff = (caddr_t) "mod_user"; | |
303 | retfunc = ModifyCallback; | |
83d3aa0c | 304 | break; |
305 | case MM_REGISTER: | |
306 | if (*stringval(form, 2)) { | |
307 | argv[0] = stringval(form, 2); | |
308 | } else { | |
309 | argv[0] = stringval(form, 0); | |
310 | argv[1] = stringval(form, 1); | |
311 | form->extrastuff = NULL; | |
61fda611 | 312 | i = MoiraQuery("get_user_account_by_name", 2, argv, |
83d3aa0c | 313 | ModifyCallback, (char *)form); |
314 | if (i) { | |
b2d21e59 | 315 | com_err(program_name, i, " looking up user by name"); |
83d3aa0c | 316 | return; |
317 | } | |
318 | if (form->extrastuff == NULL) { | |
319 | display_error("Ambiguous user specification"); | |
320 | return; | |
321 | } | |
322 | argv[0] = (char *)form->extrastuff; | |
323 | } | |
324 | qy = "register_user"; | |
325 | argv[1] = stringval(form, 3); | |
326 | argv[2] = "1"; | |
327 | argc = 3; | |
328 | break; | |
83d3aa0c | 329 | case MM_DEACTIVATE: |
83d3aa0c | 330 | argv[1] = "3"; |
83d3aa0c | 331 | break; |
332 | case MM_EXPUNGE: | |
333 | display_error("Expunge is not yet implemented"); | |
334 | return; | |
335 | break; | |
83d3aa0c | 336 | case MM_MOD_FINGER: |
337 | if (!strcmp(form->formname, "mod_finger")) { | |
338 | qy = "update_finger_by_login"; | |
339 | for (i = 0; i < F_MODTIME - 1; i++) | |
892c98b2 | 340 | argv[i + 1] = StringValue(form, i); |
83d3aa0c | 341 | argv[0] = form->extrastuff; |
342 | argc = F_MODTIME; | |
343 | break; | |
344 | } | |
83d3aa0c | 345 | form->extrastuff = (caddr_t) "mod_finger"; |
346 | retfunc = ModifyCallback; | |
347 | break; | |
348 | case MM_SHOW_KRBMAP: | |
83d3aa0c | 349 | if (!*stringval(form, 0)) |
350 | argv[0] = "*"; | |
351 | if (!*stringval(form, 1)) | |
352 | argv[1] = "*"; | |
83d3aa0c | 353 | break; |
354 | case MM_SET_POBOX: | |
83d3aa0c | 355 | if (!strcmp(argv[1], "POP")) |
356 | argv[2] = stringval(form, 3); | |
83d3aa0c | 357 | break; |
358 | case MM_SHOW_ACE_USE: | |
83d3aa0c | 359 | if (boolval(form, 2)) { |
360 | sprintf(buf, "R%s", stringval(form, 0)); | |
361 | argv[0] = buf; | |
362 | } | |
83d3aa0c | 363 | break; |
364 | case MM_MOD_LIST: | |
365 | if (!strcmp(form->formname, "mod_list")) { | |
366 | qy = "update_list"; | |
367 | for (i = 0; i < L_MODTIME; i++) | |
892c98b2 | 368 | argv[i + 1] = StringValue(form, i); |
83d3aa0c | 369 | argv[0] = form->extrastuff; |
370 | argc = L_MODTIME + 1; | |
371 | break; | |
372 | } | |
83d3aa0c | 373 | form->extrastuff = (caddr_t) "mod_list"; |
374 | retfunc = ModifyCallback; | |
375 | break; | |
83d3aa0c | 376 | case MM_SHOW_MEMBERS: |
892c98b2 | 377 | if (!*stringval(form, 0)) { |
83d3aa0c | 378 | qy = "get_lists_of_member"; |
379 | argv[0] = stringval(form, 1); | |
61fda611 | 380 | sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]); |
b2d21e59 | 381 | AppendToLog(buf); |
83d3aa0c | 382 | if (boolval(form, 3)) { |
383 | sprintf(buf, "R%s", stringval(form, 1)); | |
384 | argv[0] = buf; | |
385 | } | |
386 | argv[1] = stringval(form, 2); | |
387 | argc = 2; | |
b2d21e59 | 388 | } else { |
4d9aea5d | 389 | sprintf(buf, "Members of list: %s\n", argv[0]); |
b2d21e59 | 390 | AppendToLog(buf); |
83d3aa0c | 391 | } |
392 | break; | |
83d3aa0c | 393 | case MM_DEL_ALL_MEMBER: |
4d9aea5d | 394 | form->extrastuff = (caddr_t) sq_create(); |
395 | retfunc = CollectData; | |
83d3aa0c | 396 | break; |
397 | case MM_SHOW_FILSYS: | |
398 | if (*stringval(form, 0)) { | |
399 | qy = "get_filesys_by_label"; | |
400 | argv[0] = stringval(form, 0); | |
401 | argc = 1; | |
402 | } else if (*stringval(form, 1)) { | |
b2d21e59 | 403 | StoreHost(form, 1, &argv[0]); |
83d3aa0c | 404 | if (*stringval(form, 2)) { |
405 | qy = "get_filesys_by_nfsphys"; | |
406 | argv[1] = stringval(form, 2); | |
407 | argc = 2; | |
408 | } else { | |
409 | qy = "get_filesys_by_machine"; | |
410 | argc = 1; | |
411 | } | |
412 | } else if (*stringval(form, 3)) { | |
413 | qy = "get_filesys_by_group"; | |
414 | argv[0] = stringval(form, 3); | |
415 | argc = 1; | |
416 | } | |
4d9aea5d | 417 | /* fall through to */ |
418 | case MM_SHOW_FSGROUP: | |
419 | form->extrastuff = (caddr_t) sq_create(); | |
83d3aa0c | 420 | break; |
421 | case MM_ADD_FILSYS: | |
b2d21e59 | 422 | StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]); |
83d3aa0c | 423 | if (!strcmp(stringval(form, FS_TYPE), "AFS") || |
61fda611 | 424 | !strcmp(stringval(form, FS_TYPE), "FSGROUP") || |
425 | !strcmp(stringval(form, FS_TYPE), "MUL")) | |
83d3aa0c | 426 | argv[FS_MACHINE] = "\\[NONE\\]"; |
83d3aa0c | 427 | break; |
428 | case MM_MOD_FILSYS: | |
429 | if (!strcmp(form->formname, "mod_filsys")) { | |
b2d21e59 | 430 | qy = "update_filesys"; |
83d3aa0c | 431 | for (i = 0; i < FS_MODTIME; i++) |
892c98b2 | 432 | argv[i + 1] = StringValue(form, i); |
b2d21e59 | 433 | StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]); |
83d3aa0c | 434 | argv[0] = form->extrastuff; |
435 | argc = FS_MODTIME + 1; | |
436 | break; | |
437 | } | |
83d3aa0c | 438 | form->extrastuff = (caddr_t) "mod_filsys"; |
439 | retfunc = ModifyCallback; | |
440 | break; | |
bae3d620 | 441 | case MM_MOV_FSGROUP: |
442 | argv[1] = strsave(stringval(form, 1)); | |
443 | s = index(argv[1], ' '); | |
444 | if (s) *s = 0; | |
445 | i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback, | |
446 | (char *)form); | |
447 | if (i) { | |
448 | com_err(program_name, i, " removing filesystem from FS group"); | |
449 | return; | |
450 | } | |
451 | argc = 3; | |
452 | /* fall through to: */ | |
b2d21e59 | 453 | case MM_ADD_FSGROUP: |
bae3d620 | 454 | /* find the two keys to sort between */ |
455 | argv[2] = strsave(argv[2]); | |
456 | s = index(argv[2], ' '); | |
457 | if (s) { | |
458 | argv[2] = s+2; | |
459 | s = index(argv[2], ')'); | |
460 | if (s) *s = 0; | |
461 | } else | |
462 | argv[2] = ""; | |
463 | if (*argv[2] == 0) argv[2] = "A"; | |
464 | /* Finding the after key is gross. We look through the widgets | |
465 | * in the radiobox to find the one selected and the one after | |
466 | * it. The name of the widget is also the member name. | |
467 | */ | |
468 | { | |
469 | Widget w, kid; | |
470 | CompositeRec *cr; | |
471 | ||
472 | argv[3] = ""; | |
473 | cr = (CompositeRec *)form->inputlines[2]->mywidget; | |
474 | for (i = 0; i < cr->composite.num_children; i++) { | |
475 | kid = cr->composite.children[i]; | |
476 | if (!strcmp(XtName(kid), stringval(form, 2))) { | |
477 | i++; | |
478 | if (i < cr->composite.num_children) { | |
479 | argv[3] = strsave(XtName(cr->composite.children[i])); | |
480 | s = index(argv[3], ' '); | |
481 | if (s) { | |
482 | argv[3] = s+2; | |
483 | s = index(argv[3], ')'); | |
484 | if (s) *s = 0; | |
485 | } else | |
486 | argv[3] = ""; | |
487 | } | |
488 | break; | |
489 | } | |
490 | } | |
491 | } | |
492 | if (*argv[3] == 0) argv[3] = "Z"; | |
493 | #ifdef DEBUG | |
494 | printf("Got before key of \"%s\" and after key of \"%s\"\n", | |
495 | argv[2], argv[3]); | |
496 | #endif /* DEBUG */ | |
497 | /* copy the matching chars */ | |
498 | for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++) | |
499 | *s++ = *argv[2]++; | |
500 | /* and set the last char */ | |
501 | if (*argv[2] == 0) | |
502 | *argv[2] = i = 'A'; | |
503 | else | |
504 | i = argv[2][1]; | |
505 | if (i == 0) i = 'A'; | |
506 | if (*argv[3] == 0) *argv[3] = 'Z'; | |
507 | if (*argv[3] - *argv[2] > 1) { | |
508 | *s++ = (*argv[3] + *argv[2])/2; | |
509 | } else { | |
510 | *s++ = *argv[2]; | |
511 | *s++ = (i + 'Z')/2; | |
512 | } | |
513 | *s = 0; | |
514 | argv[2] = strsave(buf); | |
515 | break; | |
516 | case MM_DEL_FSGROUP: | |
517 | argv[1] = strsave(stringval(form, 1)); | |
518 | s = index(argv[1], ' '); | |
519 | if (s) *s = 0; | |
b2d21e59 | 520 | break; |
521 | case MM_SHOW_FS_ALIAS: | |
522 | case MM_ADD_FS_ALIAS: | |
523 | case MM_DEL_FS_ALIAS: | |
524 | argv[1] = "FILESYS"; | |
525 | argv[2] = stringval(form, 1); | |
526 | break; | |
527 | case MM_SHOW_NFS: | |
528 | StoreHost(form, NFS_NAME, &argv[NFS_NAME]); | |
529 | if (!*stringval(form, 1)) | |
530 | argv[1] = "*"; | |
531 | break; | |
532 | case MM_ADD_NFS: | |
533 | StoreHost(form, NFS_NAME, &argv[NFS_NAME]); | |
534 | sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) + | |
535 | (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0)); | |
536 | argv[NFS_STATUS] = buf; | |
537 | argv[NFS_ALLOC] = stringval(form, 5); | |
538 | argv[NFS_SIZE] = stringval(form, 6); | |
539 | break; | |
540 | case MM_MOD_NFS: | |
541 | StoreHost(form, NFS_NAME, &argv[NFS_NAME]); | |
542 | if (!strcmp(form->formname, "mod_nfs")) { | |
543 | qy = "update_nfsphys"; | |
544 | argc = NFS_MODTIME; | |
8f0dfcd4 | 545 | StoreHost(form, NFS_NAME, &argv[NFS_NAME]); |
546 | sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) + | |
547 | (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0)); | |
548 | argv[NFS_STATUS] = buf; | |
549 | argv[NFS_ALLOC] = stringval(form, 5); | |
550 | argv[NFS_SIZE] = stringval(form, 6); | |
b2d21e59 | 551 | break; |
552 | } | |
553 | form->extrastuff = (caddr_t) "mod_nfs"; | |
554 | retfunc = ModifyCallback; | |
555 | break; | |
556 | case MM_DEL_NFS: | |
557 | StoreHost(form, NFS_NAME, &argv[NFS_NAME]); | |
558 | break; | |
892c98b2 | 559 | case MM_SHOW_QUOTA: |
560 | if (!*stringval(form, 0)) | |
561 | argv[0] = "*"; | |
562 | if (*stringval(form, 1)) { | |
563 | argv[1] = "USER"; | |
564 | argv[2] = stringval(form, 1); | |
565 | } else if (*stringval(form, 2)) { | |
566 | argv[1] = "GROUP"; | |
567 | argv[2] = stringval(form, 2); | |
568 | } else if (!*stringval(form, 0)) { | |
569 | display_error("Must specify something."); | |
570 | return; | |
571 | } else { | |
572 | qy = "get_quota_by_filesys"; | |
573 | argc = 1; | |
574 | } | |
575 | break; | |
576 | case MM_SHOW_MACH: | |
577 | case MM_ADD_MACH: | |
578 | case MM_DEL_MACH: | |
b2d21e59 | 579 | StoreHost(form, 0, &argv[0]); |
892c98b2 | 580 | break; |
581 | case MM_MOD_MACH: | |
582 | if (!strcmp(form->formname, "mod_machine")) { | |
583 | qy = "update_machine"; | |
584 | for (i = 0; i < M_MODTIME; i++) | |
585 | argv[i + 1] = StringValue(form, i); | |
586 | argv[0] = form->extrastuff; | |
587 | argc = M_MODTIME + 1; | |
588 | break; | |
589 | } | |
b2d21e59 | 590 | StoreHost(form, 0, &argv[0]); |
892c98b2 | 591 | form->extrastuff = (caddr_t) "mod_machine"; |
592 | retfunc = ModifyCallback; | |
593 | break; | |
b2d21e59 | 594 | case MM_MOD_CLUSTER: |
595 | if (!strcmp(form->formname, "mod_cluster")) { | |
596 | qy = "update_cluster"; | |
597 | for (i = 0; i < C_MODTIME; i++) | |
598 | argv[i + 1] = StringValue(form, i); | |
599 | argv[0] = form->extrastuff; | |
600 | argc = C_MODTIME + 1; | |
601 | break; | |
602 | } | |
603 | form->extrastuff = (caddr_t) "mod_cluster"; | |
604 | retfunc = ModifyCallback; | |
605 | break; | |
606 | case MM_SHOW_MCMAP: | |
607 | if (!*stringval(form, 0)) | |
608 | argv[0] = "*"; | |
609 | else | |
610 | StoreHost(form, 0, &argv[0]); | |
611 | if (!*stringval(form, 1)) | |
612 | argv[1] = "*"; | |
613 | AppendToLog("Cluster mappings:\n"); | |
614 | break; | |
615 | case MM_ADD_MCMAP: | |
616 | case MM_DEL_MCMAP: | |
617 | StoreHost(form, 0, &argv[0]); | |
618 | break; | |
619 | case MM_SHOW_CLDATA: | |
620 | if (!*stringval(form, 1)) | |
621 | argv[1] = "*"; | |
622 | break; | |
623 | case MM_ADD_PCAP: | |
624 | StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]); | |
625 | StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]); | |
626 | break; | |
627 | case MM_SAVE_LOG: | |
61fda611 | 628 | if (!write_log_to_file(stringval(form, 0)) && remove) |
b2d21e59 | 629 | XtUnmanageChild(form->formpointer); |
630 | return; | |
61fda611 | 631 | case MM_NEW_VALUE: |
632 | argv[0] = form->extrastuff; | |
633 | argv[1] = "TYPE"; | |
634 | argv[2] = StringValue(form, 0); | |
635 | for (s = argv[2]; *s; s++) | |
636 | if (islower(*s)) *s = toupper(*s); | |
637 | break; | |
83d3aa0c | 638 | } |
639 | ||
640 | if (argc == -1) { | |
641 | display_error("Unknown function in form callback.\n"); | |
642 | return; | |
643 | } | |
644 | i = MoiraQuery(qy, argc, argv, retfunc, (char *)form); | |
645 | if (i) { | |
b2d21e59 | 646 | com_err(program_name, i, " executing database query"); |
83d3aa0c | 647 | return; |
648 | } | |
649 | ||
650 | f = NULL; | |
651 | if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) { | |
4d9aea5d | 652 | if (form->formpointer) |
653 | XtUnmanageChild(form->formpointer); | |
83d3aa0c | 654 | f->extrastuff = (caddr_t) strsave(stringval(form, 0)); |
655 | f->menu = form->menu; | |
656 | } | |
657 | ||
658 | switch (form->menu->operation) { | |
659 | case MM_MOD_USER: | |
660 | if (f) { | |
83d3aa0c | 661 | f->inputlines[U_STATE]->keywords = user_states; |
662 | StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]); | |
663 | GetKeywords(f, U_CLASS, "class"); | |
664 | } else | |
665 | AppendToLog("Done.\n"); | |
666 | break; | |
667 | case MM_MOD_FINGER: | |
b2d21e59 | 668 | case MM_MOD_CLUSTER: |
83d3aa0c | 669 | if (!f) |
670 | AppendToLog("Done.\n"); | |
671 | break; | |
672 | case MM_MOD_LIST: | |
61fda611 | 673 | if (f) { |
674 | GetKeywords(f, L_ACE_TYPE, "ace_type"); | |
675 | f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged; | |
676 | f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged; | |
677 | } else | |
83d3aa0c | 678 | AppendToLog("Done.\n"); |
679 | break; | |
680 | case MM_MOD_FILSYS: | |
681 | if (f) { | |
682 | GetKeywords(f, FS_TYPE, "filesys"); | |
683 | sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE)); | |
684 | GetKeywords(f, FS_ACCESS, buf); | |
685 | GetKeywords(f, FS_L_TYPE, "lockertype"); | |
686 | if (!strcmp(stringval(f, FS_MACHINE), "[NONE]")) | |
687 | StoreField(f, FS_MACHINE, "\\[NONE\\]"); | |
61fda611 | 688 | f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged; |
83d3aa0c | 689 | } else |
690 | AppendToLog("Done.\n"); | |
691 | break; | |
892c98b2 | 692 | case MM_MOD_MACH: |
693 | if (f) | |
694 | GetKeywords(f, 1, "mac_type"); | |
695 | else | |
696 | AppendToLog("Done.\n"); | |
697 | break; | |
b2d21e59 | 698 | case MM_MOD_NFS: |
699 | if (f) | |
700 | f->inputlines[3]->keywords = nfs_states; | |
701 | else | |
702 | AppendToLog("Done.\n"); | |
703 | break; | |
4d9aea5d | 704 | case MM_DEL_ALL_MEMBER: |
705 | argv[1] = StringValue(form, 0); | |
706 | argv[2] = StringValue(form, 1); | |
707 | while (sq_get_data(form->extrastuff, &(argv[0]))) { | |
708 | sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0), | |
709 | StringValue(form, 1), argv[0]); | |
710 | if (!boolval(form, 2) || | |
8f0dfcd4 | 711 | AskQuestion(buf, "confirm_del_all")) { |
4d9aea5d | 712 | i = MoiraQuery("delete_member_from_list", 3, argv, |
713 | DisplayCallback, NULL); | |
714 | if (i) | |
715 | com_err(program_name, i, " while removing member from list"); | |
716 | else { | |
717 | sprintf(buf, "Member %s %s removed from list %s.\n", | |
718 | argv[1], argv[2], argv[0]); | |
719 | AppendToLog(buf); | |
720 | } | |
721 | } | |
722 | free(argv[0]); | |
723 | } | |
724 | AppendToLog("Done.\n"); | |
725 | break; | |
726 | case MM_SHOW_FILSYS: | |
727 | case MM_SHOW_FSGROUP: | |
728 | while (sq_get_data(form->extrastuff, &aargv)) { | |
729 | ShowFilsys(aargv); | |
730 | } | |
731 | sq_destroy(form->extrastuff); | |
732 | break; | |
83d3aa0c | 733 | case MM_ADD_HOST: |
734 | case MM_DEL_HOST: | |
735 | case MM_CLEAR_HOST: | |
736 | case MM_RESET_HOST: | |
737 | case MM_ADD_SERVICE: | |
738 | case MM_DEL_SERVICE: | |
739 | case MM_CLEAR_SERVICE: | |
740 | case MM_RESET_SERVICE: | |
741 | case MM_ENABLE_DCM: | |
742 | case MM_TRIGGER_DCM: | |
743 | case MM_ADD_ZEPHYR: | |
744 | case MM_DEL_ZEPHYR: | |
745 | case MM_ADD_PCAP: | |
746 | case MM_DEL_PCAP: | |
747 | case MM_ADD_CLDATA: | |
748 | case MM_DEL_CLDATA: | |
749 | case MM_ADD_MCMAP: | |
750 | case MM_DEL_MCMAP: | |
751 | case MM_ADD_CLUSTER: | |
752 | case MM_DEL_CLUSTER: | |
753 | case MM_ADD_MACH: | |
754 | case MM_DEL_MACH: | |
755 | case MM_ADD_MEMBER: | |
756 | case MM_DEL_MEMBER: | |
83d3aa0c | 757 | case MM_ADD_LIST: |
758 | case MM_DEL_LIST: | |
759 | case MM_ADD_QUOTA: | |
760 | case MM_DEL_QUOTA: | |
761 | case MM_SET_DQUOTA: | |
762 | case MM_ADD_NFS: | |
763 | case MM_DEL_NFS: | |
764 | case MM_ADD_FS_ALIAS: | |
765 | case MM_DEL_FS_ALIAS: | |
766 | case MM_ADD_FSGROUP: | |
767 | case MM_MOV_FSGROUP: | |
768 | case MM_DEL_FSGROUP: | |
769 | case MM_ADD_FILSYS: | |
770 | case MM_DEL_FILSYS: | |
771 | case MM_ADD_KRBMAP: | |
772 | case MM_DEL_KRBMAP: | |
773 | case MM_SET_POBOX: | |
774 | case MM_DEL_POBOX: | |
775 | case MM_ADD_USER: | |
776 | case MM_REGISTER: | |
777 | case MM_DEACTIVATE: | |
778 | case MM_EXPUNGE: | |
892c98b2 | 779 | case MM_RESET_POBOX: |
83d3aa0c | 780 | AppendToLog("Done.\n"); |
61fda611 | 781 | break; |
782 | case MM_NEW_VALUE: | |
783 | CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel, | |
784 | form->extrastuff, StringValue(form, 0)); | |
83d3aa0c | 785 | } |
786 | ||
4d9aea5d | 787 | if (remove && form->formpointer) |
b2d21e59 | 788 | XtUnmanageChild(form->formpointer); |
789 | ||
83d3aa0c | 790 | if (f) |
791 | DisplayForm(f); | |
892c98b2 | 792 | else |
793 | AppendToLog("\n"); | |
83d3aa0c | 794 | } |
795 | ||
796 | ||
797 | MoiraMenuComplete(m) | |
798 | MenuItem *m; | |
799 | { | |
800 | char *qy, *argv[32]; | |
801 | int (*retfunc)(), argc, i; | |
802 | EntryForm dummy; | |
803 | ||
804 | retfunc = DisplayCallback; | |
805 | argc = -1; | |
806 | dummy.menu = m; | |
892c98b2 | 807 | qy = m->query; |
808 | argc = m->argc; | |
83d3aa0c | 809 | |
810 | switch (m->operation) { | |
811 | case MM_SHOW_MAILLIST: | |
83d3aa0c | 812 | argv[0] = argv[1] = argv[3] = "TRUE"; |
813 | argv[2] = "FALSE"; | |
814 | argv[4] = "DONTCARE"; | |
b2d21e59 | 815 | AppendToLog("Public Mailinglists:\n"); |
83d3aa0c | 816 | break; |
817 | case MM_SHOW_DQUOTA: | |
83d3aa0c | 818 | argv[0] = "def_quota"; |
83d3aa0c | 819 | break; |
820 | case MM_SHOW_DCM: | |
b2d21e59 | 821 | AppendToLog("Services and Hosts with failed updates:\n"); |
83d3aa0c | 822 | argv[0] = argv[2] = "DONTCARE"; |
823 | argv[1] = "TRUE"; | |
824 | i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL); | |
825 | if (i && i != MR_NO_MATCH) | |
b2d21e59 | 826 | com_err(program_name, i, " executing database query"); |
83d3aa0c | 827 | argv[0] = "*"; |
828 | argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE"; | |
829 | argv[4] = "TRUE"; | |
b2d21e59 | 830 | i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL); |
831 | if (i && i != MR_NO_MATCH) | |
832 | com_err(program_name, i, " executing database query"); | |
833 | AppendToLog("\n"); | |
834 | return; | |
835 | case MM_HELP_MOIRA: | |
836 | case MM_HELP_WILDCARDS: | |
837 | case MM_HELP_AUTHORS: | |
838 | case MM_HELP_BUGS: | |
8f0dfcd4 | 839 | case MM_HELP_MOUSE: |
840 | case MM_HELP_KEYBOARD: | |
b2d21e59 | 841 | help(m->query); |
842 | return; | |
843 | case MM_QUIT: | |
844 | mr_disconnect(); | |
845 | exit(0); | |
83d3aa0c | 846 | } |
847 | if (argc == -1) { | |
848 | display_error("Unknown function in menu callback.\n"); | |
849 | return; | |
850 | } | |
851 | i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy); | |
852 | if (i) | |
b2d21e59 | 853 | com_err(program_name, i, " executing database query"); |
854 | AppendToLog("\n"); | |
83d3aa0c | 855 | } |