8
from functools import partial
13
import common.makeuser
14
import common.studpath
17
# usrmgt-server <port> <magic>
19
# User management operations:
21
# - [Re]Create jail for a user
22
# - Create a svn repository for a user
26
# - Checkout repository as home directory
28
# - Disable a user's account
29
# - Enable a user's account
31
# - Rebuild svn config
32
# - Rebuild svn auth file
33
# - Rebuild passwd + push to nodes.
36
def create_user(props):
37
"""Create the database record for the given user.
39
username - used as a unix login name and svn repository name.
41
uid - the unix uid under which execution will take place
42
on the behalf of the user. Don't use 0! If not specified
43
or None, one will be allocated from the configured
46
password - the clear-text password for the user. If this property is
47
absent or None, this is an indication that external
48
authentication should be used (i.e. LDAP).
50
email - the user's email address.
52
nick - the display name to use.
54
fullname - The name of the user for results and/or other official
57
rolenm - The user's role. Must be one of "anyone", "student",
58
"tutor", "lecturer", "admin".
60
studentid - If supplied and not None, the student id of the user for
61
results and/or other official purposes.
63
Return Value: the uid associated with the user. INT
66
# FIXME: the IVLE server must check that an admin is doing this!
68
if 'uid' not in props or props['uid'] is None:
69
raise NotImplementedError, "No algorithm for creating uids yet!"
73
username = props['username']
76
password = props['password']
80
email = props['email']
84
fullname = props['fullname']
85
rolenm = props['rolenm']
87
studentid = props['studentid']
90
common.makeuser.make_user_db(username, uid, password, email, nick,
91
fullname, rolenm, studentid)
95
def get_login(login, passwd, _realm, _login, _may_save):
96
"""Callback function used by pysvn for authentication.
98
# print >> sys.stderr, "Getting password for %s (realm %s)" % (login, _realm)
99
return (True, login, passwd, False)
101
def activate_user(props):
102
"""Create the on-disk stuff for the given user.
103
Sets the state of the user in the db from pending to enabled.
105
login - the user name for the jail
110
login = props['login']
116
# FIXME: check we're pending
118
details = db.get_user(login)
120
# make svn config/auth
122
# print >> sys.stderr, "Creating repo"
123
common.makeuser.make_svn_repo(login, throw_on_error=False)
124
# print >> sys.stderr, "Creating svn config"
125
common.makeuser.make_svn_config(login, throw_on_error=False)
126
# print >> sys.stderr, "Creating svn auth"
127
passwd = common.makeuser.make_svn_auth(login, throw_on_error=False)
128
# print >> sys.stderr, "passwd: %s" % passwd
131
svn.callback_get_login = partial(get_login, login, passwd)
133
# FIXME: This should be a loop over enrolements.
134
# We're not going to fix this now because it requires
135
# a large amount of admin console work to manage subject
137
# Instead, we're just going to use a single offering with
138
# a "short" name of "info1".
139
# print >> sys.stderr, "Creating /info1"
141
svn.mkdir(conf.svn_addr + login + "/info1",
142
"Initial creation of work directory for Informatics 1")
143
except Exception, exc:
145
# print >> sys.stderr, "Creating /submissions"
147
svn.mkdir(conf.svn_addr + login + "/submissions",
148
"Initial creation of submissions directory")
149
except Exception, exc:
151
# print >> sys.stderr, "Creating /stuff"
153
svn.mkdir(conf.svn_addr + login + "/stuff",
154
"Initial creation of directory for miscellania")
155
except Exception, exc:
158
# print >> sys.stderr, "Creating jail"
159
common.makeuser.make_jail(login, details.unixid)
163
tcf_path = os.path.join(conf.jail_base, 'template/opt/ivle/lib/conf/conf.py')
164
cf_path = os.path.join(conf.jail_base, login, 'opt/ivle/lib/conf/conf.py')
167
cf = open(cf_path, "w")
168
cf.write(open(tcf_path, "r").read())
169
cf.write("# The login name for the owner of the jail\n")
170
cf.write("login = %s\n" % repr(login))
172
cf.write("# The subversion-only password for the owner of the jail\n")
173
cf.write("svn_pass = %s\n" % repr(passwd))
178
# print >> sys.stderr, "Checking out directories in the jail"
180
svn.checkout(conf.svn_addr + "/" + login + "/stuff",
181
common.studpath.url_to_local(login + "/stuff")[1])
182
except Exception, exc:
185
svn.checkout(conf.svn_addr + "/" + login + "/submissions",
186
common.studpath.url_to_local(login + "/submissions")[1])
187
except Exception, exc:
190
svn.checkout(conf.svn_addr + "/" + login + "/info1",
191
common.studpath.url_to_local(login + "/info1")[1])
192
except Exception, exc:
195
# FIXME: should this be nicer?
196
os.system("chown -R %d:%d %s" \
197
% (details.unixid, details.unixid,
198
common.studpath.url_to_local(login)[1]))
201
# print >> sys.stderr, "Enabling user"
202
db.update_user(login, state='enabled')
204
return {"response": "okay"}
206
except Exception, exc:
207
print >> sys.stderr, exc
213
'create_user':create_user,
214
'activate_user':activate_user
218
# print >> sys.stderr, repr(props)
219
action = props.keys()[0]
220
return actions[action](props[action])
222
if __name__ == "__main__":
223
port = int(sys.argv[1])
226
common.chat.start_server(port, magic, False, dispatch)