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

« back to all changes in this revision

Viewing changes to setup/install.py

  • Committer: mattgiuca
  • Date: 2008-07-15 07:19:34 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:875
Added "migrations" directory, which contains incremental database update
    scripts.
Updated users.sql, uniqueness key on offering table.
Added migration matching this update to the migrations directory. Mm handy!

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
# Author: Matt Giuca, Refactored by David Coles
20
20
# Date:   03/07/2008
21
21
 
 
22
# setup/build.py
 
23
# Compiles all files and sets up a jail template in the source directory.
 
24
# Details:
 
25
# Compiles (GCC) trampoline/trampoline.c to trampoline/trampoline.
 
26
# Creates jail/.
 
27
# Creates standard subdirs inside the jail, eg bin, opt, home, tmp.
 
28
# Copies console/ to a location within the jail.
 
29
# Copies OS programs and files to corresponding locations within the jail
 
30
#   (eg. python and Python libs, ld.so, etc).
 
31
# Generates .pyc files for all the IVLE .py files.
 
32
 
22
33
import optparse
23
34
import os
24
 
import sys
25
 
import functools
26
 
 
27
 
from setup import util
28
 
 
29
 
PYTHON_VERSION = sys.version[:3]
 
35
from setuputil import *
30
36
 
31
37
def install(args):
32
38
    usage = """usage: %prog install [options]
33
39
(Requires root)
34
40
Create target install directory ($target).
35
41
Create $target/bin.
36
 
Copy bin/trampoline/trampoline to $target/bin.
37
 
Copy bin/timount/timount to $target/bin.
 
42
Copy trampoline/trampoline to $target/bin.
 
43
Copy timount/timount to $target/bin.
38
44
chown and chmod the installed trampoline.
 
45
Copy www/ to $target.
 
46
Copy jail/ to jail_system directory (unless --nojail specified).
 
47
Copy subjects/ to subjects directory (unless --nosubjects specified).
39
48
"""
40
49
 
41
50
    # Parse arguments
43
52
    parser.add_option("-n", "--dry",
44
53
        action="store_true", dest="dry",
45
54
        help="Print out the actions but don't do anything.")
46
 
    parser.add_option("-R", "--nosvnrevno",
47
 
        action="store_true", dest="nosvnrevno",
48
 
        help="Don't write out the Subversion revision to the share directory.")
49
 
    parser.add_option("--root",
50
 
        action="store", dest="rootdir",
51
 
        help="Install into a different root directory.",
52
 
        default='/')
53
 
    parser.add_option("--prefix",
54
 
        action="store", dest="prefix",
55
 
        help="Base prefix to install IVLE into (default: /usr/local).",
56
 
        default='/usr/local')
57
 
    parser.add_option("--python-site-packages",
58
 
        action="store", dest="python_site_packages",
59
 
        help="Path to Python site packages directory.",
60
 
        default='/usr/local/lib/python%s/site-packages' % PYTHON_VERSION)
 
55
    parser.add_option("-J", "--nojail",
 
56
        action="store_true", dest="nojail",
 
57
        help="Don't copy jail/ to jail_system directory")
 
58
    parser.add_option("-S", "--nosubjects",
 
59
        action="store_true", dest="nosubjects",
 
60
        help="Don't copy subject/ to subjects directory.")
61
61
    (options, args) = parser.parse_args(args)
62
62
 
63
63
    # Call the real function
64
 
    return __install(prefix=options.prefix,
65
 
                     python_site_packages=options.python_site_packages,
66
 
                     dry=options.dry, rootdir=options.rootdir,
67
 
                     nosvnrevno=options.nosvnrevno)
68
 
 
69
 
def __install(prefix, python_site_packages, dry=False, rootdir=None,
70
 
              nosvnrevno=False):
71
 
    install_list = util.InstallList()
72
 
 
73
 
    # We need to apply make_install_path with the rootdir to an awful lot of
74
 
    # config variables, so make it easy:
75
 
    mip = functools.partial(util.make_install_path, rootdir)
76
 
 
77
 
    # Compute the lib_path, share_path and bin_path (copied from
