~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 04:52:56 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:283
Fixed a bug where variables were persistent across test cases.

Added initial minutes/report/documentation on tutorials.

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
import compileall
69
69
import getopt
70
70
 
 
71
# Import modules from the website is tricky since they're in the www
 
72
# directory.
 
73
sys.path.append(os.path.join(os.getcwd(), 'www'))
 
74
import conf
 
75
import common.makeuser
 
76
 
 
77
# Operating system files to copy over into the jail.
 
78
# These will be copied from the given place on the OS file system into the
 
79
# same place within the jail.
 
80
JAIL_FILES = [
 
81
    '/lib/ld-linux.so.2',
 
82
    '/lib/tls/i686/cmov/libc.so.6',
 
83
    '/lib/tls/i686/cmov/libdl.so.2',
 
84
    '/lib/tls/i686/cmov/libm.so.6',
 
85
    '/lib/tls/i686/cmov/libpthread.so.0',
 
86
    '/lib/tls/i686/cmov/libutil.so.1',
 
87
    '/etc/ld.so.conf',
 
88
    '/etc/ld.so.cache',
 
89
    # These 2 files do not exist in Ubuntu
 
90
    #'/etc/ld.so.preload',
 
91
    #'/etc/ld.so.nohwcap',
 
92
    # UNIX commands
 
93
    '/usr/bin/strace',
 
94
    '/bin/ls',
 
95
    '/bin/echo',
 
96
    # Needed by python
 
97
    '/usr/bin/python2.5',
 
98
    # Needed by matplotlib
 
99
    '/usr/lib/i686/cmov/libssl.so.0.9.8',
 
100
    '/usr/lib/i686/cmov/libcrypto.so.0.9.8',
 
101
    '/lib/tls/i686/cmov/libnsl.so.1',
 
102
    '/usr/lib/libz.so.1',
 
103
    '/usr/lib/atlas/liblapack.so.3',
 
104
    '/usr/lib/atlas/libblas.so.3',
 
105
    '/usr/lib/libg2c.so.0',
 
106
    '/usr/lib/libstdc++.so.6',
 
107
    '/usr/lib/libfreetype.so.6',
 
108
    '/usr/lib/libpng12.so.0',
 
109
    '/usr/lib/libBLT.2.4.so.8.4',
 
110
    '/usr/lib/libtk8.4.so.0',
 
111
    '/usr/lib/libtcl8.4.so.0',
 
112
    '/usr/lib/tcl8.4/init.tcl',
 
113
    '/usr/lib/libX11.so.6',
 
114
    '/usr/lib/libXau.so.6',
 
115
    '/usr/lib/libXdmcp.so.6',
 
116
    '/lib/libgcc_s.so.1',
 
117
    '/etc/matplotlibrc',
 
118
]
 
119
# Symlinks to make within the jail. Src mapped to dst.
 
120
JAIL_LINKS = {
 
121
    'python2.5': 'jail/usr/bin/python',
 
122
}
 
123
# Trees to copy. Src mapped to dst (these will be passed to action_copytree).
 
124
JAIL_COPYTREES = {
 
125
    '/usr/lib/python2.5': 'jail/usr/lib/python2.5',
 
126
    '/usr/share/matplotlib': 'jail/usr/share/matplotlib',
 
127
    '/etc/ld.so.conf.d': 'jail/etc/ld.so.conf.d',
 
128
}
 
129
 
71
130
# Try importing existing conf, but if we can't just set up defaults
72
131
# The reason for this is that these settings are used by other phases
73
132
# of setup besides conf, so we need to know them.
74
133
# Also this allows you to hit Return to accept the existing value.
75
134
try:
76
135
    confmodule = __import__("www/conf/conf")
77
 
    root_dir = confmodule.root_dir
78
 
    ivle_install_dir = confmodule.ivle_install_dir
79
 
    jail_base = confmodule.jail_base
 
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"
80
152
except ImportError:
81
153
    # Just set reasonable defaults
82
154
    root_dir = "/ivle"
83
155
    ivle_install_dir = "/opt/ivle"
 
156
    public_host = "public.localhost"
84
157
    jail_base = "/home/informatics/jails"
85
158
# Always defaults
86
159
allowed_uids = "0"
127
200
        return 1
128
201
 
129
202
    # Disallow run as root unless installing
130
 
    if operation != 'install' and os.geteuid() == 0:
 
203
    if (operation != 'install' and operation != 'updatejails'
 
204
        and os.geteuid() == 0):
131
205
        print >>sys.stderr, "I do not want to run this stage as root."
132
206
        print >>sys.stderr, "Please run as a normal user."
133
207
        return 1
139
213
            'build' : build,
140
214
            'listmake' : listmake,
141
215
            'install' : install,
 
216
            'updatejails' : updatejails,
142
217
        }[operation]
143
218
    except KeyError:
144
219
        print >>sys.stderr, (
192
267
Args are:
193
268
    --root_dir
194
269
    --ivle_install_dir
 
270
    --public_host
195
271
    --jail_base
196
272
    --allowed_uids
197
273
As explained in the interactive prompt or conf.py.
222
298
 
223
299
--nojail    Do not copy the jail.
224
300
--dry | -n  Print out the actions but don't do anything."""
 
301
    elif operation == 'updatejails':
 
302
        print """sudo python setup.py updatejails [--dry|-n]
 
303
(Requires root)
 
304
Copy jail/ to each subdirectory in jails directory.
 
305
 
 
306
--dry | -n  Print out the actions but don't do anything."""
225
307
    else:
226
308
        print >>sys.stderr, (
227
309
            """Invalid operation '%s'. Try python setup.py help."""
300
382
        file.write(']\n')
301
383
 
302
384
def conf(args):
303
 
    global root_dir, ivle_install_dir, jail_base, allowed_uids
 
385
    global root_dir, ivle_install_dir, jail_base, public_host, allowed_uids
304
386
    # Set up some variables
305
387
 
306
388
    cwd = os.getcwd()
308
390
    conffile = os.path.join(cwd, "www/conf/conf.py")
309
391
    conf_hfile = os.path.join(cwd, "trampoline/conf.h")
310
392
 
311
 
    # Fixed config options that we don't ask the admin
312
 
    default_app = "dummy"
313
 
 
314
393
    # Get command-line arguments to avoid asking questions.
315
394
 
316
395
    (opts, args) = getopt.gnu_getopt(args, "", ['root_dir=',
344
423
        jail_base = query_user(jail_base,
345
424
        """Root directory where the jails (containing user files) are stored
346
425
(on the local file system):""")
 
426
        public_host = query_user(public_host,
 
427
        """Hostname which will cause the server to go into "public mode",
 
428
providing login-free access to student's published work:""")
347
429
        allowed_uids = query_user(allowed_uids,
348
430
        """UID of the web server process which will run IVLE.
349
431
Only this user may execute the trampoline. May specify multiple users as
359
441
            ivle_install_dir = opts['--ivle_install_dir']
360
442
        if '--jail_base' in opts:
361
443
            jail_base = opts['--jail_base']
 
444
        if '--public_host' in opts:
 
445
            public_host = opts['--public_host']
362
446
        if '--allowed_uids' in opts:
363
447
            allowed_uids = opts['--allowed_uids']
364
448
 
390
474
# This directory should contain the "www" and "bin" directories.
391
475
ivle_install_dir = "%s"
392
476
 
 
477
# The server goes into "public mode" if the browser sends a request with this
 
478
# host. This is for security reasons - we only serve public student files on a
 
479
# separate domain to the main IVLE site.
 
480
# Public mode does not use cookies, and serves only public content.
 
481
# Private mode (normal mode) requires login, and only serves files relevant to
 
482
# the logged-in user.
 
483
public_host = "%s"
 
484
 
393
485
# In the local file system, where are the student/user file spaces located.
394
486
# The user jails are expected to be located immediately in subdirectories of
395
487
# this location.
396
488
jail_base = "%s"
397
 
 
398
 
# Which application to load by default (if the user navigates to the top level
399
 
# of the site). This is the app's URL name.
400
 
# Note that if this app requires authentication, the user will first be
401
 
# presented with the login screen.
402
 
default_app = "%s"
403
 
""" % (root_dir, ivle_install_dir, jail_base, default_app))
 
489
""" % (root_dir, ivle_install_dir, public_host, jail_base))
404
490
 
405
491
        conf.close()
406
492
    except IOError, (errno, strerror):
470
556
    # Copy all console and operating system files into the jail
471
557
    action_copylist(install_list.list_console, 'jail/opt/ivle', dry)
472
558
    copy_os_files_jail(dry)
 
559
    # Chmod the python console
 
560
    action_chmod_x('jail/opt/ivle/console/python-console', dry)
 
561
    
473
562
 
474
563
    # Compile .py files into .pyc or .pyo files
475
564
    compileall.compile_dir('www', quiet=True)
481
570
    """Copies necessary Operating System files from their usual locations
482
571
    into the jail/ directory of the cwd."""
483
572
    # Currently source paths are configured for Ubuntu.
484
 
    copy_file_to_jail('/lib/ld-linux.so.2', dry)
485
 
    copy_file_to_jail('/lib/tls/i686/cmov/libc.so.6', dry)
486
 
    copy_file_to_jail('/lib/tls/i686/cmov/libdl.so.2', dry)
487
 
    copy_file_to_jail('/lib/tls/i686/cmov/libm.so.6', dry)
488
 
    copy_file_to_jail('/lib/tls/i686/cmov/libpthread.so.0', dry)
489
 
    copy_file_to_jail('/lib/tls/i686/cmov/libutil.so.1', dry)
490
 
    copy_file_to_jail('/usr/bin/python2.5', dry)
491
 
    action_symlink('python2.5', 'jail/usr/bin/python', dry)
492
 
    action_copytree('/usr/lib/python2.5', 'jail/usr/lib/python2.5', dry)
 
573
    for filename in JAIL_FILES:
 
574
        copy_file_to_jail(filename, dry)
 
575
    for src, dst in JAIL_LINKS.items():
 
576
        action_symlink(src, dst, dry)
 
577
    for src, dst in JAIL_COPYTREES.items():
 
578
        action_copytree(src, dst, dry)
493
579
 
494
580
def copy_file_to_jail(src, dry):
495
581
    """Copies a single file from an absolute location into the same location
531
617
        # for all the students' jails).
532
618
        action_copytree('jail', os.path.join(jail_base, 'template'), dry)
533
619
 
 
620
    # Append IVLE path to ivle.pth in python site packages
 
621
    # (Unless it's already there)
 
622
    ivle_pth = os.path.join(sys.prefix,
 
623
        "lib/python2.5/site-packages/ivle.pth")
 
624
    ivle_www = os.path.join(ivle_install_dir, "www")
 
625
    write_ivle_pth = True
 
626
    try:
 
627
        file = open(ivle_pth, 'r')
 
628
        for line in file:
 
629
            if line.strip() == ivle_www:
 
630
                write_ivle_pth = False
 
631
                break
 
632
    except (IOError, OSError):
 
633
        pass
 
634
    if write_ivle_pth:
 
635
        action_append(ivle_pth, ivle_www)
 
636
 
 
637
    return 0
 
638
 
 
639
def updatejails(args):
 
640
    # Get "dry" variable from command line
 
641
    (opts, args) = getopt.gnu_getopt(args, "n", ['dry'])
 
642
    opts = dict(opts)
 
643
    dry = '-n' in opts or '--dry' in opts
 
644
 
 
645
    if dry:
 
646
        print "Dry run (no actions will be executed\n"
 
647
 
 
648
    if not dry and os.geteuid() != 0:
 
649
        print >>sys.stderr, "Must be root to run install"
 
650
        print >>sys.stderr, "(I need to chown some files)."
 
651
        return 1
 
652
 
 
653
    # Update the template jail directory in case it hasn't been installed
 
654
    # recently.
 
655
    action_copytree('jail', os.path.join(jail_base, 'template'), dry)
 
656
 
 
657
    # Re-link all the files in all students jails.
 
658
    for dir in os.listdir(jail_base):
 
659
        if dir == 'template': continue
 
660
        # First back up the student's home directory
 
661
        temp_home = os.tmpnam()
 
662
        action_rename(os.path.join(jail_base, dir, 'home'), temp_home, dry)
 
663
        # Delete the student's jail and relink the jail files
 
664
        action_linktree(os.path.join(jail_base, 'template'),
 
665
            os.path.join(jail_base, dir), dry)
 
666
        # Restore the student's home directory
 
667
        action_rename(temp_home, os.path.join(jail_base, dir, 'home'), dry)
 
668
        # Set up the user's home directory just in case they don't have a
 
669
        # directory for this yet
 
670
        action_mkdir(os.path.join(jail_base, dir, 'home', dir), dry)
 
671
 
534
672
    return 0
535
673
 
536
674
# The actions call Python os functions but print actions and handle dryness.
562
700
    if ret != 0:
563
701
        raise RunError(prog, ret)
564
702
 
 
703
def action_rename(src, dst, dry):
 
704
    """Calls rename. Deletes the target if it already exists."""
 
705
    if os.access(dst, os.F_OK):
 
706
        print "rm -r", dst
 
707
        if not dry:
 
708
            shutil.rmtree(dst, True)
 
709
    print "mv ", src, dst
 
710
    if dry: return
 
711
    try:
 
712
        os.rename(src, dst)
 
713
    except OSError, (err, msg):
 
714
        if err != errno.EEXIST:
 
715
            raise
 
716
 
565
717
def action_mkdir(path, dry):
566
718
    """Calls mkdir. Silently ignored if the directory already exists.
567
719
    Creates all parent directories as necessary."""
587
739
    if dry: return
588
740
    shutil.copytree(src, dst, True)
589
741
 
 
742
def action_linktree(src, dst, dry):
 
743
    """Hard-links an entire directory tree. Same as copytree but the created
 
744
    files are hard-links not actual copies. Removes the existing destination.
 
745
    """
 
746
    if os.access(dst, os.F_OK):
 
747
        print "rm -r", dst
 
748
        if not dry:
 
749
            shutil.rmtree(dst, True)
 
750
    print "<cp with hardlinks> -r", src, dst
 
751
    if dry: return
 
752
    common.makeuser.linktree(src, dst)
 
753
 
590
754
def action_copylist(srclist, dst, dry):
591
755
    """Copies all files in a list to a new location. The files in the list
592
756
    are read relative to the current directory, and their destinations are the
634
798
    if not dry:
635
799
        os.symlink(src, dst)
636
800
 
 
801
def action_append(ivle_pth, ivle_www):
 
802
    file = open(ivle_pth, 'a+')
 
803
    file.write(ivle_www + '\n')
 
804
    file.close()
 
805
 
637
806
def action_chown_setuid(file, dry):
638
807
    """Chowns a file to root, and sets the setuid bit on the file.
639
808
    Calling this function requires the euid to be root.
648
817
        os.chmod(file, stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
649
818
            | stat.S_ISUID | stat.S_IRUSR | stat.S_IWUSR)
650
819
 
 
820
def action_chmod_x(file, dry):
 
821
    """Chmod +xs a file (sets execute permission)."""
 
822
    print "chmod u+rwx", file
 
823
    if not dry:
 
824
        os.chmod(file, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR)
 
825
 
651
826
def query_user(default, prompt):
652
827
    """Prompts the user for a string, which is read from a line of stdin.
653
828
    Exits silently if EOF is encountered. Returns the string, with spaces