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