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

« back to all changes in this revision

Viewing changes to scripts/usrmgt-server

  • Committer: agdimech
  • Date: 2008-02-22 05:03:30 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:543
browser/listing.js: Fixed sorting for date and size by adding .fileinfo

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
import os
 
4
import pysvn
 
5
import subprocess
 
6
import sys
 
7
import urllib
 
8
from functools import partial
 
9
 
 
10
import conf
 
11
import common.db
 
12
import common.chat
 
13
import common.makeuser
 
14
import common.studpath
 
15
 
 
16
# usage:
 
17
#   usrmgt-server <port> <magic>
 
18
 
 
19
# User management operations:
 
20
#   - Create local user
 
21
#   - [Re]Create jail for a user
 
22
#       - Create a svn repository for a user
 
23
#           - create repository
 
24
#           - svn config
 
25
#           - svn auth
 
26
#       - Checkout repository as home directory
 
27
#       - /etc/passwd entry
 
28
#   - Disable a user's account
 
29
#   - Enable a user's account
 
30
#   - Remove a user
 
31
#   - Rebuild svn config
 
32
#   - Rebuild svn auth file
 
33
#   - Rebuild passwd + push to nodes.
 
34
 
 
35
DEBUG_PRINT = True
 
36
 
 
37
def create_user(props):
 
38
    """Create the database record for the given user.
 
39
       Expected properties:
 
40
        username    - used as a unix login name and svn repository name.
 
41
                      STRING REQUIRED 
 
42
        uid         - the unix uid under which execution will take place
 
43
                      on the behalf of the user. Don't use 0! If not specified
 
44
                      or None, one will be allocated from the configured
 
45
                      numeric range.
 
46
                      INT OPTIONAL
 
47
        password    - the clear-text password for the user. If this property is
 
48
                      absent or None, this is an indication that external
 
49
                      authentication should be used (i.e. LDAP).
 
50
                      STRING OPTIONAL
 
51
        email       - the user's email address.
 
52
                      STRING OPTIONAL
 
53
        nick        - the display name to use.
 
54
                      STRING REQUIRED
 
55
        fullname    - The name of the user for results and/or other official
 
56
                      purposes.
 
57
                      STRING REQUIRED
 
58
        rolenm      - The user's role. Must be one of "anyone", "student",
 
59
                      "tutor", "lecturer", "admin".
 
60
                      STRING/ENUM REQUIRED
 
61
        studentid   - If supplied and not None, the student id of the user for
 
62
                      results and/or other official purposes.
 
63
                      STRING OPTIONAL
 
64
       Return Value: the uid associated with the user. INT
 
65
    """
 
66
 
 
67
    # FIXME: the IVLE server must check that an admin is doing this!
 
68
 
 
69
    if 'uid' not in props or props['uid'] is None:
 
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!"
 
76
        # uid = invent-uid
 
77
        # props['uid'] = uid
 
78
 
 
79
    username = props['username']
 
80
    uid = props['uid']
 
81
    try:
 
82
        password = props['password']
 
83
    except KeyError:
 
84
        password = None
 
85
    try:
 
86
        email = props['email']
 
87
    except KeyError:
 
88
        email = None
 
89
    nick = props['nick']
 
90
    fullname = props['fullname']
 
91
    rolenm = props['rolenm']
 
92
    try:
 
93
        studentid = props['studentid']
 
94
    except KeyError:
 
95
        studentid = None
 
96
    common.makeuser.make_user_db(username, uid, password, email, nick,
 
97
                                 fullname, rolenm, studentid)
 
98
 
 
99
    return uid
 
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
 
 
107
def activate_user(props):
 
108
    """Create the on-disk stuff for the given user.
 
109
       Sets the state of the user in the db from pending to enabled.
 
110
       Expected properties:
 
111
        login       - the user name for the jail
 
112
                      STRING REQUIRED
 
113
       Return Value: None
 
114
    """
 
115
 
 
116
    login = props['login']
 
117
 
 
118
    db = common.db.DB()
 
119
 
 
120
    try:
 
121
 
 
122
        # FIXME: check we're pending
 
123
 
 
124
        details = db.get_user(login)
 
125
 
 
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")
 
217
        db.update_user(login, state='enabled')
 
218
 
 
219
        return {"response": "okay"}
 
220
    
 
221
    except Exception, exc:
 
222
        print >> sys.stderr, exc
 
223
 
 
224
    finally:
 
225
        db.close()
 
226
 
 
227
actions = {
 
228
        'create_user':create_user,
 
229
        'activate_user':activate_user
 
230
    }
 
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
 
 
239
def dispatch(props):
 
240
    print >> sys.stderr, repr(props)
 
241
    action = props.keys()[0]
 
242
    return actions[action](props[action])
 
243
 
 
244
if __name__ == "__main__":
 
245
    port = int(sys.argv[1])
 
246
    magic = sys.argv[2]
 
247
 
 
248
    common.chat.start_server(port, magic, False, dispatch)