7 #include <moira_site.h>
12 extern char *user, *program_name;
13 extern EntryForm *MoiraForms[];
14 EntryForm *GetAndClearForm();
16 char *user_states[] = { "0 - Registerable",
18 "2 - Half Registered",
20 "4 - Not registerable",
21 "5 - Enrolled/Registerable",
22 "6 - Enrolled/Not Registerable",
25 char *nfs_states[] = { "0 - Not Allocated",
33 static FixNameCase(form, field)
37 char fixname[128], buf[256];
39 strcpy(fixname, stringval(form, field));
41 sprintf(buf, "You entered a name which does not follow the capitalization conventions.\nCorrect it to \"%s\"?", fixname);
42 if (strcmp(fixname, stringval(form, field)) &&
43 AskQuestion(buf, "fixcase"))
44 StoreField(form, field, fixname);
48 get_members(argc, argv, sq)
51 struct save_queue *sq;
55 sprintf(buf, "%s (%s)", argv[0], argv[1]);
56 sq_save_data(sq, strsave(buf));
61 /* Deal with AFS cell names */
63 char *canonicalize_cell(c)
71 sprintf(path, "/afs/%s", c);
72 if (lstat(path, &stbuf) || !stbuf.st_mode&S_IFLNK)
74 count = readlink(path, path, sizeof(path));
75 if (count < 1) return(c);
78 return(strsave(path));
82 int GetAliasValue(argc, argv, retval)
87 *retval = strsave(argv[2]);
93 MoiraValueChanged(f, prompt)
100 struct save_queue *sq, *s;
101 #define maybechange(f, n, v) {if (f->inputlines[n]->insensitive != v) { f->inputlines[n]->insensitive=v; f->inputlines[n]->changed = True; }}
103 for (field = 0; f->inputlines[field]; field++)
104 if (prompt == f->inputlines[field]) break;
106 switch (f->menu->operation) {
109 maybechange(f, L_GID, !boolval(f, L_GROUP));
110 if (!strcmp(stringval(f, L_ACE_TYPE), "NONE"))
111 maybechange(f, L_ACE_NAME, True)
113 maybechange(f, L_ACE_NAME, False)
117 if (field == FS_TYPE &&
118 (!strcmp(stringval(f, FS_TYPE), "FSGROUP") ||
119 !strcmp(stringval(f, FS_TYPE), "MUL") ||
120 !strcmp(stringval(f, FS_TYPE), "ERR"))) {
121 maybechange(f, FS_MACHINE, True);
122 maybechange(f, FS_PACK, True);
123 maybechange(f, FS_M_POINT, True);
124 maybechange(f, FS_ACCESS, True);
125 maybechange(f, FS_CREATE, True);
126 } else if (field == FS_TYPE &&
127 (!strcmp(stringval(f, FS_TYPE), "NFS") ||
128 !strcmp(stringval(f, FS_TYPE), "AFS") ||
129 !strcmp(stringval(f, FS_TYPE), "RVD"))) {
130 maybechange(f, FS_MACHINE, False);
131 maybechange(f, FS_PACK, False);
132 maybechange(f, FS_M_POINT, False);
133 maybechange(f, FS_ACCESS, False);
134 maybechange(f, FS_CREATE, False);
136 if (field == FS_NAME && !strcmp(stringval(f, FS_M_POINT), "/mit/")) {
137 sprintf(buf, "/mit/%s", stringval(f, FS_NAME));
138 StoreField(f, FS_M_POINT, buf);
140 if (field == FS_MACHINE && !strcmp(stringval(f, FS_TYPE), "AFS")) {
141 p = strsave(stringval(f, FS_MACHINE));
142 p = canonicalize_cell(p);
144 StoreField(f, FS_MACHINE, p);
147 if (field == FS_MACHINE && (!strcmp(stringval(f, FS_TYPE), "NFS") ||
148 !strcmp(stringval(f, FS_TYPE), "RVD"))) {
149 StoreHost(f, FS_MACHINE, &p);
151 if (!strcmp(stringval(f, FS_TYPE), "AFS") &&
152 *stringval(f, FS_NAME) &&
153 *stringval(f, FS_MACHINE) &&
154 *stringval(f, FS_L_TYPE)) {
158 sprintf(buf, "%s:%s", stringval(f, FS_MACHINE),
159 stringval(f, FS_L_TYPE));
164 i = MoiraQuery("get_alias", 3, argv, GetAliasValue, &path);
165 if (i == MR_SUCCESS) {
166 p = index(path, ':');
171 sprintf(buf, "/afs/%s/%s", stringval(f, FS_MACHINE), path);
173 for (p=stringval(f, FS_NAME);
174 *p && (p - stringval(f, FS_NAME)) < depth;
178 buf[strlen(buf)-1] = *p;
180 sprintf(buf, "/afs/%s/%s/other",
181 stringval(f, FS_MACHINE), path);
185 } else if (depth = -1) {
186 if (isdigit(stringval(f, FS_NAME)[0])) {
189 for (p = stringval(f, FS_NAME);
196 strcat(buf, "/other");
201 strcat(buf, stringval(f, FS_NAME));
204 p = strsave(stringval(f, FS_L_TYPE));
205 sprintf(buf, "/afs/%s/%s/%s", stringval(f, FS_MACHINE),
206 lowercase(p), stringval(f, FS_NAME));
209 StoreField(f, FS_PACK, buf);
213 if (!strcmp(stringval(f, PO_TYPE), "POP")) {
214 maybechange(f, 2, True);
215 maybechange(f, 3, False);
216 } else if (!strcmp(stringval(f, PO_TYPE), "SMTP")) {
217 maybechange(f, 2, False);
218 maybechange(f, 3, True);
219 } else if (!strcmp(stringval(f, PO_TYPE), "NONE")) {
220 maybechange(f, 2, True);
221 maybechange(f, 3, True);
226 if (!strcmp(stringval(f, Q_TYPE), "ANY"))
227 maybechange(f, Q_NAME, True)
229 maybechange(f, Q_NAME, False)
233 if (!strcmp(stringval(f, ZA_XMT_TYPE), "NONE"))
234 maybechange(f, ZA_XMT_ID, True)
236 maybechange(f, ZA_XMT_ID, False)
237 if (!strcmp(stringval(f, ZA_SUB_TYPE), "NONE"))
238 maybechange(f, ZA_SUB_ID, True)
240 maybechange(f, ZA_SUB_ID, False)
241 if (!strcmp(stringval(f, ZA_IWS_TYPE), "NONE"))
242 maybechange(f, ZA_IWS_ID, True)
244 maybechange(f, ZA_IWS_ID, False)
245 if (!strcmp(stringval(f, ZA_IUI_TYPE), "NONE"))
246 maybechange(f, ZA_IUI_ID, True)
248 maybechange(f, ZA_IUI_ID, False)
251 FixNameCase(f, U_LAST);
252 FixNameCase(f, U_FIRST);
253 FixNameCase(f, U_MIDDLE);
260 argv[0] = stringval(f, 0);
262 i = MoiraQuery("get_fsgroup_members", 1, argv, get_members, (char *)sq);
264 com_err(program_name, i, " retrieving filesystem group members");
268 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
270 if (f->inputlines[2]->keywords)
271 free(f->inputlines[2]->keywords);
272 f->inputlines[2]->keywords = (char **)malloc(sizeof(char *)*(size+2));
273 if (f->inputlines[2]->keywords == NULL) {
274 display_error("Out of memory while fetching members");
277 f->inputlines[2]->keywords[0] = "[First]";
278 for (i = 0; i < size; i++)
279 sq_get_data(sq, &f->inputlines[2]->keywords[i+1]);
280 f->inputlines[2]->keywords[i+1] = NULL;
281 f->inputlines[2]->changed = 1;
283 RemakeRadioField(f, 2);
286 argv[0] = stringval(f, 0);
288 i = MoiraQuery("get_fsgroup_members", 1, argv, get_members, (char *)sq);
290 com_err(program_name, i, " retrieving filesystem group members");
294 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
296 if (f->inputlines[1]->keywords)
297 free(f->inputlines[1]->keywords);
298 f->inputlines[1]->keywords = (char **)malloc(sizeof(char *)*(size+1));
299 if (f->inputlines[1]->keywords == NULL) {
300 display_error("Out of memory while fetching members");
303 for (i = 0; i < size; i++)
304 sq_get_data(sq, &f->inputlines[1]->keywords[i]);
305 f->inputlines[1]->keywords[i] = NULL;
306 f->inputlines[1]->changed = 1;
308 RemakeRadioField(f, 1);
311 argv[0] = stringval(f, 0);
313 i = MoiraQuery("get_fsgroup_members", 1, argv, get_members, (char *)sq);
315 com_err(program_name, i, " retrieving filesystem group members");
319 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
321 if (f->inputlines[1]->keywords)
322 free(f->inputlines[1]->keywords);
323 f->inputlines[1]->keywords = (char **)malloc(sizeof(char *)*(size+1));
324 if (f->inputlines[1]->keywords == NULL) {
325 display_error("Out of memory while fetching members");
328 if (f->inputlines[2]->keywords)
329 free(f->inputlines[2]->keywords);
330 f->inputlines[2]->keywords = (char **)malloc(sizeof(char *)*(size+2));
331 if (f->inputlines[2]->keywords == NULL) {
332 display_error("Out of memory while fetching members");
335 f->inputlines[2]->keywords[0] = "[First]";
336 for (i = 0; i < size; i++) {
337 sq_get_data(sq, &f->inputlines[1]->keywords[i]);
338 f->inputlines[2]->keywords[i+1] = f->inputlines[1]->keywords[i];
340 f->inputlines[1]->keywords[i] = NULL;
341 f->inputlines[2]->keywords[i+1] = NULL;
342 f->inputlines[1]->changed = 1;
343 f->inputlines[2]->changed = 1;
345 RemakeRadioField(f, 1);
346 RemakeRadioField(f, 2);
355 /* Called when a menu item is selected. */
357 MoiraMenuRequest(menu)
362 f = GetAndClearForm(menu->form);
364 if (!strcmp(menu->form, "0"))
365 MoiraMenuComplete(menu);
367 display_error("Sorry, unable to process that request (no form registered).");
371 switch (menu->operation) {
373 GetKeywords(f, 4, "class");
374 f->inputlines[1]->valuechanged = MoiraValueChanged;
375 f->inputlines[2]->valuechanged = MoiraValueChanged;
378 StoreField(f, U_NAME, UNIQUE_LOGIN);
379 StoreField(f, U_UID, UNIQUE_UID);
380 StoreField(f, U_SHELL, "/bin/csh");
381 StoreField(f, U_STATE, user_states[US_NO_LOGIN_YET]);
382 f->inputlines[U_STATE]->keywords = user_states;
383 f->inputlines[U_LAST]->valuechanged = MoiraValueChanged;
384 f->inputlines[U_FIRST]->valuechanged = MoiraValueChanged;
385 f->inputlines[U_MIDDLE]->valuechanged = MoiraValueChanged;
386 GetKeywords(f, U_CLASS, "class");
389 GetKeywords(f, 1, "pobox");
390 GetKeywords(f, 3, "poserver");
391 f->inputlines[PO_TYPE]->valuechanged = MoiraValueChanged;
394 StoreField(f, FS_TYPE, "AFS");
395 StoreField(f, FS_M_POINT, "/mit/");
396 StoreField(f, FS_MACHINE, "athena.mit.edu");
397 StoreField(f, FS_ACCESS, "w");
398 StoreField(f, FS_OWNER, user);
399 StoreField(f, FS_OWNERS, user);
400 boolval(f, FS_CREATE) = TRUE;
401 GetKeywords(f, FS_TYPE, "filesys");
402 GetKeywords(f, FS_ACCESS, "fs_access_AFS");
403 GetKeywords(f, FS_L_TYPE, "lockertype");
404 f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
405 f->inputlines[FS_L_TYPE]->valuechanged = MoiraValueChanged;
406 f->inputlines[FS_NAME]->valuechanged = MoiraValueChanged;
407 f->inputlines[FS_MACHINE]->valuechanged = MoiraValueChanged;
410 if (f->inputlines[2]->keywords)
411 free(f->inputlines[2]->keywords);
412 f->inputlines[2]->keywords = (char **)malloc(sizeof(char*)*2);
413 f->inputlines[2]->keywords[0] = "[First]";
414 f->inputlines[2]->keywords[1] = NULL;
415 f->inputlines[0]->valuechanged = MoiraValueChanged;
418 if (f->inputlines[1]->keywords)
419 free(f->inputlines[1]->keywords);
420 f->inputlines[1]->keywords = (char **)malloc(sizeof(char*)*2);
421 f->inputlines[1]->keywords[0] = "[Placeholder]";
422 f->inputlines[1]->keywords[1] = NULL;
423 f->inputlines[0]->valuechanged = MoiraValueChanged;
426 if (f->inputlines[1]->keywords)
427 free(f->inputlines[1]->keywords);
428 f->inputlines[1]->keywords = (char **)malloc(sizeof(char*)*2);
429 f->inputlines[1]->keywords[0] = "[Placeholder]";
430 f->inputlines[1]->keywords[1] = NULL;
431 if (f->inputlines[2]->keywords)
432 free(f->inputlines[2]->keywords);
433 f->inputlines[2]->keywords = (char **)malloc(sizeof(char*)*2);
434 f->inputlines[2]->keywords[0] = "[First]";
435 f->inputlines[2]->keywords[1] = NULL;
436 f->inputlines[0]->valuechanged = MoiraValueChanged;
439 StoreField(f, 1, "/u1/lockers");
440 StoreField(f, 2, "/dev/");
441 StoreField(f, 5, "0");
442 StoreField(f, 6, "0");
443 StoreField(f, 3, nfs_states[1]);
444 f->inputlines[3]->keywords = nfs_states;
449 GetKeywords(f, 1, "quota_type");
450 f->inputlines[Q_TYPE]->valuechanged = MoiraValueChanged;
452 case MM_SHOW_ACE_USE:
453 StoreField(f, 0, "USER");
454 GetKeywords(f, 0, "ace_type");
457 boolval(f, L_ACTIVE) = TRUE;
458 boolval(f, L_MAILLIST) = TRUE;
459 StoreField(f, L_GID, UNIQUE_GID);
460 StoreField(f, L_ACE_TYPE, "USER");
461 GetKeywords(f, L_ACE_TYPE, "ace_type");
462 f->inputlines[L_GID]->insensitive = True;
463 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
464 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
466 case MM_SHOW_MEMBERS:
467 GetKeywords(f, 1, "member");
471 GetKeywords(f, 1, "member");
473 case MM_DEL_ALL_MEMBER:
474 boolval(f, 2) = TRUE;
475 GetKeywords(f, 0, "member");
478 GetKeywords(f, 1, "mac_type");
481 StoreField(f, PCAP_SPOOL_DIR, "/usr/spool/printer/");
482 boolval(f, PCAP_AUTH) = TRUE;
483 StoreField(f, PCAP_PRICE, "10");
486 StoreField(f, SVC_INTERVAL, "1430");
487 StoreField(f, SVC_TARGET, "/tmp/");
488 StoreField(f, SVC_SCRIPT, "/moira/bin/");
489 StoreField(f, 4, "UNIQUE");
490 StoreField(f, 6, "NONE");
491 GetKeywords(f, 4, "service");
492 GetKeywords(f, 6, "ace_type");
495 StoreField(f, 2, "*");
496 GetKeywords(f, 1, "alias");
499 GetKeywords(f, 1, "ace_type");
500 GetKeywords(f, 3, "ace_type");
501 GetKeywords(f, 5, "ace_type");
502 GetKeywords(f, 7, "ace_type");
503 f->inputlines[ZA_XMT_TYPE]->valuechanged = MoiraValueChanged;
504 f->inputlines[ZA_SUB_TYPE]->valuechanged = MoiraValueChanged;
505 f->inputlines[ZA_IWS_TYPE]->valuechanged = MoiraValueChanged;
506 f->inputlines[ZA_IUI_TYPE]->valuechanged = MoiraValueChanged;
515 /* Find a form by name. Returns a pointer to the form or NULL on error. */
517 EntryForm *GetForm(name)
522 for (fp = MoiraForms; *fp; fp++)
523 if (!strcmp((*fp)->formname, name))
529 /* Find a form by name and clear all of its fields. Returns a pointer
530 * to the form or NULL on error.
533 EntryForm *GetAndClearForm(name)
538 static BottomButton **buttons = NULL;
539 int MoiraFormComplete(), MoiraFormApply();
540 int button_callback(), help_form_callback();
542 for (fp = MoiraForms; *fp; fp++)
543 if (!strcmp((*fp)->formname, name))
545 if (*fp == (EntryForm *)NULL)
548 for (pp = (*fp)->inputlines; p = *pp; pp++) {
552 if (p->returnvalue.stringvalue)
553 free(p->returnvalue.stringvalue);
554 p->returnvalue.stringvalue = (char *)malloc(MAXFIELDSIZE);
555 if (p->returnvalue.stringvalue == NULL) {
556 fprintf(stderr, "Moira: out of memory\n");
559 *(p->returnvalue.stringvalue) = '\0';
562 p->returnvalue.booleanvalue = False;
565 p->returnvalue.integervalue = 0;
569 if (buttons == NULL) {
570 buttons = (BottomButton **)malloc(5 * sizeof(BottomButton *));
571 buttons[0] = (BottomButton *)malloc(sizeof(BottomButton));
572 buttons[0]->label = "OK";
573 buttons[0]->returnfunction = MoiraFormComplete;
574 buttons[1] = (BottomButton *)malloc(sizeof(BottomButton));
575 buttons[1]->label = "Apply";
576 buttons[1]->returnfunction = MoiraFormApply;
577 buttons[2] = (BottomButton *)malloc(sizeof(BottomButton));
578 buttons[2]->label = "Cancel";
579 buttons[2]->returnfunction = button_callback;
580 buttons[3] = (BottomButton *)malloc(sizeof(BottomButton));
581 buttons[3]->label = "Help";
582 buttons[3]->returnfunction = help_form_callback;
585 (*fp)->buttons = buttons;
590 /* Store a string into a given field in a form. */
592 StoreField(form, field, value)
597 strncpy(form->inputlines[field]->returnvalue.stringvalue,
598 value, MAXFIELDSIZE);
602 char *StringValue(form, field)
606 switch (form->inputlines[field]->type) {
609 return(stringval(form, field));
611 return(boolval(form, field) ? "1" : "0");
616 StoreHost(form, field, dest)
623 s = strsave(stringval(form, field));
624 s = canonicalize_hostname(s);
625 StoreField(form, field, s);
626 form->inputlines[field]->changed = True;
629 *dest = stringval(form, field);
633 /* Helper routine for GetKeywords() */
635 static get_alias(argc, argv, sq)
638 struct save_queue *sq;
640 sq_save_data(sq, strsave(argv[2]));
642 printf("found keyword %s\n", argv[2]);
647 static get_sloc(argc, argv, sq)
650 struct save_queue *sq;
652 sq_save_data(sq, strsave(argv[1]));
654 printf("found sloc %s\n", argv[1]);
660 /* Retrieve possible keyword values from Moira and store them in the specified
661 * field of the form. Returns 0 if successful, -1 if not.
664 static struct save_queue *cache = NULL;
665 struct cache_elem { char *name; char **values; };
667 int GetKeywords(form, field, name)
672 struct save_queue *sq, *s;
673 struct cache_elem *ce;
680 cache->q_lastget = NULL;
682 if (!strcmp(name, "fsgroup")) {
683 form->inputlines[field]->keywords = NULL;
686 /* look through cache */
687 while (sq_get_data(cache, &ce))
688 if (!strcmp(ce->name, name)) {
689 form->inputlines[field]->keywords = ce->values;
693 /* not in cache, do query */
695 if (!strcmp(name, "poserver")) {
697 stat = MoiraQuery("get_server_locations", 1, argv, get_sloc,
700 com_err(program_name, stat, "retrieving service locations");
707 stat = MoiraQuery("get_alias", 3, argv, get_alias, (char *)sq);
709 com_err(program_name, stat, "retrieving keyword values");
715 for (s = sq->q_next; s->q_next != sq; s = s->q_next)
718 printf("Found %d keywords of type %s\n", size, name);
721 /* transform query data into proper malloc'ed structure */
722 ce = (struct cache_elem *) malloc(sizeof(struct cache_elem));
724 display_error("Out of memory while fetching keywords");
728 ce->values = (char **) malloc(sizeof(char *) * (size + 1));
729 if (ce->values == NULL) {
730 display_error("Out of memory while fetching keywords");
733 for (i = 0; i < size; i++)
734 sq_get_data(sq, &(ce->values[i]));
735 ce->values[i] = NULL;
738 /* put it in the cache */
739 sq_save_data(cache, ce);
741 /* and return answer */
742 form->inputlines[field]->keywords = ce->values;
746 CacheNewValue(form, field, name, value)
752 struct save_queue *sq;
753 struct cache_elem *ce;
759 cache->q_lastget = NULL;
761 /* find entry in cache */
762 while (sq_get_data(cache, &ce))
763 if (!strcmp(ce->name, name))
767 for (size = 0; ce->values[size]; size++);
769 /* add new keyword */
770 ce->values = (char **)realloc(ce->values, sizeof(char *) * (size + 2));
771 ce->values[size] = strsave(value);
772 ce->values[size + 1] = NULL;
775 printf("CacheNewValue(%x, %d, %s, %s)\n", form, field, name, value);
776 printf(" form is %x (%s)\n", form, form->formname);
777 printf(" field is %d (%s)\n", field, form->inputlines[field]->prompt);
778 printf(" keywords: ");
779 for (size = 0; ce->values[size]; size++) printf("%s ", ce->values[size]);
783 /* new update form */
784 form->inputlines[field]->keywords = ce->values;
785 RemakeRadioField(form, field);