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