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

« back to all changes in this revision

Viewing changes to setup/install.py

  • Committer: dcoles
  • Date: 2008-07-03 04:20:54 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:803
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should 
allow us to get in there and tidy up each module much easier. Also removed 
updatejails since this functionality seems to be duplicated with remakeuser.py 
and remakealluser.py scripts.

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
 
 
26
 
from setup import util
 
35
from setuputil import *
27
36
 
28
37
def install(args):
29
38
    usage = """usage: %prog install [options]
30
39
(Requires root)
31
40
Create target install directory ($target).
32
41
Create $target/bin.
33
 
Copy bin/trampoline/trampoline to $target/bin.
34
 
Copy bin/timount/timount to $target/bin.
 
42
Copy trampoline/trampoline to $target/bin.
35
43
chown and chmod the installed trampoline.
36
44
Copy www/ to $target.
37
 
Copy jail/ to jail_system directory (unless --nojail specified).
 
45
Copy jail/ to jails __staging__ directory (unless --nojail specified).
38
46
Copy subjects/ to subjects directory (unless --nosubjects specified).
39
47
"""
40
48
 
45
53
        help="Print out the actions but don't do anything.")
46
54
    parser.add_option("-J", "--nojail",
47
55
        action="store_true", dest="nojail",
48
 
        help="Don't copy jail/ to jail_system directory")
 
56
        help="Don't copy jail/ to jail __staging__ directory")
49
57
    parser.add_option("-S", "--nosubjects",
50
58
        action="store_true", dest="nosubjects",
51
59
        help="Don't copy subject/ to subjects directory.")
52
60
    (options, args) = parser.parse_args(args)
53
61
 
54
62
    # Call the real function
55
 
    return __install(options.dry, options.nojail, options.nosubjects)
 
63
    __install(options.dry, options.nojail, options.nosubjects)
56
64
 
57
65
def __install(dry=False,nojail=False,nosubjects=False):
58
 
    # We need to import the one in the working copy, not in the system path.
59
 
    confmodule = __import__("ivle/conf/conf")
60
 
    install_list = util.InstallList()
 
66
    # Importing configuration is a little tricky
 
67
    sys.path.append(os.path.join(os.pardir, 'lib'))
 
68
    sys.path.append(os.pardir)
 
69
    import conf.conf
 
70
    import install_list
61
71
 
62
72
    # Pull the required varibles out of the config
63
 
    lib_path = confmodule.lib_path
64
 
    share_path = confmodule.share_path
65
 
    bin_path = confmodule.bin_path
66
 
    python_site_packages = confmodule.python_site_packages
67
 
    jail_base = confmodule.jail_base
68
 
    jail_system = confmodule.jail_system
69
 
    subjects_base = confmodule.subjects_base
70
 
    exercises_base = confmodule.exercises_base
 
73
    ivle_install_dir = conf.conf.ivle_install_dir
 
74
    jail_base = conf.conf.jail_base
 
75
    subjects_base = conf.conf.subjects_base
 
76
    exercises_base = conf.conf.exercises_base
71
77
 
72
78
    # Must be run as root or a dry run  
73
79
    if dry:
77
83
        print >>sys.stderr, "Must be root to run build"
78
84
        print >>sys.stderr, "(I need to chown)."
79
85
        return 1
80
 
 
81
 
    # Make some directories for data.
82
 
    util.action_mkdir(confmodule.log_path, dry)
83
 
    util.action_mkdir(confmodule.data_path, dry)
84
 
    util.action_mkdir(confmodule.jail_base, dry)
85
 
    util.action_mkdir(confmodule.jail_src_base, dry)
86
 
    util.action_mkdir(confmodule.content_path, dry)
87
 
    util.action_mkdir(confmodule.notices_path, dry)
88
 
    util.action_mkdir(os.path.join(confmodule.data_path, 'sessions'), dry)
89
 
    util.action_mkdir(confmodule.svn_path, dry)
90
 
    util.action_mkdir(confmodule.svn_repo_path, dry)
