3 * This generates the web server user & group data.
7 * Copyright 1998 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, please see the file
12 #include <mit-copyright.h>
14 #include <moira_site.h>
22 EXEC SQL INCLUDE sqlca;
28 #define WWW_SUBDIR "www"
31 #define MAX_RECSIZE 10240
33 char *whoami = "www.gen";
34 char *db = "moira/moira";
36 void filsys(FILE *out);
37 void group(FILE *out);
39 char www_dir[MAXPATHLEN];
41 char *colors[] = {"red", "green", "blue", "yellow", "mauve", "spooge",
42 "rose", "ivory", "mitbeige", "twinkie", "midnightblue",
43 "grey", "lilac", "orange", "purple", "ronhoffmanngreen"};
47 int main(int argc, char **argv)
49 char outgrp[MAXPATHLEN];
50 char outfs[MAXPATHLEN];
51 char wkgrp[MAXPATHLEN];
52 char wkfs[MAXPATHLEN];
60 initialize_sms_error_table();
63 sprintf(www_dir, "%s/%s", DCM_DIR, WWW_SUBDIR);
66 sprintf(www_dir, "%s", argv[1]);
67 /* fake out dcm - we'll append .out later */
68 if (c = strrchr(www_dir, '.'))
74 fprintf(stderr, "usage: %s [outdir]\n", argv[0]);
78 if (stat(www_dir, &sb) < 0)
82 if (mkdir(www_dir, 0700) < 0)
84 fprintf(stderr, "%s: unable to make directory %s (%s))\n",
85 whoami, www_dir, strerror(errno));
91 fprintf(stderr, "%s: cannot stat %s (%s)\n", whoami, www_dir,
96 else if(!S_ISDIR(sb.st_mode))
98 fprintf(stderr, "%s: %s not a directory\n" , whoami, www_dir);
102 EXEC SQL CONNECT :db;
104 sprintf(outgrp, "%s/group", www_dir);
105 sprintf(outfs, "%s/filsys", www_dir);
106 sprintf(wkgrp, "%s/group~", www_dir);
107 sprintf(wkfs, "%s/filsys~", www_dir);
110 if (stat(outfs, &sb) == 0)
112 if (ModDiff (&flag, "filesys", sb.st_mtime))
116 fprintf(stderr, "%s: %s does not need to be rebuilt.\n", whoami, outfs);
119 fprintf(stderr, "%s: building fs database...\n", whoami);
120 if (!(outfsf = fopen(wkfs, "w")))
122 fprintf(stderr, "%s: cannot open %s for writing (%s)\n", whoami,
123 wkfs, strerror(errno));
129 fprintf(stderr, "%s: close of %s failed (%s)", whoami,
130 wkfs, strerror(errno));
137 if (stat(outgrp, &sb) == 0)
139 if (ModDiff (&flag, "list", sb.st_mtime) ||
140 ModDiff (&flag, "users", sb.st_mtime))
144 fprintf(stderr, "%s: %s does not need to be rebuilt.\n", whoami, outgrp);
147 fprintf(stderr, "%s: building group database...\n", whoami);
148 if (!(outgrpf = fopen(wkgrp, "w")))
150 fprintf(stderr, "%s: cannot open %s for writing (%s)\n", whoami,
151 wkgrp, strerror(errno));
157 fprintf(stderr, "%s: close of %s failed (%s)", whoami, wkgrp,
164 fprintf(stderr, "%s: building tar file...\n", whoami);
165 sprintf(cmd, "(cd %s; tar cf - . ) > %s.out", www_dir, www_dir);
172 void filsys(FILE *out)
175 EXEC SQL BEGIN DECLARE SECTION;
176 char label[FILESYS_LABEL_SIZE], path[FILESYS_NAME_SIZE];
178 EXEC SQL END DECLARE SECTION;
180 EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
182 EXEC SQL DECLARE filsys_cursor CURSOR FOR
183 SELECT label, name FROM filesys WHERE type='AFS' ORDER by label;
184 EXEC SQL OPEN filsys_cursor;
188 EXEC SQL FETCH filsys_cursor INTO :label, :path;
191 if (!*strtrim(label))
195 fprintf(out, "%s:%s\n", label, path);
198 EXEC SQL CLOSE filsys_cursor;
204 db_error(sqlca.sqlcode);
208 void group(FILE *out)
213 EXEC SQL BEGIN DECLARE SECTION;
214 char user[USERS_LOGIN_SIZE];
215 char list[LIST_NAME_SIZE];
216 char parent[LIST_NAME_SIZE];
217 EXEC SQL END DECLARE SECTION;
219 EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
221 EXEC SQL DECLARE user_cursor CURSOR FOR
222 SELECT login FROM users WHERE status=1 ORDER by login;
223 EXEC SQL OPEN user_cursor;
227 EXEC SQL FETCH user_cursor INTO :user;
231 recsize = strlen(user) + 3;
234 EXEC SQL DECLARE member_cursor CURSOR FOR
235 SELECT DISTINCT l.name from list l, imembers i, users u
236 WHERE u.login=:user AND u.users_id=i.member_id AND
237 i.member_type='USER' AND i.list_id=l.list_id AND
238 l.grouplist != 0 and l.active != 0
240 EXEC SQL OPEN member_cursor;
244 EXEC SQL FETCH member_cursor INTO :list;
249 fprintf(out, "%s:xjOhFdLKGK84w:", user);
250 fprintf(out, "%s%s", first ? "" : ",", list);
251 recsize += strlen(list) + 1;
253 if (recsize > MAX_RECSIZE)
255 fprintf(stderr, "truncated group list for %s\n", user);
260 EXEC SQL CLOSE member_cursor;
267 EXEC SQL CLOSE user_cursor;
273 db_error(sqlca.sqlcode);