# $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)
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
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;
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);
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;
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);
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]);
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]);
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);
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]);
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(", ");
}
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);
+
}
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++; \
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);
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);
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);
}
!(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);
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);
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++;
}
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 {
*/
GETSIZE (child);
- *pheight = (height * MIN(5, count));
+ *pheight = (height * MIN(5, count)) + vpad;
return(radioparent);
}
** 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));
}
{
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);
}
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);
}
#include <mit-copyright.h>
#include <stdio.h>
#include <Xm/Xm.h>
+#include <moira.h>
#include "mmoira.h"
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;
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;
}
Widget CreateMenu(), CreateForm();
Widget BuildMenuTree();
-void popup_error_hook();
+void popup_error_hook(), mr_x_input();
Widget toplevel;
char *user, *program_name, *moira_server;
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);
XtRealizeWidget(toplevel);
set_com_err_hook(popup_error_hook);
+ mr_set_alternate_input(ConnectionNumber(XtDisplay(toplevel)),
+ mr_x_input);
XtMainLoop();
}
{
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");
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);
}
sprintf(cp, fmt, arg1, arg2, arg3, arg4, arg5);
display_error(buf);
}
+
+
+void mr_x_input()
+{
+ XEvent event;
+
+ XtAppNextEvent(_XtDefaultAppContext(), &event);
+ XtDispatchEvent(&event);
+}
BEGIN { numfields = 0; nummenus = 0;
printf("/* This file is machine generated, do not edit. */");
printf("\n#include <Xm/Text.h>\n");
- printf("#include \"data.h\"\n\n");
- printf("#include \"operations.h\"\n\n");
+ printf("#include \"mmoira.h\"\n\n");
}
/^;/ { next }
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
}
; 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
/* $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
#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
#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
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) {
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;
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) {
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:
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);
}
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;
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] = "*";
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")) {
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) {
}
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;
}
AppendToLog("Done.\n");
break;
case MM_MOD_FINGER:
+ case MM_MOD_CLUSTER:
if (!f)
AppendToLog("Done.\n");
break;
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:
AppendToLog("Done.\n");
}
+ if (!persistant_forms)
+ XtUnmanageChild(form->formpointer);
+
if (f)
DisplayForm(f);
else
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");
}
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");
}
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);
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);
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++;
}