91
 
    util.action_mkdir(os.path.join(confmodule.svn_repo_path, 'users'), dry)
92
 
    util.action_mkdir(os.path.join(confmodule.svn_repo_path, 'groups'), dry)
93
 
 
94
 
    util.action_chown(confmodule.log_path, util.wwwuid, util.wwwuid, dry)
95
 
    util.action_chown(os.path.join(confmodule.data_path, 'sessions'),
96
 
                      util.wwwuid, util.wwwuid, dry)
97
 
    util.action_chown(os.path.join(confmodule.svn_repo_path, 'users'),
98
 
                      util.wwwuid, util.wwwuid, dry)
99
 
    util.action_chown(os.path.join(confmodule.svn_repo_path, 'groups'),
100
 
                      util.wwwuid, util.wwwuid, dry)
101
 
 
102
 
    # Create lib and copy the compiled files there
103
 
    util.action_mkdir(lib_path, dry)
104
 
 
105
 
    tramppath = os.path.join(lib_path, 'trampoline')
106
 
    util.action_copyfile('bin/trampoline/trampoline', tramppath, dry)
 
86
    
 
87
    # Create the target (install) directory
 
88
    action_mkdir(ivle_install_dir, dry)
 
89
 
 
90
    # Create bin and copy the compiled files there
 
91
    action_mkdir(os.path.join(ivle_install_dir, 'bin'), dry)
 
92
    tramppath = os.path.join(ivle_install_dir, 'bin/trampoline')
 
93
    action_copyfile('trampoline/trampoline', tramppath, dry)
107
94
    # chown trampoline to root and set setuid bit
108
 
    util.action_chown_setuid(tramppath, dry)
109
 
 
110
 
    timountpath = os.path.join(lib_path, 'timount')
111
 
    util.action_copyfile('bin/timount/timount', timountpath, dry)
112
 
 
113
 
    # Create a services directory to put the usrmgt-server in.
114
 
    util.action_mkdir(os.path.join(share_path, 'services'), dry)
115
 
 
116
 
    usrmgtpath = os.path.join(share_path, 'services/usrmgt-server')
117
 
    util.action_copyfile('services/usrmgt-server', usrmgtpath, dry)
118
 
    util.action_chmod_x(usrmgtpath, dry)
119
 
 
120
 
    # Copy the user-executable binaries using the list.
121
 
    util.action_copylist(install_list.list_user_binaries, bin_path, dry,
122
 
                         onlybasename=True)
 
95
    action_chown_setuid(tramppath, dry)
 
96
 
 
97
    # Create a scripts directory to put the usrmgt-server in.
 
98
    action_mkdir(os.path.join(ivle_install_dir, 'scripts'), dry)
 
99
    usrmgtpath = os.path.join(ivle_install_dir, 'scripts/usrmgt-server')
 
100
    action_copyfile('scripts/usrmgt-server', usrmgtpath, dry)
 
101
    action_chmod_x(usrmgtpath, dry)
123
102
 
124
103
    # Copy the www and lib directories using the list
125
 
    util.action_copylist(install_list.list_www, share_path, dry)
126
 
    util.action_copylist(install_list.list_ivle_lib, python_site_packages, dry)
 
104
    action_copylist(install_list.list_www, ivle_install_dir, dry)
 
105
    action_copylist(install_list.list_lib, ivle_install_dir, dry)
127
106
    
128
 
    # Make the config file private
129
 
    # XXX Get rid of lib
130
 
    configpath = os.path.join(python_site_packages, 'ivle/conf/conf.py')
131
 
    util.action_make_private(configpath, dry)
132
 
 
133
107
    # Copy the php directory
134
108
    forum_dir = "www/php/phpBB3"
135
 
    forum_path = os.path.join(share_path, forum_dir)
136
 
    util.action_copytree(forum_dir, forum_path, dry)
 
109
    forum_path = os.path.join(ivle_install_dir, forum_dir)
 
110
    action_copytree(forum_dir, forum_path, dry)
