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

« back to all changes in this revision

Viewing changes to scripts/usrmgt-server

  • Committer: drtomc
  • Date: 2008-01-02 22:21:12 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:128
A couple of bug fixes.

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
 
 
36
 
def create_user(props):
37
 
    """Create the database record for the given user.
38
 
       Expected properties:
39
 
        username    - used as a unix login name and svn repository name.
40
 
                      STRING REQUIRED 
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
44
 
                      numeric range.
45
 
                      INT OPTIONAL
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).
49
 
                      STRING OPTIONAL
50
 
        email       - the user's email address.
51
 
                      STRING OPTIONAL
52
 
        nick        - the display name to use.
53
 
                      STRING REQUIRED
54
 
        fullname    - The name of the user for results and/or other official
55
 
                      purposes.
56
 
                      STRING REQUIRED
57
 
        rolenm      - The user's role. Must be one of "anyone", "student",
58
 
                      "tutor", "lecturer", "admin".
59
 
                      STRING/ENUM REQUIRED
60
 
        studentid   - If supplied and not None, the student id of the user for
61
 
                      results and/or other official purposes.
62
 
                      STRING OPTIONAL
63
 
       Return Value: the uid associated with the user. INT
64
 
    """
65
 
 
66
 
    # FIXME: the IVLE server must check that an admin is doing this!
67
 
 
68
 
    if 'uid' not in props or props['uid'] is None:
69
 
        raise NotImplementedError, "No algorithm for creating uids yet!"
70
 
        # uid = invent-uid
71
 
        # props['uid'] = uid
72
 
 
73
 
    username = props['username']
74
 
    uid = props['uid']
75
 
    try:
76
 
        password = props['password']
77
 
    except KeyError:
78
 
        password = None
79
 
    try:
80
 
        email = props['email']
81
 
    except KeyError:
82
 
        email = None
83
 
    nick = props['nick']
84
 
    fullname = props['fullname']
85
 
    rolenm = props['rolenm']
86
 
    try:
87
 
        studentid = props['studentid']
88
 
    except KeyError:
89
 
        studentid = None
90
 
    common.makeuser.make_user_db(username, uid, password, email, nick,
91
 
                                 fullname, rolenm, studentid)
92
 
 
93
 
    return uid
94
 
 
95
 
def get_login(login, passwd, _realm, _login, _may_save):
96
 
    """Callback function used by pysvn for authentication.
97
 
    """
98
 
    # print >> sys.stderr, "Getting password for %s (realm %s)" % (login, _realm)
99
 
    return (True, login, passwd, False)
100
 
 
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.
104
 
       Expected properties:
105
 
        login       - the user name for the jail
106
 
                      STRING REQUIRED
107
 
       Return Value: None
108
 
    """
109
 
 
110
 
    login = props['login']
111
 
 
112
 
    db = common.db.DB()
113
 
 
114
 
    try:
115
 
 
116
 
        # FIXME: check we're pending
117
 
 
118
 
        details = db.get_user(login)
119
 
 
120
 
        # make svn config/auth
121
 
 
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
129
 
 
130
 
        svn = pysvn.Client()
131
 
        svn.callback_get_login = partial(get_login, login, passwd)
132
 
    
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
136
 
        #        offerings.
137
 
        #        Instead, we're just going to use a single offering with
138
 
        #        a "short" name of "info1".
139
 
        # print >> sys.stderr, "Creating /info1"
140
 
        try:
141
 
            svn.mkdir(conf.svn_addr + login + "/info1",
142
 
                      "Initial creation of work directory for Informatics 1")
143
 
        except Exception, exc:
144
 
            pass
145
 
        # print >> sys.stderr, "Creating /submissions"
146
 
        try:
147
 
            svn.mkdir(conf.svn_addr + login + "/submissions",
148
 
                      "Initial creation of submissions directory")
149
 
        except Exception, exc:
150
 
            pass
151
 
        # print >> sys.stderr, "Creating /stuff"
152
 
        try:
153
 
            svn.mkdir(conf.svn_addr + login + "/stuff",
154
 
                      "Initial creation of directory for miscellania")
155
 
        except Exception, exc:
156
 
            pass
157
 
 
158
 
        # print >> sys.stderr, "Creating jail"
159
 
        common.makeuser.make_jail(login, details.unixid)
160
 
 
161
 
        # FIXME: <hack>
162
 
 
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')
165
 
 
166
 
        os.remove(cf_path)
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))
171
 
        cf.write("\n")
172
 
        cf.write("# The subversion-only password for the owner of the jail\n")
173
 
        cf.write("svn_pass = %s\n" % repr(passwd))
174
 
        cf.close()
175
 
 
176
 
        # FIXME: </hack>
177
 
 
178
 
        # print >> sys.stderr, "Checking out directories in the jail"
179
 
        try:
180
 
            svn.checkout(conf.svn_addr + "/" + login + "/stuff",
181
 
                         common.studpath.url_to_local(login + "/stuff")[1])
182
 
        except Exception, exc:
183
 
            pass
184
 
        try:
185
 
            svn.checkout(conf.svn_addr + "/" + login + "/submissions",
186
 
                         common.studpath.url_to_local(login + "/submissions")[1])
187
 
        except Exception, exc:
188
 
            pass
189
 
        try:
190
 
            svn.checkout(conf.svn_addr + "/" + login + "/info1",
191
 
                         common.studpath.url_to_local(login + "/info1")[1])
192
 
        except Exception, exc:
193
 
            pass
194
 
 
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]))
199
 
 
200
 
 
201
 
        # print >> sys.stderr, "Enabling user"
202
 
        db.update_user(login, state='enabled')
203
 
 
204
 
        return {"response": "okay"}
205
 
    
206
 
    except Exception, exc:
207
 
        print >> sys.stderr, exc
208
 
 
209
 
    finally:
210
 
        db.close()
211
 
 
212
 
actions = {
213
 
        'create_user':create_user,
214
 
        'activate_user':activate_user
215
 
    }
216
 
 
217
 
def dispatch(props):
218
 
    # print >> sys.stderr, repr(props)
219
 
    action = props.keys()[0]
220
 
    return actions[action](props[action])
221
 
 
222
 
if __name__ == "__main__":
223
 
    port = int(sys.argv[1])
224
 
    magic = sys.argv[2]
225
 
 
226
 
    common.chat.start_server(port, magic, False, dispatch)