6 #include <moira_site.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
15 /******* temporary ********/
16 char *atot(s) char *s; { return s; }
20 int DisplayCallback(argc, info, form)
25 char buf[1024], name[128];
26 char *MOD_FORMAT = "Modified by %s at %s with %s\n";
29 switch (form->menu->operation) {
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);
34 sprintf(buf, "User id: %-23s Login shell %-10s Class: %s\n",
35 info[U_UID], info[U_SHELL], info[U_CLASS]);
37 sprintf(buf, "Account is: %-20s Encrypted MIT ID number: %s\n",
38 user_states[atoi(info[U_STATE])], info[U_MITID]);
40 sprintf(buf, MOD_FORMAT,
41 info[U_MODBY], info[U_MODTIME],info[U_MODWITH]);
45 sprintf(buf, "Nickname: %-29s Department: %s\n", info[F_NICKNAME],
48 sprintf(buf, "finger %s =>\n", info[F_NAME]);
50 sprintf(buf, "Login name: %-27s In real life: %s\n", info[F_NAME],
53 sprintf(buf, "Home: %-33s Home phone: %s\n", info[F_HOME_ADDR],
56 sprintf(buf, "Office: %-31s Office phone: %s\n", info[F_OFFICE_ADDR],
57 info[F_OFFICE_PHONE]);
61 sprintf(buf, "Address: %-10s Box: %-35s Type: %s\n", info[PO_NAME],
62 info[PO_BOX], info[PO_TYPE]);
64 sprintf(buf, MOD_FORMAT, info[4], info[3], info[5]);
68 sprintf(buf, "User: %-9s Principal: %s\n",
69 info[KMAP_USER], info[KMAP_PRINCIPAL]);
74 if (!strcmp(info[FS_TYPE], "FSGROUP")) {
76 /* struct qelem *elem = NULL; */
78 sprintf(buf,"%20s Filesystem Group: %s\n", " ", info[FS_NAME]);
81 sprintf(buf,"Comments: %s\n",info[FS_COMMENTS]);
83 sprintf(buf, MOD_FORMAT, info[FS_MODBY], info[FS_MODTIME],
86 add_to_display("Containing the filesystems (in order):");
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]");
93 com_err(program_name, stat, NULL);
96 Loop(QueueTop(elem), (void *) PrintFSGMembers);
101 sprintf(buf,"%20s Filesystem: %s\n", " ", info[FS_NAME]);
103 sprintf(buf,"Type: %-40s Machine: %-15s\n",
104 info[FS_TYPE], info[FS_MACHINE]);
106 sprintf(buf,"Default Access: %-2s Packname: %-17s Mountpoint %s \n",
107 info[FS_ACCESS], info[FS_PACK], info[FS_M_POINT]);
109 sprintf(buf,"Comments: %s\n",info[FS_COMMENTS]);
111 sprintf(buf, "User Ownership: %-30s Group Ownership: %s\n",
112 info[FS_OWNER], info[FS_OWNERS]);
114 sprintf(buf, "Auto Create: %-34s Locker Type: %s\n",
115 atoi(info[FS_CREATE]) ? "ON" : "OFF",
118 sprintf(buf, MOD_FORMAT, info[FS_MODBY], info[FS_MODTIME],
124 sprintf(buf,"Machine: %-20s Directory: %-15s Device: %s\n",
125 info[NFS_NAME], info[NFS_DIR], info[NFS_DEVICE]);
128 sprintf(buf, "Status: %s\n",
129 format_filesys_type(atoi(info[NFS_STATUS])));
131 sprintf(buf, "Quota Allocated: %-17s Size: %s\n",
132 info[NFS_ALLOC], info[NFS_SIZE]);
134 sprintf(buf, MOD_FORMAT, info[NFS_MODBY], info[NFS_MODTIME],
139 if (!strcmp(info[Q_TYPE], "ANY"))
140 sprintf(buf, "Filesystem: %s\n", info[Q_FILESYS]);
142 sprintf(buf, "Filesystem: %-45s %s %s\n", info[Q_FILESYS],
143 info[Q_TYPE], info[Q_NAME]);
145 sprintf(buf, "Machine: %-20s Directory: %-15s\n",
146 info[Q_MACHINE], info[Q_DIRECTORY]);
148 sprintf(buf, "Quota: %s\n", info[Q_QUOTA]);
150 sprintf(buf, MOD_FORMAT, info[Q_MODBY], info[Q_MODTIME], info[Q_MODWITH]);
154 (void) sprintf(buf, "%20sList: %s\n", "", info[L_NAME]);
156 (void) sprintf(buf, "Description: %s\n", info[L_DESC]);
158 if ( atoi(info[L_MAILLIST]))
159 add_to_display("This list is a mailing list.\n");
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",
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");
171 sprintf(buf, "The Administrator of this list is the %s: %s\n",
172 info[L_ACE_TYPE], info[L_ACE_NAME]);
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");
180 sprintf(buf, MOD_FORMAT, info[L_MODBY], info[L_MODTIME], info[L_MODWITH]);
184 sprintf(buf, "Machine: %-30s Type: %s\n", info[M_NAME], info[M_TYPE]);
186 sprintf(buf, MOD_FORMAT, info[M_MODBY], info[M_MODTIME], info[M_MODWITH]);
189 case MM_SHOW_CLUSTER:
190 sprintf(buf, "Cluster: %s\n", info[C_NAME]);
192 sprintf(buf, "Description: %s\n", info[C_DESCRIPT]);
194 sprintf(buf, "Location: %s\n", info[C_LOCATION]);
196 sprintf(buf, MOD_FORMAT, info[C_MODBY], info[C_MODTIME], info[C_MODWITH]);
200 sprintf(buf, "Cluster: %-20s Label: %-15s Data: %s\n",
201 info[CD_NAME], info[CD_LABEL], info[CD_DATA]);
204 case MM_SHOW_MEMBERS:
206 sprintf(buf, "%-9s %s\n", info[0], info[1]);
208 sprintf(buf, "%s\n", info[0]);
212 sprintf(buf, "Table: %-20s Modified: %s\n", info[0], info[5]);
214 sprintf(buf, " %-8D appends, %-8d updates, %-8d deletes\n",
215 info[2], info[3], info[4]);
220 unsigned long host_address;
221 struct hostent *host_entry;
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) {
228 info[1] = strsave(host_entry->h_name);
232 sprintf(buf, "Principal %s on %s (%s)\n", info[0], info[1], info[2]);
234 sprintf(buf, " Connected at %s, client %s\n", info[3], info[4]);
238 sprintf(buf, "Variable: %-20s Value: %s\n", stringval(form, 0),
243 sprintf(buf, "Alias: %-20s Type: %-8s Value: %s\n",
244 info[0], info[1], info[2]);
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],
252 if (atoi(info[SH_HOSTERROR]))
253 sprintf(name, "Error %d: %s", atoi(info[SH_HOSTERROR]),
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);
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]);
271 sprintf(buf, "The default quota is %s Kbytes.\n", info[0]);
276 sprintf(buf, "%s:%s\n", info[0], info[1]);
278 sprintf(buf, "%s\n", info[0]);
282 for (i = 0; i < argc; i++) {
283 if (i != 0) add_to_display(", ");
284 add_to_display(info[i]);
286 add_to_display("\n");
292 /* Called with moira data that is to be modified. */
294 int ModifyCallback(argc, argv, form)
301 int count, i, offset;
305 switch (form->menu->operation) {
312 count = F_MODTIME - 1;
316 if (form->extrastuff)
317 form->extrastuff = NULL;
319 form->extrastuff = strsave(argv[U_UID]);
333 f = GetAndClearForm(fn);
335 display_error("Unknown form in ModifyCallback!\n");
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;
345 StoreField(f, i, argv[i + offset]);
347 display_error("Unknown function in ModifyCallback!\n");
354 /* callback when form is complete to process the data */
356 MoiraFormComplete(dummy1, form)
360 char *qy, *argv[32], buf[256];
361 int (*retfunc)(), argc, i;
364 retfunc = DisplayCallback;
367 for (i = 0; form->inputlines[i]; i++)
368 if (form->inputlines[i]->type == FT_BOOLEAN)
369 argv[i] = boolval(form, i) ? "1" : "0";
371 argv[i] = stringval(form, i);
373 switch (form->menu->operation) {
375 if (*stringval(form, 0)) {
376 qy = "get_user_by_login";
377 argv[0] = stringval(form, 0);
379 } else if (*stringval(form, 3)) {
380 qy = "get_user_by_uid";
381 argv[0] = stringval(form, 3);
383 } else if (*stringval(form, 4)) {
384 qy = "get_user_by_class";
385 argv[0] = stringval(form, 4);
387 } else if (*stringval(form, 1) == 0 &&
388 *stringval(form, 2) == 0) {
389 DisplayError("Must fill in at least one blank.");
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);
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));
409 EncryptID(argv[U_MITID], argv[U_MITID], argv[U_FIRST], argv[U_LAST]);
413 if (*stringval(form, 2)) {
414 argv[0] = stringval(form, 2);
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);
422 com_err(program_name, i, "looking up user by name");
425 if (form->extrastuff == NULL) {
426 display_error("Ambiguous user specification");
429 argv[0] = (char *)form->extrastuff;
431 qy = "register_user";
432 argv[1] = stringval(form, 3);
437 if (!strcmp(form->formname, "mod_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;
447 EncryptID(argv[U_MITID + 1], argv[U_MITID + 1],
448 argv[U_FIRST + 1], argv[U_LAST + 1]);
449 argc = U_MODTIME + 1;
452 qy = "get_user_by_login";
453 argv[0] = stringval(form, 0);
455 form->extrastuff = (caddr_t) "mod_user";
456 retfunc = ModifyCallback;
459 qy = "update_user_status";
460 argv[0] = stringval(form, 0);
465 display_error("Expunge is not yet implemented");
469 qy = "get_finger_by_login";
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;
481 qy = "get_finger_by_login";
483 form->extrastuff = (caddr_t) "mod_finger";
484 retfunc = ModifyCallback;
488 if (!*stringval(form, 0))
490 if (!*stringval(form, 1))
499 qy = "delete_krbmap";
508 if (!strcmp(argv[1], "POP"))
509 argv[2] = stringval(form, 3);
513 qy = "set_pobox_pop";
518 argv[0] = stringval(form, 0);
524 qy = "get_list_info";
527 case MM_SHOW_ACE_USE:
529 if (boolval(form, 2)) {
530 sprintf(buf, "R%s", stringval(form, 0));
540 if (!strcmp(form->formname, "mod_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;
548 qy = "get_list_info";
550 form->extrastuff = (caddr_t) "mod_list";
551 retfunc = ModifyCallback;
557 case MM_SHOW_MEMBERS:
558 if (*stringval(form, 0)) {
559 qy = "get_members_of_list";
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));
568 argv[1] = stringval(form, 2);
573 qy = "add_member_to_list";
577 qy = "delete_member_from_list";
580 case MM_DEL_ALL_MEMBER:
581 display_error("Not yet implemented.");
585 if (*stringval(form, 0)) {
586 qy = "get_filesys_by_label";
587 argv[0] = stringval(form, 0);
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);
596 qy = "get_filesys_by_machine";
599 } else if (*stringval(form, 3)) {
600 qy = "get_filesys_by_group";
601 argv[0] = stringval(form, 3);
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\\]";
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;
622 qy = "get_filesys_by_label";
623 argv[0] = stringval(form, 0);
625 form->extrastuff = (caddr_t) "mod_filsys";
626 retfunc = ModifyCallback;
631 display_error("Unknown function in form callback.\n");
634 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
636 com_err(program_name, i, "executing database query");
641 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
642 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
643 f->menu = form->menu;
646 switch (form->menu->operation) {
649 qy = strsave(stringval(f, U_MITID));
650 sprintf(stringval(f, U_MITID), "\"%s\"", 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");
656 add_to_display("Done.\n");
660 add_to_display("Done.\n");
664 GetKeywords(f, L_ACE_TYPE, "ace_type");
666 add_to_display("Done.\n");
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\\]");
677 add_to_display("Done.\n");
685 case MM_CLEAR_SERVICE:
686 case MM_RESET_SERVICE:
703 case MM_DEL_ALL_MEMBER:
711 case MM_ADD_FS_ALIAS:
712 case MM_DEL_FS_ALIAS:
726 add_to_display("Done.\n");
738 int (*retfunc)(), argc, i;
741 retfunc = DisplayCallback;
745 switch (m->operation) {
746 case MM_SHOW_MAILLIST:
747 qy = "qualified_get_lists";
748 argv[0] = argv[1] = argv[3] = "TRUE";
750 argv[4] = "DONTCARE";
755 argv[0] = "def_quota";
759 Put_message("Services and Hosts with failed updates:");
760 argv[0] = argv[2] = "DONTCARE";
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";
767 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
772 qy = "get_all_table_stats";
781 display_error("Unknown function in menu callback.\n");
784 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
786 com_err(program_name, i, "executing database query");
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); }