|
|
1.1 root 1: /* dsaconfig.c - build a database directory for a Level-1 DSA */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/others/quipu/tools/dsaconfig/RCS/dsaconfig.c,v 7.4 90/07/27 08:44:58 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/others/quipu/tools/dsaconfig/RCS/dsaconfig.c,v 7.4 90/07/27 08:44:58 mrose Exp $
9: *
10: *
11: * $Log: dsaconfig.c,v $
12: * Revision 7.4 90/07/27 08:44:58 mrose
13: * update
14: *
15: * Revision 7.3 90/03/22 08:38:31 mrose
16: * touch-up
17: *
18: * Revision 7.2 90/01/11 18:36:09 mrose
19: * real-sync
20: *
21: * Revision 7.1 89/12/06 17:30:24 mrose
22: * update
23: *
24: * Revision 7.0 89/11/23 22:02:38 mrose
25: * Release 6.0
26: *
27: */
28:
29: /*
30: * NOTICE
31: *
32: * Acquisition, use, and distribution of this module and related
33: * materials are subject to the restrictions of a license agreement.
34: * Consult the Preface in the User's Manual for the full terms of
35: * this agreement.
36: *
37: */
38:
39:
40: #include <ctype.h>
41: #include <errno.h>
42: #include <grp.h>
43: #include <pwd.h>
44: #include <stdio.h>
45: #include <varargs.h>
46: #include "general.h"
47: #include "manifest.h"
48: #include "internet.h"
49: #include "psap.h"
50: #include "tailor.h"
51:
52:
53: #ifdef SYS5
54: struct group *getgrnam ();
55: struct passwd *getpwnam (), *getpwuid ();
56: #endif
57:
58: /* DATA */
59:
60: static int debug =0;
61:
62: static int uid = 0;
63: static int gid = 0;
64:
65: static char *myname = "dsaconfig";
66:
67: static char *wildlife = NULL;
68: static char sedfil[BUFSIZ];
69:
70:
71: void adios (), advise ();
72: char *version ();
73:
74:
75: extern int errno;
76:
77: extern char *quipuversion;
78:
79: /* MAIN */
80:
81: /* ARGSUSED */
82:
83: main (argc, argv, envp)
84: int argc;
85: char **argv,
86: **envp;
87: {
88: char buffer[BUFSIZ];
89:
90: arginit (argv);
91: if (access (wildlife, 0x00) != NOTOK)
92: adios (NULLCP, "%s already exists, choose a different name", wildlife);
93:
94: read_config ();
95: generate_sed ();
96:
97: build_root ();
98: build_TLC ();
99: build_organization ();
100: build_unit ();
101:
102: build_tailor ();
103: build_startup ();
104: build_nightly ();
105:
106: build_dsap ();
107: build_fred ();
108:
109: #ifndef SYS5
110: (void) sprintf (buffer, "find %s -exec /etc/chown %d {} \\;",
111: wildlife, uid);
112: #else
113: (void) sprintf (buffer, "find %s -exec chown %d {} \\;", wildlife, uid);
114: #endif
115: if (debug)
116: fprintf (stderr, "%s\n", buffer);
117: (void) system (buffer);
118:
119: (void) sprintf (buffer, "find %s -exec chgrp %d {} \\;",
120: wildlife, gid);
121: if (debug)
122: fprintf (stderr, "%s\n", buffer);
123: (void) system (buffer);
124:
125: (void) unlink (sedfil);
126:
127: exit (0);
128: }
129:
130: /* CONFIG */
131:
132: struct country {
133: char *c_code;
134: int c_number;
135: char *c_name;
136:
137: char *c_root;
138: char *c_master;
139: char *c_other;
140:
141: char *c_phone;
142:
143: int c_flags;
144: #define C_SHORT 0x01
145: };
146:
147: struct country *read_country ();
148:
149: /* */
150:
151: struct pair {
152: char *p_name;
153: char *p_value;
154:
155: int p_flags;
156: #define P_NULL 0x00
157: #define P_OPT 0x01
158: #define P_MBOX 0x02
159: #define P_XXX 0x04
160: #define P_ZAP 0x08
161: #define P_POST 0x10
162: };
163:
164: static struct pair pairs[] = {
165: "dsa", NULL, /* Spectacled Bear */
166: P_NULL,
167:
168: "country", NULL, /* US */
169: P_OPT,
170: "organization", NULL, /* NYSERNet, Inc. */
171: P_NULL,
172: "domain", NULL, /* nyser.net */
173: P_NULL,
174: "unit", NULL, /* Research and Development */
175: P_NULL,
176: "street", NULL, /* 165 Jordan Road */
177: P_OPT,
178: "pob", NULL, /* 1234 */
179: P_OPT,
180: "town", NULL, /* Troy */
181: P_NULL,
182: "state", NULL, /* New York */
183: P_NULL,
184: "zipcode", NULL, /* 12180 */
185: P_NULL,
186: "locality", NULL, /* Troy, New York */
187: P_OPT,
188: "postaladdress", NULL, /* org $ address */
189: P_OPT | P_POST,
190:
191: "telephone", NULL, /* +1 518-283-8860 */
192: P_NULL,
193: "fax", NULL, /* +1 518-283-8904 */
194: P_OPT,
195:
196: "description", NULL, /* not-for-profit ... */
197: P_NULL,
198:
199: "ipaddr", NULL, /* 127.0.0.1 */
200: P_OPT,
201: "port", NULL, /* 17003 */
202: P_OPT,
203:
204: "firstname", NULL, /* Marshall */
205: P_NULL,
206: "lastname", NULL, /* Rose */
207: P_NULL,
208: "middleinitial", NULL, /* T */
209: P_OPT,
210: "middlename", NULL, /* Txxx */
211: P_OPT,
212: "mailbox", NULL, /* [email protected] */
213: P_MBOX,
214: "title", NULL, /* Senior Scientist */
215: P_NULL,
216: "userid", NULL, /* mrose */
217: P_OPT,
218: "groupid", NULL, /* whitepages */
219: P_OPT,
220: "password", NULL, /* secret */
221: P_NULL,
222: "extension", NULL, /* +1 518-283-8860 */
223: P_OPT,
224:
225: "wildlife", NULL, /* spectacled-bear */
226: P_XXX,
227: "bindir", NULL, /* /usr/local/bin/ */
228: P_XXX,
229: "sbindir", NULL, /* /usr/etc/ */
230: P_XXX,
231: "etcdir", NULL, /* /usr/etc/ */
232: P_XXX,
233: "quipuversion", NULL, /* from -lquipu */
234: P_XXX,
235: "rootDSA", NULL, /* root upstream */
236: P_XXX,
237: "countryDSA", NULL, /* country upstream */
238: P_XXX,
239: "otherDSA", NULL, /* hack... */
240: P_XXX,
241: "rootDSAaddress", NULL, /* PSAP of root upstream */
242: P_XXX,
243: "countryDSAaddress", NULL, /* PSAP of country upstream */
244: P_XXX,
245: "otherDSAaddress", NULL, /* PSAP of hack... */
246: P_XXX,
247:
248: NULL
249: };
250:
251: struct pair *n2p ();
252:
253: /* */
254:
255: static read_config () {
256: int lineno;
257: register char *cp,
258: *dp;
259: char buffer[BUFSIZ],
260: file[BUFSIZ],
261: line[BUFSIZ],
262: *vec[NVEC + 1];
263: FILE *fp;
264: register struct country *c;
265: register struct pair *p,
266: *q;
267: register struct hostent *hp;
268: struct sockaddr_in in_socket;
269: register struct sockaddr_in *isock = &in_socket;
270:
271: (void) sprintf (file, "%s.dsa", wildlife);
272: if ((fp = fopen (file, "r")) == NULL)
273: adios (file, "unable to read");
274:
275: for (lineno = 1; fgets (buffer, sizeof buffer, fp); lineno++) {
276: if (*buffer == '#')
277: continue;
278: if (cp = index (buffer, '\n'))
279: *cp = NULL;
280: (void) strcpy (line, buffer);
281:
282: bzero ((char *) vec, sizeof vec);
283: switch (str2vec (buffer, vec)) {
284: case 0:
285: continue;
286:
287: case 1:
288: for (p = pairs; p -> p_name; p++)
289: if (strcmp (p -> p_name, vec[0]) == 0)
290: break;
291: if (!p -> p_name || (p -> p_flags & P_XXX))
292: adios (NULLCP, "unknown variable \"%s\"", vec[0]);
293: continue;
294:
295: case 2:
296: break;
297:
298: default:
299: adios (NULLCP, "syntax error on line %d:\n%s", lineno, line);
300: /* NOTREACHED */
301: }
302:
303: for (p = pairs; p -> p_name; p++)
304: if (strcmp (p -> p_name, vec[0]) == 0)
305: break;
306: if (!p -> p_name || (p -> p_flags & P_XXX))
307: adios (NULLCP, "unknown variable \"%s\"", vec[0]);
308: if (p -> p_value)
309: adios (NULLCP, "multiple values for \"%s\" starting at line %d",
310: p -> p_name, lineno);
311:
312: if (p -> p_flags & P_MBOX) {
313: for (cp = vec[1]; *cp; cp++)
314: if (!isascii (*cp) || *cp == '$' || *cp == '&') {
315: illegal: ;
316: adios (NULLCP,
317: "illegal character %c (0%o) in value for \"%s\"",
318: *cp, *cp & 0xff, p -> p_name);
319: }
320: }
321: else
322: for (cp = vec[1]; *cp; cp++) {
323: if (isalpha (*cp) || isdigit (*cp))
324: continue;
325: switch (*cp) {
326: case 047: /* ' */
327: case '(':
328: case ')':
329: case '+':
330: case ',':
331: case '-':
332: case '.':
333: case '/':
334: case ':':
335: case '?':
336: case ' ':
337: continue;
338:
339: default:
340: if ((p -> p_flags & P_POST) && *cp == '$')
341: continue;
342: goto illegal;
343: }
344: }
345:
346: p -> p_value = strdup (vec[1]);
347: }
348:
349: if (ferror (fp) && !feof (fp))
350: adios (file, "error reading");
351: (void) fclose (fp);
352:
353: for (p = pairs; p -> p_name; p++)
354: if (!p -> p_value && !(p -> p_flags & (P_OPT | P_XXX)))
355: adios (NULLCP, "missing value for \"%s\"", p -> p_name);
356:
357: if (n2p ("country", 0) == NULL)
358: n2p ("country", 1) -> p_value = strdup ("US");
359:
360: if ((c = read_country (cp = n2p ("country", 1) -> p_value)) == NULL)
361: adios (NULLCP, "unknown country code \"%s\"", cp);
362: n2p ("rootDSA", 1) -> p_value =
363: strdup (c -> c_root ? c -> c_root : c -> c_master);
364: if (c -> c_root)
365: read_psap (c -> c_root, &(n2p ("rootDSAaddress", 1) -> p_value));
366: n2p ("countryDSA", 1) -> p_value = strdup (c -> c_master);
367: read_psap (c -> c_master, &(n2p ("countryDSAaddress", 1) -> p_value));
368: if (c -> c_other) {
369: n2p ("otherDSA", 1) -> p_value = strdup (c -> c_other);
370: read_psap (c -> c_other, &(n2p ("otherDSAaddress", 1) -> p_value));
371: }
372:
373: if (n2p ("postaladdress", 0) == NULL
374: && n2p ("street", 0) == NULL
375: && n2p ("pob", 0) == NULL)
376: adios (NULLCP, "must specify either \"street\" or \"pob\"");
377:
378: if ((p = n2p ("locality", 1)) -> p_value == NULL) {
379: (void) sprintf (buffer, "%s, %s", n2p ("town", 1) -> p_value,
380: n2p ("state", 1) -> p_value);
381:
382: p -> p_value = strdup (buffer);
383:
384: if (debug)
385: printf ("setting locality to \"%s\"\n", p -> p_value);
386: }
387:
388: if (*(p = n2p ("telephone", 1)) -> p_value != '+') {
389: (void) sprintf (buffer, "+%s %s", c -> c_phone, p -> p_value);
390: free (p -> p_value);
391: p -> p_value = strdup (buffer);
392:
393: if (debug)
394: printf ("setting telephone number to \"%s\"\n", p -> p_value);
395: }
396:
397: if ((p = n2p ("fax", 0)) && *p -> p_value != '+') {
398: (void) sprintf (buffer, "+%s %s", c -> c_phone, p -> p_value);
399: free (p -> p_value);
400: p -> p_value = strdup (buffer);
401:
402: if (debug)
403: printf ("setting fax number to \"%s\"\n", p -> p_value);
404: }
405:
406: if ((p = n2p ("ipaddr", 1)) -> p_value == NULL) {
407: if ((hp = gethostbyname (cp = getlocalhost ())) == NULL)
408: adios (NULLCP, "%s: unknown host", cp);
409: }
410: else {
411: if ((hp = gethostbystring (p -> p_value)) == NULL)
412: adios (NULLCP, "%s: unknown host", p -> p_value);
413: }
414: bzero ((char *) isock, sizeof *isock);
415: isock -> sin_family = hp -> h_addrtype;
416: inaddr_copy (hp, isock);
417: p -> p_value = strdup (inet_ntoa (isock -> sin_addr));
418: if (debug)
419: printf ("setting IP address of DSA to \"%s\"\n", p -> p_value);
420:
421: if ((p = n2p ("port", 1)) -> p_value == NULL) {
422: p -> p_value = strdup ("17003");
423:
424: if (debug)
425: printf ("setting TCP port of DSA to \"%s\"\n", p -> p_value);
426: }
427:
428: if ((p = n2p ("middlename", 1)) -> p_value
429: && (q = n2p ("middleinitial", 1)) -> p_value == NULL) {
430: (void) sprintf (buffer, "%c", *p -> p_value);
431: p -> p_value = strdup (buffer);
432:
433: if (debug)
434: printf ("setting MiddleInitial to \"%s\"\n", p -> p_value);
435: }
436:
437: uid = getuid (), gid = getgid ();
438: if ((p = n2p ("userid", 1)) -> p_value) {
439: register struct passwd *pw = getpwnam (p -> p_value);
440:
441: if (pw == NULL)
442: adios (NULLCP, "unknown user name \"%s\"", p -> p_value);
443: uid = pw -> pw_uid, gid = pw -> pw_gid;
444: }
445: else {
446: register struct passwd *pw = getpwuid (uid);
447:
448: if (pw == NULL)
449: adios (NULLCP, "unknown user name \"%s\"", p -> p_value);
450: p -> p_value = strdup (pw -> pw_name);
451:
452: if (debug)
453: printf ("setting userid to \"%s\"\n", p -> p_value);
454: }
455:
456: if (p = n2p ("groupid", 0)) {
457: register struct group *gr = getgrnam (p -> p_value);
458:
459: if (gr == NULL)
460: adios (NULLCP, "unknown group name \"%s\"", p -> p_value);
461: gid = gr -> gr_gid;
462: }
463:
464: p = n2p ("extension", 1), q = n2p ("telephone", 1);
465: if (cp = p -> p_value) {
466: if (*cp == 'X' || *cp == 'x') {
467: (void) sprintf (buffer, "%s x%s", q -> p_value, p -> p_value);
468: free (p -> p_value);
469: p -> p_value = strdup (buffer);
470:
471: if (debug)
472: printf ("setting user's telephone number to \"%s\"\n",
473: p -> p_value);
474: }
475: }
476: else {
477: p -> p_value = strdup (q -> p_value);
478:
479: if (debug)
480: printf ("setting user telephone number to \"%s\"\n", p -> p_value);
481: }
482:
483: n2p ("wildlife", 1) -> p_value = strdup (wildlife);
484: n2p ("bindir", 1) -> p_value = strdup (isodebinpath);
485: n2p ("sbindir", 1) -> p_value = strdup (isodesbinpath);
486: n2p ("etcdir", 1) -> p_value = strdup (isodetcpath);
487: n2p ("quipuversion", 1) -> p_value = strdup (quipuversion);
488:
489: if (dp = (p = n2p ("postaladdress", 1)) -> p_value) {
490: int i;
491:
492: for (i = 1; cp = index (dp, '$'); dp = cp + 1, i++) {
493: *cp = NULL;
494: if (strlen (dp) > 30)
495: goto too_long;
496: *cp = '$';
497: }
498: if (strlen (dp) > 30) {
499: too_long: ;
500: adios (NULLCP,
501: "item %d is too long (30 characters maximum): \"%s\"", i,
502: dp);
503: }
504: if (i > 6)
505: adios (NULLCP, "too many items (%d) in postalAddress, 6 maximum",
506: i);
507: }
508: else {
509: int i;
510:
511: cp = buffer;
512:
513: (void) sprintf (cp, "%s $ ", n2p ("organization", 1) -> p_value);
514: if ((i = strlen (cp)) > 30 + 3) {
515: advise (NULLCP,
516: "your organization name is longer than 30 characters!");
517: postal_problem: ;
518: adios (NULLCP,
519: "You must explicitly define the postalAddress attribute in the\n\
520: configuration file for your Level-1 DSA.\n\
521: \n\
522: The format is:\n\
523: \n\
524: postaladdress \"item1 $ item2 $ ... $ itemN\"\n\
525: \n\
526: where each item is <= 30 characters in length and there are no\n\
527: more than six items. Refer to the Administrator's Guide for more\n\
528: information.\n\
529: ");
530: }
531: cp += i;
532:
533: if (q = n2p ("pob", 0)) {
534: (void) sprintf (cp, "POB %s $ ", q -> p_value);
535: if ((i = strlen (cp)) > 30 + 3) {
536: advise (NULLCP, "your POB is longer than 26 characters!");
537: goto postal_problem;
538: }
539: cp += i;
540: }
541: else
542: if (q = n2p ("street", 0)) {
543: (void) sprintf (cp, "%s $ ", q -> p_value);
544: if ((i = strlen (cp)) > 30 + 3) {
545: advise (NULLCP,
546: "your street address is longer than 30 characters!");
547: goto postal_problem;
548: }
549: cp += i;
550:
551: q -> p_flags |= P_ZAP;
552: }
553:
554: (void) sprintf (cp, "%s, %s %s $ ",
555: n2p ("town", 1) -> p_value,
556: n2p ("state", 1) -> p_value,
557: n2p ("zipcode", 1) -> p_value);
558: if ((i = strlen (cp)) > 30 + 3) {
559: advise (NULLCP,
560: "your town/state/zipcode is longer than 30 characters!");
561: goto postal_problem;
562: }
563: cp += i;
564:
565: if ((c -> c_flags & C_SHORT) || (i = strlen (dp = c -> c_name)) > 30)
566: i = strlen (dp = c -> c_code);
567: (void) strcpy (cp, dp);
568: cp += i;
569:
570: p -> p_value = strdup (buffer);
571: }
572: }
573:
574: /* */
575:
576: static struct country *read_country (code)
577: char *code;
578: {
579: int vecp;
580: register char *cp,
581: *dp;
582: char d,
583: *ep,
584: buffer[BUFSIZ + 1],
585: file[BUFSIZ],
586: *vec[NVEC + NSLACK + 1];
587: FILE *fp;
588: static struct country cs;
589: register struct country *c = NULL;
590:
591: (void) strcpy (file, "iso3166");
592: if ((fp = fopen (file, "r")) == NULL)
593: adios (file, "unable to open");
594:
595: ep = (dp = buffer) + sizeof buffer;
596: while (fgets (dp, ep - dp, fp)) {
597: if (*buffer == '#')
598: continue;
599: if (cp = index (buffer, '\n')) {
600: *cp = NULL;
601: if ((d = getc (fp)) != EOF)
602: (void) ungetc (d, fp);
603: switch (d) {
604: case '#':
605: case '\n':
606: case EOF:
607: break;
608:
609: default:
610: *cp++ = ' ';
611: if ((dp = cp) + 1 >= ep) {
612: *ep = NULL;
613: adios (NULLCP,
614: "virtual line too long in %s: \"%s\"",
615: file, cp);
616: }
617: continue;
618: }
619: }
620:
621: dp = buffer;
622: switch (vecp = str2vec (buffer, vec)) {
623: case 7: /* standard entry */
624: case 8:
625: if (strcmp (vec[0], code))
626: continue;
627: c = &cs;
628: bzero ((char *) c, sizeof *c);
629: c -> c_code = strdup (vec[0]);
630: if (sscanf (vec[1], "%d", &c -> c_number) != 1)
631: adios (NULLCP,
632: "malformed ISO3166 number for country %s in %s",
633: code, file);
634: c -> c_number = atoi (vec[1]);
635: c -> c_name = strdup (vec[2]);
636: if (strcmp (vec[3], "NULL"))
637: c -> c_root = strdup (vec[3]);
638: if (strcmp (vec[4], "NULL"))
639: c -> c_master = strdup (vec[4]);
640: else
641: adios (NULLCP, "no masterDSA known for country %s in %s",
642: code,file);
643: if (strcmp (vec[5], "NULL"))
644: c -> c_other = strdup (vec[5]);
645: c -> c_phone = strdup (vec[6]);
646: if (vecp == 8) {
647: char *bp;
648:
649: if (strncmp (cp = vec[7], "0x", 2) == 0)
650: cp += 2, bp = "%x";
651: else
652: if (*cp == '0')
653: cp += 1, bp = "%o";
654: else
655: bp = "%d";
656: if (sscanf (cp, bp, &c -> c_flags) != 1)
657: adios (NULLCP,
658: "malformed entry for country %s in %s",
659: code, file);
660: }
661: break;
662:
663: default:
664: continue;
665: }
666: break;
667: }
668:
669: (void) fclose (fp);
670:
671: return c;
672: }
673:
674: /* */
675:
676: static read_psap (dsa, addr)
677: char *dsa,
678: **addr;
679: {
680: int i;
681: register char *cp,
682: *dp;
683: char buffer[BUFSIZ],
684: stuff[BUFSIZ];
685: FILE *fp;
686:
687: if ((fp = fopen (cp = isodefile ("dsaptailor", 0), "r")) == NULL)
688: adios (cp, "unable to open");
689:
690: while (fgets (buffer, sizeof buffer, fp)) {
691: if (lexnequ (buffer, "dsa_address", sizeof "dsa_address" - 1)
692: || (cp = index (buffer, '"')) == NULL
693: || lexnequ (++cp, dsa + 3, i = strlen (dsa + 3))
694: || *(cp += i ) != '"')
695: continue;
696: for (cp++; isspace (*cp); cp++)
697: continue;
698: if (*cp == NULL) {
699: malformed: ;
700: adios (NULLCP, "malformed entry in dsaptailor for DSA %s", dsa);
701: }
702: for (dp = stuff; *cp; *dp++ = *cp++) {
703: switch (*cp) {
704: case '\n':
705: break;
706:
707: case '\'':
708: *dp++ = '\\';
709: /* and fall... */
710: case '\\':
711: *dp++ = '\\';
712: continue;
713:
714: default:
715: continue;
716: }
717: break;
718: }
719: *dp = NULL;
720: if (*cp != '\n')
721: goto malformed;
722: *addr = strdup (stuff);
723: goto hit;
724: }
725: adios (NULLCP, "unable to find presentationAddress for DSA %s", dsa);
726:
727: hit: ;
728: (void) fclose (fp);
729: }
730:
731: /* */
732:
733: generate_sed () {
734: FILE *fp;
735: register struct pair *p;
736:
737: (void) sprintf (sedfil, "/tmp/%sXXXXXX", myname);
738: (void) unlink (mktemp (sedfil));
739:
740: if ((fp = fopen (sedfil, "w")) == NULL)
741: adios (sedfil, "unable to create");
742:
743: for (p = pairs; p -> p_name; p++)
744: if (!(p -> p_flags & P_MBOX) && p -> p_value)
745: fprintf (fp, "s!@(%s)!%s!\n", p -> p_name, p -> p_value);
746:
747: if (ferror (fp))
748: adios (sedfil, "error writing");
749: (void) fclose (fp);
750: }
751:
752: /* */
753:
754: static struct pair *n2p (name, any)
755: char *name;
756: int any;
757: {
758: register struct pair *p;
759:
760: for (p = pairs; p -> p_name; p++)
761: if (strcmp (p -> p_name, name) == 0)
762: return (any || (p -> p_value && !(p -> p_flags & P_ZAP)) ? p
763: : NULL);
764:
765: adios (NULLCP, "internal error -- unable to find \"%s\"", name);
766: /* NOTREACHED */
767: }
768:
769: /* */
770:
771: static munge (fp, entries)
772: FILE *fp;
773: char *entries[];
774: {
775: register char c,
776: *bp,
777: *cp,
778: *dp,
779: **pp;
780: char buffer[BUFSIZ];
781: register struct pair *p;
782:
783:
784: for (pp = entries; cp = *pp; pp++) {
785: bp = buffer;
786:
787: while (c = *cp++) {
788: if (c != '@' || *cp != '(') {
789: *bp++ = c;
790: continue;
791: }
792: if ((dp = index (++cp, ')')) == NULL)
793: adios (NULLCP, "internal error -- you lose big");
794: *dp = NULL;
795:
796: if ((p = n2p (cp, 0)) == NULL) {
797: bp = buffer;
798: goto no_match;
799: }
800: (void) strcpy (bp, p -> p_value);
801: bp += strlen (bp);
802:
803: cp = ++dp;
804: }
805:
806: *bp = NULL;
807: fprintf (fp, "%s\n", buffer);
808: no_match: ;
809: }
810: }
811:
812: /* EDB */
813:
814: static build_root () {
815: if (debug)
816: fprintf (stderr, "mkdir %s\n", wildlife);
817: if (mkdir (wildlife, 0700) == NOTOK)
818: adios (wildlife, "unable to create directory");
819:
820: make_file ("root.edb", "EDB", 0600, 0);
821: }
822:
823: /* */
824:
825: static char *c_TLC[] = {
826: "o=@(organization)",
827: "masterDSA= c=@(country)@cn=@(dsa)#",
828: "acl= others # read # entry",
829: "acl= group # c=@(country)@o=@(organization)@cn=Manager # write # entry",
830: "acl= others # read # default",
831: "acl= group # c=@(country)@o=@(organization)@cn=Manager # write # default",
832: "acl= others # compare # attributes # accessControlList$userPassword",
833: "acl= group # c=@(country)@o=@(organization)@cn=Manager # write # attributes # accessControlList$userPassword",
834: "o= @(organization)",
835: "streetAddress= @(street)",
836: "postOfficeBox= @(pob)",
837: "physicalDeliveryOfficeName= @(town)",
838: "stateOrProvinceName= @(state)",
839: "postalCode= @(zipcode)",
840: "postalAddress= @(postaladdress)",
841: "telephoneNumber= @(telephone)",
842: "facsimileTelephoneNumber= @(fax)",
843: "localityName= @(locality)",
844: "description= @(description)",
845: "associatedDomain= @(domain)",
846: "treeStructure= quipuNonLeafObject & organizationalUnit",
847: "treeStructure= quipuDSA & alias & organizationalRole",
848: "treeStructure= domainRelatedObject",
849: "objectClass= top & quipuObject & quipuNonLeafObject",
850: "objectClass= domainRelatedObject",
851: "objectClass= organization",
852: "",
853:
854: "cn=@(dsa)",
855: "acl= others # read # entry",
856: "acl= group # c=@(country)@o=@(organization)@cn=Manager # write # entry",
857: "acl= others # read # default",
858: "acl= group # c=@(country)@o=@(organization)@cn=Manager # write # default",
859: "acl= others # compare # attributes # accessControlList$userPassword",
860: "acl= group # c=@(country)@o=@(organization)@cn=Manager # write # attributes # accessControlList$userPassword",
861: "cn= @(dsa)",
862: "eDBinfo= # @(rootDSA) #",
863: "eDBinfo= c=@(country) # @(countryDSA) #",
864: "eDBinfo= c=@(country)@o=@(organization) # # @(countryDSA)",
865: "eDBinfo= c=@(country)@o=@(organization) # # @(rootDSA)",
866: "eDBinfo= c=@(country)@o=@(organization) # # @(otherDSA)",
867: "presentationAddress= '0101'H/Internet=@(ipaddr)+@(port)",
868: "manager= c=@(country)@o=@(organization)@cn=Manager#",
869: "manager= c=@(country)@cn=Manager#",
870: "userPassword= @(wildlife)",
871: "quipuVersion= @(quipuversion)",
872: "localityName= @(locality)",
873: "description= The Endangered @(dsa)",
874: "description= Master DSA for @(organization) in the @(country)",
875: "objectClass= top & quipuObject",
876: "objectClass= applicationEntity & dSA & quipuDSA",
877: "supportedApplicationContext= x500DSP & x500DAP & quipuDSP",
878: "",
879:
880: NULL
881: };
882:
883:
884: static build_TLC () {
885: char buffer[BUFSIZ];
886:
887: (void) sprintf (buffer, "%s/c=%s", wildlife,
888: n2p ("country", 1) -> p_value);
889: make_edb (buffer, "SLAVE", "0000000000Z", c_TLC);
890: }
891:
892: /* */
893:
894: static char *o_I[] = {
895: "cn=Manager",
896: "acl=",
897: "cn= Manager",
898: "aliasedObjectName= c=@(country)@o=@(organization)@ou=@(unit)@cn=@(firstname) @(lastname)#",
899: "objectClass= top & quipuObject",
900: "objectClass= alias",
901: "",
902:
903: "cn=Postmaster",
904: "acl=",
905: "cn= Postmaster",
906: "aliasedObjectName= c=@(country)@o=@(organization)@ou=@(unit)@cn=@(firstname) @(lastname)#",
907: "objectClass= top & quipuObject",
908: "objectClass= alias",
909: "",
910:
911: "ou=@(unit)",
912: "masterDSA= c=@(country)@cn=@(dsa)#",
913: "acl= others # read # entry",
914: "acl= others # read # default",
915: "acl= others # compare # attributes # accessControlList$userPassword",
916: "ou= @(unit)",
917: "treeStructure= quipuNonLeafObject & organizationalUnit",
918: "treeStructure= alias & pilotPerson & organizationalRole",
919: "objectClass= top & quipuObject & quipuNonLeafObject",
920: "objectClass= organizationalUnit",
921: "",
922:
923: NULL
924: };
925:
926:
927: static build_organization () {
928: char buffer[BUFSIZ];
929:
930: (void) sprintf (buffer, "%s/c=%s/o=%s", wildlife,
931: n2p ("country", 1) -> p_value,
932: n2p ("organization", 1) -> p_value);
933: make_edb (buffer, "MASTER", version (), o_I);
934: }
935:
936: /* */
937:
938: static char *u_J[] = {
939: "cn=@(firstname) @(lastname)",
940: "acl= self # write # entry",
941: "acl= others # read # entry",
942: "acl= self # write # default",
943: "acl= others # read # default",
944: "acl= self # write # attributes # accessControlList$userPassword",
945: "acl= others # compare # attributes # accessControlList$userPassword",
946: "rfc822Mailbox= @(mailbox)",
947: "otherMailbox = internet $ @(mailbox)",
948: "title= @(title)",
949: "userid= @(userid)",
950: "userPassword= @(password)",
951: "telephoneNumber= @(extension)",
952: "surname= @(lastname)",
953: "cn= @(firstname) @(lastname)",
954: "cn= @(firstname) @(middleinitial). @(lastname)",
955: "cn= @(firstname) @(middlename) @(lastname)",
956: "objectClass= top & quipuObject",
957: "objectClass= person & thornPerson & pilotPerson",
958: "",
959:
960: NULL
961: };
962:
963:
964: static build_unit () {
965: char buffer[BUFSIZ];
966:
967: (void) sprintf (buffer, "%s/c=%s/o=%s/ou=%s", wildlife,
968: n2p ("country", 1) -> p_value,
969: n2p ("organization", 1) -> p_value,
970: n2p ("unit", 1) -> p_value);
971: make_edb (buffer, "MASTER", version (), u_J);
972: }
973:
974: /* */
975:
976: static make_edb (dir, type, date, entries)
977: char *dir,
978: *type,
979: *date;
980: char *entries[];
981: {
982: char edb[BUFSIZ];
983: FILE *fp;
984:
985: if (debug)
986: fprintf (stderr, "mkdir %s\n", dir);
987: if (mkdir (dir, 0700) == NOTOK)
988: adios (dir, "unable to create directory");
989:
990: (void) sprintf (edb, "%s/EDB", dir);
991: if (debug)
992: fprintf (stderr, "create %s\n", edb);
993: if ((fp = fopen (edb, "w")) == NULL)
994: adios (edb, "unable to create");
995:
996: fprintf (fp, "%s\n%s\n", type, date);
997: munge (fp, entries);
998:
999: if (ferror (fp))
1000: adios (edb, "error writing");
1001: (void) fclose (fp);
1002:
1003: (void) chmod (edb, 0600);
1004: }
1005:
1006: /* */
1007:
1008: static char *version () {
1009: long clock;
1010: struct UTCtime ut;
1011: static char buffer[BUFSIZ];
1012:
1013: (void) time (&clock);
1014: tm2ut (gmtime (&clock), &ut);
1015: (void) strcpy (buffer, gent2str (&ut));
1016:
1017: return buffer;
1018: }
1019:
1020: /* FILES */
1021:
1022: static build_tailor () { make_file ("quiputailor", "quiputailor", 0644, 1); }
1023:
1024: static build_startup () { make_file ("startup.sh", "startup.sh", 0755, 1); }
1025:
1026: static build_nightly () { make_file ("nightly.sh", "nightly.sh", 0755, 1); }
1027:
1028: /* */
1029:
1030: static make_file (infile, outfile, mode, dosed)
1031: char *infile,
1032: *outfile;
1033: int mode,
1034: dosed;
1035: {
1036: char buffer[BUFSIZ];
1037:
1038: if (dosed)
1039: (void) sprintf (buffer, "sed -f %s < templates/%s > %s/%s",
1040: sedfil, infile, wildlife, outfile);
1041: else
1042: (void) sprintf (buffer, "cp templates/%s %s/%s", infile, wildlife,
1043: outfile);
1044:
1045: if (debug)
1046: fprintf (stderr, "%s\n", buffer);
1047: if (system (buffer) != 0)
1048: adios (NULLCP, "%s of %s failed", dosed ? "sed" : "cp", infile);
1049:
1050: (void) sprintf (buffer, "%s/%s", wildlife, outfile);
1051: (void) chmod (buffer, mode);
1052: }
1053:
1054: /* SED */
1055:
1056: static build_dsap () { fudge_file ("dsaptailor"); }
1057:
1058: static build_fred () { fudge_file ("fredrc"); fudge_file ("ufnrc"); }
1059:
1060: /* */
1061:
1062: static fudge_file (name)
1063: char *name;
1064: {
1065: char buffer[BUFSIZ],
1066: file[BUFSIZ],
1067: oldfil[BUFSIZ],
1068: tmpfil[BUFSIZ];
1069:
1070: (void) strcpy (file, isodefile (name, 0));
1071:
1072: (void) sprintf (buffer, "%sXXXXXX", myname);
1073: (void) strcpy (tmpfil, isodefile (buffer, 0));
1074: (void) unlink (mktemp (tmpfil));
1075:
1076: (void) sprintf (buffer, "sed -f %s < %s > %s", sedfil, file, tmpfil);
1077: if (debug)
1078: fprintf (stderr, "%s\n", buffer);
1079: if (system (buffer) != 0) {
1080: (void) unlink (tmpfil);
1081: adios (NULLCP, "sed failed");
1082: }
1083:
1084: (void) sprintf (oldfil, "%s.old", file);
1085: if (access (oldfil, 0x00) == NOTOK)
1086: (void) rename (file, oldfil);
1087: if (rename (tmpfil, file) == NOTOK)
1088: adios (file, "unable to rename %s to", tmpfil);
1089: }
1090:
1091: /* ARGINIT */
1092:
1093: static arginit (vec)
1094: char **vec;
1095: {
1096: register char *ap;
1097:
1098: if (myname = rindex (*vec, '/'))
1099: myname++;
1100: if (myname == NULL || *myname == NULL)
1101: myname = *vec;
1102:
1103: isodetailor (myname, 1);
1104:
1105: for (vec++; ap = *vec; vec++) {
1106: if (*ap == '-') {
1107: while (*++ap)
1108: switch (*ap) {
1109: case 'd':
1110: debug++;
1111: break;
1112:
1113: default:
1114: adios (NULLCP, "unknown switch -%c", *ap);
1115: }
1116: continue;
1117: }
1118:
1119: if (wildlife) {
1120: usage: ;
1121: adios (NULLCP, "usage: %s config-file", myname);
1122: }
1123: wildlife = ap;
1124: }
1125:
1126: if (!wildlife)
1127: goto usage;
1128: }
1129:
1130: /* ERRORS */
1131:
1132: #ifndef lint
1133: void _advise ();
1134:
1135:
1136: static void adios (va_alist)
1137: va_dcl
1138: {
1139: va_list ap;
1140:
1141: va_start (ap);
1142:
1143: _advise (ap);
1144:
1145: va_end (ap);
1146:
1147: _exit (1);
1148: }
1149: #else
1150: /* VARARGS */
1151:
1152: static void adios (what, fmt)
1153: char *what,
1154: *fmt;
1155: {
1156: adios (what, fmt);
1157: }
1158: #endif
1159:
1160:
1161: #ifndef lint
1162: static void advise (va_alist)
1163: va_dcl
1164: {
1165: va_list ap;
1166:
1167: va_start (ap);
1168:
1169: _advise (ap);
1170:
1171: va_end (ap);
1172: }
1173:
1174:
1175: static void _advise (ap)
1176: va_list ap;
1177: {
1178: char buffer[BUFSIZ];
1179:
1180: asprintf (buffer, ap);
1181:
1182: (void) fflush (stdout);
1183:
1184: fprintf (stderr, "%s: ", myname);
1185: (void) fputs (buffer, stderr);
1186: (void) fputc ('\n', stderr);
1187:
1188: (void) fflush (stderr);
1189: }
1190: #else
1191: /* VARARGS */
1192:
1193: static void advise (what, fmt)
1194: char *what,
1195: *fmt;
1196: {
1197: advise (what, fmt);
1198: }
1199: #endif
1200:
1201: /* MISCELLANY */
1202:
1203: #ifndef lint
1204: static char *strdup (s)
1205: char *s;
1206: {
1207: char *p;
1208:
1209: if ((p = malloc((unsigned) (strlen (s) + 1))) == NULL)
1210: adios (NULLCP, "out of memory");
1211:
1212: (void) strcpy (p, s);
1213:
1214: return p;
1215: }
1216: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.