32
28
# - Rebuild svn auth file
33
29
# - 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
31
def activate_user(props):
102
32
"""Create the on-disk stuff for the given user.
103
33
Sets the state of the user in the db from pending to enabled.
120
52
# 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"
54
repopath = os.path.join(conf.svn_repo_path, 'users', login)
55
logging.debug("Creating user's Subversion repository")
56
common.makeuser.make_svn_repo(repopath, throw_on_error=False)
58
rebuild_svn_config(props)
60
logging.debug("Adding Subversion authentication")
127
61
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"
62
logging.debug("passwd: %s" % passwd)
64
logging.debug("Creating jail")
65
common.makeuser.make_jail(login, details.unixid, svn_pass=passwd)
67
logging.info("Enabling user")
202
68
db.update_user(login, state='enabled')
204
70
return {"response": "okay"}
206
except Exception, exc:
207
print >> sys.stderr, exc
75
def rebuild_svn_config(props):
76
"""Rebuilds the svn config file
78
response (okay, failure)
81
common.makeuser.rebuild_svn_config()
83
logging.warning('Rebuild of Subversion authorization config failed!')
84
return{'response': 'failure', 'msg': repr(e)}
86
return {'response': 'okay'}
88
def rebuild_svn_group_config(props):
89
"""Rebuilds the svn group config file
91
response (okay, failure)
94
common.makeuser.rebuild_svn_group_config()
97
'Rebuild of Subversion group authorization config failed!')
98
return{'response': 'failure', 'msg': repr(e)}
100
return {'response': 'okay'}
102
def create_group_repository(props):
103
"""Creates on disk repository for the given group
105
subj_short_name, year, semester, groupnm
107
response (okay, failure)
110
subj_short_name = props['subj_short_name']
112
semester = props['semester']
113
groupnm = props['groupnm']
115
namespace = "_".join([subj_short_name, year, semester, groupnm])
116
repopath = os.path.join(conf.svn_repo_path, 'groups', namespace)
117
logging.debug("Creating Subversion repository %s"%repopath)
119
common.makeuser.make_svn_repo(repopath)
121
logging.error("Failed to create Subversion repository %s: %s"%
123
return {'response': 'failure', 'msg': repr(e)}
125
return {'response': 'okay'}
213
'create_user':create_user,
214
'activate_user':activate_user
128
'activate_user':activate_user,
129
'create_group_repository':create_group_repository,
130
'rebuild_svn_config':rebuild_svn_config,
131
'rebuild_svn_group_config':rebuild_svn_group_config,
136
pidfile = open('/var/run/usrmgt-server.pid', 'w')
137
pidfile.write('%d\n' % os.getpid())
139
except IOError, (errno, strerror):
140
print "Couldn't write PID file. IO error(%s): %s" % (errno, strerror)
217
143
def dispatch(props):
218
# print >> sys.stderr, repr(props)
144
logging.debug(repr(props))
219
145
action = props.keys()[0]
220
146
return actions[action](props[action])
222
148
if __name__ == "__main__":
223
port = int(sys.argv[1])
226
common.chat.start_server(port, magic, False, dispatch)
151
logging.basicConfig(filename="/var/log/usrmgt.log", level=logging.INFO)
152
logging.info("Starting usrmgt server on port %d (pid = %d)" %
153
(conf.usrmgt_port, pid))
155
common.chat.start_server(conf.usrmgt_port, conf.usrmgt_magic, True, dispatch, initializer)