103
103
os.rename(ivle.conf.svn_conf + ".new", ivle.conf.svn_conf)
104
104
chown_to_webserver(ivle.conf.svn_conf)
106
def rebuild_svn_group_config(store):
106
def rebuild_svn_group_config():
107
107
"""Build the complete SVN configuration file for groups
110
groups = conn.get_all('project_group',
111
['groupid', 'groupnm', 'projectsetid'])
109
112
f = open(ivle.conf.svn_group_conf + ".new", "w")
110
113
f.write("# IVLE SVN Group Repositories Configuration\n")
111
114
f.write("# Auto-generated on %s\n" % time.asctime())
113
for group in store.find(ProjectGroup):
114
offering = group.project_set.offering
115
reponame = "_".join([offering.subject.short_name,
116
offering.semester.year,
117
offering.semester.semester,
117
projectsetid = g['projectsetid']
118
offeringinfo = conn.get_offering_info(projectsetid)
119
subj_short_name = offeringinfo['subj_short_name']
120
year = offeringinfo['year']
121
semester = offeringinfo['semester']
122
reponame = "_".join([subj_short_name, year, semester, g['groupnm']])
119
123
f.write("[%s:/]\n"%reponame)
120
for user in group.members:
121
f.write("%s = rw\n" % user.login)
124
users = conn.get_projectgroup_members(g['groupid'])
126
f.write("%s = rw\n"%u['login'])
124
129
os.rename(ivle.conf.svn_group_conf + ".new", ivle.conf.svn_group_conf)
178
183
return (to_add, to_remove)
181
def make_jail(user, force=True):
186
def make_jail(username, uid, force=True, svn_pass=None):
182
187
"""Creates a new user's jail space, in the jail directory as configured in
190
195
Chowns the user's directory within the jail to the given UID.
197
Note: This takes separate username and uid arguments. The UID need not
198
*necessarily* correspond to a Unix username at all, if all you are
199
planning to do is setuid to it. This allows the caller the freedom of
200
deciding the binding between username and uid, if any.
192
202
force: If false, exception if jail already exists for this user.
193
203
If true (default), overwrites it, but preserves home directory.
205
svn_pass: If provided this will be a string, the randomly-generated
206
Subversion password for this user (if you happen to already have it).
207
If not provided, it will be read from the database.
195
209
# MUST run as root or some of this may fail
196
210
if os.getuid() != 0:
203
217
elif not os.path.isdir(tempdir):
204
218
os.unlink(tempdir)
205
219
os.mkdir(tempdir)
206
userdir = os.path.join(ivle.conf.jail_src_base, user.login)
220
userdir = os.path.join(ivle.conf.jail_src_base, username)
207
221
homedir = os.path.join(userdir, 'home')
208
userhomedir = os.path.join(homedir, user.login) # Return value
222
userhomedir = os.path.join(homedir, username) # Return value
210
224
if os.path.exists(userdir):
226
240
shutil.move(homebackup, homedir)
227
241
# Change the ownership of all the files to the right unixid
228
242
logging.debug("chown %s's home directory files to uid %d"
229
%(user.login, user.unixid))
230
os.chown(userhomedir, user.unixid, user.unixid)
244
os.chown(userhomedir, uid, uid)
231
245
for root, dirs, files in os.walk(userhomedir):
232
246
for fsobj in dirs + files:
233
os.chown(os.path.join(root, fsobj), user.unixid, user.unixid)
247
os.chown(os.path.join(root, fsobj), uid, uid)
235
249
# No user jail exists
236
250
# Set up the user's home directory
237
251
os.makedirs(userhomedir)
238
252
# Chown (and set the GID to the same as the UID).
239
os.chown(userhomedir, user.unixid, user.unixid)
253
os.chown(userhomedir, uid, uid)
240
254
# Chmod to rwxr-xr-x (755)
241
255
os.chmod(userhomedir, 0755)
243
make_conf_py(user.login, userdir, ivle.conf.jail_system, user.svn_pass)
244
make_etc_passwd(user.login, userdir, ivle.conf.jail_system, user.unixid)
257
# There are 2 special files which need to be generated specific to this
258
# user: ${python_site_packages}/lib/conf/conf.py and /etc/passwd.
259
# "__" username "__" users are exempt (special)
260
if not (username.startswith("__") and username.endswith("__")):
261
make_conf_py(username, userdir, ivle.conf.jail_system, svn_pass)
262
make_etc_passwd(username, userdir, ivle.conf.jail_system, uid)
246
264
return userhomedir
248
def make_conf_py(username, user_jail_dir, staging_dir, svn_pass):
266
def make_conf_py(username, user_jail_dir, staging_dir, svn_pass=None):
250
268
Creates (overwriting any existing file, and creating directories) a
251
269
file ${python_site_packages}/ivle/conf/conf.py in a given user's jail.
262
280
ivle.conf.python_site_packages[1:], "ivle/conf/conf.py")
263
281
os.makedirs(os.path.dirname(conf_path))
283
# If svn_pass isn't supplied, grab it from the DB
285
dbconn = ivle.db.DB()
286
svn_pass = dbconn.get_user(username).svn_pass
265
289
# Read the contents of the template conf file
267
291
template_conf_file = open(template_conf_path, "r")
304
328
% (username, unixid, unixid, username))
305
329
passwd_file.close()
331
def make_user_db(throw_on_error = True, **kwargs):
332
"""Creates a user's entry in the database, filling in all the fields.
333
All arguments must be keyword args. They are the fields in the table.
334
However, instead of supplying a "passhash", you must supply a
335
"password" argument, which will be hashed internally.
336
Also do not supply a state. All users are created in the "no_agreement"
338
Also pulls the user's subjects using the configured subject pulldown
339
module, and adds enrolments to the DB.
340
Throws an exception if the user already exists.
342
dbconn = ivle.db.DB()
343
dbconn.create_user(**kwargs)
346
# Pulldown subjects and add enrolments
347
ivle.pulldown_subj.enrol_user(kwargs['login'])
307
349
def mount_jail(login):
308
350
# This is where we'll mount to...
309
351
destdir = os.path.join(ivle.conf.jail_base, login)