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

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: mattgiuca
  • Date: 2008-01-31 23:57:02 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:358
setup.py: Gutted out the config options code. It was getting so there were
about 6 points of control on the options, and adding a new option required you
to write code in all of those places.

Now there is a single data structure storing all of the config options (their
names, default values, and prompts). The code in the rest of setup.py just
acts on this data structure.

Adding new options now only requires appending a new value to config_options
at the top of the script.

Show diffs side-by-side

added added

removed removed

Lines of Context:
133
133
    '/etc/ld.so.conf.d': 'jail/etc/ld.so.conf.d',
134
134
}
135
135
 
 
136
class ConfigOption:
 
137
    """A configuration option; one of the things written to conf.py."""
 
138
    def __init__(self, option_name, default, prompt, comment):
 
139
        """Creates a configuration option.
 
140
        option_name: Name of the variable in conf.py. Also name of the
 
141
            command-line argument to setup.py conf.
 
142
        default: Default value for this variable.
 
143
        prompt: (Short) string presented during the interactive prompt in
 
144
            setup.py conf.
 
145
        comment: (Long) comment string stored in conf.py. Each line of this
 
146
            string should begin with a '#'.
 
147
        """
 
148
        self.option_name = option_name
 
149
        self.default = default
 
150
        self.prompt = prompt
 
151
        self.comment = comment
 
152
 
 
153
# Configuration options, defaults and descriptions
 
154
config_options = []
 
155
config_options.append(ConfigOption("root_dir", "/ivle",
 
156
    """Root directory where IVLE is located (in URL space):""",
 
157
    """
 
158
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
 
159
# with this).
 
160
# eg. "/" or "/ivle"."""))
 
161
config_options.append(ConfigOption("ivle_install_dir", "/opt/ivle",
 
162
    'Root directory where IVLE will be installed (on the local file '
 
163
    'system):',
 
164
    """
 
165
# In the local file system, where IVLE is actually installed.
 
166
# This directory should contain the "www" and "bin" directories."""))
 
167
config_options.append(ConfigOption("jail_base", "/home/informatics/jails",
 
168
    """Root directory where the jails (containing user files) are stored
 
169
(on the local file system):""",
 
170
    """
 
171
# In the local file system, where are the student/user file spaces located.
 
172
# The user jails are expected to be located immediately in subdirectories of
 
173
# this location."""))
 
174
config_options.append(ConfigOption("subjects_base",
 
175
    "/home/informatics/subjects",
 
176
    """Root directory where the subject directories (containing worksheets
 
177
and other per-subject files) are stored (on the local file system):""",
 
178
    """
 
179
# In the local file system, where are the per-subject file spaces located.
 
180
# The individual subject directories are expected to be located immediately
 
181
# in subdirectories of this location."""))
 
182
config_options.append(ConfigOption("public_host", "public.localhost",
 
183
    """Hostname which will cause the server to go into "public mode",
 
184
providing login-free access to student's published work:""",
 
185
    """
 
186
# The server goes into "public mode" if the browser sends a request with this
 
187
# host. This is for security reasons - we only serve public student files on a
 
188
# separate domain to the main IVLE site.
 
189
# Public mode does not use cookies, and serves only public content.
 
190
# Private mode (normal mode) requires login, and only serves files relevant to
 
191
# the logged-in user."""))
 
192
config_options.append(ConfigOption("allowed_uids", "33",
 
193
    """UID of the web server process which will run IVLE.
 
194
Only this user may execute the trampoline. May specify multiple users as
 
195
a comma-separated list.
 
196
    (eg. "1002,78")""",
 
197
    """
 
198
# The User-ID of the web server process which will run IVLE, and any other
 
199
# users who are allowed to run the trampoline. This is stores as a string of
 
200
# comma-separated integers, simply because it is not used within Python, only
 
201
# used by the setup program to write to conf.h (see setup.py config)."""))
 
202
 
136
203
# Try importing existing conf, but if we can't just set up defaults
137
204
# The reason for this is that these settings are used by other phases
138
205
# of setup besides conf, so we need to know them.
139
206
# Also this allows you to hit Return to accept the existing value.
140
207
try:
141
208
    confmodule = __import__("www/conf/conf")
142
 
    try:
143
 
        root_dir = confmodule.root_dir
144
 
    except:
145
 
        root_dir = "/ivle"
146
 
    try:
147
 
        ivle_install_dir = confmodule.ivle_install_dir
148
 
    except:
149
 
        ivle_install_dir = "/opt/ivle"
150
 
    try:
151
 
        public_host = confmodule.public_host
152
 
    except:
153
 
        public_host = "public.localhost"
154
 
    try:
155
 
        jail_base = confmodule.jail_base
156
 
    except:
157
 
        jail_base = "/home/informatics/jails"
158
 
    try:
159
 
        subjects_base = confmodule.subjects_base
160
 
    except:
161
 
        subjects_base = "/home/informatics/subjects"
 
209
    for opt in config_options:
 
210
        try:
 
211
            globals()[opt.option_name] = confmodule.__dict__[opt.option_name]
 
212
        except:
 
213
            globals()[opt.option_name] = opt.default
162
214
except ImportError:
163
215
    # Just set reasonable defaults
164
 
    root_dir = "/ivle"
165
 
    ivle_install_dir = "/opt/ivle"
166
 
    public_host = "public.localhost"
167
 
    jail_base = "/home/informatics/jails"
