]> andersk Git - moira.git/blame_incremental - clients/moira/namespace.c
deal with new get_pobox output
[moira.git] / clients / moira / namespace.c
... / ...
CommitLineData
1/* $Id$
2 *
3 * This is the file main.c for the Moira Client, which allows users
4 * to quickly and easily maintain most parts of the Moira database.
5 * It Contains: The main driver for the Moira Client.
6 *
7 * Created: 4/12/88
8 * By: Chris D. Peterson
9 *
10 * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
11 * For copying and distribution information, please see the file
12 * <mit-copyright.h>.
13 */
14
15#include <mit-copyright.h>
16#include <moira.h>
17#include "defs.h"
18#include "f_defs.h"
19#include "globals.h"
20
21#include <signal.h>
22#include <stdio.h>
23#include <string.h>
24
25#include <krb.h>
26
27RCSID("$Header$");
28
29static void ErrorExit(char *buf, int status);
30static void Usage(void);
31static void Signal_Handler(void);
32static void CatchInterrupt(void);
33int NewListHelp(int argc, char **argv);
34
35char *whoami; /* used by menu.c ugh!!! */
36char *moira_server;
37int interrupt = 0;
38
39/*
40 * List Information Menu
41 */
42
43Menu list_info_menu = {
44 NULLFUNC,
45 NULLFUNC,
46 "List Information Menu",
47 3,
48 {
49 SIMPLEFUNC("member", "Show all lists to which a given member belongs",
50 ListByMember),
51 SIMPLEFUNC("admin", "Show all items which a given member can administer",
52 ListByAdministrator),
53 SIMPLEFUNC("public", "Show all public mailing lists",
54 ListAllPublicMailLists),
55 }
56};
57
58/*
59 * List Member Menu
60 */
61
62Menu list_member_menu = {
63 ListmaintMemberMenuEntry,
64 ListmaintMemberMenuExit,
65 NULL,
66 4,
67 {
68 SIMPLEFUNC("add", "Add a member to this list", AddMember),
69 SIMPLEFUNC("remove", "Remove a member from this list", DeleteMember),
70 SIMPLEFUNC("show", "Show the members of this list", ListAllMembers),
71 SIMPLEFUNC("verbose", "Toggle Verbosity of Delete", ToggleVerboseMode)
72 }
73};
74
75/*
76 * List Menu
77 */
78
79Menu list_menu = {
80 NULLFUNC,
81 NULLFUNC,
82 "List Menu",
83 6,
84 {
85 { ShowListInfo, NULLMENU, 2, {
86 {"show", "Display information about a list"},
87 {"list name", "Name of list: "}
88 } },
89 { UpdateList, NULLMENU, 2, {
90 {"update", "Update characteristics of a list"},
91 {"list name", "Name of list: "}
92 } },
93 SIMPLEFUNC("query_remove",
94 "Interactively remove a member from all lists",
95 InterRemoveItemFromLists),
96 { NULLFUNC, &list_member_menu, 2, {
97 {"members", "Member Menu - Change/Show Members of a List."},
98 {"list name", "Name of list: "}
99 } },
100 SUBMENU("lists", "Find Mailing Lists Menu",
101 &list_info_menu),
102 SIMPLEFUNC("help", "Print Help", NewListHelp)
103 }
104};
105
106/*
107 * Post Office Box Menu
108 */
109
110Menu pobox_menu = {
111 NULLFUNC,
112 NULLFUNC,
113 "Mail Forwarding Menu",
114 3,
115 {
116 {GetUserPOBox, NULLMENU, 2, {
117 {"show", "Show a user's post office box"},
118 {"user name", "user name: "}
119 } },
120 {SetUserPOBox, NULLMENU, 2, {
121 {"set", "Set a user's post office box (mail forwarding)"},
122 {"user name", "user name: "}
123 } },
124 {RemoveUserPOBox, NULLMENU, 2, {
125 {"remove", "Remove a user's post office box"},
126 {"user name", "user name: "}
127 } },
128 }
129};
130
131/*
132 * Miscellaneous Menu
133 */
134
135Menu misc_menu = {
136 NULLFUNC,
137 NULLFUNC,
138 "Miscellaneous Menu",
139 2,
140 {
141 SIMPLEFUNC("statistics", "Show database statistics", TableStats),
142 SIMPLEFUNC("clients", "Show active Moira clients", ShowClients),
143 }
144};
145
146
147Menu namespace_menu = {
148 NULLFUNC,
149 NULLFUNC,
150 "Campus Namespace Database Manipulation",
151 4,
152 {
153 SUBMENU("mail", "Mail Forwarding", &pobox_menu),
154 SUBMENU("list", "Mailing Lists", &list_menu),
155 {ShowUserByLogin, NULLMENU, 2, {
156 {"account", "Show user account information"},
157 {"login name", "Desired login name: "}
158 } },
159 SUBMENU("misc", "Miscellaneous", &misc_menu)
160 }
161};
162
163#ifdef HAVE_CURSES
164Bool use_menu = TRUE; /* whether or not we are using a menu. */
165#endif
166
167/* Function Name: main
168 * Description: The main driver for the Moira Client.
169 * Arguments: argc, argv - standard command line args.
170 * Returns: doesn't return.
171 */
172
173int main(int argc, char **argv)
174{
175 int status;
176 Menu *menu;
177 char *motd, **arg;
178 char pname[ANAME_SZ];
179 struct sigaction act;
180
181 if (!(program_name = strrchr(argv[0], '/')))
182 program_name = argv[0];
183 else
184 program_name++;
185 program_name = strdup(program_name);
186 whoami = strdup(program_name); /* used by menu.c, ugh !!! */
187
188 verbose = TRUE;
189 arg = argv;
190 moira_server = NULL;
191
192 while (++arg - argv < argc)
193 {
194 if (**arg == '-')
195 {
196 if (!strcmp(*arg, "-nomenu"))
197 {
198#ifdef HAVE_CURSES
199 use_menu = FALSE;
200#else
201 ;
202#endif
203 }
204 else if (!strcmp(*arg, "-menu"))
205 {
206#ifdef HAVE_CURSES
207 use_menu = TRUE;
208#else
209 fprintf(stderr, "%s: No curses support. -menu option ignored\n",
210 whoami);
211#endif
212 }
213 else if (!strcmp(*arg, "-db"))
214 if (arg - argv < argc - 1)
215 {
216 ++arg;
217 moira_server = *arg;
218 }
219 else
220 Usage();
221 else
222 Usage();
223 }
224 }
225
226 if ((status = mr_connect(moira_server)))
227 ErrorExit("\nConnection to Moira server failed", status);
228
229 /* do this now since calling mr_connect initialized the krb error table
230 * for us.
231 */
232 if ((status = tf_init(TKT_FILE, R_TKT_FIL)) ||
233 (status = tf_get_pname(pname)))
234 {
235 com_err(whoami, status, "cannot find your ticket file");
236 exit(1);
237 }
238 tf_close();
239 user = strdup(pname);
240
241 if ((status = mr_motd(&motd)))
242 ErrorExit("\nUnable to check server status", status);
243 if (motd)
244 {
245 fprintf(stderr, "The Moira server is currently unavailable:\n%s\n",
246 motd);
247 mr_disconnect();
248 exit(1);
249 }
250
251 if ((status = mr_auth(program_name)))
252 {
253 if (status == MR_USER_AUTH)
254 {
255 char buf[BUFSIZ];
256 com_err(program_name, status, "\nPress [RETURN] to continue");
257 fgets(buf, BUFSIZ, stdin);
258 }
259 else
260 ErrorExit("\nAuthorization failed -- please run kinit", status);
261 }
262
263 /*
264 * These signals should not be set until just before we fire up the menu
265 * system.
266 */
267
268 sigemptyset(&act.sa_mask);
269 act.sa_flags = 0;
270 act.sa_handler = Signal_Handler;
271 sigaction(SIGHUP, &act, NULL);
272 sigaction(SIGQUIT, &act, NULL);
273#ifdef HAVE_CURSES
274 if (use_menu)
275 sigaction(SIGINT, &act, NULL);
276 else
277#endif
278 {
279 act.sa_handler = CatchInterrupt;
280 sigaction(SIGINT, &act, NULL);
281 }
282
283 menu = &namespace_menu;
284
285#ifdef HAVE_CURSES
286 if (use_menu) /* Start menus that execute program */
287 {
288 Start_paging();
289 Start_menu(menu);
290 Stop_paging();
291 }
292 else /* Start program without menus. */
293#endif
294 Start_no_menu(menu);
295
296 mr_disconnect();
297 exit(0);
298}
299
300/* Function Name: ErrorExit
301 * Description: This function does the error handling and exits.
302 * Arguments: buf - the error message to print.
303 * status - the error code.
304 * Returns: doesn't return.
305 */
306
307static void ErrorExit(char *buf, int status)
308{
309 com_err(program_name, status, buf);
310 mr_disconnect();
311 exit(1);
312}
313
314/* Function Name: usage
315 * Description: Prints usage info and then exits.
316 * Arguments: none
317 * Returns: doesn't return.
318 */
319
320static void Usage(void)
321{
322 fprintf(stderr, "Usage: %s [-nomenu]\n", program_name);
323 exit(1);
324}
325
326/* Function Name: Signal_Handler
327 * Description: This function cleans up from a signal interrupt.
328 * Arguments: none.
329 * Returns: doesn't
330 */
331
332static void Signal_Handler(void)
333{
334 Put_message("Signal caught - exiting");
335#ifdef HAVE_CURSES
336 if (use_menu)
337 Cleanup_menu();
338#endif
339 mr_disconnect();
340 exit(1);
341}
342
343
344static void CatchInterrupt(void)
345{
346 Put_message("Interrupt! Press RETURN to continue");
347 interrupt = 1;
348}
349
350
351/* Dummy routine to be able to link against the rest of the moira client */
352
353int DeleteUser(int argc, char **argv)
354{
355 return DM_QUIT;
356}
357
358
359int NewListHelp(int argc, char **argv)
360{
361 static char *message[] = {
362 "A list can be a mailing list, an Athena group list, or both. Each",
363 "list has an owner and members. The owner of a list may be the list",
364 "itself, another list, or a user. The members of a list can be users",
365 "(login names), other lists, or foreign address strings. You can use",
366 "certain keys to do the following:",
367 " Refresh the screen - Type ctrl-L.",
368 " Escape from a function - Type ctrl-C.",
369 NULL,
370 };
371
372 return PrintHelp(message);
373}
This page took 0.079932 seconds and 5 git commands to generate.