78
 
    # ivle/conf/conf.py).
79
 
    lib_path = mip(os.path.join(prefix, 'lib/ivle'))
80
 
    share_path = mip(os.path.join(prefix, 'share/ivle'))
81
 
    bin_path = mip(os.path.join(prefix, 'bin'))
82
 
    python_site_packages = mip(python_site_packages)
 
64
    __install(options.dry, options.nojail, options.nosubjects)
 
65
 
 
66
def __install(dry=False,nojail=False,nosubjects=False):
 
67
    # Importing configuration is a little tricky
 
68
    sys.path.append('lib')
 
69
    import conf.conf
 
70
    import install_list
 
71
 
 
72
    # Pull the required varibles out of the config
 
73
    ivle_install_dir = conf.conf.ivle_install_dir
 
74
    jail_base = conf.conf.jail_base
 
75
    jail_system = conf.conf.jail_system
 
76
    subjects_base = conf.conf.subjects_base
 
77
    exercises_base = conf.conf.exercises_base
83
78
 
84
79
    # Must be run as root or a dry run  
85
80
    if dry:
86
81
        print "Dry run (no actions will be executed)\n"
87
82
    
88
83
    if not dry and os.geteuid() != 0:
89
 
        print >>sys.stderr, "Must be root to run install"
 
84
        print >>sys.stderr, "Must be root to run build"
 
85
        print >>sys.stderr, "(I need to chown)."
90
86
        return 1
91
 
 
92
 
    # Create the config directory.
93
 
    util.action_mkdir(mip('/etc/ivle/plugins.d'), dry)
94
 
 
95
 
    # Create lib and copy the compiled files there
96
 
    util.action_mkdir(lib_path, dry)
97
 
 
98
 
    tramppath = os.path.join(lib_path, 'trampoline')
99
 
    util.action_copyfile('bin/trampoline/trampoline', tramppath, dry)
 
87
    
 
88
    # Create the target (install) directory
 
89
    action_mkdir(ivle_install_dir, dry)
 
90
 
 
91
    # Create bin and copy the compiled files there
 
92
    action_mkdir(os.path.join(ivle_install_dir, 'bin'), dry)
 
93
    tramppath = os.path.join(ivle_install_dir, 'bin/trampoline')
 
94
    action_copyfile('trampoline/trampoline', tramppath, dry)
100
95
    # chown trampoline to root and set setuid bit
101
 
    util.action_chown_setuid(tramppath, dry)
102
 
 
103
 
    timountpath = os.path.join(lib_path, 'timount')
104
 
    util.action_copyfile('bin/timount/timount', timountpath, dry)
105
 
 
106
 
    # Copy in the services (only usrmgt-server is needed on the host, but
107
 
    # the jail build requires the rest).
108
 
    util.action_copylist(install_list.list_services, share_path, dry)
109
 
    usrmgtpath = os.path.join(share_path, 'services/usrmgt-server')
110
 
    util.action_chmod_x(usrmgtpath, dry)
111
 
 
112
 
    # Copy the user-executable binaries using the list.
113
 
    util.action_copylist(install_list.list_user_binaries, bin_path, dry,
114
 
                         onlybasename=True)
115
 
 
116
 
    # Copy the lib directory (using the list)
117
 
    util.action_copylist(install_list.list_ivle_lib, python_site_packages, dry)
118
 
 
119
 
    if not nosvnrevno:
120
 
        # Create the ivle working revision record file
121
 
        ivle_revision_file = os.path.join(share_path, 'revision.txt')
122
 
        if not dry:
123
 
            try:
124
 
                conf = open(ivle_revision_file, "w")
125
 
 
126
 
                conf.write("""# SVN revision r%s
127
 
# Source tree location: %s
128
 
# Modified files:
129
 
""" % (util.get_svn_revision(), os.getcwd()))
130
 
 
131
 
                conf.close()
132
 
            except IOError, (errno, strerror):
133
 
                print "IO error(%s): %s" % (errno, strerror)
134
 
                sys.exit(1)
