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

« back to all changes in this revision

Viewing changes to bin/ivle-buildjail

  • Committer: William Grant
  • Date: 2009-04-29 05:20:14 UTC
  • Revision ID: grantw@unimelb.edu.au-20090429052014-5tzyfz97fwt5mn0k
Replace some of ivle.makeuser's os.system calls with subprocess.call.

This makes Subversion repositories with spaces work.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
import optparse
20
20
import os
21
 
import stat
22
21
import sys
23
22
import shutil
24
23
 
 
24
import ivle.conf
25
25
import ivle.config
26
26
import ivle.jailbuilder.debian
27
27
 
28
 
class UnsafeJail(Exception):
29
 
    pass
30
 
 
31
28
usage = """usage: %prog [options]
32
29
(requires root)
33
30
Builds or updates the base IVLE jail."""
34
31
 
35
 
# Requires root
36
 
if os.getuid() != 0:
37
 
    print >> sys.stderr, "This script requires root privlages to run"
38
 
    sys.exit(1)
39
 
 
40
32
conf = ivle.config.Config()
41
 
build_path = conf['paths']['jails']['template_build']
 
33
build_path = ivle.conf.jail_system_build
42
34
 
43
35
# Parse arguments
44
36
parser = optparse.OptionParser(usage)
51
43
    help='''Apply any package updates in the jail.''')
52
44
parser.add_option("-m", "--mirror",
53
45
    action="store", dest="apt_mirror",
54
 
    help="Sets the apt mirror.", default=conf['jail']['mirror'])
 
46
    help="Sets the apt mirror.", default="http://archive.ubuntu.com/ubuntu")
55
47
parser.add_option("--python-site-packages",
56
48
    action="store", dest="python_site_packages",
57
49
    help="Path to Python site packages directory inside the jail.",
84
76
              build_path, mirror=options.apt_mirror)
85
77
 
86
78
    ivle.jailbuilder.debian.apt_update_cache(build_path)
87
 
    # Minimal required packages
88
79
    ivle.jailbuilder.debian.apt_install(build_path,
89
 
            ['python2.5', 'python-cjson', 'python-svn', 'python-configobj'])
 
80
                        ['python2.5', 'python-cjson', 'python-svn'])
90
81
 
91
82
    ivle.jailbuilder.debian.apt_clean(build_path)
92
83
 
120
111
 
121
112
if conf['jail']['devmode']:
122
113
    # Copy all console and operating system files into the jail
123
 
    services_path = os.path.join(conf['paths']['share'], 'services')
 
114
    services_path = os.path.join(ivle.conf.share_path, 'services')
124
115
    jail_services_path = os.path.join(build_path, services_path[1:])
125
116
    if os.path.exists(jail_services_path):
126
117
        shutil.rmtree(jail_services_path)
146
137
        shutil.rmtree(jail_site_packages)
147
138
    shutil.copytree(ivle_site_packages, jail_site_packages)
148
139
 
149
 
# Make /tmp and /var/lock un-world-writable. /tmp will be mounted over,
150
 
# and /var/{lock,tmp} should die.
151
 
for path in ('tmp', 'var/lock', 'var/tmp'):
152
 
    path = os.path.join(build_path, path)
153
 
    os.chmod(path, os.stat(path).st_mode & ~stat.S_IWOTH)
154
 
 
155
 
# Verify that nothing in the jail is world-writable.
156
 
# We don't want students to write into places that others can see.
157
 
try:
158
 
    for path, dirs, files in os.walk(build_path):
159
 
        for dname in dirs:
160
 
            d = os.path.join(path, dname)
161
 
            if os.path.islink(d):
162
 
                continue
163
 
            if os.stat(d).st_mode & stat.S_IWOTH:
164
 
                raise UnsafeJail(d)
165
 
 
166
 
        for fname in files:
167
 
            f = os.path.join(path, fname)
168
 
            if os.path.islink(f):
169
 
                continue
170
 
            if os.stat(f).st_mode & stat.S_IWOTH:
171
 
                if (os.path.dirname(f) == os.path.join(build_path, 'dev') and
172
 
                    os.path.basename(f) in ('ptmx', 'null', 'tty', 'full', 'zero',
173
 
                                            'random', 'urandom')
174
 
                    ):
175
 
                    continue
176
 
                raise UnsafeJail(f)
177
 
except UnsafeJail, e:
178
 
    print >> sys.stderr,"""Error: Jail contains world writable path: '%s'.
179
 
This is a security vulnerability as jail template contents are shared between 
180
 
users. Please either make this path world unwriteable or remove it from the 
181
 
jail."""%str(e)
182
 
    sys.exit(1)
183
 
 
184
 
# Copy jail template build to actual jail template
185
 
template_path = conf['paths']['jails']['template']
186
140
if os.spawnvp(os.P_WAIT, 'rsync', ['rsync', '-a', '--delete',
187
 
              build_path + '/', template_path]) != 0:
 
141
              build_path + '/', ivle.conf.jail_system]) != 0:
188
142
    print >> sys.stderr, "Jail copying failed."
189
143
    sys.exit(1)
190
144
 
191
 
# Now mangle things a bit, so we can bind-mount the user bits in.
192
 
# /etc/passwd and /etc/ivle/ivle.conf need to be symlinks to somewhere in /home
193
 
 
194
 
os.rename(os.path.join(template_path, 'etc/passwd'),
195
 
          os.path.join(template_path, 'home/.passwd')
196
 
          )
197
 
os.symlink('../home/.passwd', os.path.join(template_path, 'etc/passwd'))
198
 
 
199
 
os.makedirs(os.path.join(template_path, "etc/ivle"))
200
 
os.symlink('../../home/.ivle.conf',
201
 
           os.path.join(template_path, "etc/ivle/ivle.conf"))