]> andersk Git - moira.git/blame - gen/winad.pc
Add pointer to a file allowing us to deny users printing access.
[moira.git] / gen / winad.pc
CommitLineData
c31c844d 1/* $Id$
2 *
3 * This generates the user, list, list membership, filesys data
4 * for windows active directory update
5 *
6 * (c) Copyright 1988-2001 by the Massachusetts Institute of Technology.
7 * For copying and distribution information, please see the file
8 * <mit-copyright.h>.
9 */
10
11#include <mit-copyright.h>
12#include <moira.h>
13#include <moira_site.h>
14
15#include <sys/stat.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19
20#include "util.h"
21
22EXEC SQL INCLUDE sqlca;
23
24#ifndef WINAD_SUBDIR
25#define WINAD_SUBDIR "winad"
26#endif
27
28char winad_dir[MAXPATHLEN];
29char *whoami = "winad.gen";
30char *db = "moira/moira";
31
32int do_user(void);
33int do_groups(void);
34int do_groupmembership(void);
4484634e 35int do_containers(void);
c31c844d 36
37int main(int argc, char **argv)
38{
39 char cmd[64];
40 struct stat sb;
41 int changed = 0;
42
43 if (argc > 2)
44 {
45 fprintf(stderr, "usage: %s [outfile]\n", argv[0]);
46 exit(MR_ARGS);
47 }
48
49 initialize_sms_error_table();
50 sprintf(winad_dir, "%s/%s", DCM_DIR, WINAD_SUBDIR);
51
52 EXEC SQL CONNECT :db;
53
54 changed = do_user();
55 changed += do_groups();
56 changed += do_groupmembership();
4484634e 57 changed += do_containers();
c31c844d 58
59 if (!changed)
60 {
61 fprintf(stderr, "No files updated.\n");
62 if (argc == 2 && stat(argv[1], &sb) == 0)
63 exit(MR_NO_CHANGE);
64 }
65
66 if (argc == 2)
67 {
68 fprintf(stderr, "Building tar file.\n");
69 sprintf(cmd, "cd %s; tar cf %s .", winad_dir, argv[1]);
70 if (system(cmd))
71 exit(MR_TAR_FAIL);
72 }
73
74 exit(MR_SUCCESS);
75}
76
77
78int do_user(void)
79{
80 FILE *fout;
81 char foutf[MAXPATHLEN];
82 char foutft[MAXPATHLEN];
83 EXEC SQL BEGIN DECLARE SECTION;
84 char login[USERS_LOGIN_SIZE];
85 char mit_id[USERS_CLEARID_SIZE];
86 int users_id, unix_uid, status;
87 char type[FILESYS_TYPE_SIZE];
88 char name[FILESYS_NAME_SIZE];
67fc5ef4 89 char homedir[USERS_WINHOMEDIR_SIZE];
90 char profiledir[USERS_WINPROFILEDIR_SIZE];
65382c46 91 int fid;
c31c844d 92 EXEC SQL END DECLARE SECTION;
93
94 sprintf(foutf, "%s/winuser.db", winad_dir);
95 sprintf(foutft, "%s~", foutf);
96
97 fout = fopen(foutft, "w");
98 if (!fout)
99 {
100 perror("cannot open winuser.db for write");
101 exit(MR_OCONFIG);
102 }
103
104 EXEC SQL DECLARE u_cursor CURSOR FOR
67fc5ef4 105 SELECT users_id, login, unix_uid, status, clearid, winhomedir,
106 winprofiledir
c31c844d 107 FROM users
108 ORDER BY users_id;
109 EXEC SQL OPEN u_cursor;
110 while (1)
111 {
112 EXEC SQL FETCH u_cursor INTO :users_id, :login, :unix_uid, :status,
67fc5ef4 113:mit_id, :homedir, :profiledir;
c31c844d 114 if (sqlca.sqlcode)
115 break;
116 strtrim(login);
117 strtrim(mit_id);
67fc5ef4 118 strtrim(homedir);
119 strtrim(profiledir);
120
121 if (strcmp(mit_id, "") == 0)
122 strcpy(mit_id, "0");
123
124 if (strcasecmp(homedir, "[AFS]") == 0 || strcasecmp(profiledir,
125 "[AFS]") == 0)
126 {
127 EXEC SQL SELECT filsys_id into :fid
128 FROM filesys
129 WHERE lockertype = 'HOMEDIR'
130 AND label = :login
131 AND type = 'FSGROUP';
132
133 if (sqlca.sqlcode == 0)
134 {
135 EXEC SQL DECLARE f_cursor CURSOR FOR
136 SELECT type, name
137 FROM filesys a, fsgroup b
138 WHERE a.filsys_id=b.filsys_id
139 AND b.group_id=:fid
140 ORDER by key;
141
142 EXEC SQL OPEN f_cursor;
143
144 EXEC SQL FETCH f_cursor INTO :type, :name;
145
146 if (sqlca.sqlcode == 0)
147 {
148 strtrim(type);
149 strtrim(name);
150 }
151 else
152 {
153 strcpy(type, "NONE");
154 strcpy(name, "NONE");
155 }
156
157 EXEC SQL CLOSE f_cursor;
158 }
159
160 else
161 {
162 EXEC SQL SELECT type, name into :type, :name
163 FROM filesys
164 WHERE lockertype = 'HOMEDIR'
165 AND label=:login;
166
167 if (sqlca.sqlcode == 0)
168 {
169 strtrim(type);
170 strtrim(name);
171 }
172 else
173 {
174 strcpy(type, "NONE");
175 strcpy(name, "NONE");
176 }
177 }
178 if (strcasecmp(type, "AFS") != 0)
179 strcpy(name, "[LOCAL]");
180
181 }
182
183 if (strcasecmp(homedir, "[AFS]") == 0)
184 strcpy(homedir, name);
185
186 if (strcasecmp(profiledir, "[AFS]") == 0)
187 {
188 strcpy(profiledir, name);
189 if (strcasecmp(name, "[LOCAL]"))
190 strcat(profiledir, "/.winprofile");
191 }
65382c46 192
c31c844d 193 fprintf(fout, "%d %s %d %d %s %s %s\n",
65382c46 194 users_id, login, unix_uid, status, mit_id,
67fc5ef4 195 homedir, profiledir);
65382c46 196 }
197
c31c844d 198 if (sqlca.sqlcode < 0)
199 db_error(sqlca.sqlcode);
200 EXEC SQL CLOSE u_cursor;
201 EXEC SQL COMMIT;
202
203 if (fclose(fout))
204 {
205 fprintf(stderr, "Unsuccessful file close of winuser.db\n");
206 exit(MR_CCONFIG);
207 }
208
209 fix_file(foutf);
210
211 return 1;
212}
213
214int do_groups(void)
215{
216 FILE *fout;
217 char foutf[MAXPATHLEN];
218 char foutft[MAXPATHLEN];
219 EXEC SQL BEGIN DECLARE SECTION;
220 char listname[LIST_NAME_SIZE];
221 char description[LIST_DESCRIPTION_SIZE];
222 char acltype[LIST_ACL_TYPE_SIZE];
223 int aclid;
224 char aclname[STRINGS_STRING_SIZE];
225 int list_id, active, maillist, grouplist;
226 EXEC SQL END DECLARE SECTION;
227
228 sprintf(foutf, "%s/wingroup.db", winad_dir);
229 sprintf(foutft, "%s~", foutf);
230
231 fout = fopen(foutft, "w");
232 if (!fout)
233 {
234 perror("cannot open wingroup.db for write");
235 exit(MR_OCONFIG);
236 }
237
238 EXEC SQL DECLARE l_cursor CURSOR FOR
239 SELECT list_id, name, active, maillist, grouplist, description,
240acl_type, acl_id
241 FROM list
242 ORDER BY list_id;
243 EXEC SQL OPEN l_cursor;
244 while (1)
245 {
246 EXEC SQL FETCH l_cursor INTO :list_id, :listname, :active, :maillist,
247:grouplist,
248 :description, :acltype, :aclid;
249
250 if (sqlca.sqlcode)
251 break;
252
253 strtrim(listname);
254 strtrim(description);
255 strtrim(acltype);
256
257
4484634e 258 strcpy(aclname, "NONE");
c31c844d 259 if (strcmp(acltype, "LIST") == 0)
260 {
261 EXEC SQL SELECT name into :aclname
262 FROM list
263 WHERE list_id = :aclid;
264 }
265 else if (strcmp(acltype, "USER") == 0)
266 {
267 EXEC SQL SELECT login into :aclname
268 FROM users
269 WHERE users_id = :aclid;
270 }
271 else if (strcmp(acltype, "KERBEROS") == 0)
272 {
273 EXEC SQL SELECT string into :aclname
274 FROM strings
275 WHERE string_id = :aclid;
276 }
277
278 strtrim(aclname);
279
280 fprintf(fout, "%d %s %d %d %d %s %s %s\n",
281 list_id, listname, active, maillist, grouplist, acltype, aclname,
282description);
283 }
284
285 if (sqlca.sqlcode < 0)
286 db_error(sqlca.sqlcode);
287 EXEC SQL CLOSE l_cursor;
288 EXEC SQL COMMIT;
289
290 if (fclose(fout))
291 {
292 fprintf(stderr, "Unsuccessful file close of wingroup.db\n");
293 exit(MR_CCONFIG);
294 }
295
296 fix_file(foutf);
297 return 1;
298}
299
300int do_groupmembership(void)
301{
302 FILE *fout;
303 char foutf[MAXPATHLEN];
304 char foutft[MAXPATHLEN];
305 EXEC SQL BEGIN DECLARE SECTION;
306 char member_type[IMEMBERS_MEMBER_TYPE_SIZE];
307 char member_name[STRINGS_STRING_SIZE];
308 int list_id;
309 EXEC SQL END DECLARE SECTION;
310
311 sprintf(foutf, "%s/wingmember.db", winad_dir);
312 sprintf(foutft, "%s~", foutf);
313
314 fout = fopen(foutft, "w");
315 if (!fout)
316 {
317 perror("cannot open wingmember.db for write");
318 exit(MR_OCONFIG);
319 }
320
321 EXEC SQL DECLARE list_cursor CURSOR FOR
322 SELECT list_id
323 FROM list
e2a7bf03 324 WHERE active != 0
c31c844d 325 ORDER BY list_id;
326 EXEC SQL OPEN list_cursor;
327 while (1)
328 {
329 EXEC SQL FETCH list_cursor INTO :list_id;
330
331 if (sqlca.sqlcode)
332 break;
333
334 /* get all the users */
335 EXEC SQL DECLARE csr001 CURSOR FOR
336 SELECT i.member_type, u.login
337 FROM users u, imembers i
338 WHERE i.list_id = :list_id AND i.member_type = 'USER'
339 AND i.member_id = u.users_id
340 ORDER BY u.login;
341
342 EXEC SQL OPEN csr001;
343 while(1)
344 {
345 EXEC SQL FETCH csr001 into :member_type, :member_name;
346 if (sqlca.sqlcode)
347 break;
348 fprintf(fout, "%d %s %s\n",
349 list_id, member_type, member_name);
350 }
351
352 if (sqlca.sqlcode < 0)
353 db_error(sqlca.sqlcode);
354 EXEC SQL CLOSE csr001;
355
356 /* get all the KERBEROS AND STRINGS */
357 EXEC SQL DECLARE csr002 CURSOR FOR
358 SELECT i.member_type, s.string
359 FROM strings s, imembers i
360 WHERE i.list_id = :list_id AND
361 (i.member_type = 'KERBEROS' OR i.member_type = 'STRING')
362 AND i.member_id = s.string_id
363 ORDER BY s.string;
364
365 EXEC SQL OPEN csr002;
366 while(1)
367 {
368 EXEC SQL FETCH csr002 into :member_type, :member_name;
369 if (sqlca.sqlcode)
370 break;
371 fprintf(fout, "%d %s %s\n",
372 list_id, member_type, member_name);
373 }
374
375 if (sqlca.sqlcode < 0)
376 db_error(sqlca.sqlcode);
377
378 EXEC SQL CLOSE csr002;
379 }
380
381 if (sqlca.sqlcode < 0)
382 db_error(sqlca.sqlcode);
383
384 EXEC SQL CLOSE list_cursor;
385 EXEC SQL COMMIT;
386
387 if (fclose(fout))
388 {
389 fprintf(stderr, "Unsuccessful file close of wingmember.db\n");
390 exit(MR_CCONFIG);
391 }
392
393 fix_file(foutf);
394 return 1;
395}
4484634e 396
397int do_containers(void)
398{
399 FILE *fout;
400 char foutf[MAXPATHLEN];
401 char foutft[MAXPATHLEN];
402 EXEC SQL BEGIN DECLARE SECTION;
403 char container_name[CONTAINERS_NAME_SIZE];
404 char acl_type[CONTAINERS_ACL_TYPE_SIZE];
405 char acl_name[STRINGS_STRING_SIZE];
406 char description[CONTAINERS_DESCRIPTION_SIZE];
407 int cnt_id;
408 int acl_id;
409 EXEC SQL END DECLARE SECTION;
410
411 sprintf(foutf, "%s/wincontainer.db", winad_dir);
412 sprintf(foutft, "%s~", foutf);
413
414 fout = fopen(foutft, "w");
415 if (!fout)
416 {
417 perror("cannot open wincontainer.db for write");
418 exit(MR_OCONFIG);
419 }
420
421 EXEC SQL DECLARE container_cursor CURSOR FOR
422 SELECT name, cnt_id, acl_type, acl_id, description
423 FROM containers
424 ORDER BY cnt_id, name;
425 EXEC SQL OPEN container_cursor;
426 while (1)
427 {
428 EXEC SQL FETCH container_cursor INTO :container_name, :cnt_id,
429 :acl_type, :acl_id, :description ;
430
431 if (sqlca.sqlcode)
432 break;
433
434 strtrim(container_name);
435 strtrim(acl_type);
436 strtrim(description);
437
438 strcpy(acl_name, "NONE");
439 if (strcmp(acl_type, "LIST") == 0)
440 {
441 EXEC SQL SELECT name into :acl_name
442 FROM list
443 WHERE list_id = :acl_id;
444 }
445 else if (strcmp(acl_type, "USER") == 0)
446 {
447 EXEC SQL SELECT login into :acl_name
448 FROM users
449 WHERE users_id = :acl_id;
450 }
451 else if (strcmp(acl_type, "KERBEROS") == 0)
452 {
453 EXEC SQL SELECT string into :acl_name
454 FROM strings
455 WHERE string_id = :acl_id;
456 }
457
458 strtrim(acl_name);
459
460 fprintf(fout, "%d,%s,%s,%s,%s\n",
461 cnt_id, container_name, acl_type, acl_name,
462 description);
463 }
464 if (sqlca.sqlcode < 0)
465 db_error(sqlca.sqlcode);
466
467 EXEC SQL CLOSE container_cursor;
468 EXEC SQL COMMIT;
469
470 if (fclose(fout))
471 {
472 fprintf(stderr, "Unsuccessful file close of wincontainer.db\n");
473 exit(MR_CCONFIG);
474 }
475
476 fix_file(foutf);
477 return 1;
478}
479
This page took 0.114326 seconds and 5 git commands to generate.