135
 
 
136
 
            os.system("svn status . >> %s" % ivle_revision_file)
137
 
 
138
 
        print "Wrote IVLE code revision status to %s" % ivle_revision_file
 
96
    action_chown_setuid(tramppath, dry)
 
97
 
 
98
    timountpath = os.path.join(ivle_install_dir, 'bin/timount')
 
99
    action_copyfile('timount/timount', timountpath, dry)
 
100
 
 
101
    # Create a scripts directory to put the usrmgt-server in.
 
102
    action_mkdir(os.path.join(ivle_install_dir, 'scripts'), dry)
 
103
    usrmgtpath = os.path.join(ivle_install_dir, 'scripts/usrmgt-server')
 
104
    action_copyfile('scripts/usrmgt-server', usrmgtpath, dry)
 
105
    action_chmod_x(usrmgtpath, dry)
 
106
 
 
107
    # Copy the www and lib directories using the list
 
108
    action_copylist(install_list.list_www, ivle_install_dir, dry)
 
109
    action_copylist(install_list.list_lib, ivle_install_dir, dry)
 
110
    
 
111
    # Copy the php directory
 
112
    forum_dir = "www/php/phpBB3"
 
113
    forum_path = os.path.join(ivle_install_dir, forum_dir)
 
114
    action_copytree(forum_dir, forum_path, dry)
 
115
    print "chown -R www-data:www-data %s" % forum_path
 
116
    if not dry:
 
117
        os.system("chown -R www-data:www-data %s" % forum_path)
 
118
 
 
119
    if not nojail:
 
120
        # Copy the local jail directory built by the build action
 
121
        # to the jail_system directory (it will be used to help build
 
122
        # all the students' jails).
 
123
        action_copytree('jail', jail_system, dry)
 
124
    if not nosubjects:
 
125
        # Copy the subjects and exercises directories across
 
126
        action_copylist(install_list.list_subjects, subjects_base, dry,
 
127
            srcdir="./subjects")
 
128
        action_copylist(install_list.list_exercises, exercises_base, dry,
 
129
            srcdir="./exercises")
 
130
 
 
131
    # Append IVLE path to ivle.pth in python site packages
 
132
    # (Unless it's already there)
 
133
    ivle_pth = os.path.join(sys.prefix,
 
134
        "lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION)
 
135
    ivle_www = os.path.join(ivle_install_dir, "www")
 
136
    ivle_lib = os.path.join(ivle_install_dir, "lib")
 
137
    write_ivle_pth = True
 
138
    write_ivle_lib_pth = True
 
139
    try:
 
140
        file = open(ivle_pth, 'r')
 
141
        for line in file:
 
142
            if line.strip() == ivle_www:
 
143
                write_ivle_pth = False
 
144
            elif line.strip() == ivle_lib:
 
145
                write_ivle_lib_pth = False
 
146
        file.close()
 
147
    except (IOError, OSError):
 
148
        pass
 
149
    if write_ivle_pth:
 
150
        action_append(ivle_pth, ivle_www)
 
151
    if write_ivle_lib_pth:
 
152
        action_append(ivle_pth, ivle_lib)
 
153
 
 
154
 
 
155
    # Create the ivle working revision record file
 
156
    action_mkdir(os.path.join(ivle_install_dir, 'version'), dry)
 
157
    ivle_revision_record_file = os.path.join(ivle_install_dir, 'version/ivle-revision.txt')
 
158
    if not dry:
 
159
        try:
 
160
            conf = open(ivle_revision_record_file, "w")
 
161
 
 
162
            conf.write( "# IVLE code revision listing generated by running 'svn status -v ..' from " + os.getcwd() + "\n#\n\n")
 
163
 
 
164
            conf.close()
 
165
        except IOError, (errno, strerror):
 
166
            print "IO error(%s): %s" % (errno, strerror)
 
167
            sys.exit(1)
 
168
 
 
169
        os.system("svn status -v . >> %s" % ivle_revision_record_file)
 
170
 
 
171
    print "Wrote IVLE code revision status to %s" % ivle_revision_record_file
139
172
 
140
173
    return 0
141
174