168
 
    subjects_base = "/home/informatics/subjects"
169
 
# Always defaults
170
 
allowed_uids = "0"
 
216
    for opt in config_options:
 
217
        globals()[opt.option_name] = opt.default
171
218
 
172
219
# Try importing install_list, but don't fail if we can't, because listmake can
173
220
# function without it.
275
322
 
276
323
Creates www/conf/conf.py and trampoline/conf.h.
277
324
 
278
 
Args are:
279
 
    --root_dir
280
 
    --ivle_install_dir
281
 
    --public_host
282
 
    --jail_base
283
 
    --subjects_base
284
 
    --allowed_uids
285
 
As explained in the interactive prompt or conf.py.
 
325
Args are:"""
 
326
        for opt in config_options:
 
327
            print "    --" + opt.option_name
 
328
        print """As explained in the interactive prompt or conf.py.
286
329
"""
287
330
    elif operation == 'build':
288
331
        print """python -O setup.py build [--dry|-n]
442
485
        # If EOF is encountered at any time during the questioning, just exit
443
486
        # silently
444
487
 
445
 
        root_dir = query_user(root_dir,
446
 
        """Root directory where IVLE is located (in URL space):""")
447
 
        ivle_install_dir = query_user(ivle_install_dir,
448
 
        'Root directory where IVLE will be installed (on the local file '
449
 
        'system):')
450
 
        jail_base = query_user(jail_base,
451
 
        """Root directory where the jails (containing user files) are stored
452
 
(on the local file system):""")
453
 
        subjects_base = query_user(subjects_base,
454
 
        """Root directory where the subject directories (containing worksheets
455
 
and other per-subject files) are stored (on the local file system):""")
456
 
        public_host = query_user(public_host,
457
 
        """Hostname which will cause the server to go into "public mode",
458
 
providing login-free access to student's published work:""")
459
 
        allowed_uids = query_user(allowed_uids,
460
 
        """UID of the web server process which will run IVLE.
461
 
Only this user may execute the trampoline. May specify multiple users as
462
 
a comma-separated list.
463
 
    (eg. "1002,78")""")
464
 
 
 
488
        for opt in config_options:
 
489
            globals()[opt.option_name] = \
 
490
                query_user(globals()[opt.option_name], opt.prompt)
465
491
    else:
466
492
        opts = dict(opts)
467
493
        # Non-interactive mode. Parse the options.
468
 
        if '--root_dir' in opts:
469
 
            root_dir = opts['--root_dir']
470
 
        if '--ivle_install_dir' in opts:
471
 
            ivle_install_dir = opts['--ivle_install_dir']
472
 
        if '--jail_base' in opts:
473
 
            jail_base = opts['--jail_base']
474
 
        if '--subjects_base' in opts:
475
 
            jail_base = opts['--subjects_base']
476
 
        if '--public_host' in opts:
477
 
            public_host = opts['--public_host']
478
 
        if '--allowed_uids' in opts:
479
 
            allowed_uids = opts['--allowed_uids']
 
494
        for opt in config_options:
 
495
            if '--' + opt.option_name in opts:
 
496
                globals()[opt.option_name] = opts['--' + opt.option_name]
480
497
 
481
498
    # Error handling on input values
482
499
    try:
483
 
        allowed_uids = map(int, allowed_uids.split(','))
 
500
        allowed_uids_list = map(int, allowed_uids.split(','))
484
501
    except ValueError:
485
502
        print >>sys.stderr, (
486
503
        "Invalid UID list (%s).\n"
496
513
# conf.py
497
514
# Miscellaneous application settings
498
515
 
499
 
 
500
 
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
501
 
# with this).
502
 
# eg. "/" or "/ivle".
503
 
root_dir = "%s"
504
 
 
505
 
# In the local file system, where IVLE is actually installed.
506
 
# This directory should contain the "www" and "bin" directories.
507
 
ivle_install_dir = "%s"
508
 
 
509
 
# The server goes into "public mode" if the browser sends a request with this
510
 
# host. This is for security reasons - we only serve public student files on a
511
 
# separate domain to the main IVLE site.
512
 
# Public mode does not use cookies, and serves only public content.
513
 
# Private mode (normal mode) requires login, and only serves files relevant to
514
 
# the logged-in user.
515
 
public_host = "%s"
516
 
 
517
 
# In the local file system, where are the student/user file spaces located.
518
 
# The user jails are expected to be located immediately in subdirectories of
519
 
# this location.
520
 
jail_base = "%s"
521
 
 
522
 
# In the local file system, where are the per-subject file spaces located.
523
 
# The individual subject directories are expected to be located immediately
524
 
# in subdirectories of this location.
525
 
subjects_base = "%s"
526
 
""" % (root_dir, ivle_install_dir, public_host, jail_base, subjects_base))
 
516
""")
 
517
        for opt in config_options:
 
518
            conf.write('%s\n%s = "%s"\n' % (opt.comment, opt.option_name,
 
519
                globals()[opt.option_name]))
527
520
 
528
521
        conf.close()
529
522
    except IOError, (errno, strerror):
555
548
 * (Note that root is an implicit member of this list).
556
549
 */
557
550
static const int allowed_uids[] = { %s };
558
 
""" % (jail_base, repr(allowed_uids)[1:-1]))
 
551
""" % (jail_base, repr(allowed_uids_list)[1:-1]))
559
552
 
560
553
        conf.close()
561
554
    except IOError, (errno, strerror):