~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/makeuser.py

  • Committer: William Grant
  • Date: 2009-04-29 05:39:08 UTC
  • Revision ID: grantw@unimelb.edu.au-20090429053908-krramviw2xluolcs
Remove a couple of unused functions from ivle.makeuser, and clean up docstrings

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# IVLE - Informatics Virtual Learning Environment
2
 
# Copyright (C) 2007-2008 The University of Melbourne
 
2
# Copyright (C) 2007-2009 The University of Melbourne
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
17
 
18
 
# Module: MakeUser
19
 
# Author: Matt Giuca
20
 
# Date:   1/2/2008
21
 
 
22
 
# Allows creation of users. This sets up the following:
23
 
# * User's jail and home directory within the jail.
24
 
# * Subversion repository (TODO)
25
 
# * Check out Subversion workspace into jail (TODO)
26
 
# * Database details for user
27
 
# * Unix user account
28
 
 
29
 
# TODO: Sanitize login name and other fields.
30
 
# Users must not be called "temp" or "template".
31
 
 
32
 
# TODO: When creating a new home directory, chown it to its owner
33
 
 
34
 
# TODO: In chown_to_webserver:
35
 
# Do not call os.system("chown www-data") - use Python lib
36
 
# and use the web server uid given in conf. (Several places).
 
18
"""User and group filesystem management helpers."""
37
19
 
38
20
import hashlib
39
21
import os
42
24
import time
43
25
import uuid
44
26
import warnings
45
 
import filecmp
46
27
import logging
47
28
import subprocess
48
 
import ivle.pulldown_subj
49
29
 
50
30
from ivle.database import ProjectGroup
51
31
 
72
52
 
73
53
def rebuild_svn_config(store, config):
74
54
    """Build the complete SVN configuration file.
 
55
 
75
56
    @param config: An ivle.config.Config object.
76
57
    """
77
58
    users = store.find(ivle.database.User)
100
81
 
101
82
def rebuild_svn_group_config(store, config):
102
83
    """Build the complete SVN configuration file for groups
 
84
 
103
85
    @param config: An ivle.config.Config object.
104
86
    """
105
87
    conf_name = config['paths']['svn']['group_conf']
123
105
    chown_to_webserver(conf_name)
124
106
 
125
107
def make_svn_auth(store, login, config, throw_on_error=True):
126
 
    """Setup svn authentication for the given user.
127
 
       Uses the given DB store object. Does not commit to the db.
 
108
    """Create a Subversion password for a user.
 
109
 
 
110
    Generates a new random Subversion password, and assigns it to the user.
 
111
    The password is added to Apache's Subversion authentication file.
128
112
    """
129
113
    # filename is, eg, /var/lib/ivle/svn/ivle.auth
130
114
    filename = config['paths']['svn']['auth_ivle']
137
121
    user = ivle.database.User.get_by_login(store, login)
138
122
    user.svn_pass = unicode(passwd)
139
123
 
140
 
    res = os.system("htpasswd -%smb %s %s %s" % (create, filename,
141
 
                                              login, passwd))
 
124
    res = subprocess.call(['htpasswd', '-%smb' % create,
 
125
                           filename, login, passwd])
142
126
    if res != 0 and throw_on_error:
143
127
        raise Exception("Unable to create ivle-auth for %s" % login)
144
128
 
148
132
 
149
133
    return passwd
150
134
 
151
 
def generate_manifest(basedir, targetdir, parent=''):
152
 
    """ From a basedir and a targetdir work out which files are missing or out 
153
 
    of date and need to be added/updated and which files are redundant and need 
154
 
    to be removed.
155
 
    
156
 
    parent: This is used for the recursive call to track the relative paths 
157
 
    that we have decended.
158
 
    """
159
 
    
160
 
    cmp = filecmp.dircmp(basedir, targetdir)
161
 
 
162
 
    # Add all new files and files that have changed
163
 
    to_add = [os.path.join(parent,x) for x in (cmp.left_only + cmp.diff_files)]
164
 
 
165
 
    # Remove files that are redundant
166
 
    to_remove = [os.path.join(parent,x) for x in cmp.right_only]
167
 
    
168
 
    # Recurse
169
 
    for d in cmp.common_dirs:
170
 
        newbasedir = os.path.join(basedir, d)
171
 
        newtargetdir = os.path.join(targetdir, d)
172
 
        newparent = os.path.join(parent, d)
173
 
        (sadd,sremove) = generate_manifest(newbasedir, newtargetdir, newparent)
174
 
        to_add += sadd
175
 
        to_remove += sremove
176
 
 
177
 
    return (to_add, to_remove)
178
 
 
179
 
 
180
135
def make_jail(user, config, force=True):
181
 
    """Creates a new user's jail space, in the jail directory as configured in
182
 
    conf.py.
 
136
    """Create or update a user's jail.
183
137
 
184
 
    This only creates things within /home - everything else is expected to be
185
 
    part of another UnionFS branch.
 
138
    Only the user-specific parts of the jail are created here - everything
 
139
    else is expected to be part of another aufs branch.
186
140
 
187
141
    Returns the path to the user's home directory.
188
142
 
189
143
    Chowns the user's directory within the jail to the given UID.
190
144
 
191
 
    force: If false, exception if jail already exists for this user.
192
 
    If true (default), overwrites it, but preserves home directory.
 
145
    @param force: If False, raise an exception if the user already has a jail.
 
146
                  If True (default), rebuild the jail preserving /home.
193
147
    """
194
148
    # MUST run as root or some of this may fail
195
149
    if os.getuid() != 0:
247
201
    return userhomedir
248
202
 
249
203
def make_ivle_conf(username, user_jail_dir, svn_pass, sys_config):
250
 
    """
 
204
    """Generate an ivle.conf for a user's jail.
 
205
 
251
206
    Creates (overwriting any existing file, and creating directories) a
252
207
    file /etc/ivle/ivle.conf in a given user's jail.
 
208
 
253
209
    @param username: Username.
254
210
    @param user_jail_dir: User's jail dir, ie. ['jails']['src'] + username
255
211
    @param svn_pass: User's SVN password.
276
232
                        | stat.S_IROTH)
277
233
 
278
234
def make_etc_passwd(username, user_jail_dir, template_dir, unixid):
279
 
    """
 
235
    """Create a passwd file for a user's jail.
 
236
 
280
237
    Creates /etc/passwd in the given user's jail. This will be identical to
281
238
    that in the template jail, except for the added entry for this user.
282
239
    """
290
247
    passwd_file.write('%s:x:%d:%d::/home/%s:/bin/bash'
291
248
                      % (username, unixid, unixid, username))
292
249
    passwd_file.close()
293
 
 
294
 
def mount_jail(login, config):
295
 
    # This is where we'll mount to...
296
 
    destdir = os.path.join(config['paths']['jails']['mounts'], login)
297
 
    # ... and this is where we'll get the user bits.
298
 
    srcdir = os.path.join(config['paths']['jails']['src'], login)
299
 
    try:
300
 
        if not os.path.exists(destdir):
301
 
            os.mkdir(destdir)
302
 
        if os.system('/bin/mount -t aufs -o dirs=%s:%s=ro none %s'
303
 
                     % (srcdir, config['paths']['jails']['template'],
304
 
                        destdir)) == 0:
305
 
            logging.info("mounted user %s's jail." % login)
306
 
        else:
307
 
            logging.error("failed to mount user %s's jail!" % login)
308
 
    except Exception, message:
309
 
        logging.warning(str(message))