📄 usconfig.c
字号:
} if (mkdir (file, DIRPERM) < 0 && errno != EEXIST) adios (NULLCP, "internal error: cannot create %s",file);/* make sure EDB file doesn't already exist */ strcat (file, "/EDB"); if (access (file, F_OK) == 0) { sprintf (oldfile, "%s.bak", file); if (rename (file, oldfile) < 0) adios (NULLCP, "cannot rename %s to %s", file, oldfile); }/* now create skeleton organizational unit entries */ sprintf (buf, "sed -f %s %s > \"%s\"", SEDFILE, OUEDBTMPL, file); if (system (buf) != 0) adios (NULLCP, "system failed: cannot create %s", file);}/* *//* build_tailor () -- build tailor files */voidbuild_tailor (){ extern void make_file (); make_file ("quiputailor", QUIPUTMPL); make_file (isodefile ("dsaptailor", 0), DSAPTMPL);}/* build_scripts () -- build script files */voidbuild_scripts (){ extern void make_file (); make_file ("startup.sh", STARTUPTMPL); make_file ("nightly.sh", NIGHTLYTMPL);}/* build_uifl () -- build user interface configuration files */voidbuild_uifl (){ extern void make_file (); sprintf (file, "%s/fredrc", isodetcpath); make_file (file, FREDTMPL); sprintf (file, "%s/ufnrc", isodetcpath); make_file (file, UFNTMPL);}/* *//* create_sedfile () -- create sed file to convert templates */voidcreate_sedfile (){ FILE *sedfp; /* sed file pointer */ struct pair *pp; /* to get pair values */ char *orgnm; /* organization name */ char *town; /* name of town */ struct state *sp; /* to save state */ short stnmlen; /* length of state name */ int i; extern char *timestamp (); if ((sedfp = fopen (SEDFILE, "w")) == (FILE *)NULL) adios (NULLCP, "cannot create sed file %s", SEDFILE);/* put in pairs */ for (i = 0; pairs[i].p_nm != (char *)NULL; ++i) if (pairs[i].p_val != (char *)NULL) fprintf (sedfp,"s!@(%s)!%s!g\n", pairs[i].p_nm, pairs[i].p_val); else fprintf (sedfp, "s!@(%s)!!g\n", pairs[i].p_nm);/* put in things from isodetailor () */ fprintf (sedfp,"s!@(etcdir)!%s!g\n",isodetcpath); fprintf (sedfp,"s!@(bindir)!%s!g\n",isodebinpath); fprintf (sedfp,"s!@(sbindir)!%s!g\n",isodesbinpath); fprintf (sedfp,"s!@(quipuversion)!%s!g\n",quipuversion);/* get state, in order to find apppropriate regional DSAs */ if ((pp = findpair ("state", 0x00)) == (struct pair *)NULL) adios (NULLCP, "internal error: cannot get 'state' variable"); stnmlen = strlen (pp->p_val); for (i = 0; usstates[i].s_nm != (char *)NULL; ++i) if (stnmlen == strlen (pp->p_val) && strcmp (pp->p_val, usstates[i].s_nm) == 0) break; if (usstates[i].s_nm == (char *)NULL) adios (NULLCP, "state %s not a U.S. state\n", pp->p_val); else sp = (usstates +i);/* put in appropriate regional DSA */ fprintf (sedfp,"s!@(parentdsa)!%s!g\n", regional_dsas[sp->s_region].dsa_name); fprintf (sedfp,"s!@(parentaddr)!%s!g\n", regional_dsas[sp->s_region].dsa_addr);/* get organization name */ if ((pp = findpair ("organization", 0x00)) == (struct pair *)NULL) adios (NULLCP, "internal error: cannot get 'organization' variable"); orgnm = pp->p_val; if ((pp = findpair ("orgcode", 0x00)) != (struct pair *)NULL || chartered_by_congress) { fprintf (sedfp, "s!@(dnprefix)!%s@o=%s!g\n", USDN, orgnm); } else { fprintf (sedfp, "s!@(dnprefix)!%s@st=%s@o=%s!g\n", USDN, sp->s_nm, orgnm); }/* put in locality and physicalDeliveryOfficeName */ if ((pp = findpair ("town", 0x00)) == (struct pair *)NULL) adios (NULLCP, "internal error: cannot get 'town' variable"); fprintf (sedfp,"s!@(locality)!%s, %s!g\n", pp->p_val, sp->s_nm);/* put in timestamp */ fprintf (sedfp, "s!@(timestamp)!%s!g\n", timestamp ()); fclose (sedfp);}/* *//* make_file () -- create a file from a template */voidmake_file (fl, tmpl)char *fl; /* file to be created */char *tmpl; /* template to use */{ if (access (fl, F_OK) == 0) { /* file already exists? */ sprintf (oldfile, "%s.old", fl); if (rename (fl, oldfile) < 0) adios (NULLCP, "cannot rename %s to %s", fl, oldfile); } sprintf (buf, "sed -f %s %s > %s", SEDFILE, tmpl, fl); if (system (buf) != 0) adios (NULLCP, "system failed: cannot create %s", fl);}/* *//* build_mesgfl () -- build file that needs to be sent to wpp-manager */voidbuild_mesgfl (){ FILE *msgfp; /* pointer to message file */ FILE *fp; /* pointer to various EDB entries */ struct pair *pp; /* to get pair values */ char *orgnm; /* name of organization */ char *statenm; /* name of state */ unsigned char nationalorg; /*national organization? nonzero if so*//* open up message file */ if ((msgfp = fopen ("to.wpp-manager", "w")) == (FILE *)NULL) adios (NULLCP, "cannot create to.wpp-manager message file");/* get name of organization */ if ((pp = findpair ("organization", 0x00)) == (struct pair *)NULL) adios (NULLCP, "internal error: cannot get 'organization' value"); orgnm = pp->p_val;/* get name of state */ if ((pp = findpair ("state", 0x00)) == (struct pair *)NULL) adios (NULLCP, "internal error: cannot get 'state' value"); statenm = pp->p_val;/* determine if this is a regional or national organization */ if ((pp = findpair ("orgcode", 0x00)) != (struct pair *)NULL || chartered_by_congress) { nationalorg = 0x7f; /* a national organization */ } else nationalorg = 0x00; /* a regional organization *//* put organizational EDB into message */ if (nationalorg) fprintf (msgfp,"--- Addition to %s/EDB ---\n", USDN); else fprintf (msgfp,"--- Addition to %s/st=%s/EDB ---\n", USDN, statenm); if ((fp = fopen (ORGENTRY, "r")) == (FILE *)NULL) adios (NULLCP, "cannot open %s", ORGENTRY); while (fgets (line, BUFSIZ-1, fp) != (char *)NULL) fprintf (msgfp, "%s", line); fclose (fp);/* put DSA entry into message */ if ((fp = fopen (DSAENTRY, "r")) == (FILE *)NULL) adios (NULLCP, "cannot open %s", DSAENTRY); fprintf (msgfp, "--- Addition to %s/EDB ---\n", USDN); while (fgets (line, BUFSIZ-1, fp) != (char *)NULL) fprintf (msgfp, "%s", line); fclose (fp); fclose (msgfp); printf ("Remember to send the to.wpp-manager file off.\n"); printf ("(It may be deleted anytime after it is sent)\n"); unlink (ORGENTRY); unlink (DSAENTRY);}/* *//* copy_edb () -- create an EDB, or append to an existing EDB */voidcopy_edb (dir, edbtmpl, append)char *dir; /* place where EDB should go */char *edbtmpl; /* location of EDB template */unsigned char append; /* append, nonzero if so */{ FILE *edbfp; /* EDB file pointer */ FILE *tmplfp; /* template file pointer */ bzero (file, BUFSIZ); /* clear general purpose filename */ bzero (line, BUFSIZ); /* clear general purpose line */ sprintf(file, "%s/EDB", dir); /* get path of EDB file */ if (!append) { /* don't append -- copy *//* rename EDB if it already exists */ if (access (file, F_OK) == 0) { bzero (oldfile, BUFSIZ); sprintf (oldfile,"%s.bak", file); if (rename (file, oldfile) < 0) adios (NULLCP, "cannot rename %s to %s", file, oldfile); } /* open new EDB file */ if ((edbfp = fopen (file, "w")) == (FILE *)NULL) adios (NULLCP, "cannot open %s", file); } else { /* append *//* open new EDB file */ if ((edbfp = fopen (file, "a")) == (FILE *)NULL) adios (NULLCP, "cannot open %s", file); }/* open template file */ if ((tmplfp = fopen (edbtmpl, "r")) == (FILE *)NULL) adios (NULLCP, "cannot open template file %s", edbtmpl);/* copy in EDB */ while (fgets (line, BUFSIZ-1, tmplfp) != NULL) fprintf(edbfp, "%s", line); fclose (tmplfp); fclose (edbfp);}/* *//* findpair () -- find 'pair' structure corresponding to name provided */struct pair *findpair (nm, any)char *nm; /* name of 'pair' to find */char any; /* 'pair' can have any value? */{ int i; /* index and counter */ int nmlen; /* length of name */ nmlen = strlen (nm); /* get length of name *//* iterate, looking for a name match */ for (i = 0 ; pairs[i].p_nm != (char *)NULL; ++i) if (nmlen == strlen(pairs[i].p_nm) && strcmp (pairs[i].p_nm,nm) == 0) if (any || pairs[i].p_val != (char *)NULL) return (pairs+i); return ((struct pair *)NULL);}/* *//* set_permissions () -- set appropriate permissions on database directory */voidset_permissions (){ struct pair *pp; /* to get pair values */ char *owner, *group; /* owner and group */ char *wildlife; /* database directory */ struct passwd *pw; struct group *grp; owner = (char *)NULL; group = (char *)NULL;/* get database directory */ if ((pp = findpair ("wildlife", 0x00)) == (struct pair *)NULL) adios (NULLCP, "internal error: cannot get 'wildlife' directory"); wildlife = pp->p_val;/* get owner */ if ((pp = findpair ("owner", 0x00)) == (struct pair *)NULL) if ((pp = findpair ("userid", 0x00)) == (struct pair *)NULL) if ((pw = getpwuid (geteuid())) == (struct passwd *)NULL) adios (NULLCP, "Warning: chown not performed -- no account"); else { advise (NULLCP, "Warning: 'owner' and 'userid' not specified -- using %s", pw->pw_name); owner = pw->pw_name; } else { if (getpwnam (pp->p_val) == (struct passwd *)NULL) adios (NULLCP, "Account '%s' is not legal -- cannot be owner", pp->p_val); owner = pp->p_val; } else { if (getpwnam (pp->p_val) == (struct passwd *)NULL) adios (NULLCP, "Account '%s' is not legal -- cannot be owner", pp->p_val); owner = pp->p_val; }/* get group */ if ((pp = findpair ("groupid", 0x00)) == (struct pair *)NULL) { if ((grp = getgrgid (getegid ())) == (struct group *)NULL) adios (NULLCP, "Warning: chown not performed -- no group"); group = grp->gr_name; } else { if (getgrnam (pp->p_val) == (struct group *)NULL) adios (NULLCP, "Group '%s' not legal -- cannot be group", pp->p_val); group = pp->p_val; } /* do chown */ bzero (buf, BUFSIZ); chdir (".."); sprintf (buf, "find %s -exec chown %s.%s {} \\;", wildlife, owner, group); if (system (buf) != 0) adios (NULLCP, "cannot perform chown -- system failed"); sprintf (buf, "chmod 755 %s/startup.sh %s/nightly.sh", wildlife, wildlife); if (system (buf) != 0) adios (NULLCP, "cannot perform chmod -- system failed");}/* *//* make_usstates () -- generate EDB format entries for the U.S. states */voidmake_usstates (){ int i,j; char *masterdsa; for (i = 0; usstates[i].s_nm != (char *)NULL; ++i) { printf ("st=%s\n",usstates[i].s_nm); printf ("objectclass= top & locality & quipuObject & quipuNonLeafObject & nadfObject & usStateOrEquivalent\n"); printf ("l= %s & %s\n", usstates[i].s_nm, usstates[i].s_abb); printf ("st=%s\n",usstates[i].s_nm); if (usstates[i].s_fips < 60) printf ("description= The State of %s\n", usstates[i].s_nm); else printf ("description= %s\n", usstates[i].s_nm); printf ("acl= others # read # default\n"); printf ("acl= others # read # entry\n"); printf ("masterDSA= cn=Alpaca\n"); printf ("slaveDSA= cn=Fruit Bat\n"); printf ("slaveDSA= cn=Giant Anteater\n"); printf ("fipsStateNumericCode= %d\n",usstates[i].s_fips); printf ("fipsStateAlphaCode= %s\n\n",usstates[i].s_abb); } /* end, foreach state */}/* *//* timestamp () -- return timestamp to use as version on EDB file */char *timestamp (){ long clock; struct UTCtime ut; static char timestamp [32]; (void) time (&clock); tm2ut (gmtime (&clock), &ut); (void) strcpy (timestamp, gent2str (&ut)); return (timestamp);}/* adios () -- exit with error */#ifndef lintvoidadios (va_alist)va_dcl{ va_list ap; extern void _advise (); va_start (ap); _advise (ap); va_end (ap); _exit (1);}#else /* lint */voidadios (what, fmt)char *what, fmt);{ adios (what, fmt);}#endif /* lint *//* advise () -- print out an error message */#ifndef lintvoidadvise (va_alist)va_dcl{ va_list ap; extern void _advise (); va_start (ap); _advise (ap); va_end (ap);}void_advise (ap)va_list ap;{ char buffer[BUFSIZ]; asprintf (buffer, ap); (void) fflush (stdout); fprintf (stderr, "%s: ", prgnm); (void) fputs (buffer, stderr); (void) fputc ('\n',stderr); (void)fflush(stderr);}#else /* lint *//* VARARGS */voidadvise (what, fmt)char *what, *fmt;{ advise (what, fmt);}#endif /* lint */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -