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

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: dilshan_a
  • Date: 2008-01-24 23:49:08 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:292
Fixed bug in get_name for TestSuite.

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
# cutting a distribution, and the listfile it generates should be included in
32
32
# the distribution, avoiding the administrator having to run it.
33
33
 
34
 
# setup.py config [args]
 
34
# setup.py conf [args]
35
35
# Configures IVLE with machine-specific details, most notably, various paths.
36
36
# Either prompts the administrator for these details or accepts them as
37
37
# command-line args.
74
74
import conf
75
75
import common.makeuser
76
76
 
77
 
# Determine which Python version (2.4 or 2.5, for example) we are running,
78
 
# and use that as the filename to the Python directory.
79
 
# Just get the first 3 characters of sys.version.
80
 
PYTHON_VERSION = sys.version[0:3]
81
 
 
82
77
# Operating system files to copy over into the jail.
83
78
# These will be copied from the given place on the OS file system into the
84
79
# same place within the jail.
99
94
    '/bin/ls',
100
95
    '/bin/echo',
101
96
    # Needed by python
102
 
    '/usr/bin/python%s' % PYTHON_VERSION,
 
97
    '/usr/bin/python2.5',
103
98
    # Needed by matplotlib
104
99
    '/usr/lib/i686/cmov/libssl.so.0.9.8',
105
100
    '/usr/lib/i686/cmov/libcrypto.so.0.9.8',
123
118
]
124
119
# Symlinks to make within the jail. Src mapped to dst.
125
120
JAIL_LINKS = {
126
 
    'python%s' % PYTHON_VERSION: 'jail/usr/bin/python',
 
121
    'python2.5': 'jail/usr/bin/python',
127
122
}
128
123
# Trees to copy. Src mapped to dst (these will be passed to action_copytree).
129
124
JAIL_COPYTREES = {
130
 
    '/usr/lib/python%s' % PYTHON_VERSION:
131
 
        'jail/usr/lib/python%s' % PYTHON_VERSION,
 
125
    '/usr/lib/python2.5': 'jail/usr/lib/python2.5',
132
126
    '/usr/share/matplotlib': 'jail/usr/share/matplotlib',
133
127
    '/etc/ld.so.conf.d': 'jail/etc/ld.so.conf.d',
134
128
}
135
129
 
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
 
config_options.append(ConfigOption("db_host", "localhost",
203
 
    """PostgreSQL Database config
204
 
==========================
205
 
Hostname of the DB server:""",
206
 
    """
207
 
### PostgreSQL Database config ###
208
 
# Database server hostname"""))
209
 
config_options.append(ConfigOption("db_port", "5432",
210
 
    """Port of the DB server:""",
211
 
    """
212
 
# Database server port"""))
213
 
config_options.append(ConfigOption("db_dbname", "ivle",
214
 
    """Database name:""",
215
 
    """
216
 
# Database name"""))
217
 
config_options.append(ConfigOption("db_user", "postgres",
218
 
    """Username for DB server login:""",
219
 
    """
220
 
# Database username"""))
221
 
config_options.append(ConfigOption("db_password", "",
222
 
    """Password for DB server login:
223
 
    (Caution: This password is stored in plaintext in www/conf/conf.py)""",
224
 
    """
225
 
# Database password"""))
226
 
 
227
130
# Try importing existing conf, but if we can't just set up defaults
228
131
# The reason for this is that these settings are used by other phases
229
132
# of setup besides conf, so we need to know them.
230
133
# Also this allows you to hit Return to accept the existing value.
231
134
try:
232
135
    confmodule = __import__("www/conf/conf")
233
 
    for opt in config_options:
234
 
        try:
235
 
            globals()[opt.option_name] = confmodule.__dict__[opt.option_name]
236
 
        except:
237
 
            globals()[opt.option_name] = opt.default
 
136
    try:
 
137
        root_dir = confmodule.root_dir
 
138
    except:
 
139
        root_dir = "/ivle"
 
140
    try:
 
141
        ivle_install_dir = confmodule.ivle_install_dir
 
142
    except:
 
143
        ivle_install_dir = "/opt/ivle"
 
144
    try:
 
145
        public_host = confmodule.public_host
 
146
    except:
 
147
        public_host = "public.localhost"
 
148
    try:
 
149
        jail_base = confmodule.jail_base
 
150
    except:
 
151
        jail_base = "/home/informatics/jails"
 
152
    try:
 
153
        subjects_base = confmodule.subjects_base
 
154
    except:
 
155
        subjects_base = "/home/informatics/subjects"
238
156
except ImportError:
239
157
    # Just set reasonable defaults
240
 
    for opt in config_options:
241
 
        globals()[opt.option_name] = opt.default
 
158
    root_dir = "/ivle"
 
159
    ivle_install_dir = "/opt/ivle"
 
160
    public_host = "public.localhost"
 
161
    jail_base = "/home/informatics/jails"
 
162
    subjects_base = "/home/informatics/subjects"
 
163
# Always defaults
 
164
allowed_uids = "0"
242
165
 
243
166
# Try importing install_list, but don't fail if we can't, because listmake can
244
167
# function without it.
253
176
# as necessary, and include it in the distribution.
254
177
listmake_mimetypes = ['text/x-python', 'text/html',
255
178
    'application/x-javascript', 'application/javascript',
256
 
    'text/css', 'image/png', 'application/xml']
 
179
    'text/css', 'image/png']
257
180
 
258
181
# Main function skeleton from Guido van Rossum
259
182
# http://www.artima.com/weblogs/viewpost.jsp?thread=4829
291
214
    try:
292
215
        oper_func = {
293
216
            'help' : help,
294
 
            'config' : conf,
 
217
            'conf' : conf,
295
218
            'build' : build,
296
219
            'listmake' : listmake,
297
220
            'install' : install,
312
235
Operation (and args) can be:
313
236
    help [operation]
314
237
    listmake (developer use only)
315
 
    config [args]
 
238
    conf [args]
316
239
    build
317
 
    install [--nojail] [--nosubjects] [-n|--dry]
 
240
    install [--nojail] [-n|--dry]
318
241
"""
319
242
        return 1
320
243
    elif len(args) != 1:
333
256
be copied upon installation. This should be run by the developer before
334
257
cutting a distribution, and the listfile it generates should be included in
335
258
the distribution, avoiding the administrator having to run it."""
336
 
    elif operation == 'config':
337
 
        print """python setup.py config [args]
 
259
    elif operation == 'conf':
 
260
        print """python setup.py conf [args]
338
261
Configures IVLE with machine-specific details, most notably, various paths.
339
262
Either prompts the administrator for these details or accepts them as
340
263
command-line args. Will be interactive only if there are no arguments given.
346
269
 
347
270
Creates www/conf/conf.py and trampoline/conf.h.
348
271
 
349
 
Args are:"""
350
 
        for opt in config_options:
351
 
            print "    --" + opt.option_name
352
 
        print """As explained in the interactive prompt or conf.py.
 
272
Args are:
 
273
    --root_dir
 
274
    --ivle_install_dir
 
275
    --public_host
 
276
    --jail_base
 
277
    --subjects_base
 
278
    --allowed_uids
 
279
As explained in the interactive prompt or conf.py.
353
280
"""
354
281
    elif operation == 'build':
355
282
        print """python -O setup.py build [--dry|-n]
366
293
 
367
294
--dry | -n  Print out the actions but don't do anything."""
368
295
    elif operation == 'install':
369
 
        print """sudo python setup.py install [--nojail] [--nosubjects][--dry|-n]
 
296
        print """sudo python setup.py install [--nojail] [--dry|-n]
370
297
(Requires root)
371
298
Create target install directory ($target).
372
299
Create $target/bin.
374
301
chown and chmod the installed trampoline.
375
302
Copy www/ to $target.
376
303
Copy jail/ to jails template directory (unless --nojail specified).
377
 
Copy subjects/ to subjects directory (unless --nosubjects specified).
378
304
 
379
 
--nojail        Do not copy the jail.
380
 
--nosubjects    Do not copy the subjects.
 
305
--nojail    Do not copy the jail.
381
306
--dry | -n  Print out the actions but don't do anything."""
382
307
    elif operation == 'updatejails':
383
308
        print """sudo python setup.py updatejails [--dry|-n]
395
320
    # We build two separate lists, by walking www and console
396
321
    list_www = build_list_py_files('www')
397
322
    list_console = build_list_py_files('console')
398
 
    list_subjects = build_list_py_files('subjects', no_top_level=True)
399
323
    # Make sure that the files generated by conf are in the list
400
324
    # (since listmake is typically run before conf)
401
325
    if "www/conf/conf.py" not in list_www:
425
349
# List of all installable files in console directory.
426
350
list_console = """)
427
351
        writelist_pretty(file, list_console)
428
 
        file.write("""
429
 
# List of all installable files in subjects directory.
430
 
# This is to install sample subjects and material.
431
 
list_subjects = """)
432
 
        writelist_pretty(file, list_subjects)
433
352
 
434
353
        file.close()
435
354
    except IOError, (errno, strerror):
446
365
 
447
366
    return 0
448
367
 
449
 
def build_list_py_files(dir, no_top_level=False):
 
368
def build_list_py_files(dir):
450
369
    """Builds a list of all py files found in a directory and its
451
 
    subdirectories. Returns this as a list of strings.
452
 
    no_top_level=True means the file paths will not include the top-level
453
 
    directory.
454
 
    """
 
370
    subdirectories. Returns this as a list of strings."""
455
371
    pylist = []
456
372
    for (dirpath, dirnames, filenames) in os.walk(dir):
457
373
        # Exclude directories beginning with a '.' (such as '.svn')
459
375
        # All *.py files are added to the list
460
376
        pylist += [os.path.join(dirpath, item) for item in filenames
461
377
            if mimetypes.guess_type(item)[0] in listmake_mimetypes]
462
 
    if no_top_level:
463
 
        for i in range(0, len(pylist)):
464
 
            _, pylist[i] = pylist[i].split(os.sep, 1)
465
378
    return pylist
466
379
 
467
380
def writelist_pretty(file, list):
475
388
        file.write(']\n')
476
389
 
477
390
def conf(args):
478
 
    global db_port
 
391
    global root_dir, ivle_install_dir, jail_base, subjects_base
 
392
    global public_host, allowed_uids
479
393
    # Set up some variables
480
394
 
481
395
    cwd = os.getcwd()
485
399
 
486
400
    # Get command-line arguments to avoid asking questions.
487
401
 
488
 
    optnames = []
489
 
    for opt in config_options:
490
 
        optnames.append(opt.option_name + "=")
491
 
    (opts, args) = getopt.gnu_getopt(args, "", optnames)
 
402
    (opts, args) = getopt.gnu_getopt(args, "", ['root_dir=',
 
403
                    'ivle_install_dir=', 'jail_base=', 'allowed_uids='])
492
404
 
493
405
    if args != []:
494
406
        print >>sys.stderr, "Invalid arguments:", string.join(args, ' ')
510
422
        # If EOF is encountered at any time during the questioning, just exit
511
423
        # silently
512
424
 
513
 
        for opt in config_options:
514
 
            globals()[opt.option_name] = \
515
 
                query_user(globals()[opt.option_name], opt.prompt)
 
425
        root_dir = query_user(root_dir,
 
426
        """Root directory where IVLE is located (in URL space):""")
 
427
        ivle_install_dir = query_user(ivle_install_dir,
 
428
        'Root directory where IVLE will be installed (on the local file '
 
429
        'system):')
 
430
        jail_base = query_user(jail_base,
 
431
        """Root directory where the jails (containing user files) are stored
 
