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

« back to all changes in this revision

Viewing changes to bin/ivle-buildjail

  • Committer: Matt Giuca
  • Date: 2009-02-25 09:47:54 UTC
  • mto: This revision was merged to the branch mainline in revision 1119.
  • Revision ID: matt.giuca@gmail.com-20090225094754-levaflw2b6up3n38
ivle-headings.html: The IVLE logo is now clickable (takes you to /).
ivle.css: All images with links now have no border. Who wants this?

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'])
55
 
parser.add_option("--python-site-packages",
56
 
    action="store", dest="python_site_packages",
57
 
    help="Path to Python site packages directory inside the jail.",
58
 
    default=None)
 
46
    help="Sets the apt mirror used when recreating the jail.")
59
47
(options, args) = parser.parse_args(sys.argv)
60
48
 
61
49
if os.geteuid() != 0:
66
54
    print >> sys.stderr, "No jail exists -- please rerun with -r."
67
55
    sys.exit(1)
68
56
 
69
 
if (options.python_site_packages is not None and
70
 
    options.python_site_packages[:1] not in (os.path.sep, os.path.altsep)):
71
 
    print >> sys.stderr, "python-site-packages must be an absolute path."
72
 
    sys.exit(1)
73
 
 
74
57
if options.recreate:
75
 
    options.upgrade = True
76
 
 
77
58
    # Create the jail and its subdirectories
78
59
    # Note: Other subdirs will be made by copying files
79
60
    if options.apt_mirror is not None:
83
64
    ivle.jailbuilder.debian.debootstrap_create_jail(conf['jail']['suite'],
84
65
              build_path, mirror=options.apt_mirror)
85
66
 
86
 
    ivle.jailbuilder.debian.apt_update_cache(build_path)
87
 
    ivle.jailbuilder.debian.apt_install(build_path,
88
 
                        ['python2.5', 'python-cjson', 'python-svn'])
89
 
 
90
 
    ivle.jailbuilder.debian.apt_clean(build_path)
91
 
 
92
 
if options.upgrade:
93
 
    # Run apt-get update, apt-get upgrade and apt-get clean.
94
 
    ivle.jailbuilder.debian.mangle_sources_list(build_path, clobber=True)
95
 
    ivle.jailbuilder.debian.mangle_sources_list(build_path, lines=[
96
 
            'deb %s %s%s %s' % (options.apt_mirror, conf['jail']['suite'],
97
 
                                pocket, ' '.join(['main', 'universe']))
98
 
            for pocket in ('', '-updates', '-security')])
99
 
 
100
67
    # Add any extra site apt sources.
101
68
    if conf['jail']['extra_sources']:
102
69
        ivle.jailbuilder.debian.mangle_sources_list(build_path,
108
75
                                            conf['jail']['extra_keys'])
109
76
 
110
77
    ivle.jailbuilder.debian.apt_update_cache(build_path)
111
 
    ivle.jailbuilder.debian.apt_upgrade(build_path)
 
78
    ivle.jailbuilder.debian.apt_install(build_path,
 
79
                        ['python2.5', 'python-cjson', 'python-svn'])
112
80
 
113
81
    # Install any extra site packages.
114
82
    if conf['jail']['extra_packages']:
117
85
 
118
86
    ivle.jailbuilder.debian.apt_clean(build_path)
119
87
 
 
88
if options.upgrade:
 
89
    # Run apt-get update, apt-get upgrade and apt-get clean.
 
90
    ivle.jailbuilder.debian.apt_update_cache(build_path)
 
91
    ivle.jailbuilder.debian.apt_upgrade(build_path)
 
92
    ivle.jailbuilder.debian.apt_clean(build_path)
 
93
 
120
94
if conf['jail']['devmode']:
121
95
    # Copy all console and operating system files into the jail
122
 
    services_path = os.path.join(conf['paths']['share'], 'services')
 
96
    services_path = os.path.join(ivle.conf.share_path, 'services')
123
97
    jail_services_path = os.path.join(build_path, services_path[1:])
124
98
    if os.path.exists(jail_services_path):
125
99
        shutil.rmtree(jail_services_path)
127
101
 
128
102
    # Also copy the IVLE lib directory into the jail
129
103
    # This is necessary for running certain services
130
 
 
131
 
    # ivle_site_packages is the IVLE install location outside the jail
132
 
    ivle_site_packages = os.path.dirname(ivle.__file__)
133
 
 
134
 
    if options.python_site_packages is None:
135
 
        # Get the site packages from the IVLE install location *OUTSIDE* the
136
 
        # jail. Warning! This only works if you have the same Python site
137
 
        # packages directory inside and out (ie. same Python version).
138
 
        # If not, you should use --python-site-packages.
139
 
        jail_site_packages = os.path.join(build_path, ivle_site_packages[1:])
140
 
    else:
141
 
        # User-specified site packages
142
 
        jail_site_packages = os.path.join(build_path,
143
 
                                options.python_site_packages[1:], "ivle")
 
104
    ivle_site_packages = os.path.join(ivle.conf.python_site_packages, 'ivle')
 
105
    jail_site_packages = os.path.join(build_path, ivle_site_packages[1:])
144
106
    if os.path.exists(jail_site_packages):
145
107
        shutil.rmtree(jail_site_packages)
146
108
    shutil.copytree(ivle_site_packages, jail_site_packages)
147
109
 
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']
 
110
    # IMPORTANT: ivle/conf/conf.py contains details which could compromise security
 
111
    # if left in the jail (such as the DB password). We delete it now! It would be
 
112
    # shadowed by the per-user conf.py anyway, but it's best to be safe.
 
113
    os.unlink(os.path.join(jail_site_packages, 'conf/conf.py'))
 
114
    # XXX: Shouldn't copy the compiled files at all, but compile them in the jail!
 
115
    os.unlink(os.path.join(jail_site_packages, 'conf/conf.pyc'))
 
116
 
185
117
if os.spawnvp(os.P_WAIT, 'rsync', ['rsync', '-a', '--delete',
186
 
              build_path + '/', template_path]) != 0:
 
118
              build_path + '/', ivle.conf.jail_system]) != 0:
187
119
    print >> sys.stderr, "Jail copying failed."
188
120
    sys.exit(1)
189
121
 
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"))