]> andersk Git - moira.git/blame - gen/www.pc
#defines for subnet statuses.
[moira.git] / gen / www.pc
CommitLineData
6b3a8ea3 1/* $Id$
2 *
3 * This generates the web server user & group data.
4 *
5 * tom@mit.edu
6 *
7 * Copyright 1998 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, please see the file
9 * <mit-copyright.h>.
10 */
11
12#include <mit-copyright.h>
13#include <moira.h>
14#include <moira_site.h>
15#include <sys/stat.h>
16#include <stdio.h>
17#include <string.h>
18#include <time.h>
19#include <errno.h>
20#include "util.h"
21
22EXEC SQL INCLUDE sqlca;
23
24RCSID("$Header$");
25
26
27#ifndef WWW_SUBDIR
28#define WWW_SUBDIR "www"
29#endif
30
31#define MAX_RECSIZE 10240
32
33char *whoami = "www.gen";
34char *db = "moira/moira";
35
36void filsys(FILE *out);
37void group(FILE *out);
38
39char www_dir[MAXPATHLEN];
40
41char *colors[] = {"red", "green", "blue", "yellow", "mauve", "spooge",
42 "rose", "ivory", "mitbeige", "twinkie", "midnightblue",
43 "grey", "lilac", "orange", "purple", "ronhoffmanngreen"};
44int ncolors = 16;
45
46
47int main(int argc, char **argv)
48{
49 char outgrp[MAXPATHLEN];
50 char outfs[MAXPATHLEN];
51 char wkgrp[MAXPATHLEN];
52 char wkfs[MAXPATHLEN];
53 char cmd[BUFSIZ];
54 FILE *outgrpf;
55 FILE *outfsf;
56 struct stat sb;
57 char *c;
6b3a8ea3 58
59 initialize_sms_error_table();
60
61 if (argc == 1)
62 sprintf(www_dir, "%s/%s", DCM_DIR, WWW_SUBDIR);
63 else
64 {
65 sprintf(www_dir, "%s", argv[1]);
66 /* fake out dcm - we'll append .out later */
67 if (c = strrchr(www_dir, '.'))
68 *c = '\0';
69 }
70
71 if (argc > 2)
72 {
73 fprintf(stderr, "usage: %s [outdir]\n", argv[0]);
74 exit(MR_ARGS);
75 }
76
77 if (stat(www_dir, &sb) < 0)
78 {
79 if (errno == ENOENT)
80 {
81 if (mkdir(www_dir, 0700) < 0)
82 {
83 fprintf(stderr, "%s: unable to make directory %s (%s))\n",
84 whoami, www_dir, strerror(errno));
85 exit(MR_CCONFIG);
86 }
87 }
88 else
89 {
90 fprintf(stderr, "%s: cannot stat %s (%s)\n", whoami, www_dir,
91 strerror(errno));
92 exit(MR_CCONFIG);
93 }
94 }
95 else if(!S_ISDIR(sb.st_mode))
96 {
97 fprintf(stderr, "%s: %s not a directory\n" , whoami, www_dir);
98 exit(MR_CCONFIG);
99 }
100
101 EXEC SQL CONNECT :db;
102
103 sprintf(outgrp, "%s/group", www_dir);
104 sprintf(outfs, "%s/filsys", www_dir);
105 sprintf(wkgrp, "%s/group~", www_dir);
106 sprintf(wkfs, "%s/filsys~", www_dir);
107
a589d269 108 fprintf(stderr, "%s: building fs database...\n", whoami);
109 if (!(outfsf = fopen(wkfs, "w")))
6b3a8ea3 110 {
a589d269 111 fprintf(stderr, "%s: cannot open %s for writing (%s)\n", whoami,
112 wkfs, strerror(errno));
113 exit(MR_OCONFIG);
6b3a8ea3 114 }
a589d269 115 filsys(outfsf);
116 if (fclose(outfsf))
6b3a8ea3 117 {
a589d269 118 fprintf(stderr, "%s: close of %s failed (%s)", whoami,
119 wkfs, strerror(errno));
120 exit(MR_CCONFIG);
6b3a8ea3 121 }
a589d269 122 fix_file(outfs);
6b3a8ea3 123
a589d269 124 fprintf(stderr, "%s: building group database...\n", whoami);
125 if (!(outgrpf = fopen(wkgrp, "w")))
6b3a8ea3 126 {
a589d269 127 fprintf(stderr, "%s: cannot open %s for writing (%s)\n", whoami,
128 wkgrp, strerror(errno));
129 exit(MR_OCONFIG);
6b3a8ea3 130 }
a589d269 131 group(outgrpf);
132 if (fclose(outgrpf))
6b3a8ea3 133 {
a589d269 134 fprintf(stderr, "%s: close of %s failed (%s)", whoami, wkgrp,
135 strerror(errno));
136 exit(MR_CCONFIG);
6b3a8ea3 137 }
a589d269 138 fix_file(outgrp);
139
6b3a8ea3 140 fprintf(stderr, "%s: building tar file...\n", whoami);
141 sprintf(cmd, "(cd %s; tar cf - . ) > %s.out", www_dir, www_dir);
142 if (system(cmd))
143 exit(MR_TAR_FAIL);
144
145 exit(MR_SUCCESS);
146}
147
148void filsys(FILE *out)
149{
150 char *c;
151 EXEC SQL BEGIN DECLARE SECTION;
152 char label[FILESYS_LABEL_SIZE], path[FILESYS_NAME_SIZE];
ad031ac3 153 char type[FILESYS_TYPE_SIZE], key[FSGROUP_KEY_SIZE];
8aa828ce 154 char alias[ALIAS_NAME_SIZE];
ad031ac3 155 int status, fid;
6b3a8ea3 156 EXEC SQL END DECLARE SECTION;
157
158 EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
159
160 EXEC SQL DECLARE filsys_cursor CURSOR FOR
ad031ac3 161 SELECT label, name, type, filsys_id FROM filesys
162 WHERE type='AFS' or type='FSGROUP'
163 ORDER by label;
6b3a8ea3 164 EXEC SQL OPEN filsys_cursor;
6b3a8ea3 165 while (1)
166 {
ad031ac3 167 EXEC SQL FETCH filsys_cursor INTO :label, :path, :type, :fid;
6b3a8ea3 168 if (sqlca.sqlcode)
169 break;
ad031ac3 170
6b3a8ea3 171 if (!*strtrim(label))
172 continue;
ad031ac3 173
174 if (!strcmp(strtrim(type), "FSGROUP"))
175 {
97b4b723 176 *path = '\0';
ad031ac3 177 EXEC SQL DECLARE group_cursor CURSOR FOR
178 SELECT f.name, g.key FROM filesys f, fsgroup g
179 WHERE f.filsys_id = g.filsys_id AND f.type='AFS'
180 AND g.group_id = :fid
181 ORDER BY g.key;
182 EXEC SQL OPEN group_cursor;
183 EXEC SQL FETCH group_cursor INTO :path, :key;
184 EXEC SQL CLOSE group_cursor;
185 }
186
8aa828ce 187 EXEC SQL DECLARE alias_cursor CURSOR FOR
188 SELECT name INTO :alias FROM alias
189 WHERE type='FILESYS' AND trans=:label;
190
6b3a8ea3 191 if (!*strtrim(path))
192 continue;
193 fprintf(out, "%s:%s\n", label, path);
8aa828ce 194
195 EXEC SQL OPEN alias_cursor;
196 while (1)
197 {
198 EXEC SQL FETCH alias_cursor INTO :alias;
199 if (sqlca.sqlcode)
200 break;
201
202 if (!*strtrim(alias))
203 continue;
204 fprintf(out, "%s:%s\n", alias, path);
205 }
206 EXEC SQL CLOSE alias_cursor;
6b3a8ea3 207 }
208
209 EXEC SQL CLOSE filsys_cursor;
210 EXEC SQL COMMIT;
211
212 return;
213
214sqlerr:
215 db_error(sqlca.sqlcode);
216 exit(MR_DBMS_ERR);
217}
218
219void group(FILE *out)
220{
221 int first;
222 int recsize;
223
224 EXEC SQL BEGIN DECLARE SECTION;
225 char user[USERS_LOGIN_SIZE];
226 char list[LIST_NAME_SIZE];
227 char parent[LIST_NAME_SIZE];
228 EXEC SQL END DECLARE SECTION;
229
230 EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
231
232 EXEC SQL DECLARE user_cursor CURSOR FOR
71a95cd2 233 SELECT login FROM users WHERE status=1 OR status=2 OR status=6
234 ORDER by login;
6b3a8ea3 235 EXEC SQL OPEN user_cursor;
236
237 while (1)
238 {
239 EXEC SQL FETCH user_cursor INTO :user;
240 if (sqlca.sqlcode)
241 break;
242 strtrim(user);
97b4b723 243 if (!isalpha(*user))
244 continue;
245
6b3a8ea3 246 recsize = strlen(user) + 3;
247 first = 1;
97b4b723 248 fprintf(out, "%s:xjOhFdLKGK84w:", user);
6b3a8ea3 249
250 EXEC SQL DECLARE member_cursor CURSOR FOR
251 SELECT DISTINCT l.name from list l, imembers i, users u
252 WHERE u.login=:user AND u.users_id=i.member_id AND
253 i.member_type='USER' AND i.list_id=l.list_id AND
254 l.grouplist != 0 and l.active != 0
255 ORDER by l.name;
256 EXEC SQL OPEN member_cursor;
257
258 while (1)
259 {
260 EXEC SQL FETCH member_cursor INTO :list;
261 if (sqlca.sqlcode)
262 break;
263 strtrim(list);
6b3a8ea3 264 fprintf(out, "%s%s", first ? "" : ",", list);
265 recsize += strlen(list) + 1;
266 first = 0;
267 if (recsize > MAX_RECSIZE)
268 {
269 fprintf(stderr, "truncated group list for %s\n", user);
270 break;
271 }
272 }
273
274 EXEC SQL CLOSE member_cursor;
275 EXEC SQL COMMIT;
276
97b4b723 277 fprintf(out, "\n");
6b3a8ea3 278 }
279
280 EXEC SQL CLOSE user_cursor;
281 EXEC SQL COMMIT;
282
283 return;
284
285sqlerr:
286 db_error(sqlca.sqlcode);
287 exit(MR_DBMS_ERR);
288}
This page took 0.183717 seconds and 5 git commands to generate.