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

« back to all changes in this revision

Viewing changes to scripts/usrmgt-server

  • Committer: mattgiuca
  • Date: 2008-03-09 13:58:10 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:675
remakeallusers: Removed bogus return statement at the top level.

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
 
9
import traceback
 
10
import logging
4
11
 
 
12
import conf
5
13
import common.db
6
14
import common.chat
7
15
import common.makeuser
 
16
import common.studpath
8
17
 
9
18
# usage:
10
19
#   usrmgt-server <port> <magic>
25
34
#   - Rebuild svn auth file
26
35
#   - Rebuild passwd + push to nodes.
27
36
 
28
 
 
29
37
def create_user(props):
30
38
    """Create the database record for the given user.
31
39
       Expected properties:
32
 
        username    - used as a unix login name and svn repository name.
 
40
        login       - used as a unix login name and svn repository name.
33
41
                      STRING REQUIRED 
34
 
        uid         - the unix uid under which execution will take place
 
42
        unixid      - the unix uid under which execution will take place
35
43
                      on the behalf of the user. Don't use 0! If not specified
36
44
                      or None, one will be allocated from the configured
37
45
                      numeric range.
56
64
       Return Value: the uid associated with the user. INT
57
65
    """
58
66
 
59
 
    # FIXME: the IVLE server must check that an admin is doing this!
60
 
 
61
 
    if 'uid' not in props or props['uid'] is None:
62
 
        raise NotImplementedError, "No algorithm for creating uids yet!"
63
 
        # uid = invent-uid
64
 
        # props['uid'] = uid
65
 
 
66
 
    username = props['username']
67
 
    uid = props['uid']
68
 
    try:
69
 
        password = props['password']
70
 
    except KeyError:
71
 
        password = None
72
 
    try:
73
 
        email = props['email']
74
 
    except KeyError:
75
 
        email = None
76
 
    nick = props['nick']
77
 
    fullname = props['fullname']
78
 
    rolenm = props['rolenm']
79
 
    try:
80
 
        studentid = props['studentid']
81
 
    except KeyError:
82
 
        studentid = None
83
 
    common.makeuser.make_user_db(username, uid, password, email, nick,
84
 
                                 fullname, rolenm, studentid)
85
 
 
86
 
    return uid
 
67
    if 'unixid' not in props or props['unixid'] is None:
 
68
        # For the time being, just choose a random unixid.
 
69
        # This may result in duplicates, but the unixid is essentially
 
70
        # a monitoring/logging convenience only. Oh, and dups could kill
 
71
        # each other. <sigh>
 
72
        props['unixid'] = random.randrange(5000,10000)
 
73
        # raise NotImplementedError, "No algorithm for creating uids yet!"
 
74
        # unixid = invent-uid
 
75
        # props['unixid'] = unixid
 
76
 
 
77
    common.makeuser.make_user_db(**props)
 
78
 
 
79
    return int(props['unixid'])
 
80
 
 
81
def update_user(props):
 
82
    """Create the database record for the given user.
 
83
       Expected properties:
 
84
        login       - user who is making the change (not necessarily the one
 
85
                      being updated).
 
86
        update      - dict of fields to be updated. The fields are all those
 
87
                      in the login table of the db.
 
88
                      'login' required.
 
89
                      Omitted fields will not be set.
 
90
    """
 
91
    update = props['update']
 
92
    # Note: "login" is special - it is not part of the kwargs to
 
93
    # db.update_user, but the first arg - used to find the user to update.
 
94
    # However it doesn't need any special treatment here.
 
95
 
 
96
    db = common.db.DB()
 
97
    db.update_user(**update)
 
98
    db.close()
 
99
 
 
100
def get_login(login, passwd, _realm, _login, _may_save):
 
101
    """Callback function used by pysvn for authentication.
 
102
    """
 
103
    logging.debug("Getting password for %s (realm %s)" % (login, _realm))
 
104
    return (True, login, passwd, False)
87
105
 
