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

« back to all changes in this revision

Viewing changes to scripts/usrmgt-server

  • Committer: drtomc
  • Date: 2008-02-22 04:02:23 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:542
makeuser: create svn auth for local users.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/python
2
2
 
 
3
import os
 
4
import pysvn
 
5
import subprocess
3
6
import sys
 
7
import urllib
 
8
from functools import partial
4
9
 
 
10
import conf
5
11
import common.db
6
12
import common.chat
7
13
import common.makeuser
 
14
import common.studpath
8
15
 
9
16
# usage:
10
17
#   usrmgt-server <port> <magic>
25
32
#   - Rebuild svn auth file
26
33
#   - Rebuild passwd + push to nodes.
27
34
 
 
35
DEBUG_PRINT = True
28
36
 
29
37
def create_user(props):
30
38
    """Create the database record for the given user.
59
67
    # FIXME: the IVLE server must check that an admin is doing this!
60
68
 
61
69
    if 'uid' not in props or props['uid'] is None:
62
 
        raise NotImplementedError, "No algorithm for creating uids yet!"
 
70
        # For the time being, just choose a random unixid.
 
71
        # This may result in duplicates, but the unixid is essentially
 
72
        # a monitoring/logging convenience only. Oh, and dups could kill
 
73
        # each other. <sigh>
 
74
        props['uid'] = random.randrange(5000,10000)
 
75
        # raise NotImplementedError, "No algorithm for creating uids yet!"
63
76
        # uid = invent-uid
64
77
        # props['uid'] = uid
65
78
 
85
98
 
86
99
    return uid
87
100
 
 
101
def get_login(login, passwd, _realm, _login, _may_save):
 
102
    """Callback function used by pysvn for authentication.
 
103
    """
 
104
    log("Getting password for %s (realm %s)" % (login, _realm))
 
105
    return (True, login, passwd, False)
 
106
 
88
107
def activate_user(props):
89
108
    """Create the on-disk stuff for the given user.
90
109
       Sets the state of the user in the db from pending to enabled.
104
123
 
105
124
        details = db.get_user(login)
106
125
 
107
 
        # FIXME: make svn config/auth
108
 
 
109
 
        # FIXME: etc, etc.
110
 
 
111
 
        common.makeuser.make_jail(login, details['unixid'])
112
 
 
 
126
        # make svn config/auth
 
127
 
 
128
        log("Creating repo")
 
129
        common.makeuser.make_svn_repo(login, throw_on_error=False)
 
130
        log("Creating svn config")
 
131
        common.makeuser.make_svn_config(login, throw_on_error=False)
 
132
        log("Creating svn auth")
 
133
        passwd = common.makeuser.make_svn_auth(login, throw_on_error=False)
 
134
        log("passwd: %s" % passwd)
 
135
 
 
136
        svn = pysvn.Client()
 
137
        svn.callback_get_login = partial(get_login, login, passwd)
 
138
 
 
139
        if conf.svn_addr[-1] != '/':
 
140
            conf.svn_addr = conf.svn_addr + "/"
 
141
    
 
142
        # FIXME: This should be a loop over enrolements.
 
143
        #        We're not going to fix this now because it requires
 
144
        #        a large amount of admin console work to manage subject
 
145
        #        offerings.
 
146
        #        Instead, we're just going to use a single offering with
 
147
        #        a "short" name of "info1".
 
148
        log("Creating /info1")
 
149
        try:
 
150
            svn.mkdir(conf.svn_addr + login + "/info1",
 
151
                      "Initial creation of work directory for Informatics 1")
 
152
        except Exception, exc:
 
153
            log("While mkdiring info1: %s" % str(exc))
 
154
            pass
 
155
        log("Creating /submissions")
 
156
        try:
 
157
            svn.mkdir(conf.svn_addr + login + "/submissions",
 
158
                      "Initial creation of submissions directory")
 
159
        except Exception, exc:
 
160
            log("While mkdiring submissions: %s" % str(exc))
 
161
            pass
 
162
        log("Creating /stuff")
 
163
        try:
 
164
            svn.mkdir(conf.svn_addr + login + "/stuff",
 
165
                      "Initial creation of directory for miscellania")
 
166
        except Exception, exc:
 
167
            log("While mkdiring stuff: %s" % str(exc))
 
168
            pass
 
169
 
 
170
        log("Creating jail")
 
171
        common.makeuser.make_jail(login, details.unixid)
 
172
 
 
173
        # FIXME: <hack>
 
174
 
 
175
        tcf_path = os.path.join(conf.jail_base, 'template/opt/ivle/lib/conf/conf.py')
 
176
        cf_path = os.path.join(conf.jail_base, login, 'opt/ivle/lib/conf/conf.py')
 
177
 
 
178
        os.remove(cf_path)
 
179
        cf = open(cf_path, "w")
 
180
        cf.write(open(tcf_path, "r").read())
 
181
        cf.write("# The login name for the owner of the jail\n")
 
182
        cf.write("login = %s\n" % repr(login))
 
183
        cf.write("\n")
 
184
        cf.write("# The subversion-only password for the owner of the jail\n")
 
185
        cf.write("svn_pass = %s\n" % repr(passwd))
 
186
        cf.close()
 
187
 
 
188
        # FIXME: </hack>
 
189
 
 
190
        log("Checking out directories in the jail")
 
191
        try:
 
192
            svn.checkout(conf.svn_addr + login + "/stuff",
 
193
                         common.studpath.url_to_local(login + "/stuff")[1])
 
194
        except Exception, exc:
 
195
            log("While mkdiring stuff: %s" % str(exc))
 
196
            pass
 
197
        try:
 
198
            svn.checkout(conf.svn_addr + login + "/submissions",
 
199
                         common.studpath.url_to_local(login + "/submissions")[1])
 
200
        except Exception, exc:
 
201
            log("While mkdiring submissions: %s" % str(exc))
 
202
            pass
 
203
        try:
 
204
            svn.checkout(conf.svn_addr + login + "/info1",
 
205
                         common.studpath.url_to_local(login + "/info1")[1])
 
206
        except Exception, exc:
 
207
            log("While mkdiring info1: %s" % str(exc))
 
208
            pass
 
209
 
 
210
        # FIXME: should this be nicer?
 
211
        os.system("chown -R %d:%d %s" \
 
212
                % (details.unixid, details.unixid,
 
213
                   common.studpath.url_to_local(login)[1]))
 
214
 
 
215
 
 
216
        log("Enabling user")
113
217
        db.update_user(login, state='enabled')
114
218
 
115
219
        return {"response": "okay"}
 
220
    
 
221
    except Exception, exc:
 
222
        print >> sys.stderr, exc
116
223
 
117
224
    finally:
118
225
        db.close()
122
229
        'activate_user':activate_user
123
230
    }
124
231
 
 
232
def log(msg):
 
233
    """Writes a message to stderr, but only if DEBUG_PRINT is True.
 
234
    """
 
235
    global DEBUG_PRINT
 
236
    if DEBUG_PRINT:
 
237
        print >>sys.stderr, msg
 
238
 
125
239
def dispatch(props):
 
240
    print >> sys.stderr, repr(props)
126
241
    action = props.keys()[0]
127
242
    return actions[action](props[action])
128
243