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