X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/c31c844d6fce2e77a3051137176b4c64e8836d34..30e8d306df648a457ba510d246ff3d2f9b8057bd:/gen/winad.pc diff --git a/gen/winad.pc b/gen/winad.pc index fe654922..48582d8a 100644 --- a/gen/winad.pc +++ b/gen/winad.pc @@ -32,6 +32,7 @@ char *db = "moira/moira"; int do_user(void); int do_groups(void); int do_groupmembership(void); +int do_containers(void); int main(int argc, char **argv) { @@ -53,6 +54,7 @@ int main(int argc, char **argv) changed = do_user(); changed += do_groups(); changed += do_groupmembership(); + changed += do_containers(); if (!changed) { @@ -84,6 +86,9 @@ int do_user(void) int users_id, unix_uid, status; char type[FILESYS_TYPE_SIZE]; char name[FILESYS_NAME_SIZE]; + char homedir[USERS_WINHOMEDIR_SIZE]; + char profiledir[USERS_WINPROFILEDIR_SIZE]; + int fid; EXEC SQL END DECLARE SECTION; sprintf(foutf, "%s/winuser.db", winad_dir); @@ -97,39 +102,99 @@ int do_user(void) } EXEC SQL DECLARE u_cursor CURSOR FOR - SELECT users_id, login, unix_uid, status, clearid + SELECT users_id, login, unix_uid, status, clearid, winhomedir, + winprofiledir FROM users ORDER BY users_id; EXEC SQL OPEN u_cursor; while (1) { EXEC SQL FETCH u_cursor INTO :users_id, :login, :unix_uid, :status, -:mit_id; +:mit_id, :homedir, :profiledir; if (sqlca.sqlcode) break; strtrim(login); strtrim(mit_id); - - EXEC SQL SELECT type, name INTO :type, :name - FROM filesys - WHERE lockertype = 'HOMEDIR' - AND owner = :users_id; + strtrim(homedir); + strtrim(profiledir); + + if (strcmp(mit_id, "") == 0) + strcpy(mit_id, "0"); + + if (strcasecmp(homedir, "[AFS]") == 0 || strcasecmp(profiledir, + "[AFS]") == 0) + { + EXEC SQL SELECT filsys_id into :fid + FROM filesys + WHERE lockertype = 'HOMEDIR' + AND label = :login + AND type = 'FSGROUP'; + + if (sqlca.sqlcode == 0) + { + EXEC SQL DECLARE f_cursor CURSOR FOR + SELECT type, name + FROM filesys a, fsgroup b + WHERE a.filsys_id=b.filsys_id + AND b.group_id=:fid + ORDER by key; + + EXEC SQL OPEN f_cursor; + + EXEC SQL FETCH f_cursor INTO :type, :name; + + if (sqlca.sqlcode == 0) + { + strtrim(type); + strtrim(name); + } + else + { + strcpy(type, "NONE"); + strcpy(name, "NONE"); + } + + EXEC SQL CLOSE f_cursor; + } + + else + { + EXEC SQL SELECT type, name into :type, :name + FROM filesys + WHERE lockertype = 'HOMEDIR' + AND label=:login; + + if (sqlca.sqlcode == 0) + { + strtrim(type); + strtrim(name); + } + else + { + strcpy(type, "NONE"); + strcpy(name, "NONE"); + } + } + if (strcasecmp(type, "AFS") != 0) + strcpy(name, "[LOCAL]"); - if (sqlca.sqlcode == 0) - { - strtrim(type); - strtrim(name); - } - else - { - strcpy(type, ""); - strcpy(name, ""); - } - fprintf(fout, "%d %s %d %d %s %s %s\n", - users_id, login, unix_uid, status, mit_id, - type, name); } + if (strcasecmp(homedir, "[AFS]") == 0) + strcpy(homedir, name); + + if (strcasecmp(profiledir, "[AFS]") == 0) + { + strcpy(profiledir, name); + if (strcasecmp(name, "[LOCAL]")) + strcat(profiledir, "/.winprofile"); + } + + fprintf(fout, "%d %s %d %d %s %s %s\n", + users_id, login, unix_uid, status, mit_id, + homedir, profiledir); + } + if (sqlca.sqlcode < 0) db_error(sqlca.sqlcode); EXEC SQL CLOSE u_cursor; @@ -157,7 +222,7 @@ int do_groups(void) char acltype[LIST_ACL_TYPE_SIZE]; int aclid; char aclname[STRINGS_STRING_SIZE]; - int list_id, active, maillist, grouplist; + int list_id, active, publicflg, hidden, maillist, grouplist; EXEC SQL END DECLARE SECTION; sprintf(foutf, "%s/wingroup.db", winad_dir); @@ -171,16 +236,15 @@ int do_groups(void) } EXEC SQL DECLARE l_cursor CURSOR FOR - SELECT list_id, name, active, maillist, grouplist, description, -acl_type, acl_id + SELECT list_id, name, active, publicflg, hidden, maillist, + grouplist, description, acl_type, acl_id FROM list ORDER BY list_id; EXEC SQL OPEN l_cursor; while (1) { - EXEC SQL FETCH l_cursor INTO :list_id, :listname, :active, :maillist, -:grouplist, - :description, :acltype, :aclid; + EXEC SQL FETCH l_cursor INTO :list_id, :listname, :active, :publicflg, + :hidden, :maillist, :grouplist, :description, :acltype, :aclid; if (sqlca.sqlcode) break; @@ -190,7 +254,7 @@ acl_type, acl_id strtrim(acltype); - strcpy(aclname, ""); + strcpy(aclname, "NONE"); if (strcmp(acltype, "LIST") == 0) { EXEC SQL SELECT name into :aclname @@ -212,9 +276,9 @@ acl_type, acl_id strtrim(aclname); - fprintf(fout, "%d %s %d %d %d %s %s %s\n", - list_id, listname, active, maillist, grouplist, acltype, aclname, -description); + fprintf(fout, "%d %s %d %d %d %d %d %s %s %s\n", + list_id, listname, active, publicflg, hidden, maillist, + grouplist, acltype, aclname, description); } if (sqlca.sqlcode < 0) @@ -256,6 +320,7 @@ int do_groupmembership(void) EXEC SQL DECLARE list_cursor CURSOR FOR SELECT list_id FROM list + WHERE active != 0 ORDER BY list_id; EXEC SQL OPEN list_cursor; while (1) @@ -310,8 +375,29 @@ int do_groupmembership(void) db_error(sqlca.sqlcode); EXEC SQL CLOSE csr002; + + /* get all the machines */ + EXEC SQL DECLARE csr003 CURSOR FOR + SELECT i.member_type, m.name + FROM machine m, imembers i + WHERE i.list_id = :list_id AND i.member_type = 'MACHINE' + AND i.member_id = m.mach_id + ORDER BY m.name; + + EXEC SQL OPEN csr003; + while (1) + { + EXEC SQL FETCH csr003 into :member_type, :member_name; + if (sqlca.sqlcode) + break; + fprintf(fout, "%d %s %s\n", list_id, member_type, member_name); } + if (sqlca.sqlcode < 0) + db_error(sqlca.sqlcode); + EXEC SQL CLOSE csr003; + } + if (sqlca.sqlcode < 0) db_error(sqlca.sqlcode); @@ -327,3 +413,87 @@ int do_groupmembership(void) fix_file(foutf); return 1; } + +int do_containers(void) +{ + FILE *fout; + char foutf[MAXPATHLEN]; + char foutft[MAXPATHLEN]; + EXEC SQL BEGIN DECLARE SECTION; + char container_name[CONTAINERS_NAME_SIZE]; + char acl_type[CONTAINERS_ACL_TYPE_SIZE]; + char acl_name[STRINGS_STRING_SIZE]; + char description[CONTAINERS_DESCRIPTION_SIZE]; + int cnt_id; + int acl_id; + EXEC SQL END DECLARE SECTION; + + sprintf(foutf, "%s/wincontainer.db", winad_dir); + sprintf(foutft, "%s~", foutf); + + fout = fopen(foutft, "w"); + if (!fout) + { + perror("cannot open wincontainer.db for write"); + exit(MR_OCONFIG); + } + + EXEC SQL DECLARE container_cursor CURSOR FOR + SELECT name, cnt_id, acl_type, acl_id, description + FROM containers + ORDER BY cnt_id, name; + EXEC SQL OPEN container_cursor; + while (1) + { + EXEC SQL FETCH container_cursor INTO :container_name, :cnt_id, + :acl_type, :acl_id, :description ; + + if (sqlca.sqlcode) + break; + + strtrim(container_name); + strtrim(acl_type); + strtrim(description); + + strcpy(acl_name, "NONE"); + if (strcmp(acl_type, "LIST") == 0) + { + EXEC SQL SELECT name into :acl_name + FROM list + WHERE list_id = :acl_id; + } + else if (strcmp(acl_type, "USER") == 0) + { + EXEC SQL SELECT login into :acl_name + FROM users + WHERE users_id = :acl_id; + } + else if (strcmp(acl_type, "KERBEROS") == 0) + { + EXEC SQL SELECT string into :acl_name + FROM strings + WHERE string_id = :acl_id; + } + + strtrim(acl_name); + + fprintf(fout, "%d,%s,%s,%s,%s\n", + cnt_id, container_name, acl_type, acl_name, + description); + } + if (sqlca.sqlcode < 0) + db_error(sqlca.sqlcode); + + EXEC SQL CLOSE container_cursor; + EXEC SQL COMMIT; + + if (fclose(fout)) + { + fprintf(stderr, "Unsuccessful file close of wincontainer.db\n"); + exit(MR_CCONFIG); + } + + fix_file(foutf); + return 1; +} +