[1807] in Moira
winad.gen
daemon@ATHENA.MIT.EDU (Qing Dong)
Tue Jun 19 15:46:45 2001
Message-Id: <200106191946.PAA02721@melbourne-city-street.mit.edu>
Date: Tue, 19 Jun 2001 15:46:43 -0400
To: moiradev@mit.edu
From: Qing Dong <dongq@MIT.EDU>
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
I made some changes to windcm.gen:
1. renamed it to winad.gen
2. combined the filesys file with the users file
3. added description, acl_type, acl_name to list file
Here is the new file. Thanks.
Qing
/* $Id: winad.pc,v 1.1 2001/06/19 19:43:11 dongq Exp $
*
* This generates the user, list, list membership, filesys data
* for windows active directory update
*
* (c) Copyright 1988-2001 by the Massachusetts Institute of Technology.
* For copying and distribution information, please see the file
* <mit-copyright.h>.
*/
#include <mit-copyright.h>
#include <moira.h>
#include <moira_site.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
EXEC SQL INCLUDE sqlca;
#ifndef WINAD_SUBDIR
#define WINAD_SUBDIR "winad"
#endif
char winad_dir[MAXPATHLEN];
char *whoami = "winad.gen";
char *db = "moira/moira";
int do_user(void);
int do_groups(void);
int do_groupmembership(void);
int main(int argc, char **argv)
{
char cmd[64];
struct stat sb;
int changed = 0;
if (argc > 2)
{
fprintf(stderr, "usage: %s [outfile]\n", argv[0]);
exit(MR_ARGS);
}
initialize_sms_error_table();
sprintf(winad_dir, "%s/%s", DCM_DIR, WINAD_SUBDIR);
EXEC SQL CONNECT :db;
changed = do_user();
changed += do_groups();
changed += do_groupmembership();
if (!changed)
{
fprintf(stderr, "No files updated.\n");
if (argc == 2 && stat(argv[1], &sb) == 0)
exit(MR_NO_CHANGE);
}
if (argc == 2)
{
fprintf(stderr, "Building tar file.\n");
sprintf(cmd, "cd %s; tar cf %s .", winad_dir, argv[1]);
if (system(cmd))
exit(MR_TAR_FAIL);
}
exit(MR_SUCCESS);
}
int do_user(void)
{
FILE *fout;
char foutf[MAXPATHLEN];
char foutft[MAXPATHLEN];
EXEC SQL BEGIN DECLARE SECTION;
char login[USERS_LOGIN_SIZE];
char mit_id[USERS_CLEARID_SIZE];
int users_id, unix_uid, status;
char type[FILESYS_TYPE_SIZE];
char name[FILESYS_NAME_SIZE];
EXEC SQL END DECLARE SECTION;
sprintf(foutf, "%s/winuser.db", winad_dir);
sprintf(foutft, "%s~", foutf);
fout = fopen(foutft, "w");
if (!fout)
{
perror("cannot open winuser.db for write");
exit(MR_OCONFIG);
}
EXEC SQL DECLARE u_cursor CURSOR FOR
SELECT users_id, login, unix_uid, status, clearid
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;
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;
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 (sqlca.sqlcode < 0)
db_error(sqlca.sqlcode);
EXEC SQL CLOSE u_cursor;
EXEC SQL COMMIT;
if (fclose(fout))
{
fprintf(stderr, "Unsuccessful file close of winuser.db\n");
exit(MR_CCONFIG);
}
fix_file(foutf);
return 1;
}
int do_groups(void)
{
FILE *fout;
char foutf[MAXPATHLEN];
char foutft[MAXPATHLEN];
EXEC SQL BEGIN DECLARE SECTION;
char listname[LIST_NAME_SIZE];
char description[LIST_DESCRIPTION_SIZE];
char acltype[LIST_ACL_TYPE_SIZE];
int aclid;
char aclname[STRINGS_STRING_SIZE];
int list_id, active, maillist, grouplist;
EXEC SQL END DECLARE SECTION;
sprintf(foutf, "%s/wingroup.db", winad_dir);
sprintf(foutft, "%s~", foutf);
fout = fopen(foutft, "w");
if (!fout)
{
perror("cannot open wingroup.db for write");
exit(MR_OCONFIG);
}
EXEC SQL DECLARE l_cursor CURSOR FOR
SELECT list_id, name, active, 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;
if (sqlca.sqlcode)
break;
strtrim(listname);
strtrim(description);
strtrim(acltype);
strcpy(aclname, "");
if (strcmp(acltype, "LIST") == 0)
{
EXEC SQL SELECT name into :aclname
FROM list
WHERE list_id = :aclid;
}
else if (strcmp(acltype, "USER") == 0)
{
EXEC SQL SELECT login into :aclname
FROM users
WHERE users_id = :aclid;
}
else if (strcmp(acltype, "KERBEROS") == 0)
{
EXEC SQL SELECT string into :aclname
FROM strings
WHERE string_id = :aclid;
}
strtrim(aclname);
fprintf(fout, "%d %s %d %d %d %s %s %s\n",
list_id, listname, active, maillist, grouplist, acltype, aclname,
description);
}
if (sqlca.sqlcode < 0)
db_error(sqlca.sqlcode);
EXEC SQL CLOSE l_cursor;
EXEC SQL COMMIT;
if (fclose(fout))
{
fprintf(stderr, "Unsuccessful file close of wingroup.db\n");
exit(MR_CCONFIG);
}
fix_file(foutf);
return 1;
}
int do_groupmembership(void)
{
FILE *fout;
char foutf[MAXPATHLEN];
char foutft[MAXPATHLEN];
EXEC SQL BEGIN DECLARE SECTION;
char member_type[IMEMBERS_MEMBER_TYPE_SIZE];
char member_name[STRINGS_STRING_SIZE];
int list_id;
EXEC SQL END DECLARE SECTION;
sprintf(foutf, "%s/wingmember.db", winad_dir);
sprintf(foutft, "%s~", foutf);
fout = fopen(foutft, "w");
if (!fout)
{
perror("cannot open wingmember.db for write");
exit(MR_OCONFIG);
}
EXEC SQL DECLARE list_cursor CURSOR FOR
SELECT list_id
FROM list
ORDER BY list_id;
EXEC SQL OPEN list_cursor;
while (1)
{
EXEC SQL FETCH list_cursor INTO :list_id;
if (sqlca.sqlcode)
break;
/* get all the users */
EXEC SQL DECLARE csr001 CURSOR FOR
SELECT i.member_type, u.login
FROM users u, imembers i
WHERE i.list_id = :list_id AND i.member_type = 'USER'
AND i.member_id = u.users_id
ORDER BY u.login;
EXEC SQL OPEN csr001;
while(1)
{
EXEC SQL FETCH csr001 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 csr001;
/* get all the KERBEROS AND STRINGS */
EXEC SQL DECLARE csr002 CURSOR FOR
SELECT i.member_type, s.string
FROM strings s, imembers i
WHERE i.list_id = :list_id AND
(i.member_type = 'KERBEROS' OR i.member_type = 'STRING')
AND i.member_id = s.string_id
ORDER BY s.string;
EXEC SQL OPEN csr002;
while(1)
{
EXEC SQL FETCH csr002 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 csr002;
}
if (sqlca.sqlcode < 0)
db_error(sqlca.sqlcode);
EXEC SQL CLOSE list_cursor;
EXEC SQL COMMIT;
if (fclose(fout))
{
fprintf(stderr, "Unsuccessful file close of wingmember.db\n");
exit(MR_CCONFIG);
}
fix_file(foutf);
return 1;
}