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

« back to all changes in this revision

Viewing changes to bin/ivle-buildjail

  • Committer: David Coles
  • Date: 2009-12-10 01:18:36 UTC
  • Revision ID: coles.david@gmail.com-20091210011836-6kk2omcmr9hvphj0
Correct documentation's system diagram (console communication goes via Application Slaves)

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