432
(on the local file system):""")
 
433
        subjects_base = query_user(subjects_base,
 
434
        """Root directory where the subject directories (containing worksheets
 
435
and other per-subject files) are stored (on the local file system):""")
 
436
        public_host = query_user(public_host,
 
437
        """Hostname which will cause the server to go into "public mode",
 
438
providing login-free access to student's published work:""")
 
439
        allowed_uids = query_user(allowed_uids,
 
440
        """UID of the web server process which will run IVLE.
 
441
Only this user may execute the trampoline. May specify multiple users as
 
442
a comma-separated list.
 
443
    (eg. "1002,78")""")
 
444
 
516
445
    else:
517
446
        opts = dict(opts)
518
447
        # Non-interactive mode. Parse the options.
519
 
        for opt in config_options:
520
 
            if '--' + opt.option_name in opts:
521
 
                globals()[opt.option_name] = opts['--' + opt.option_name]
 
448
        if '--root_dir' in opts:
 
449
            root_dir = opts['--root_dir']
 
450
        if '--ivle_install_dir' in opts:
 
451
            ivle_install_dir = opts['--ivle_install_dir']
 
452
        if '--jail_base' in opts:
 
453
            jail_base = opts['--jail_base']
 
454
        if '--subjects_base' in opts:
 
455
            jail_base = opts['--subjects_base']
 
456
        if '--public_host' in opts:
 
457
            public_host = opts['--public_host']
 
458
        if '--allowed_uids' in opts:
 
459
            allowed_uids = opts['--allowed_uids']
522
460
 
523
461
    # Error handling on input values
524
462
    try:
525
 
        allowed_uids_list = map(int, allowed_uids.split(','))
 
463
        allowed_uids = map(int, allowed_uids.split(','))
526
464
    except ValueError:
527
465
        print >>sys.stderr, (
528
466
        "Invalid UID list (%s).\n"
529
467
        "Must be a comma-separated list of integers." % allowed_uids)
530
468
        return 1
531
 
    try:
532
 
        db_port = int(db_port)
533
 
        if db_port < 0 or db_port >= 65536: raise ValueError()
534
 
    except ValueError:
535
 
        print >>sys.stderr, (
536
 
        "Invalid DB port (%s).\n"
537
 
        "Must be an integer between 0 and 65535." % repr(db_port))
538
 
        return 1
539
469
 
540
470
    # Write www/conf/conf.py
541
471
 
546
476
# conf.py
547
477
# Miscellaneous application settings
548
478
 
549
 
""")
550
 
        for opt in config_options:
551
 
            conf.write('%s\n%s = %s\n' % (opt.comment, opt.option_name,
552
 
                repr(globals()[opt.option_name])))
 
479
 
 
480
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
 
481
# with this).
 
482
# eg. "/" or "/ivle".
 
483
root_dir = "%s"
 
484
 
 
485
# In the local file system, where IVLE is actually installed.
 
486
# This directory should contain the "www" and "bin" directories.
 
487
ivle_install_dir = "%s"
 
488
 
 
489
# The server goes into "public mode" if the browser sends a request with this
 
490
# host. This is for security reasons - we only serve public student files on a
 
491
# separate domain to the main IVLE site.
 
492
# Public mode does not use cookies, and serves only public content.
 
493
# Private mode (normal mode) requires login, and only serves files relevant to
 
494
# the logged-in user.
 
495
public_host = "%s"
 
496
 
 
497
# In the local file system, where are the student/user file spaces located.
 
498
# The user jails are expected to be located immediately in subdirectories of
 
499
# this location.
 
500
jail_base = "%s"
 
501
 
 
502
# In the local file system, where are the per-subject file spaces located.
 
503
# The individual subject directories are expected to be located immediately
 
504
# in subdirectories of this location.
 
505
subjects_base = "%s"
 
506
""" % (root_dir, ivle_install_dir, public_host, jail_base, subjects_base))
553
507
 
554
508
        conf.close()
