6 #include <moira_site.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
15 /* Called with moira data that is to be modified. */
17 int ModifyCallback(argc, argv, form)
28 switch (form->menu->operation) {
35 count = F_MODTIME - 1;
40 form->extrastuff = NULL;
42 form->extrastuff = strsave(argv[U_UID]);
56 f = GetAndClearForm(fn);
58 display_error("Unknown form in ModifyCallback!\n");
61 f->extrastuff = form->extrastuff;
63 for (i = 0; i < count; i++)
64 if (f->inputlines[i]->type == FT_BOOLEAN)
65 f->inputlines[i]->returnvalue.booleanvalue =
66 strcmp(argv[i + offset], "0") ? 1 : 0;
68 StoreField(f, i, argv[i + offset]);
70 display_error("Unknown function in ModifyCallback!\n");
77 /* callback when form is complete to process the data */
79 MoiraFormComplete(dummy1, form)
83 char *qy, *argv[32], buf[256];
84 int (*retfunc)(), argc, i;
87 retfunc = DisplayCallback;
90 for (i = 0; form->inputlines[i]; i++)
91 argv[i] = StringValue(form, i);
92 qy = form->menu->query;
93 argc = form->menu->argc;
95 switch (form->menu->operation) {
97 if (*stringval(form, 0)) {
98 qy = "get_user_by_login";
99 argv[0] = stringval(form, 0);
101 } else if (*stringval(form, 3)) {
102 qy = "get_user_by_uid";
103 argv[0] = stringval(form, 3);
105 } else if (*stringval(form, 4)) {
106 qy = "get_user_by_class";
107 argv[0] = stringval(form, 4);
109 } else if (*stringval(form, 1) == 0 &&
110 *stringval(form, 2) == 0) {
111 display_error("Must fill in at least one blank.");
114 if (*stringval(form, 1) == 0)
115 StoreField(form, 1, "*");
116 if (*stringval(form, 2) == 0)
117 StoreField(form, 2, "*");
118 qy = "get_user_by_name";
119 argv[0] = stringval(form, 1);
120 argv[1] = stringval(form, 2);
125 argv[U_STATE][1] = 0;
126 if (argv[U_MITID][0] == '"')
127 strcpy(argv[U_MITID], stringval(form, U_MITID) + 1,
128 strlen(stringval(form, U_MITID) - 2));
130 EncryptID(argv[U_MITID], argv[U_MITID], argv[U_FIRST], argv[U_LAST]);
133 if (*stringval(form, 2)) {
134 argv[0] = stringval(form, 2);
136 argv[0] = stringval(form, 0);
137 argv[1] = stringval(form, 1);
138 form->extrastuff = NULL;
139 i = MoiraQuery("get_user_by_name", 2, argv,
140 ModifyCallback, (char *)form);
142 com_err(program_name, i, "looking up user by name");
145 if (form->extrastuff == NULL) {
146 display_error("Ambiguous user specification");
149 argv[0] = (char *)form->extrastuff;
151 qy = "register_user";
152 argv[1] = stringval(form, 3);
157 if (!strcmp(form->formname, "mod_user")) {
159 for (i = 0; i < U_MODTIME; i++)
160 argv[i + 1] = StringValue(form, i);
161 argv[0] = form->extrastuff;
162 argv[U_STATE + 1][1] = 0;
163 if (argv[U_MITID + 1][0] == '"') {
164 strcpy(argv[U_MITID + 1], stringval(form, U_MITID) + 1);
165 stringval(form, U_MITID)[strlen(stringval(form, U_MITID))-1] = 0;
167 EncryptID(argv[U_MITID + 1], argv[U_MITID + 1],
168 argv[U_FIRST + 1], argv[U_LAST + 1]);
169 argc = U_MODTIME + 1;
172 form->extrastuff = (caddr_t) "mod_user";
173 retfunc = ModifyCallback;
179 display_error("Expunge is not yet implemented");
183 if (!strcmp(form->formname, "mod_finger")) {
184 qy = "update_finger_by_login";
185 for (i = 0; i < F_MODTIME - 1; i++)
186 argv[i + 1] = StringValue(form, i);
187 argv[0] = form->extrastuff;
191 form->extrastuff = (caddr_t) "mod_finger";
192 retfunc = ModifyCallback;
195 if (!*stringval(form, 0))
197 if (!*stringval(form, 1))
201 if (!strcmp(argv[1], "POP"))
202 argv[2] = stringval(form, 3);
204 case MM_SHOW_ACE_USE:
205 if (boolval(form, 2)) {
206 sprintf(buf, "R%s", stringval(form, 0));
211 if (!strcmp(form->formname, "mod_list")) {
213 for (i = 0; i < L_MODTIME; i++)
214 argv[i + 1] = StringValue(form, i);
215 argv[0] = form->extrastuff;
216 argc = L_MODTIME + 1;
219 form->extrastuff = (caddr_t) "mod_list";
220 retfunc = ModifyCallback;
222 case MM_SHOW_MEMBERS:
223 if (!*stringval(form, 0)) {
224 qy = "get_lists_of_member";
225 argv[0] = stringval(form, 1);
226 if (boolval(form, 3)) {
227 sprintf(buf, "R%s", stringval(form, 1));
230 argv[1] = stringval(form, 2);
234 case MM_DEL_ALL_MEMBER:
235 display_error("Not yet implemented.");
239 if (*stringval(form, 0)) {
240 qy = "get_filesys_by_label";
241 argv[0] = stringval(form, 0);
243 } else if (*stringval(form, 1)) {
244 argv[0] = canonicalize_hostname(stringval(form, 1));
245 if (*stringval(form, 2)) {
246 qy = "get_filesys_by_nfsphys";
247 argv[1] = stringval(form, 2);
250 qy = "get_filesys_by_machine";
253 } else if (*stringval(form, 3)) {
254 qy = "get_filesys_by_group";
255 argv[0] = stringval(form, 3);
260 argv[FS_MACHINE] = canonicalize_hostname(stringval(form, FS_MACHINE));
261 if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
262 !strcmp(stringval(form, FS_TYPE), "FSGROUP"))
263 argv[FS_MACHINE] = "\\[NONE\\]";
266 if (!strcmp(form->formname, "mod_filsys")) {
267 qy = "update_filsys";
268 for (i = 0; i < FS_MODTIME; i++)
269 argv[i + 1] = StringValue(form, i);
270 argv[0] = form->extrastuff;
271 argc = FS_MODTIME + 1;
274 form->extrastuff = (caddr_t) "mod_filsys";
275 retfunc = ModifyCallback;
278 if (!*stringval(form, 0))
280 if (*stringval(form, 1)) {
282 argv[2] = stringval(form, 1);
283 } else if (*stringval(form, 2)) {
285 argv[2] = stringval(form, 2);
286 } else if (!*stringval(form, 0)) {
287 display_error("Must specify something.");
290 qy = "get_quota_by_filesys";
297 argv[0] = canonicalize_hostname(stringval(form, 0));
300 if (!strcmp(form->formname, "mod_machine")) {
301 qy = "update_machine";
302 for (i = 0; i < M_MODTIME; i++)
303 argv[i + 1] = StringValue(form, i);
304 argv[0] = form->extrastuff;
305 argc = M_MODTIME + 1;
308 argv[0] = canonicalize_hostname(stringval(form, 0));
309 form->extrastuff = (caddr_t) "mod_machine";
310 retfunc = ModifyCallback;
316 display_error("Unknown function in form callback.\n");
319 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
321 com_err(program_name, i, "executing database query");
326 if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
327 XtUnmanageChild(form->formpointer);
328 f->extrastuff = (caddr_t) strsave(stringval(form, 0));
329 f->menu = form->menu;
332 switch (form->menu->operation) {
335 qy = strsave(stringval(f, U_MITID));
336 sprintf(stringval(f, U_MITID), "\"%s\"", qy);
338 f->inputlines[U_STATE]->keywords = user_states;
339 StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
340 GetKeywords(f, U_CLASS, "class");
342 AppendToLog("Done.\n");
346 AppendToLog("Done.\n");
350 GetKeywords(f, L_ACE_TYPE, "ace_type");
352 AppendToLog("Done.\n");
356 GetKeywords(f, FS_TYPE, "filesys");
357 sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
358 GetKeywords(f, FS_ACCESS, buf);
359 GetKeywords(f, FS_L_TYPE, "lockertype");
360 if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
361 StoreField(f, FS_MACHINE, "\\[NONE\\]");
363 AppendToLog("Done.\n");
367 GetKeywords(f, 1, "mac_type");
369 AppendToLog("Done.\n");
377 case MM_CLEAR_SERVICE:
378 case MM_RESET_SERVICE:
395 case MM_DEL_ALL_MEMBER:
403 case MM_ADD_FS_ALIAS:
404 case MM_DEL_FS_ALIAS:
419 AppendToLog("Done.\n");
433 int (*retfunc)(), argc, i;
436 retfunc = DisplayCallback;
442 switch (m->operation) {
443 case MM_SHOW_MAILLIST:
444 argv[0] = argv[1] = argv[3] = "TRUE";
446 argv[4] = "DONTCARE";
449 argv[0] = "def_quota";
452 AppendToLog("Services and Hosts with failed updates:");
453 argv[0] = argv[2] = "DONTCARE";
455 i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
456 if (i && i != MR_NO_MATCH)
457 com_err(program_name, i, "executing database query");
458 qy = "qualified_get_server_host";
460 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
466 display_error("Unknown function in menu callback.\n");
469 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
471 com_err(program_name, i, "executing database query");
475 /******* temporary ********/
476 display_error(msg) char *msg; { PopupErrorMessage(msg, "Sorry, no help is available"); }