137
111
    print "chown -R www-data:www-data %s" % forum_path
138
112
    if not dry:
139
113
        os.system("chown -R www-data:www-data %s" % forum_path)
140
114
 
141
115
    if not nojail:
142
116
        # Copy the local jail directory built by the build action
143
 
        # to the jail_system directory (it will be used to help build
 
117
        # to the jails __staging__ directory (it will be used to help build
144
118
        # all the students' jails).
145
 
        util.action_copytree('jail', jail_system, dry)
146
 
 
 
119
        action_copytree('jail', os.path.join(jail_base, '__staging__'), dry)
147
120
    if not nosubjects:
148
121
        # Copy the subjects and exercises directories across
149
 
        util.action_mkdir(subjects_base, dry)
150
 
        util.action_copylist(install_list.list_subjects, subjects_base, dry,
 
122
        action_copylist(install_list.list_subjects, subjects_base, dry,
151
123
            srcdir="./subjects")
152
 
        util.action_mkdir(exercises_base, dry)
153
 
        util.action_copylist(install_list.list_exercises, exercises_base, dry,
 
124
        action_copylist(install_list.list_exercises, exercises_base, dry,
154
125
            srcdir="./exercises")
155
126
 
156
 
    # XXX We shouldn't have ivle.pth at all any more.
157
 
    # We may still need the www packages to be importable.
158
 
    # Anything from www that is needed from the outside should go to lib.
159
 
    ivle_pth = os.path.join(python_site_packages, "ivle.pth")
 
127
    # Append IVLE path to ivle.pth in python site packages
 
128
    # (Unless it's already there)
 
129
    ivle_pth = os.path.join(sys.prefix,
 
130
        "lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION)
 
131
    ivle_www = os.path.join(ivle_install_dir, "www")
 
132
    ivle_lib = os.path.join(ivle_install_dir, "lib")
 
133
    write_ivle_pth = True
 
134
    write_ivle_lib_pth = True
160
135
    try:
161
 
        file = open(ivle_pth, 'w')
162
 
        file.write(os.path.join(share_path, "www"))
 
136
        file = open(ivle_pth, 'r')
 
137
        for line in file:
 
138
            if line.strip() == ivle_www:
 
139
                write_ivle_pth = False
 
140
            elif line.strip() == ivle_lib:
 
141
                write_ivle_lib_pth = False
163
142
        file.close()
164
143
    except (IOError, OSError):
165
144
        pass
 
145
    if write_ivle_pth:
 
146
        action_append(ivle_pth, ivle_www)
 
147
    if write_ivle_lib_pth:
 
148
        action_append(ivle_pth, ivle_lib)
 
149
 
166
150
 
167
151
    # Create the ivle working revision record file
168
 
    ivle_revision_record_file = os.path.join(share_path, 'ivle-revision.txt')
 
152
    action_mkdir(os.path.join(ivle_install_dir, 'version'), dry)
 
153
    ivle_revision_record_file = os.path.join(ivle_install_dir, 'version/ivle-revision.txt')
169
154
    if not dry:
170
155
        try:
171
156
            conf = open(ivle_revision_record_file, "w")
172
157
 
173
 
            conf.write("""# SVN revision r%s
174
 
# Source tree location: %s
175
 
# Modified files:
176
 
""" % (util.get_svn_revision(), os.getcwd()))
 
158
            conf.write( "# IVLE code revision listing generated by running 'svn status -v ..' from " + os.getcwd() + "\n#\n\n")
177
159
 
178
160
            conf.close()
179
161
        except IOError, (errno, strerror):
180
162
            print "IO error(%s): %s" % (errno, strerror)
181
163
            sys.exit(1)
182
164
 
183
 
        os.system("svn status . >> %s" % ivle_revision_record_file)
 
165
        os.system("svn status -v .. >> %s" % ivle_revision_record_file)
184
166
 
185
167
    print "Wrote IVLE code revision status to %s" % ivle_revision_record_file
186
168