From b2d21e594a41ba709c695ea77334dcaf2b492307 Mon Sep 17 00:00:00 2001 From: mar Date: Wed, 5 Jun 1991 11:10:56 +0000 Subject: [PATCH] *** empty log message *** --- clients/mmoira/Makefile | 9 +- clients/mmoira/display.c | 101 +++++++++++++++---- clients/mmoira/formup.c | 71 ++++++++++---- clients/mmoira/help.c | 25 ++++- clients/mmoira/main.c | 71 +++++++++++--- clients/mmoira/menus.awk | 8 +- clients/mmoira/menus.txt | 203 +++++++++++++++++++++------------------ clients/mmoira/mmoira.h | 20 +++- clients/mmoira/queries.c | 164 ++++++++++++++++++++++++++++--- clients/mmoira/stubs.c | 24 +++-- 10 files changed, 517 insertions(+), 179 deletions(-) diff --git a/clients/mmoira/Makefile b/clients/mmoira/Makefile index 9263f4ae..27104405 100644 --- a/clients/mmoira/Makefile +++ b/clients/mmoira/Makefile @@ -1,11 +1,11 @@ # $Header$ -CFLAGS = -I/mit/motif/include -g -LIBS = -L/mit/motif/$(MACHINE)lib -lMu -lXm -lXt -lX11 \ +CFLAGS = -I/mit/motif/include -g -D_NO_PROTO +LIBS = -L/mit/motif/$(MACHINE)lib -lXm -lXt -lX11 \ -lmoira -lmrgdb -lhesiod -lkrb -ldes -lcom_err OBJS = form_data.o form_setup.o menu_data.o main.o formup.o \ - moira_cb.o help.o + queries.o help.o stubs.o display.o mmoira: $(OBJS) $(CC) -o mmoira $(OBJS) $(LIBS) @@ -15,3 +15,6 @@ form_data.c: forms.txt forms.awk menu_data.c: menus.txt menus.awk awk -f menus.awk menus.txt > menu_data.c + +clean: + rm -f *.o mmoira form_data.c menu_data.c diff --git a/clients/mmoira/display.c b/clients/mmoira/display.c index 83db5e3a..3cc8b424 100644 --- a/clients/mmoira/display.c +++ b/clients/mmoira/display.c @@ -16,6 +16,14 @@ char *atot(s) char *s; { return s; } +static save_info(argc, argv, sq) +int argc; +char **argv; +struct save_queue *sq; +{ + sq_save_args(argc, argv, sq); +} + int DisplayCallback(argc, info, form) int argc; @@ -42,14 +50,14 @@ EntryForm *form; AppendToLog(buf); break; case MM_SHOW_FINGER: - sprintf(buf, "Nickname: %-29s Department: %s\n", info[F_NICKNAME], - info[F_MIT_DEPT]); - AppendToLog(buf); - sprintf(buf, "finger %s =>\n", info[F_NAME]); + sprintf(buf, "Finger information for user %s:\n", info[F_NAME]); AppendToLog(buf); sprintf(buf, "Login name: %-27s In real life: %s\n", info[F_NAME], info[F_FULLNAME]); AppendToLog(buf); + sprintf(buf, "Nickname: %-29s Department: %s\n", info[F_NICKNAME], + info[F_MIT_DEPT]); + AppendToLog(buf); sprintf(buf, "Home: %-33s Home phone: %s\n", info[F_HOME_ADDR], info[F_HOME_PHONE]); AppendToLog(buf); @@ -61,14 +69,15 @@ EntryForm *form; AppendToLog(buf); break; case MM_SHOW_POBOX: - sprintf(buf, "Address: %-10s Box: %-35s Type: %s\n", info[PO_NAME], - info[PO_BOX], info[PO_TYPE]); + sprintf(buf, "Post Office information for user %s:\n", info[PO_NAME]); + AppendToLog(buf); + sprintf(buf, "type: %-8s Box: %s\n", info[PO_TYPE], info[PO_BOX]); AppendToLog(buf); sprintf(buf, MOD_FORMAT, info[4], info[3], info[5]); AppendToLog(buf); break; case MM_SHOW_KRBMAP: - sprintf(buf, "User: %-9s Principal: %s\n", + sprintf(buf, "Kerberos mapping: User %-9s Principal %s\n", info[KMAP_USER], info[KMAP_PRINCIPAL]); AppendToLog(buf); break; @@ -76,7 +85,8 @@ EntryForm *form; case MM_SHOW_FSGROUP: if (!strcmp(info[FS_TYPE], "FSGROUP")) { int stat; -/* struct qelem *elem = NULL; */ + char **argv; + struct save_queue *sq; sprintf(buf,"%20s Filesystem Group: %s\n", " ", info[FS_NAME]); AppendToLog(buf); @@ -87,21 +97,26 @@ EntryForm *form; info[FS_MODWITH]); AppendToLog(buf); AppendToLog("Containing the filesystems (in order):"); -/* - if ((stat = do_moira_query("get_fsgroup_members", 1, &info[FS_NAME], - StoreInfo, (char *)&elem)) != 0) { + + sq = sq_create(); + if ((stat = MoiraQuery("get_fsgroup_members", 1, &info[FS_NAME], + save_info, (char *)sq)) != 0) { if (stat == MR_NO_MATCH) AppendToLog(" [no members]"); else com_err(program_name, stat, NULL); } else { - fsgCount = 1; - Loop(QueueTop(elem), (void *) PrintFSGMembers); - FreeQueue(elem); + while (sq_get_data(sq, &argv)) { + sprintf(buf, " Filesystem: %-32s (sort key: %s)", + info[0], info[1]); + free(argv[0]); + free(argv[1]); + free(argv); + } + sq_destroy(sq); } -*/ } else { - sprintf(buf,"%20s Filesystem: %s\n", " ", info[FS_NAME]); + sprintf(buf,"Filesystem: %s\n", info[FS_NAME]); AppendToLog(buf); sprintf(buf,"Type: %-40s Machine: %-15s\n", info[FS_TYPE], info[FS_MACHINE]); @@ -127,9 +142,8 @@ EntryForm *form; sprintf(buf,"Machine: %-20s Directory: %-15s Device: %s\n", info[NFS_NAME], info[NFS_DIR], info[NFS_DEVICE]); AppendToLog(buf); - sprintf(buf, "Status: %s\n", - format_filesys_type(atoi(info[NFS_STATUS]))); + format_filesys_type(info[NFS_STATUS])); AppendToLog(buf); sprintf(buf, "Quota Allocated: %-17s Size: %s\n", info[NFS_ALLOC], info[NFS_SIZE]); @@ -154,7 +168,7 @@ EntryForm *form; AppendToLog(buf); break; case MM_SHOW_LIST: - (void) sprintf(buf, "%20sList: %s\n", "", info[L_NAME]); + (void) sprintf(buf, "List: %s\n", info[L_NAME]); AppendToLog(buf); (void) sprintf(buf, "Description: %s\n", info[L_DESC]); AppendToLog(buf); @@ -204,6 +218,10 @@ EntryForm *form; info[CD_NAME], info[CD_LABEL], info[CD_DATA]); AppendToLog(buf); break; + case MM_SHOW_MCMAP: + sprintf(buf, "Machine: %-20s Cluster: %s\n", info[0], info[1]); + AppendToLog(buf); + break; case MM_SHOW_MEMBERS: if (argc == 2) sprintf(buf, "%-9s %s\n", info[0], info[1]); @@ -281,6 +299,51 @@ EntryForm *form; sprintf(buf, "%s\n", info[0]); AppendToLog(buf); break; + case MM_SHOW_PCAP: + sprintf(buf, "Printer: %-35s Spool host: %s\n", info[PCAP_NAME], + info[PCAP_SPOOL_HOST]); + AppendToLog(buf); + sprintf(buf, "Spool directory: %-27s Remote Printer Name: %s\n", + info[PCAP_SPOOL_DIR], info[PCAP_RPRINTER]); + AppendToLog(buf); + sprintf(buf, "Authentication: %-3s Price/page: %-3s Quota Server: %s\n", + atoi(info[PCAP_AUTH]) ? "yes" : "no", + info[PCAP_PRICE], info[PCAP_QSERVER]); + AppendToLog(buf); + sprintf(buf, "Comments: %s\n", info[PCAP_COMMENTS]); + AppendToLog(buf); + sprintf(buf, MOD_FORMAT, info[PCAP_MODBY], info[PCAP_MODTIME], + info[PCAP_MODWITH]); + AppendToLog(buf); + break; + case MM_SHOW_ZEPHYR: + sprintf(buf, "Zephyr class: %s\n", info[ZA_CLASS]); + AppendToLog(buf); + if (!strcmp("NONE", info[ZA_XMT_TYPE])) + name[0] = 0; + else + sprintf(name, "Name: %s", info[ZA_XMT_ID]); + sprintf(buf, "XMT ACL Type %s %s\n", info[ZA_XMT_TYPE], name); + AppendToLog(buf); + if (!strcmp("NONE", info[ZA_SUB_TYPE])) + name[0] = 0; + else + sprintf(name, "Name: %s", info[ZA_SUB_ID]); + sprintf(buf, "SUB ACL Type %s %s\n", info[ZA_SUB_TYPE], name); + AppendToLog(buf); + if (!strcmp("NONE", info[ZA_IWS_TYPE])) + name[0] = 0; + else + sprintf(name, "Name: %s", info[ZA_IWS_ID]); + sprintf(buf, "IWS ACL Type %s %s\n", info[ZA_IWS_TYPE], name); + AppendToLog(buf); + if (!strcmp("NONE", info[ZA_IUI_TYPE])) + name[0] = 0; + else + sprintf(name, "Name: %s", info[ZA_IUI_ID]); + sprintf(buf, "IUI ACL Type %s %s\n", info[ZA_IUI_TYPE], name); + AppendToLog(buf); + break; default: for (i = 0; i < argc; i++) { if (i != 0) AppendToLog(", "); diff --git a/clients/mmoira/formup.c b/clients/mmoira/formup.c index 38cc51c1..32bd89b0 100644 --- a/clients/mmoira/formup.c +++ b/clients/mmoira/formup.c @@ -54,15 +54,30 @@ XmAnyCallbackStruct *call_data; } int -button_callback(w, f, call_data) -Widget w; -EntryForm *f; +button_callback(w, client_data, call_data) +Widget w; +EntryForm *client_data; XmAnyCallbackStruct *call_data; { char output[100]; static int mode = 0; - XtUnmanageChild(f->formpointer); +/* sprintf (output, "Button %x was hit...\n", w); + if (mode) { + MakeWatchCursor(toplevel); + MakeWatchCursor(entryformwidget); + mode = 0; + } + else { + MakeNormalCursor(toplevel); + MakeNormalCursor(entryformwidget); + mode = 1; + } + AppendToLog(output); + PopupErrorMessage("Sorry, no functionality here!\nSecond line", "No further help is available"); +*/ + XtUnmanageChild(client_data->formpointer); + } @@ -167,11 +182,12 @@ EntryForm *spec; Widget shellparent; if (spec->formpointer) { - printf ("Form %s already exists\n", spec->formname); UpdateForm(spec); return(spec->formpointer); } + height_so_far = vpad; + #define GETSIZE(foo) n = 0; \ XtSetArg(wargs[n], XtNwidth, &width); n++; \ XtSetArg(wargs[n], XtNheight, &height); n++; \ @@ -205,7 +221,7 @@ EntryForm *spec; XtSetArg(wargs[n], XmNlabelString, label); n++; XtSetArg(wargs[n], XtNx, 0); n++; XtSetArg(wargs[n], XtNy, height_so_far); n++; - instructionW = XtCreateManagedWidget( "title", + instructionW = XtCreateManagedWidget( "instructions", xmLabelWidgetClass, bb, wargs, n); GETSIZE(instructionW); @@ -221,10 +237,10 @@ EntryForm *spec; MakeButtons(bb, &height, &width, spec); STORESIZE; -#ifdef FORMTITLES /* ** Center the title of the form */ +#ifdef FORMTITLES n = 0; XtSetArg(wargs[n], XtNwidth, &width); n++; XtGetValues (titleW, wargs, n); @@ -235,6 +251,16 @@ EntryForm *spec; XtSetArg(wargs[n], XtNx, x); n++; XtSetValues (titleW, wargs, n); #endif + n = 0; + XtSetArg(wargs[n], XtNwidth, &width); n++; + XtGetValues (instructionW, wargs, n); + + x = (width_so_far - width) / 2; + + n = 0; + XtSetArg(wargs[n], XtNx, x); n++; + XtSetValues (instructionW, wargs, n); + return((Widget) bb); } @@ -301,10 +327,10 @@ EntryForm *spec; !(current->insensitive)); n++; switch (current->type) { case FT_STRING: - children[i] = XtCreateManagedWidget( "child", + children[i] = XtCreateManagedWidget( "textwidget", xmTextWidgetClass, parent, wargs, n); - XtAddCallback( children[i], XmNlosingFocusCallback, + XtAddCallback( children[i], XmNvalueChangedCallback, string_callback, current); if (current->returnvalue.stringvalue) { XmTextSetString (children[i], current->returnvalue.stringvalue); @@ -316,7 +342,8 @@ EntryForm *spec; break; case FT_BOOLEAN: - XtSetArg(wargs[n], XmNset, current->returnvalue.booleanvalue); n++; + XtSetArg(wargs[n], XmNset, + current->returnvalue.booleanvalue ? True : False); n++; if (current->returnvalue.booleanvalue) label = XmStringCreate( "(True)", XmSTRING_DEFAULT_CHARSET); @@ -410,8 +437,7 @@ Dimension *pheight; XtSetArg(wargs[n], XmNspacing, 0); n++; if (count > 5) { - printf ("Special case: Asking for %d columns\n",1 + count/5); - XtSetArg(wargs[n], XmNnumColumns, 1 + count / 5); n++; + XtSetArg(wargs[n], XmNnumColumns, 1 + (count-1) / 5); n++; XtSetArg(wargs[n], XmNorientation, XmVERTICAL); n++; XtSetArg(wargs[n], XmNpacking, XmPACK_COLUMN); n++; } @@ -423,7 +449,8 @@ Dimension *pheight; n = 0; label = XmStringCreate(current, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[n], XmNlabelString, label); n++; - if (!strcmp (current, prompt->returnvalue.stringvalue)) { + if ((prompt->returnvalue.stringvalue) && + (!strcmp (current, prompt->returnvalue.stringvalue))) { XtSetArg(wargs[n], XmNset, True); n++; } else { @@ -443,7 +470,7 @@ Dimension *pheight; */ GETSIZE (child); - *pheight = (height * MIN(5, count)); + *pheight = (height * MIN(5, count)) + vpad; return(radioparent); } @@ -531,10 +558,8 @@ XmAnyCallbackStruct *call_data; ** Fortunately, I was smart enough to use the button label as the name ** of the widget, and I can extract it via XtName(). Thanks, Motif! */ - if (strcmp(prompt->returnvalue.stringvalue, XtName(w))) { - printf ("Replacing old value of selection, '%s', with '%s'\n", - prompt->returnvalue.stringvalue, - XtName(w)); + if (prompt->returnvalue.stringvalue && + (strcmp(prompt->returnvalue.stringvalue, XtName(w)))) { strcpy(prompt->returnvalue.stringvalue, XtName(w)); } @@ -580,6 +605,12 @@ XmAnyCallbackStruct *call_data; { MenuItem *itemhit = (MenuItem *) client_data; +/* printf ("menu_callback: item '%s', op %d and string '%s'\n", + itemhit->label, + itemhit->operation, + itemhit->form); + XtManageChild(entryformwidget); +*/ MoiraMenuRequest(itemhit); } @@ -596,10 +627,10 @@ XmAnyCallbackStruct *call_data; newvalue = XmTextGetString(w); if (strcmp(current->returnvalue.stringvalue, newvalue)) { - printf ("Replacing old value of selection, '%s', with '%s'\n", +/* printf ("Replacing old value of selection, '%s', with '%s'\n", current->returnvalue.stringvalue, newvalue); - strcpy(current->returnvalue.stringvalue, newvalue); +*/ strcpy(current->returnvalue.stringvalue, newvalue); } XtFree(newvalue); } diff --git a/clients/mmoira/help.c b/clients/mmoira/help.c index fce5a182..0648820c 100644 --- a/clients/mmoira/help.c +++ b/clients/mmoira/help.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "mmoira.h" @@ -16,10 +17,14 @@ help(node) char *node; { FILE *helpfile = NULL; - char buf[1024], key[32]; + char buf[1024], key[32], *msg, helpbuf[10240], *filename; + char *realloc(), *getenv(); sprintf(key, "*%s\n", node); - helpfile = fopen(HELPFILE, "r"); + filename = getenv("MOIRAHELPFILE"); + if (filename == NULL) + filename = HELPFILE; + helpfile = fopen(filename, "r"); if (helpfile == NULL) { display_error("Sorry, help is currently unavailable.\n"); return; @@ -33,12 +38,24 @@ char *node; fclose(helpfile); return; } + msg = NULL; while (fgets(buf, sizeof(buf), helpfile)) if (buf[0] == '*') break; - else - fprintf(stderr, buf); + else { + if (msg) { + if (!strcmp(buf, "\n")) + strcpy(buf, " \n"); + msg = realloc(msg, strlen(msg) + strlen(buf)); + strcat(msg, buf); + } else + msg = strsave(buf); + } fclose(helpfile); + if (msg) { + PopupHelpWindow(msg); + free(msg); + } return; } diff --git a/clients/mmoira/main.c b/clients/mmoira/main.c index e64ddfce..532827ce 100644 --- a/clients/mmoira/main.c +++ b/clients/mmoira/main.c @@ -17,7 +17,7 @@ extern MenuItem MenuRoot; Widget CreateMenu(), CreateForm(); Widget BuildMenuTree(); -void popup_error_hook(); +void popup_error_hook(), mr_x_input(); Widget toplevel; char *user, *program_name, *moira_server; @@ -27,14 +27,52 @@ int argc; char *argv[]; { Widget button, bboard, menuwidget; - int n; + char *motd; + int n, status; - user = "mar"; - program_name = argv[0]; + if ((user = getlogin()) == NULL) + user = getpwuid((int) getuid())->pw_name; + user = (user && strlen(user)) ? Strsave(user) : ""; + + if ((program_name = rindex(argv[0], '/')) == NULL) + program_name = argv[0]; + else + program_name++; + program_name = Strsave(program_name); + + /* Need to parse command line argument here */ moira_server = ""; - mr_connect(moira_server); - mr_auth("mmoira"); + status = mr_connect(moira_server); + if (status) { + com_err(program_name, status, " connecting to server"); + exit(1); + } + status = mr_motd(&motd); + if (status) { + com_err(program_name, status, " connecting to server"); + exit(1); + } + if (motd) { + fprintf(stderr, "The Moira server is currently unavailable:\n%s\n", + motd); + mr_disconnect(); + exit(1); + } + + status = mr_auth("mmoira"); + if (status == MR_USER_AUTH) { + char buf[BUFSIZ]; + com_err(program_name, status, "\nPress [RETURN] to continue"); + gets(buf); + } else if (status) { + if (status >= ERROR_TABLE_BASE_krb && + status <= ERROR_TABLE_BASE_krb + 256) + com_err(program_name, status, "; authorization failed - please run kinit"); + else + com_err(program_name, status, "; authorization failed"); + exit(1); + } toplevel = XtInitialize("toplevel", "Moira", NULL, 0, &argc, argv); @@ -48,6 +86,8 @@ char *argv[]; XtRealizeWidget(toplevel); set_com_err_hook(popup_error_hook); + mr_set_alternate_input(ConnectionNumber(XtDisplay(toplevel)), + mr_x_input); XtMainLoop(); } @@ -61,17 +101,17 @@ caddr_t data; { int status; - MakeWatchCursor(); + MakeWatchCursor(toplevel); status = mr_query(query, argc, argv, callback, data); if (status != MR_ABORTED && status != MR_NOT_CONNECTED) { - MakeNormalCursor(); + MakeNormalCursor(toplevel); return(status); } status = mr_connect(moira_server); if (status) { com_err(program_name, status, " while re-connecting to server %s", moira_server); - MakeNormalCursor(); + MakeNormalCursor(toplevel); return(MR_ABORTED); } status = mr_auth("mmoira"); @@ -79,11 +119,11 @@ caddr_t data; com_err(program_name, status, " while re-authenticating to server %s", moira_server); mr_disconnect(); - MakeNormalCursor(); + MakeNormalCursor(toplevel); return(MR_ABORTED); } status = mr_query(query, argc, argv, callback, data); - MakeNormalCursor(); + MakeNormalCursor(toplevel); return(status); } @@ -119,3 +159,12 @@ caddr_t arg1, arg2, arg3, arg4, arg5; sprintf(cp, fmt, arg1, arg2, arg3, arg4, arg5); display_error(buf); } + + +void mr_x_input() +{ + XEvent event; + + XtAppNextEvent(_XtDefaultAppContext(), &event); + XtDispatchEvent(&event); +} diff --git a/clients/mmoira/menus.awk b/clients/mmoira/menus.awk index 932c83fd..45e94a36 100644 --- a/clients/mmoira/menus.awk +++ b/clients/mmoira/menus.awk @@ -3,8 +3,7 @@ BEGIN { numfields = 0; nummenus = 0; printf("/* This file is machine generated, do not edit. */"); printf("\n#include \n"); - printf("#include \"data.h\"\n\n"); - printf("#include \"operations.h\"\n\n"); + printf("#include \"mmoira.h\"\n\n"); } /^;/ { next } @@ -31,8 +30,9 @@ $NF == "}" { itemname = $1; for (i = 2; i <= NF && $i != "{"; i++) itemname = sprintf("%s %s", itemname, $i); menuno = nummenus++; - printf("static MenuItem menu%d = { \"%s\", NULL, %s \"%s\" };\n", \ - menuno, itemname, $(i + 1), $(i + 2)); + printf("static MenuItem menu%d = { \"%s\", NULL, %s \"%s\", \"%s\", %d };\n", \ + menuno, itemname, \ + $(i + 1), $(i + 2), $(i + 3), $(i + 4)); save[count++] = menuno; next } diff --git a/clients/mmoira/menus.txt b/clients/mmoira/menus.txt index a86b550f..66f19b64 100644 --- a/clients/mmoira/menus.txt +++ b/clients/mmoira/menus.txt @@ -7,151 +7,164 @@ ; submenu name -= miscellaneous - show database statistics { MM_STATS, 0 } - show active Moira clients { MM_CLIENTS, 0 } - show numeric value { MM_SHOW_VALUE, show_value } - show alias { MM_SHOW_ALIAS, show_alias } += misc + show database statistics { MM_STATS, 0 get_all_table_stats 0 } + show active Moira clients { MM_CLIENTS, 0 _list_users 0 } + show numeric value { MM_SHOW_VALUE, show_value get_value 1 } + show alias { MM_SHOW_ALIAS, show_alias get_alias 3 } = hosts - show { MM_SHOW_HOST, show_host } - add { MM_ADD_HOST, add_host } - modify { MM_MOD_HOST, show_host } - delete { MM_DEL_HOST, show_host } - clear error { MM_CLEAR_HOST, show_host } - reset state { MM_RESET_HOST, show_host } + show { MM_SHOW_HOST, show_host get_server_host_info 2 } + add { MM_ADD_HOST, add_host add_server_host_info 6 } + modify { MM_MOD_HOST, select_host get_server_host_info 2 } + delete { MM_DEL_HOST, select_host delete_server_host_info 2 } + clear error { MM_CLEAR_HOST, select_host reset_server_host_error 2 } + reset state { MM_RESET_HOST, select_host set_server_host_internal 9 } = services - show { MM_SHOW_SERVICE, show_service } - add { MM_ADD_SERVICE, add_service } - modify { MM_MOD_SERVICE, show_service } - delete { MM_DEL_SERVICE, show_service } - clear error { MM_CLEAR_SERVICE, show_service } - reset state { MM_RESET_SERVICE, show_service } - -= server updates - show status { MM_SHOW_DCMM, 0 } - enable/disable { MM_ENABLE_DCM, dcm_enable } - invoke update { MM_TRIGGER_DCM, trigger_dcm } + show { MM_SHOW_SERVICE, show_service get_server_info 1 } + add { MM_ADD_SERVICE, add_service add_server_info 8 } + modify { MM_MOD_SERVICE, select_service get_server_info 1 } + delete { MM_DEL_SERVICE, select_service delete_server_info 1 } + clear error { MM_CLEAR_SERVICE, select_service reset_server_error 1 } + reset state { MM_RESET_SERVICE, select_service set_server_internal_flags 6 } + += updates + show status { MM_SHOW_DCM, 0 qualified_get_server 3 } + enable/disable { MM_ENABLE_DCM, dcm_enable get_value 1 } + invoke update { MM_TRIGGER_DCM, trigger_dcm trigger_dcm 0 } services hosts = zephyr - show { MM_SHOW_ZEPHYR, show_zephyr } - add { MM_ADD_ZEPHYR, add_zephyr } - modify { MM_MOD_ZEPHYR, show_zephyr } - delete { MM_DEL_ZEPHYR, show_zephyr } + show { MM_SHOW_ZEPHYR, show_zephyr get_zephyr_class 1 } + add { MM_ADD_ZEPHYR, add_zephyr add_zephyr_class 9 } + modify { MM_MOD_ZEPHYR, select_zephyr get_zephyr_class 1 } + delete { MM_DEL_ZEPHYR, select_zephyr delete_zephyr_class 1 } = printer - show { MM_SHOW_PCAP, show_printer } - add { MM_ADD_PCAP, add_printer } - modify { MM_MOD_PCAP, show_printer } - delete { MM_DEL_PCAP, show_printer } + show { MM_SHOW_PCAP, show_printer get_printcap_entry 1 } + add { MM_ADD_PCAP, add_printer add_printcap_entry 8 } + modify { MM_MOD_PCAP, select_printer get_printcap_entry 1 } + delete { MM_DEL_PCAP, del_printer delete_printcap_entry 1 } = cluster data - show { MM_SHOW_CLDATA, show_cldata } - add { MM_ADD_CLDATA, add_cldata } - delete { MM_DEL_CLDATA, del_cldata } + show { MM_SHOW_CLDATA, show_cldata get_cluster_data 2 } + add { MM_ADD_CLDATA, add_cldata add_cluster_data 3 } + delete { MM_DEL_CLDATA, del_cldata delete_cluster_data 3 } = cluster mappings - show { MM_SHOW_MCMAP, mcmap } - add { MM_ADD_MCMAP, add_mcmap } - delete { MM_DEL_MCMAP, add_mcmap } + show { MM_SHOW_MCMAP, mcmap get_machine_to_cluster_map 2 } + add { MM_ADD_MCMAP, add_mcmap add_machine_to_cluster 2 } + delete { MM_DEL_MCMAP, del_mcmap delete_machine_from_cluster 2 } = cluster - show { MM_SHOW_CLUSTER, show_cluster } - add { MM_ADD_CLUSTER, add_cluster } - modify { MM_MOD_CLUSTER, show_cluster } - delete { MM_DEL_CLUSTER, show_cluster } + show { MM_SHOW_CLUSTER, show_cluster get_cluster 1 } + add { MM_ADD_CLUSTER, add_cluster add_cluster 3 } + modify { MM_MOD_CLUSTER, select_cluster get_cluster 1 } + delete { MM_DEL_CLUSTER, del_cluster delete_cluster 1 } cluster mappings cluster data = machine - show { MM_SHOW_MACH, show_machine } - add { MM_ADD_MACH, add_machine } - modify { MM_MOD_MACH, show_machine } - delete { MM_DEL_MACH, show_machine } + show { MM_SHOW_MACH, show_machine get_machine 1 } + add { MM_ADD_MACH, add_machine add_machine 2 } + modify { MM_MOD_MACH, select_machine get_machine 1 } + delete { MM_DEL_MACH, del_machine delete_machine 1 } -= list membership - show { MM_SHOW_MEMBERS, show_members } - add { MM_ADD_MEMBER, add_member } - delete { MM_DEL_MEMBER, add_member } - delete a member from all lists { MM_DEL_ALL_MEMBER, del_all_member } += members + show { MM_SHOW_MEMBERS, show_members get_members_of_list 1 } + add { MM_ADD_MEMBER, add_member add_member_to_list 3 } + delete { MM_DEL_MEMBER, del_member delete_member_from_list 3 } + delete a member from all lists { MM_DEL_ALL_MEMBER, del_all_member get_lists_of_member 2 } = list - show { MM_SHOW_LIST, show_list } - show all public mailing lists { MM_SHOW_MAILLIST, 0 } - show all items a list or user can administer { MM_SHOW_ACE_USE, show_ace_use } - add { MM_ADD_LIST, add_list } - modify { MM_MOD_LIST, show_list } - delete { MM_DEL_LIST, show_list } + show { MM_SHOW_LIST, show_list get_list_info 1 } + show all public mailing lists { MM_SHOW_MAILLIST, 0 qualified_get_lists 5 } + show all items a list or user can administer { MM_SHOW_ACE_USE, show_ace_use get_ace_use 2 } + add { MM_ADD_LIST, add_list add_list 10 } + modify { MM_MOD_LIST, select_list get_list_info 1 } + delete { MM_DEL_LIST, del_list delete_list 1 } = quota - show { MM_SHOW_QUOTA, show_quota } - add { MM_ADD_QUOTA, add_quota } - modify { MM_MOD_QUOTA, show_quota } - delete { MM_DEL_QUOTA, show_quota } - show default { MM_SHOW_DQUOTA, 0 } - set default { MM_SET_DQUOTA, set_dquota } + show { MM_SHOW_QUOTA, show_quota get_quota 3 } + add { MM_ADD_QUOTA, add_quota add_quota 4 } + modify { MM_MOD_QUOTA, mod_quota update_quota 4 } + delete { MM_DEL_QUOTA, show_quota delete_quota 3 } + show default { MM_SHOW_DQUOTA, 0 get_value 1 } + set default { MM_SET_DQUOTA, set_dquota set_value 2 } = nfs partition - show { MM_SHOW_NFS, show_nfs } - add { MM_ADD_NFS, add_nfs } - modify { MM_MOD_NFS, show_nfs } - delete { MM_DEL_NFS, del_nfs } + show { MM_SHOW_NFS, show_nfs get_nfsphys 2 } + add { MM_ADD_NFS, add_nfs add_nfsphys 6 } + modify { MM_MOD_NFS, select_nfs get_nfsphys 2 } + delete { MM_DEL_NFS, del_nfs delete_nfsphys 2 } = filesystem alias - show alias { MM_SHOW_FS_ALIAS, show_fs_alias } - add alias { MM_ADD_FS_ALIAS, add_fs_alias } - delete alias { MM_DEL_FS_ALIAS, add_fs_alias } + show alias { MM_SHOW_FS_ALIAS, show_fs_alias get_alias 3 } + add alias { MM_ADD_FS_ALIAS, add_fs_alias add_alias 3 } + delete alias { MM_DEL_FS_ALIAS, del_fs_alias delete_alias 3 } = filesystem group - show { MM_SHOW_FSGROUP, show_fsgroup } - insert { MM_ADD_FSGROUP, add_fsgroup } - re-order { MM_MOV_FSGROUP, add_fsgroup } - remove { MM_DEL_FSGROUP, del_fsgroup } + show { MM_SHOW_FSGROUP, show_fsgroup get_filesys 1 } + insert { MM_ADD_FSGROUP, add_fsgroup add_filesys_to_fsgroup 3 } + re-order { MM_MOV_FSGROUP, order_fsgroup 0 -1 } + remove { MM_DEL_FSGROUP, del_fsgroup remove_filesys_from_fsgroup 2 } = filesystem - show { MM_SHOW_FILSYS, show_filsys } - add { MM_ADD_FILSYS, add_filsys } - modify { MM_MOD_FILSYS, show_filsys } - delete { MM_DEL_FILSYS, del_filsys } - filesystem group + show { MM_SHOW_FILSYS, show_filsys get_filesys_by_label 1 } + add { MM_ADD_FILSYS, add_filsys add_filesys 11 } + modify { MM_MOD_FILSYS, select_filsys get_filesys_by_label 1 } + delete { MM_DEL_FILSYS, del_filsys delete_filesys 1 } +; filesystem group filesystem alias nfs partition = kerberos mapping - show { MM_SHOW_KRBMAP, show_krbmap } - add { MM_ADD_KRBMAP, add_krbmap } - delete { MM_DEL_KRBMAP, add_krbmap } + show { MM_SHOW_KRBMAP, show_krbmap get_kerberos_user_map 2 } + add { MM_ADD_KRBMAP, add_krbmap add_kerberos_user_map 2 } + delete { MM_DEL_KRBMAP, del_krbmap delete_kerberos_user_map 2 } = pobox - show { MM_SHOW_POBOX, select_pobox } - set { MM_SET_POBOX, set_pobox } - delete { MM_DEL_POBOX, select_pobox } + show { MM_SHOW_POBOX, select_pobox get_pobox 1 } + set { MM_SET_POBOX, set_pobox set_pobox 3 } + reset { MM_RESET_POBOX, reset_pobox set_pobox_pop 1 } + delete { MM_DEL_POBOX, del_pobox delete_pobox 1 } = user - show { MM_SHOW_USER, show_user } - add { MM_ADD_USER, add_user } - register { MM_REGISTER, register_user } - modify { MM_MOD_USER, select_user } - deactivate { MM_DEACTIVATE, select_user } - expunge { MM_EXPUNGE, select_user } - show finger info { MM_SHOW_FINGER, select_user } - modify finger info { MM_MOD_FINGER, mod_finger } + show { MM_SHOW_USER, show_user get_user_by_login 1 } + add { MM_ADD_USER, add_user add_user 9 } + register { MM_REGISTER, register_user register_user 3 } + modify { MM_MOD_USER, select_user get_user_by_login 1 } + deactivate { MM_DEACTIVATE, deactivate_user update_user_status 2 } + expunge { MM_EXPUNGE, expunge_user delete_user 1 } + show finger info { MM_SHOW_FINGER, show_finger get_finger_by_login 1 } + modify finger info { MM_MOD_FINGER, select_finger get_finger_by_login 1 } kerberos mapping += help + about moira { MM_HELP_MOIRA, 0 about_moira 0 } + wildcards { MM_HELP_WILDCARDS, 0 wildcards 0 } + reporting bugs { MM_HELP_BUGS, 0, bugs 0 } + authors { MM_HELP_AUTHORS, 0 authors 0 } + += file + save log buffer { MM_SAVE_LOG, save_log 0 0 } + sticky forms { MM_PERSISTANT_FORMS, sticky_forms 0 0 } + quit { MM_QUIT, 0 0 0 } + = toplevel + file user pobox list - list membership + members filesystem quota machine cluster printer zephyr - server updates - miscellaneous - + updates + misc + help diff --git a/clients/mmoira/mmoira.h b/clients/mmoira/mmoira.h index baafcab6..9e63de5f 100644 --- a/clients/mmoira/mmoira.h +++ b/clients/mmoira/mmoira.h @@ -1,5 +1,15 @@ /* $Header$ */ +#include "data.h" + +extern EntryForm *GetAndClearForm(), *GetForm(); +extern char *user, *program_name; +extern char *user_states[], *nfs_states[]; +extern char *StringValue(); +extern int DisplayCallback(); + +#define HELPFILE "/usr/athena/lib/moira.help" + #define MM_STATS 1 #define MM_CLIENTS 2 #define MM_SHOW_VALUE 3 @@ -16,7 +26,7 @@ #define MM_DEL_SERVICE 14 #define MM_CLEAR_SERVICE 15 #define MM_RESET_SERVICE 16 -#define MM_SHOW_DCMM 17 +#define MM_SHOW_DCM 17 #define MM_ENABLE_DCM 18 #define MM_TRIGGER_DCM 19 #define MM_SHOW_ZEPHYR 20 @@ -86,3 +96,11 @@ #define MM_EXPUNGE 84 #define MM_SHOW_FINGER 85 #define MM_MOD_FINGER 86 +#define MM_RESET_POBOX 87 +#define MM_HELP_MOIRA 88 +#define MM_HELP_WILDCARDS 89 +#define MM_HELP_AUTHORS 90 +#define MM_HELP_BUGS 91 +#define MM_SAVE_LOG 92 +#define MM_PERSISTANT_FORMS 93 +#define MM_QUIT 94 diff --git a/clients/mmoira/queries.c b/clients/mmoira/queries.c index deb1f8ce..afcb15c6 100644 --- a/clients/mmoira/queries.c +++ b/clients/mmoira/queries.c @@ -50,6 +50,35 @@ EntryForm *form; fn = "mod_filsys"; count = FS_MODTIME; break; + case MM_MOD_NFS: + f = GetAndClearForm("mod_nfs"); + if (f == NULL) { + display_error("Unknown form in ModifyCallback of mod_nfs\n"); + return; + } + f->extrastuff = form->extrastuff; + f->menu = form->menu; + StoreField(f, 0, argv[0]); + StoreField(f, 1, argv[1]); + StoreField(f, 2, argv[2]); + f->inputlines[3]->keywords = nfs_states; + for (i = 0; nfs_states[i]; i++) + if ((atoi(nfs_states[i]) & ~MR_FS_GROUPQUOTA) == atoi(argv[3])) + StoreField(f, 3, nfs_states[i]); + StoreField(f, 3, argv[3]); + if (atoi(argv[3]) && MR_FS_GROUPQUOTA) + f->inputlines[4]->returnvalue.booleanvalue = 1; + StoreField(f, 5, argv[4]); + StoreField(f, 6, argv[5]); + return; + case MM_MOD_MACH: + fn = "mod_machine"; + count = M_MODTIME; + break; + case MM_MOD_CLUSTER: + fn = "mod_cluster"; + count = C_MODTIME; + break; } if (count > 0) { @@ -80,9 +109,10 @@ MoiraFormComplete(dummy1, form) int dummy1; EntryForm *form; { - char *qy, *argv[32], buf[256]; + char *qy, *argv[32], buf[256], *s; int (*retfunc)(), argc, i; EntryForm *f; + static int persistant_forms = 0; retfunc = DisplayCallback; argc = -1; @@ -139,7 +169,7 @@ EntryForm *form; i = MoiraQuery("get_user_by_name", 2, argv, ModifyCallback, (char *)form); if (i) { - com_err(program_name, i, "looking up user by name"); + com_err(program_name, i, " looking up user by name"); return; } if (form->extrastuff == NULL) { @@ -223,12 +253,17 @@ EntryForm *form; if (!*stringval(form, 0)) { qy = "get_lists_of_member"; argv[0] = stringval(form, 1); + sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[1]); + AppendToLog(buf); if (boolval(form, 3)) { sprintf(buf, "R%s", stringval(form, 1)); argv[0] = buf; } argv[1] = stringval(form, 2); argc = 2; + } else { + sprintf(buf, "Members of list %s:\n", argv[0]); + AppendToLog(buf); } break; case MM_DEL_ALL_MEMBER: @@ -241,7 +276,7 @@ EntryForm *form; argv[0] = stringval(form, 0); argc = 1; } else if (*stringval(form, 1)) { - argv[0] = canonicalize_hostname(stringval(form, 1)); + StoreHost(form, 1, &argv[0]); if (*stringval(form, 2)) { qy = "get_filesys_by_nfsphys"; argv[1] = stringval(form, 2); @@ -257,16 +292,17 @@ EntryForm *form; } break; case MM_ADD_FILSYS: - argv[FS_MACHINE] = canonicalize_hostname(stringval(form, FS_MACHINE)); + StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]); if (!strcmp(stringval(form, FS_TYPE), "AFS") || !strcmp(stringval(form, FS_TYPE), "FSGROUP")) argv[FS_MACHINE] = "\\[NONE\\]"; break; case MM_MOD_FILSYS: if (!strcmp(form->formname, "mod_filsys")) { - qy = "update_filsys"; + qy = "update_filesys"; for (i = 0; i < FS_MODTIME; i++) argv[i + 1] = StringValue(form, i); + StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]); argv[0] = form->extrastuff; argc = FS_MODTIME + 1; break; @@ -274,6 +310,41 @@ EntryForm *form; form->extrastuff = (caddr_t) "mod_filsys"; retfunc = ModifyCallback; break; + case MM_ADD_FSGROUP: + + break; + case MM_SHOW_FS_ALIAS: + case MM_ADD_FS_ALIAS: + case MM_DEL_FS_ALIAS: + argv[1] = "FILESYS"; + argv[2] = stringval(form, 1); + break; + case MM_SHOW_NFS: + StoreHost(form, NFS_NAME, &argv[NFS_NAME]); + if (!*stringval(form, 1)) + argv[1] = "*"; + break; + case MM_ADD_NFS: + StoreHost(form, NFS_NAME, &argv[NFS_NAME]); + sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) + + (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0)); + argv[NFS_STATUS] = buf; + argv[NFS_ALLOC] = stringval(form, 5); + argv[NFS_SIZE] = stringval(form, 6); + break; + case MM_MOD_NFS: + StoreHost(form, NFS_NAME, &argv[NFS_NAME]); + if (!strcmp(form->formname, "mod_nfs")) { + qy = "update_nfsphys"; + argc = NFS_MODTIME; + break; + } + form->extrastuff = (caddr_t) "mod_nfs"; + retfunc = ModifyCallback; + break; + case MM_DEL_NFS: + StoreHost(form, NFS_NAME, &argv[NFS_NAME]); + break; case MM_SHOW_QUOTA: if (!*stringval(form, 0)) argv[0] = "*"; @@ -294,7 +365,7 @@ EntryForm *form; case MM_SHOW_MACH: case MM_ADD_MACH: case MM_DEL_MACH: - argv[0] = canonicalize_hostname(stringval(form, 0)); + StoreHost(form, 0, &argv[0]); break; case MM_MOD_MACH: if (!strcmp(form->formname, "mod_machine")) { @@ -305,11 +376,51 @@ EntryForm *form; argc = M_MODTIME + 1; break; } - argv[0] = canonicalize_hostname(stringval(form, 0)); + StoreHost(form, 0, &argv[0]); form->extrastuff = (caddr_t) "mod_machine"; retfunc = ModifyCallback; break; - + case MM_MOD_CLUSTER: + if (!strcmp(form->formname, "mod_cluster")) { + qy = "update_cluster"; + for (i = 0; i < C_MODTIME; i++) + argv[i + 1] = StringValue(form, i); + argv[0] = form->extrastuff; + argc = C_MODTIME + 1; + break; + } + form->extrastuff = (caddr_t) "mod_cluster"; + retfunc = ModifyCallback; + break; + case MM_SHOW_MCMAP: + if (!*stringval(form, 0)) + argv[0] = "*"; + else + StoreHost(form, 0, &argv[0]); + if (!*stringval(form, 1)) + argv[1] = "*"; + AppendToLog("Cluster mappings:\n"); + break; + case MM_ADD_MCMAP: + case MM_DEL_MCMAP: + StoreHost(form, 0, &argv[0]); + break; + case MM_SHOW_CLDATA: + if (!*stringval(form, 1)) + argv[1] = "*"; + break; + case MM_ADD_PCAP: + StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]); + StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]); + break; + case MM_SAVE_LOG: + display_error("Not yet implemented."); + return; + case MM_PERSISTANT_FORMS: + persistant_forms = boolval(form, 0); + if (!persistant_forms) + XtUnmanageChild(form->formpointer); + return; } if (argc == -1) { @@ -318,7 +429,7 @@ EntryForm *form; } i = MoiraQuery(qy, argc, argv, retfunc, (char *)form); if (i) { - com_err(program_name, i, "executing database query"); + com_err(program_name, i, " executing database query"); return; } @@ -342,6 +453,7 @@ EntryForm *form; AppendToLog("Done.\n"); break; case MM_MOD_FINGER: + case MM_MOD_CLUSTER: if (!f) AppendToLog("Done.\n"); break; @@ -368,6 +480,12 @@ EntryForm *form; else AppendToLog("Done.\n"); break; + case MM_MOD_NFS: + if (f) + f->inputlines[3]->keywords = nfs_states; + else + AppendToLog("Done.\n"); + break; case MM_ADD_HOST: case MM_DEL_HOST: case MM_CLEAR_HOST: @@ -419,6 +537,9 @@ EntryForm *form; AppendToLog("Done.\n"); } + if (!persistant_forms) + XtUnmanageChild(form->formpointer); + if (f) DisplayForm(f); else @@ -444,23 +565,35 @@ MenuItem *m; argv[0] = argv[1] = argv[3] = "TRUE"; argv[2] = "FALSE"; argv[4] = "DONTCARE"; + AppendToLog("Public Mailinglists:\n"); break; case MM_SHOW_DQUOTA: argv[0] = "def_quota"; break; case MM_SHOW_DCM: - AppendToLog("Services and Hosts with failed updates:"); + AppendToLog("Services and Hosts with failed updates:\n"); argv[0] = argv[2] = "DONTCARE"; argv[1] = "TRUE"; i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL); if (i && i != MR_NO_MATCH) - com_err(program_name, i, "executing database query"); - qy = "qualified_get_server_host"; + com_err(program_name, i, " executing database query"); argv[0] = "*"; argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE"; argv[4] = "TRUE"; - argc = 6; - break; + i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL); + if (i && i != MR_NO_MATCH) + com_err(program_name, i, " executing database query"); + AppendToLog("\n"); + return; + case MM_HELP_MOIRA: + case MM_HELP_WILDCARDS: + case MM_HELP_AUTHORS: + case MM_HELP_BUGS: + help(m->query); + return; + case MM_QUIT: + mr_disconnect(); + exit(0); } if (argc == -1) { display_error("Unknown function in menu callback.\n"); @@ -468,7 +601,8 @@ MenuItem *m; } i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy); if (i) - com_err(program_name, i, "executing database query"); + com_err(program_name, i, " executing database query"); + AppendToLog("\n"); } diff --git a/clients/mmoira/stubs.c b/clients/mmoira/stubs.c index bf1c7ee7..d9055c4a 100644 --- a/clients/mmoira/stubs.c +++ b/clients/mmoira/stubs.c @@ -56,10 +56,15 @@ PopupErrorMessage(text, extrahelp) char *text; char *extrahelp; { - Widget child; + static Widget child; Arg wargs[10]; int n; - XmString label; /* !@#$%^ compound string required */ + static XmString label; + + if (label) { + XtFree(label); + XtDestroyWidget(child); + } label = XmStringCreateLtoR( text, XmSTRING_DEFAULT_CHARSET); @@ -89,11 +94,15 @@ void PopupHelpWindow(text) char *text; { - Widget child; + static Widget child; Arg wargs[10]; int n; - XmString label; /* !@#$%^ compound string required */ + static XmString label; + if (label) { + XtFree(label); + XtDestroyWidget(child); + } label = XmStringCreateLtoR( text, XmSTRING_DEFAULT_CHARSET); @@ -180,20 +189,21 @@ EntryForm *spec; case FT_BOOLEAN: n = 0; - XtSetArg(wargs[n], XmNset, current->returnvalue.booleanvalue); n++; + XtSetArg(wargs[n], XmNset, + current->returnvalue.booleanvalue ? True : False); n++; XtSetValues (current->mywidget, wargs, n); break; case FT_KEYWORD: kidcount = ((CompositeRec *)(current->mywidget))-> composite.num_children; - printf ("Keyword field has %d children\n", kidcount); while(kidcount--) { n = 0; kid = ((CompositeRec *)(current->mywidget))-> composite.children[kidcount]; - if (!strcmp (XtName(kid), current->returnvalue.stringvalue)) { + if (current->returnvalue.stringvalue && + (!strcmp (XtName(kid), current->returnvalue.stringvalue))) { XtSetArg(wargs[n], XmNset, True); n++; } -- 2.45.2