]>
Commit | Line | Data |
---|---|---|
c4095074 | 1 | /* $Header$ |
2 | */ | |
3 | ||
4 | #include <stdio.h> | |
5 | #include <moira.h> | |
6 | #include <moira_site.h> | |
7 | #include <sys/types.h> | |
8 | #include <netdb.h> | |
9 | #include <sys/socket.h> | |
10 | #include <netinet/in.h> | |
11 | #include <Xm/Xm.h> | |
12 | #include "mmoira.h" | |
13 | ||
14 | ||
15 | /******* temporary ********/ | |
16 | char *atot(s) char *s; { return s; } | |
17 | ||
18 | ||
19 | ||
20 | int DisplayCallback(argc, info, form) | |
21 | int argc; | |
22 | char **info; | |
23 | EntryForm *form; | |
24 | { | |
25 | char buf[1024], name[128]; | |
26 | char *MOD_FORMAT = "Modified by %s at %s with %s\n"; | |
27 | int i; | |
28 | ||
29 | switch (form->menu->operation) { | |
30 | case MM_SHOW_USER: | |
31 | sprintf(name, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]); | |
32 | sprintf(buf, "Login name: %-20s Full name: %s\n", info[U_NAME], name); | |
33 | add_to_display(buf); | |
34 | sprintf(buf, "User id: %-23s Login shell %-10s Class: %s\n", | |
35 | info[U_UID], info[U_SHELL], info[U_CLASS]); | |
36 | add_to_display(buf); | |
37 | sprintf(buf, "Account is: %-20s Encrypted MIT ID number: %s\n", | |
38 | user_states[atoi(info[U_STATE])], info[U_MITID]); | |
39 | add_to_display(buf); | |
40 | sprintf(buf, MOD_FORMAT, | |
41 | info[U_MODBY], info[U_MODTIME],info[U_MODWITH]); | |
42 | add_to_display(buf); | |
43 | break; | |
44 | case MM_SHOW_FINGER: | |
45 | sprintf(buf, "Nickname: %-29s Department: %s\n", info[F_NICKNAME], | |
46 | info[F_MIT_DEPT]); | |
47 | add_to_display(buf); | |
48 | sprintf(buf, "finger %s =>\n", info[F_NAME]); | |
49 | add_to_display(buf); | |
50 | sprintf(buf, "Login name: %-27s In real life: %s\n", info[F_NAME], | |
51 | info[F_FULLNAME]); | |
52 | add_to_display(buf); | |
53 | sprintf(buf, "Home: %-33s Home phone: %s\n", info[F_HOME_ADDR], | |
54 | info[F_HOME_PHONE]); | |
55 | add_to_display(buf); | |
56 | sprintf(buf, "Office: %-31s Office phone: %s\n", info[F_OFFICE_ADDR], | |
57 | info[F_OFFICE_PHONE]); | |
58 | add_to_display(buf); | |
59 | break; | |
60 | case MM_SHOW_POBOX: | |
61 | sprintf(buf, "Address: %-10s Box: %-35s Type: %s\n", info[PO_NAME], | |
62 | info[PO_BOX], info[PO_TYPE]); | |
63 | add_to_display(buf); | |
64 | sprintf(buf, MOD_FORMAT, info[4], info[3], info[5]); | |
65 | add_to_display(buf); | |
66 | break; | |
67 | case MM_SHOW_KRBMAP: | |
68 | sprintf(buf, "User: %-9s Principal: %s\n", | |
69 | info[KMAP_USER], info[KMAP_PRINCIPAL]); | |
70 | add_to_display(buf); | |
71 | break; | |
72 | case MM_SHOW_FILSYS: | |
73 | case MM_SHOW_FSGROUP: | |
74 | if (!strcmp(info[FS_TYPE], "FSGROUP")) { | |
75 | int stat; | |
76 | /* struct qelem *elem = NULL; */ | |
77 | ||
78 | sprintf(buf,"%20s Filesystem Group: %s\n", " ", info[FS_NAME]); | |
79 | add_to_display(buf); | |
80 | ||
81 | sprintf(buf,"Comments: %s\n",info[FS_COMMENTS]); | |
82 | add_to_display(buf); | |
83 | sprintf(buf, MOD_FORMAT, info[FS_MODBY], info[FS_MODTIME], | |
84 | info[FS_MODWITH]); | |
85 | add_to_display(buf); | |
86 | add_to_display("Containing the filesystems (in order):"); | |
87 | /* | |
88 | if ((stat = do_moira_query("get_fsgroup_members", 1, &info[FS_NAME], | |
89 | StoreInfo, (char *)&elem)) != 0) { | |
90 | if (stat == MR_NO_MATCH) | |
91 | add_to_display(" [no members]"); | |
92 | else | |
93 | com_err(program_name, stat, NULL); | |
94 | } else { | |
95 | fsgCount = 1; | |
96 | Loop(QueueTop(elem), (void *) PrintFSGMembers); | |
97 | FreeQueue(elem); | |
98 | } | |
99 | */ | |
100 | } else { | |
101 | sprintf(buf,"%20s Filesystem: %s\n", " ", info[FS_NAME]); | |
102 | add_to_display(buf); | |
103 | sprintf(buf,"Type: %-40s Machine: %-15s\n", | |
104 | info[FS_TYPE], info[FS_MACHINE]); | |
105 | add_to_display(buf); | |
106 | sprintf(buf,"Default Access: %-2s Packname: %-17s Mountpoint %s \n", | |
107 | info[FS_ACCESS], info[FS_PACK], info[FS_M_POINT]); | |
108 | add_to_display(buf); | |
109 | sprintf(buf,"Comments: %s\n",info[FS_COMMENTS]); | |
110 | add_to_display(buf); | |
111 | sprintf(buf, "User Ownership: %-30s Group Ownership: %s\n", | |
112 | info[FS_OWNER], info[FS_OWNERS]); | |
113 | add_to_display(buf); | |
114 | sprintf(buf, "Auto Create: %-34s Locker Type: %s\n", | |
115 | atoi(info[FS_CREATE]) ? "ON" : "OFF", | |
116 | info[FS_L_TYPE]); | |
117 | add_to_display(buf); | |
118 | sprintf(buf, MOD_FORMAT, info[FS_MODBY], info[FS_MODTIME], | |
119 | info[FS_MODWITH]); | |
120 | add_to_display(buf); | |
121 | } | |
122 | break; | |
123 | case MM_SHOW_NFS: | |
124 | sprintf(buf,"Machine: %-20s Directory: %-15s Device: %s\n", | |
125 | info[NFS_NAME], info[NFS_DIR], info[NFS_DEVICE]); | |
126 | add_to_display(buf); | |
127 | ||
128 | sprintf(buf, "Status: %s\n", | |
129 | format_filesys_type(atoi(info[NFS_STATUS]))); | |
130 | add_to_display(buf); | |
131 | sprintf(buf, "Quota Allocated: %-17s Size: %s\n", | |
132 | info[NFS_ALLOC], info[NFS_SIZE]); | |
133 | add_to_display(buf); | |
134 | sprintf(buf, MOD_FORMAT, info[NFS_MODBY], info[NFS_MODTIME], | |
135 | info[NFS_MODWITH]); | |
136 | add_to_display(buf); | |
137 | break; | |
138 | case MM_SHOW_QUOTA: | |
139 | if (!strcmp(info[Q_TYPE], "ANY")) | |
140 | sprintf(buf, "Filesystem: %s\n", info[Q_FILESYS]); | |
141 | else | |
142 | sprintf(buf, "Filesystem: %-45s %s %s\n", info[Q_FILESYS], | |
143 | info[Q_TYPE], info[Q_NAME]); | |
144 | add_to_display(buf); | |
145 | sprintf(buf, "Machine: %-20s Directory: %-15s\n", | |
146 | info[Q_MACHINE], info[Q_DIRECTORY]); | |
147 | add_to_display(buf); | |
148 | sprintf(buf, "Quota: %s\n", info[Q_QUOTA]); | |
149 | add_to_display(buf); | |
150 | sprintf(buf, MOD_FORMAT, info[Q_MODBY], info[Q_MODTIME], info[Q_MODWITH]); | |
151 | add_to_display(buf); | |
152 | break; | |
153 | case MM_SHOW_LIST: | |
154 | (void) sprintf(buf, "%20sList: %s\n", "", info[L_NAME]); | |
155 | add_to_display(buf); | |
156 | (void) sprintf(buf, "Description: %s\n", info[L_DESC]); | |
157 | add_to_display(buf); | |
158 | if ( atoi(info[L_MAILLIST])) | |
159 | add_to_display("This list is a mailing list.\n"); | |
160 | else | |
161 | add_to_display("This list is NOT a mailing list.\n"); | |
162 | if (atoi(info[L_GROUP])) { | |
163 | (void) sprintf(buf,"This list is a Group and its ID number is %s\n", | |
164 | info[L_GID]); | |
165 | add_to_display(buf); | |
166 | } else | |
167 | add_to_display("This list is NOT a Group.\n"); | |
168 | if (strcmp(info[L_ACE_TYPE],"NONE") == 0) | |
169 | add_to_display("This list has no Administrator, how strange?!\n"); | |
170 | else { | |
171 | sprintf(buf, "The Administrator of this list is the %s: %s\n", | |
172 | info[L_ACE_TYPE], info[L_ACE_NAME]); | |
173 | add_to_display(buf); | |
174 | } | |
175 | (void) sprintf(buf, "This list is: %s, %s, and %s\n", | |
176 | atoi(info[L_ACTIVE]) ? "active" : "inactive", | |
177 | atoi(info[L_PUBLIC]) ? "public" : "private", | |
178 | atoi(info[L_HIDDEN]) ? "hidden" : "visible"); | |
179 | add_to_display(buf); | |
180 | sprintf(buf, MOD_FORMAT, info[L_MODBY], info[L_MODTIME], info[L_MODWITH]); | |
181 | add_to_display(buf); | |
182 | break; | |
183 | case MM_SHOW_MACH: | |
184 | sprintf(buf, "Machine: %-30s Type: %s\n", info[M_NAME], info[M_TYPE]); | |
185 | add_to_display(buf); | |
186 | sprintf(buf, MOD_FORMAT, info[M_MODBY], info[M_MODTIME], info[M_MODWITH]); | |
187 | add_to_display(buf); | |
188 | break; | |
189 | case MM_SHOW_CLUSTER: | |
190 | sprintf(buf, "Cluster: %s\n", info[C_NAME]); | |
191 | add_to_display(buf); | |
192 | sprintf(buf, "Description: %s\n", info[C_DESCRIPT]); | |
193 | add_to_display(buf); | |
194 | sprintf(buf, "Location: %s\n", info[C_LOCATION]); | |
195 | add_to_display(buf); | |
196 | sprintf(buf, MOD_FORMAT, info[C_MODBY], info[C_MODTIME], info[C_MODWITH]); | |
197 | add_to_display(buf); | |
198 | break; | |
199 | case MM_SHOW_CLDATA: | |
200 | sprintf(buf, "Cluster: %-20s Label: %-15s Data: %s\n", | |
201 | info[CD_NAME], info[CD_LABEL], info[CD_DATA]); | |
202 | add_to_display(buf); | |
203 | break; | |
204 | case MM_SHOW_MEMBERS: | |
205 | if (argc == 2) | |
206 | sprintf(buf, "%-9s %s\n", info[0], info[1]); | |
207 | else | |
208 | sprintf(buf, "%s\n", info[0]); | |
209 | add_to_display(buf); | |
210 | break; | |
211 | case MM_STATS: | |
212 | sprintf(buf, "Table: %-20s Modified: %s\n", info[0], info[5]); | |
213 | add_to_display(buf); | |
214 | sprintf(buf, " %-8D appends, %-8d updates, %-8d deletes\n", | |
215 | info[2], info[3], info[4]); | |
216 | add_to_display(buf); | |
217 | break; | |
218 | case MM_CLIENTS: | |
219 | { | |
220 | unsigned long host_address; | |
221 | struct hostent *host_entry; | |
222 | ||
223 | host_address = inet_addr(info[1]); | |
224 | if (host_address != NULL) { | |
225 | host_entry = gethostbyaddr((char *)&host_address, 4, AF_INET); | |
226 | if (host_entry != NULL) { | |
227 | free(info[1]); | |
228 | info[1] = strsave(host_entry->h_name); | |
229 | } | |
230 | } | |
231 | } | |
232 | sprintf(buf, "Principal %s on %s (%s)\n", info[0], info[1], info[2]); | |
233 | add_to_display(buf); | |
234 | sprintf(buf, " Connected at %s, client %s\n", info[3], info[4]); | |
235 | add_to_display(buf); | |
236 | break; | |
237 | case MM_SHOW_VALUE: | |
238 | sprintf(buf, "Variable: %-20s Value: %s\n", stringval(form, 0), | |
239 | info[0]); | |
240 | add_to_display(buf); | |
241 | break; | |
242 | case MM_SHOW_ALIAS: | |
243 | sprintf(buf, "Alias: %-20s Type: %-8s Value: %s\n", | |
244 | info[0], info[1], info[2]); | |
245 | add_to_display(buf); | |
246 | break; | |
247 | case MM_SHOW_HOST: | |
248 | sprintf(buf, "%s:%s mod by %s on %s with %s\n", info[SH_MACHINE], | |
249 | info[SH_SERVICE], info[SH_MODBY], info[SH_MODTIME], | |
250 | info[SH_MODWITH]); | |
251 | Put_message(buf); | |
252 | if (atoi(info[SH_HOSTERROR])) | |
253 | sprintf(name, "Error %d: %s", atoi(info[SH_HOSTERROR]), | |
254 | info[SH_ERRMSG]); | |
255 | else | |
256 | strcpy(name, "No error"); | |
257 | sprintf(buf, " %s/%s/%s/%s/%s\n", | |
258 | atoi(info[SH_ENABLE]) ? "Enabled" : "Disabled", | |
259 | atoi(info[SH_SUCCESS]) ? "Success" : "Failure", | |
260 | atoi(info[SH_INPROGRESS]) ? "InProgress" : "Idle", | |
261 | atoi(info[SH_OVERRIDE]) ? "Override" : "Normal", name); | |
262 | Put_message(buf); | |
263 | Put_message(" Last Try Last Success Value1 Value2 Value3\n"); | |
264 | strcpy(name, atot(info[SH_LASTTRY])); | |
265 | sprintf(buf, " %-20s %-20s %-9d %-9d %s\n", name, | |
266 | atot(info[SH_LASTSUCCESS]), atoi(info[SH_VALUE1]), | |
267 | atoi(info[SH_VALUE2]), info[SH_VALUE3]); | |
268 | Put_message(buf); | |
269 | break; | |
270 | case MM_SHOW_DQUOTA: | |
271 | sprintf(buf, "The default quota is %s Kbytes.\n", info[0]); | |
272 | Put_message(buf); | |
273 | break; | |
274 | case MM_SHOW_DCM: | |
275 | if (argc == 2) | |
276 | sprintf(buf, "%s:%s\n", info[0], info[1]); | |
277 | else | |
278 | sprintf(buf, "%s\n", info[0]); | |
279 | Put_message(buf); | |
280 | break; | |
281 | default: | |
282 | for (i = 0; i < argc; i++) { | |
283 | if (i != 0) add_to_display(", "); | |
284 | add_to_display(info[i]); | |
285 | } | |
286 | add_to_display("\n"); | |
287 | } | |
288 | return(MR_CONT); | |
289 | } | |
290 | ||
291 | ||
292 | /* Called with moira data that is to be modified. */ | |
293 | ||
294 | int ModifyCallback(argc, argv, form) | |
295 | int argc; | |
296 | char **argv; | |
297 | EntryForm *form; | |
298 | { | |
299 | EntryForm *f; | |
300 | char *fn; | |
301 | int count, i, offset; | |
302 | ||
303 | count = -1; | |
304 | offset = 0; | |
305 | switch (form->menu->operation) { | |
306 | case MM_MOD_USER: | |
307 | fn = "mod_user"; | |
308 | count = U_MODTIME; | |
309 | break; | |
310 | case MM_MOD_FINGER: | |
311 | fn = "mod_finger"; | |
312 | count = F_MODTIME - 1; | |
313 | offset = 1; | |
314 | break; | |
315 | case MM_REGISTER: | |
316 | if (form->extrastuff) | |
317 | form->extrastuff = NULL; | |
318 | else | |
319 | form->extrastuff = strsave(argv[U_UID]); | |
320 | return; | |
321 | break; | |
322 | case MM_MOD_LIST: | |
323 | fn = "mod_list"; | |
324 | count = L_MODTIME; | |
325 | break; | |
326 | case MM_MOD_FILSYS: | |
327 | fn = "mod_filsys"; | |
328 | count = FS_MODTIME; | |
329 | break; | |
330 | } | |
331 | ||
332 | if (count > 0) { | |
333 | f = GetAndClearForm(fn); | |
334 | if (f == NULL) { | |
335 | display_error("Unknown form in ModifyCallback!\n"); | |
336 | return; | |
337 | } | |
338 | f->extrastuff = form->extrastuff; | |
339 | f->menu = form->menu; | |
340 | for (i = 0; i < count; i++) | |
341 | if (f->inputlines[i]->type == FT_BOOLEAN) | |
342 | f->inputlines[i]->returnvalue.boolean = | |
343 | strcmp(argv[i + offset], "0") ? 1 : 0; | |
344 | else | |
345 | StoreField(f, i, argv[i + offset]); | |
346 | } else { | |
347 | display_error("Unknown function in ModifyCallback!\n"); | |
348 | return; | |
349 | } | |
350 | } | |
351 | ||
352 | ||
353 | ||
354 | /* callback when form is complete to process the data */ | |
355 | ||
356 | MoiraFormComplete(dummy1, form) | |
357 | int dummy1; | |
358 | EntryForm *form; | |
359 | { | |
360 | char *qy, *argv[32], buf[256]; | |
361 | int (*retfunc)(), argc, i; | |
362 | EntryForm *f; | |
363 | ||
364 | retfunc = DisplayCallback; | |
365 | argc = -1; | |
366 | ||
367 | for (i = 0; form->inputlines[i]; i++) | |
368 | if (form->inputlines[i]->type == FT_BOOLEAN) | |
369 | argv[i] = boolval(form, i) ? "1" : "0"; | |
370 | else | |
371 | argv[i] = stringval(form, i); | |
372 | ||
373 | switch (form->menu->operation) { | |
374 | case MM_SHOW_USER: | |
375 | if (*stringval(form, 0)) { | |
376 | qy = "get_user_by_login"; | |
377 | argv[0] = stringval(form, 0); | |
378 | argc = 1; | |
379 | } else if (*stringval(form, 3)) { | |
380 | qy = "get_user_by_uid"; | |
381 | argv[0] = stringval(form, 3); | |
382 | argc = 1; | |
383 | } else if (*stringval(form, 4)) { | |
384 | qy = "get_user_by_class"; | |
385 | argv[0] = stringval(form, 4); | |
386 | argc = 1; | |
387 | } else if (*stringval(form, 1) == 0 && | |
388 | *stringval(form, 2) == 0) { | |
389 | DisplayError("Must fill in at least one blank."); | |
390 | return; | |
391 | } else { | |
392 | if (*stringval(form, 1) == 0) | |
393 | StoreField(form, 1, "*"); | |
394 | if (*stringval(form, 2) == 0) | |
395 | StoreField(form, 2, "*"); | |
396 | qy = "get_user_by_name"; | |
397 | argv[0] = stringval(form, 1); | |
398 | argv[1] = stringval(form, 2); | |
399 | argc = 2; | |
400 | } | |
401 | break; | |
402 | case MM_ADD_USER: | |
403 | qy = "add_user"; | |
404 | argv[U_STATE][1] = 0; | |
405 | if (argv[U_MITID][0] == '"') | |
406 | strcpy(argv[U_MITID], stringval(form, U_MITID) + 1, | |
407 | strlen(stringval(form, U_MITID) - 2)); | |
408 | else | |
409 | EncryptID(argv[U_MITID], argv[U_MITID], argv[U_FIRST], argv[U_LAST]); | |
410 | argc = U_MODTIME; | |
411 | break; | |
412 | case MM_REGISTER: | |
413 | if (*stringval(form, 2)) { | |
414 | argv[0] = stringval(form, 2); | |
415 | } else { | |
416 | argv[0] = stringval(form, 0); | |
417 | argv[1] = stringval(form, 1); | |
418 | form->extrastuff = NULL; | |
419 | i = MoiraQuery("get_user_by_name", 2, argv, | |
420 | ModifyCallback, (char *)form); | |
421 | if (i) { | |
422 | com_err(program_name, i, "looking up user by name"); | |
423 | return; | |
424 | } | |
425 | if (form->extrastuff == NULL) { | |
426 | display_error("Ambiguous user specification"); | |
427 | return; | |
428 | } | |
429 | argv[0] = (char *)form->extrastuff; | |
430 | } | |
431 | qy = "register_user"; | |
432 | argv[1] = stringval(form, 3); | |
433 | argv[2] = "1"; | |
434 | argc = 3; | |
435 | break; | |
436 | case MM_MOD_USER: | |
437 | if (!strcmp(form->formname, "mod_user")) { | |
438 | qy = "update_user"; | |
439 | for (i = 0; i < U_MODTIME; i++) | |
440 | argv[i + 1] = stringval(form, i); | |
441 | argv[0] = form->extrastuff; | |
442 | argv[U_STATE + 1][1] = 0; | |
443 | if (argv[U_MITID + 1][0] == '"') { | |
444 | strcpy(argv[U_MITID + 1], stringval(form, U_MITID) + 1); | |
445 | stringval(form, U_MITID)[strlen(stringval(form, U_MITID))-1] = 0; | |
446 | } else | |
447 | EncryptID(argv[U_MITID + 1], argv[U_MITID + 1], | |
448 | argv[U_FIRST + 1], argv[U_LAST + 1]); | |
449 | argc = U_MODTIME + 1; | |
450 | break; | |
451 | } | |
452 | qy = "get_user_by_login"; | |
453 | argv[0] = stringval(form, 0); | |
454 | argc = 1; | |
455 | form->extrastuff = (caddr_t) "mod_user"; | |
456 | retfunc = ModifyCallback; | |
457 | break; | |
458 | case MM_DEACTIVATE: | |
459 | qy = "update_user_status"; | |
460 | argv[0] = stringval(form, 0); | |
461 | argv[1] = "3"; | |
462 | argc = 2; | |
463 | break; | |
464 | case MM_EXPUNGE: | |
465 | display_error("Expunge is not yet implemented"); | |
466 | return; | |
467 | break; | |
468 | case MM_SHOW_FINGER: | |
469 | qy = "get_finger_by_login"; | |
470 | argc = 1; | |
471 | break; | |
472 | case MM_MOD_FINGER: | |
473 | if (!strcmp(form->formname, "mod_finger")) { | |
474 | qy = "update_finger_by_login"; | |
475 | for (i = 0; i < F_MODTIME - 1; i++) | |
476 | argv[i + 1] = stringval(form, i); | |
477 | argv[0] = form->extrastuff; | |
478 | argc = F_MODTIME; | |
479 | break; | |
480 | } | |
481 | qy = "get_finger_by_login"; | |
482 | argc = 1; | |
483 | form->extrastuff = (caddr_t) "mod_finger"; | |
484 | retfunc = ModifyCallback; | |
485 | break; | |
486 | case MM_SHOW_KRBMAP: | |
487 | qy = "get_krbmap"; | |
488 | if (!*stringval(form, 0)) | |
489 | argv[0] = "*"; | |
490 | if (!*stringval(form, 1)) | |
491 | argv[1] = "*"; | |
492 | argc = 2; | |
493 | break; | |
494 | case MM_ADD_KRBMAP: | |
495 | qy = "add_krbmap"; | |
496 | argc = 2; | |
497 | break; | |
498 | case MM_DEL_KRBMAP: | |
499 | qy = "delete_krbmap"; | |
500 | argc = 2; | |
501 | break; | |
502 | case MM_SHOW_POBOX: | |
503 | qy = "get_pobox"; | |
504 | argc = 1; | |
505 | break; | |
506 | case MM_SET_POBOX: | |
507 | qy = "set_pobox"; | |
508 | if (!strcmp(argv[1], "POP")) | |
509 | argv[2] = stringval(form, 3); | |
510 | argc = 3; | |
511 | break; | |
512 | case MM_RESET_POBOX: | |
513 | qy = "set_pobox_pop"; | |
514 | argc = 1; | |
515 | break; | |
516 | case MM_DEL_POBOX: | |
517 | qy = "set_pobox"; | |
518 | argv[0] = stringval(form, 0); | |
519 | argv[1] = "NONE"; | |
520 | argv[2] = ""; | |
521 | argc = 3; | |
522 | break; | |
523 | case MM_SHOW_LIST: | |
524 | qy = "get_list_info"; | |
525 | argc = 1; | |
526 | break; | |
527 | case MM_SHOW_ACE_USE: | |
528 | qy = "get_ace_use"; | |
529 | if (boolval(form, 2)) { | |
530 | sprintf(buf, "R%s", stringval(form, 0)); | |
531 | argv[0] = buf; | |
532 | } | |
533 | argc = 2; | |
534 | break; | |
535 | case MM_ADD_LIST: | |
536 | qy = "add_list"; | |
537 | argc = L_MODTIME; | |
538 | break; | |
539 | case MM_MOD_LIST: | |
540 | if (!strcmp(form->formname, "mod_list")) { | |
541 | qy = "update_list"; | |
542 | for (i = 0; i < L_MODTIME; i++) | |
543 | argv[i + 1] = stringval(form, i); | |
544 | argv[0] = form->extrastuff; | |
545 | argc = L_MODTIME + 1; | |
546 | break; | |
547 | } | |
548 | qy = "get_list_info"; | |
549 | argc = 1; | |
550 | form->extrastuff = (caddr_t) "mod_list"; | |
551 | retfunc = ModifyCallback; | |
552 | break; | |
553 | case MM_DEL_LIST: | |
554 | qy = "delete_list"; | |
555 | argc = 1; | |
556 | break; | |
557 | case MM_SHOW_MEMBERS: | |
558 | if (*stringval(form, 0)) { | |
559 | qy = "get_members_of_list"; | |
560 | argc = 1; | |
561 | } else { | |
562 | qy = "get_lists_of_member"; | |
563 | argv[0] = stringval(form, 1); | |
564 | if (boolval(form, 3)) { | |
565 | sprintf(buf, "R%s", stringval(form, 1)); | |
566 | argv[0] = buf; | |
567 | } | |
568 | argv[1] = stringval(form, 2); | |
569 | argc = 2; | |
570 | } | |
571 | break; | |
572 | case MM_ADD_MEMBER: | |
573 | qy = "add_member_to_list"; | |
574 | argc = 3; | |
575 | break; | |
576 | case MM_DEL_MEMBER: | |
577 | qy = "delete_member_from_list"; | |
578 | argc = 3; | |
579 | break; | |
580 | case MM_DEL_ALL_MEMBER: | |
581 | display_error("Not yet implemented."); | |
582 | return; | |
583 | break; | |
584 | case MM_SHOW_FILSYS: | |
585 | if (*stringval(form, 0)) { | |
586 | qy = "get_filesys_by_label"; | |
587 | argv[0] = stringval(form, 0); | |
588 | argc = 1; | |
589 | } else if (*stringval(form, 1)) { | |
590 | argv[0] = canonicalize_hostname(stringval(form, 1)); | |
591 | if (*stringval(form, 2)) { | |
592 | qy = "get_filesys_by_nfsphys"; | |
593 | argv[1] = stringval(form, 2); | |
594 | argc = 2; | |
595 | } else { | |
596 | qy = "get_filesys_by_machine"; | |
597 | argc = 1; | |
598 | } | |
599 | } else if (*stringval(form, 3)) { | |
600 | qy = "get_filesys_by_group"; | |
601 | argv[0] = stringval(form, 3); | |
602 | argc = 1; | |
603 | } | |
604 | break; | |
605 | case MM_ADD_FILSYS: | |
606 | qy = "add_filesys"; | |
607 | argv[FS_MACHINE] = canonicalize_hostname(stringval(form, FS_MACHINE)); | |
608 | if (!strcmp(stringval(form, FS_TYPE), "AFS") || | |
609 | !strcmp(stringval(form, FS_TYPE), "FSGROUP")) | |
610 | argv[FS_MACHINE] = "\\[NONE\\]"; | |
611 | argc = FS_MODTIME; | |
612 | break; | |
613 | case MM_MOD_FILSYS: | |
614 | if (!strcmp(form->formname, "mod_filsys")) { | |
615 | qy = "update_filsys"; | |
616 | for (i = 0; i < FS_MODTIME; i++) | |
617 | argv[i + 1] = stringval(form, i); | |
618 | argv[0] = form->extrastuff; | |
619 | argc = FS_MODTIME + 1; | |
620 | break; | |
621 | } | |
622 | qy = "get_filesys_by_label"; | |
623 | argv[0] = stringval(form, 0); | |
624 | argc = 1; | |
625 | form->extrastuff = (caddr_t) "mod_filsys"; | |
626 | retfunc = ModifyCallback; | |
627 | break; | |
628 | } | |
629 | ||
630 | if (argc == -1) { | |
631 | display_error("Unknown function in form callback.\n"); | |
632 | return; | |
633 | } | |
634 | i = MoiraQuery(qy, argc, argv, retfunc, (char *)form); | |
635 | if (i) { | |
636 | com_err(program_name, i, "executing database query"); | |
637 | return; | |
638 | } | |
639 | ||
640 | f = NULL; | |
641 | if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) { | |
642 | f->extrastuff = (caddr_t) strsave(stringval(form, 0)); | |
643 | f->menu = form->menu; | |
644 | } | |
645 | ||
646 | switch (form->menu->operation) { | |
647 | case MM_MOD_USER: | |
648 | if (f) { | |
649 | qy = strsave(stringval(f, U_MITID)); | |
650 | sprintf(stringval(f, U_MITID), "\"%s\"", qy); | |
651 | free(qy); | |
652 | f->inputlines[U_STATE]->keywords = user_states; | |
653 | StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]); | |
654 | GetKeywords(f, U_CLASS, "class"); | |
655 | } else | |
656 | add_to_display("Done.\n"); | |
657 | break; | |
658 | case MM_MOD_FINGER: | |
659 | if (!f) | |
660 | add_to_display("Done.\n"); | |
661 | break; | |
662 | case MM_MOD_LIST: | |
663 | if (f) | |
664 | GetKeywords(f, L_ACE_TYPE, "ace_type"); | |
665 | else | |
666 | add_to_display("Done.\n"); | |
667 | break; | |
668 | case MM_MOD_FILSYS: | |
669 | if (f) { | |
670 | GetKeywords(f, FS_TYPE, "filesys"); | |
671 | sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE)); | |
672 | GetKeywords(f, FS_ACCESS, buf); | |
673 | GetKeywords(f, FS_L_TYPE, "lockertype"); | |
674 | if (!strcmp(stringval(f, FS_MACHINE), "[NONE]")) | |
675 | StoreField(f, FS_MACHINE, "\\[NONE\\]"); | |
676 | } else | |
677 | add_to_display("Done.\n"); | |
678 | break; | |
679 | case MM_ADD_HOST: | |
680 | case MM_DEL_HOST: | |
681 | case MM_CLEAR_HOST: | |
682 | case MM_RESET_HOST: | |
683 | case MM_ADD_SERVICE: | |
684 | case MM_DEL_SERVICE: | |
685 | case MM_CLEAR_SERVICE: | |
686 | case MM_RESET_SERVICE: | |
687 | case MM_ENABLE_DCM: | |
688 | case MM_TRIGGER_DCM: | |
689 | case MM_ADD_ZEPHYR: | |
690 | case MM_DEL_ZEPHYR: | |
691 | case MM_ADD_PCAP: | |
692 | case MM_DEL_PCAP: | |
693 | case MM_ADD_CLDATA: | |
694 | case MM_DEL_CLDATA: | |
695 | case MM_ADD_MCMAP: | |
696 | case MM_DEL_MCMAP: | |
697 | case MM_ADD_CLUSTER: | |
698 | case MM_DEL_CLUSTER: | |
699 | case MM_ADD_MACH: | |
700 | case MM_DEL_MACH: | |
701 | case MM_ADD_MEMBER: | |
702 | case MM_DEL_MEMBER: | |
703 | case MM_DEL_ALL_MEMBER: | |
704 | case MM_ADD_LIST: | |
705 | case MM_DEL_LIST: | |
706 | case MM_ADD_QUOTA: | |
707 | case MM_DEL_QUOTA: | |
708 | case MM_SET_DQUOTA: | |
709 | case MM_ADD_NFS: | |
710 | case MM_DEL_NFS: | |
711 | case MM_ADD_FS_ALIAS: | |
712 | case MM_DEL_FS_ALIAS: | |
713 | case MM_ADD_FSGROUP: | |
714 | case MM_MOV_FSGROUP: | |
715 | case MM_DEL_FSGROUP: | |
716 | case MM_ADD_FILSYS: | |
717 | case MM_DEL_FILSYS: | |
718 | case MM_ADD_KRBMAP: | |
719 | case MM_DEL_KRBMAP: | |
720 | case MM_SET_POBOX: | |
721 | case MM_DEL_POBOX: | |
722 | case MM_ADD_USER: | |
723 | case MM_REGISTER: | |
724 | case MM_DEACTIVATE: | |
725 | case MM_EXPUNGE: | |
726 | add_to_display("Done.\n"); | |
727 | } | |
728 | ||
729 | if (f) | |
730 | DisplayForm(f); | |
731 | } | |
732 | ||
733 | ||
734 | MoiraMenuComplete(m) | |
735 | MenuItem *m; | |
736 | { | |
737 | char *qy, *argv[32]; | |
738 | int (*retfunc)(), argc, i; | |
739 | EntryForm dummy; | |
740 | ||
741 | retfunc = DisplayCallback; | |
742 | argc = -1; | |
743 | dummy.menu = m; | |
744 | ||
745 | switch (m->operation) { | |
746 | case MM_SHOW_MAILLIST: | |
747 | qy = "qualified_get_lists"; | |
748 | argv[0] = argv[1] = argv[3] = "TRUE"; | |
749 | argv[2] = "FALSE"; | |
750 | argv[4] = "DONTCARE"; | |
751 | argc = 5; | |
752 | break; | |
753 | case MM_SHOW_DQUOTA: | |
754 | qy = "get_value"; | |
755 | argv[0] = "def_quota"; | |
756 | argc = 1; | |
757 | break; | |
758 | case MM_SHOW_DCM: | |
759 | Put_message("Services and Hosts with failed updates:"); | |
760 | argv[0] = argv[2] = "DONTCARE"; | |
761 | argv[1] = "TRUE"; | |
762 | i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL); | |
763 | if (i && i != MR_NO_MATCH) | |
764 | com_err(program_name, i, "executing database query"); | |
765 | qy = "qualified_get_server_host"; | |
766 | argv[0] = "*"; | |
767 | argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE"; | |
768 | argv[4] = "TRUE"; | |
769 | argc = 6; | |
770 | break; | |
771 | case MM_STATS: | |
772 | qy = "get_all_table_stats"; | |
773 | argc = 0; | |
774 | break; | |
775 | case MM_CLIENTS: | |
776 | qy = "_list_users"; | |
777 | argc = 0; | |
778 | break; | |
779 | } | |
780 | if (argc == -1) { | |
781 | display_error("Unknown function in menu callback.\n"); | |
782 | return; | |
783 | } | |
784 | i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy); | |
785 | if (i) | |
786 | com_err(program_name, i, "executing database query"); | |
787 | } | |
788 | ||
789 | ||
790 | /******* temporary ********/ | |
791 | DisplayError(msg) char *msg; { fprintf(stderr, "%s\n", msg); } | |
792 | Put_message(msg) char *msg; { fputs( msg, stderr); } | |
793 | add_to_display(msg) char *msg; { fputs(msg, stderr); } |