555
509
    except IOError, (errno, strerror):
581
535
 * (Note that root is an implicit member of this list).
582
536
 */
583
537
static const int allowed_uids[] = { %s };
584
 
""" % (jail_base, repr(allowed_uids_list)[1:-1]))
 
538
""" % (jail_base, repr(allowed_uids)[1:-1]))
585
539
 
586
540
        conf.close()
587
541
    except IOError, (errno, strerror):
607
561
        print "Dry run (no actions will be executed\n"
608
562
 
609
563
    # Compile the trampoline
610
 
    curdir = os.getcwd()
611
 
    os.chdir('trampoline')
612
 
    action_runprog('make', [], dry)
613
 
    os.chdir(curdir)
 
564
    action_runprog('gcc', ['-Wall', '-o', 'trampoline/trampoline',
 
565
        'trampoline/trampoline.c'], dry)
614
566
 
615
567
    # Create the jail and its subdirectories
616
568
    # Note: Other subdirs will be made by copying files
650
602
 
651
603
def install(args):
652
604
    # Get "dry" and "nojail" variables from command line
653
 
    (opts, args) = getopt.gnu_getopt(args, "n",
654
 
        ['dry', 'nojail', 'nosubjects'])
 
605
    (opts, args) = getopt.gnu_getopt(args, "n", ['dry', 'nojail'])
655
606
    opts = dict(opts)
656
607
    dry = '-n' in opts or '--dry' in opts
657
608
    nojail = '--nojail' in opts
658
 
    nosubjects = '--nosubjects' in opts
659
609
 
660
610
    if dry:
661
611
        print "Dry run (no actions will be executed\n"
683
633
        # to the jails template directory (it will be used as a template
684
634
        # for all the students' jails).
685
635
        action_copytree('jail', os.path.join(jail_base, 'template'), dry)
686
 
    if not nosubjects:
687
 
        # Copy the subjects directory across
688
 
        action_copylist(install_list.list_subjects, subjects_base, dry,
689
 
            srcdir="./subjects")
690
636
 
691
637
    # Append IVLE path to ivle.pth in python site packages
692
638
    # (Unless it's already there)
693
639
    ivle_pth = os.path.join(sys.prefix,
694
 
        "lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION)
 
640
        "lib/python2.5/site-packages/ivle.pth")
695
641
    ivle_www = os.path.join(ivle_install_dir, "www")
696
642
    write_ivle_pth = True
697
643
    try:
822
768
    if dry: return
823
769
    common.makeuser.linktree(src, dst)
824
770
 
825
 
def action_copylist(srclist, dst, dry, srcdir="."):
 
771
def action_copylist(srclist, dst, dry):
826
772
    """Copies all files in a list to a new location. The files in the list
827
773
    are read relative to the current directory, and their destinations are the
828
774
    same paths relative to dst. Creates all parent directories as necessary.
829
 
    srcdir is "." by default, can be overridden.
830
775
    """
831
776
    for srcfile in srclist:
832
777
        dstfile = os.path.join(dst, srcfile)
833
 
        srcfile = os.path.join(srcdir, srcfile)
834
778
        dstdir = os.path.split(dstfile)[0]
835
779
        if not os.path.isdir(dstdir):
836
780
            action_mkdir(dstdir, dry)
845
789
def action_copyfile(src, dst, dry):
846
790
    """Copies one file to a new location. Creates all parent directories
847
791
    as necessary.
848
 
    Warn if file not found.
849
792
    """
850
793
    dstdir = os.path.split(dst)[0]
851
794
    if not os.path.isdir(dstdir):
855
798
        try:
856
799
            shutil.copyfile(src, dst)
857
800
            shutil.copymode(src, dst)
858
 
        except (shutil.Error, IOError), e:
859
 
            print "Warning: " + str(e)
 
801
        except shutil.Error:
 
802
            pass
860
803
 
861
804
def action_symlink(src, dst, dry):
862
805
    """Creates a symlink in a given location. Creates all parent directories