88
106
def activate_user(props):
89
107
    """Create the on-disk stuff for the given user.
104
122
 
105
123
        details = db.get_user(login)
106
124
 
107
 
        # FIXME: make svn config/auth
108
 
 
109
 
        # FIXME: etc, etc.
110
 
 
111
 
        common.makeuser.make_jail(login, details['unixid'])
112
 
 
 
125
        # make svn config/auth
 
126
 
 
127
        logging.debug("Creating repo")
 
128
        common.makeuser.make_svn_repo(login, throw_on_error=False)
 
129
        logging.debug("Creating svn config")
 
130
        common.makeuser.make_svn_config(login, throw_on_error=False)
 
131
        logging.debug("Creating svn auth")
 
132
        passwd = common.makeuser.make_svn_auth(login, throw_on_error=False)
 
133
        logging.debug("passwd: %s" % passwd)
 
134
 
 
135
        svn = pysvn.Client()
 
136
        svn.callback_get_login = partial(get_login, login, passwd)
 
137
 
 
138
        if conf.svn_addr[-1] != '/':
 
139
            conf.svn_addr = conf.svn_addr + "/"
 
140
    
 
141
        # FIXME: This should be a loop over enrolements.
 
142
        #        We're not going to fix this now because it requires
 
143
        #        a large amount of admin console work to manage subject
 
144
        #        offerings.
 
145
        #        Instead, we're just going to use a single offering with
 
146
        #        a "short" name of "info1".
 
147
        logging.debug("Creating /info1")
 
148
        try:
 
149
            svn.mkdir(conf.svn_addr + login + "/info1",
 
150
                      "Initial creation of work directory for Informatics 1")
 
151
        except Exception, exc:
 
152
            logging.warning("While mkdiring info1: %s" % str(exc))
 
153
            pass
 
154
        logging.debug("Creating /stuff")
 
155
        try:
 
156
            svn.mkdir(conf.svn_addr + login + "/stuff",
 
157
                      "Initial creation of directory for miscellania")
 
158
        except Exception, exc:
 
159
            logging.warning("While mkdiring stuff: %s" % str(exc))
 
160
            pass
 
161
 
 
162
        logging.debug("Creating jail")
 
163
        common.makeuser.make_jail(login, details.unixid)
 
164
 
 
165
        # FIXME: <hack>
 
166
 
 
167
        tcf_path = os.path.join(conf.jail_base, 'template/opt/ivle/lib/conf/conf.py')
 
168
        cf_path = os.path.join(conf.jail_base, login, 'opt/ivle/lib/conf/conf.py')
 
169
 
 
170
        os.remove(cf_path)
 
171
        cf = open(cf_path, "w")
 
172
        cf.write(open(tcf_path, "r").read())
 
173
        cf.write("# The login name for the owner of the jail\n")
 
174
        cf.write("login = %s\n" % repr(login))
 
175
        cf.write("\n")
 
176
        cf.write("# The subversion-only password for the owner of the jail\n")
 
177
        cf.write("svn_pass = %s\n" % repr(passwd))
 
178
        cf.close()
 
179
 
 
180
        # FIXME: </hack>
 
181
 
 
182
        logging.debug("Checking out directories in the jail")
 
183
        try:
 
184
            svn.checkout(conf.svn_addr + login + "/stuff",
 
185
                         common.studpath.url_to_local(login + "/stuff")[1])
 
186
        except Exception, exc:
 
187
            logging.warning("While mkdiring stuff: %s" % str(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
            logging.warning("While mkdiring info1: %s" % str(exc))
 
194
            pass
 
195
 
 
196
        # FIXME: should this be nicer?
 
197
        os.system("chown -R %d:%d %s" \
 
198
                % (details.unixid, details.unixid,
 
199
                   common.studpath.url_to_local(login)[1]))
 
200
 
 
201
 
 
202
        logging.info("Enabling user")
113
203
        db.update_user(login, state='enabled')
114
204
 
115
205
        return {"response": "okay"}
119
209
 
120
210
actions = {
121
211
        'create_user':create_user,
122
 
        'activate_user':activate_user
 
212
        'update_user':update_user,
 
213
        'activate_user':activate_user,
123
214
    }
124
215
 
125
216
def dispatch(props):
 
217
    logging.debug(repr(props))
126
218
    action = props.keys()[0]
127
219
    return actions[action](props[action])
128
220
 
129
221
if __name__ == "__main__":
 
222
    if len(sys.argv) <3:
 
223
        print >>sys.stderr, "Usage: usrmgt-server <port> <magic>"
 
224
        sys.exit(1)
130
225
    port = int(sys.argv[1])
131
226
    magic = sys.argv[2]
132
227
 
133
 
    common.chat.start_server(port, magic, False, dispatch)
 
228
    pid = os.getpid()
 
229
 
 
230
    logging.basicConfig(filename="/var/log/usrmgt.log", level=logging.INFO)
 
231
    logging.info("Starting usrmgt server on port %d (pid = %d)" % (port, pid))
 
232
 
 
233
    common.chat.start_server(port, magic, True, dispatch)