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