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

« back to all changes in this revision

Viewing changes to bin/ivle-buildjail

  • Committer: William Grant
  • Date: 2009-02-27 03:55:15 UTC
  • Revision ID: grantw@unimelb.edu.au-20090227035515-u5nwfrbed8qu9sbl
Offerings now give 'view' only to user enrolled in them. 'edit' is granted
to their tutors and lecturers.

Worksheet(Exercise)s and their views now delegate to and use Offering's
permissions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
# IVLE - Informatics Virtual Learning Environment
 
3
# Copyright (C) 2009 The University of Melbourne
 
4
#
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
#
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
#
 
15
# You should have received a copy of the GNU General Public License
 
16
# along with this program; if not, write to the Free Software
 
17
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
18
 
 
19
import optparse
 
20
import os
 
21
import sys
 
22
import shutil
 
23
 
 
24
import ivle.conf
 
25
import ivle.config
 
26
import ivle.jailbuilder.debian
 
27
 
 
28
usage = """usage: %prog [options]
 
29
(requires root)
 
30
Builds or updates the base IVLE jail."""
 
31
 
 
32
conf = ivle.config.Config()
 
33
build_path = ivle.conf.jail_system_build
 
34
 
 
35
# Parse arguments
 
36
parser = optparse.OptionParser(usage)
 
37
parser.add_option("-r", "--recreate",
 
38
    action="store_true", dest="recreate",
 
39
    help='''Completely recreate the jail - don't just update its IVLE code.
 
40
Be warned, this may download hundreds of megabytes!''')
 
41
parser.add_option("-u", "--upgrade",
 
42
    action="store_true", dest="upgrade",
 
43
    help='''Apply any package updates in the jail.''')
 
44
parser.add_option("-m", "--mirror",
 
45
    action="store", dest="apt_mirror",
 
46
    help="Sets the apt mirror.", default="http://archive.ubuntu.com/ubuntu")
 
47
(options, args) = parser.parse_args(sys.argv)
 
48
 
 
49
if os.geteuid() != 0:
 
50
    print >> sys.stderr, "Must be root to run buildjail."
 
51
    sys.exit(1)
 
52
 
 
53
if not options.recreate and not os.path.exists(build_path):
 
54
    print >> sys.stderr, "No jail exists -- please rerun with -r."
 
55
    sys.exit(1)
 
56
 
 
57
if options.recreate:
 
58
    options.upgrade = True
 
59
 
 
60
    # Create the jail and its subdirectories
 
61
    # Note: Other subdirs will be made by copying files
 
62
    if options.apt_mirror is not None:
 
63
        os.environ['MIRROR'] = options.apt_mirror
 
64
 
 
65
    os.system('rm -rf --one-file-system ' + build_path)
 
66
    ivle.jailbuilder.debian.debootstrap_create_jail(conf['jail']['suite'],
 
67
              build_path, mirror=options.apt_mirror)
 
68
 
 
69
    ivle.jailbuilder.debian.apt_update_cache(build_path)
 
70
    ivle.jailbuilder.debian.apt_install(build_path,
 
71
                        ['python2.5', 'python-cjson', 'python-svn'])
 
72
 
 
73
    ivle.jailbuilder.debian.apt_clean(build_path)
 
74
 
 
75
if options.upgrade:
 
76
    # Run apt-get update, apt-get upgrade and apt-get clean.
 
77
    ivle.jailbuilder.debian.mangle_sources_list(build_path, clobber=True)
 
78
    ivle.jailbuilder.debian.mangle_sources_list(build_path, lines=[
 
79
            'deb %s %s%s %s' % (options.apt_mirror, conf['jail']['suite'],
 
80
                                pocket, ' '.join(['main', 'universe']))
 
81
            for pocket in ('', '-updates', '-security')])
 
82
 
 
83
    # Add any extra site apt sources.
 
84
    if conf['jail']['extra_sources']:
 
85
        ivle.jailbuilder.debian.mangle_sources_list(build_path,
 
86
                  conf['jail']['extra_sources'])
 
87
 
 
88
    # Add any extra site apt keys.
 
89
    if conf['jail']['extra_keys']:
 
90
        ivle.jailbuilder.debian.apt_add_key(build_path,
 
91
                                            conf['jail']['extra_keys'])
 
92
 
 
93
    ivle.jailbuilder.debian.apt_update_cache(build_path)
 
94
    ivle.jailbuilder.debian.apt_upgrade(build_path)
 
95
 
 
96
    # Install any extra site packages.
 
97
    if conf['jail']['extra_packages']:
 
98
        ivle.jailbuilder.debian.apt_install(build_path,
 
99
                  conf['jail']['extra_packages'])
 
100
 
 
101
    ivle.jailbuilder.debian.apt_clean(build_path)
 
102
 
 
103
if conf['jail']['devmode']:
 
104
    # Copy all console and operating system files into the jail
 
105
    services_path = os.path.join(ivle.conf.share_path, 'services')
 
106
    jail_services_path = os.path.join(build_path, services_path[1:])
 
107
    if os.path.exists(jail_services_path):
 
108
        shutil.rmtree(jail_services_path)
 
109
    shutil.copytree(services_path, jail_services_path)
 
110
 
 
111
    # Also copy the IVLE lib directory into the jail
 
112
    # This is necessary for running certain services
 
113
    ivle_site_packages = os.path.join(ivle.conf.python_site_packages, 'ivle')
 
114
    jail_site_packages = os.path.join(build_path, ivle_site_packages[1:])
 
115
    if os.path.exists(jail_site_packages):
 
116
        shutil.rmtree(jail_site_packages)
 
117
    shutil.copytree(ivle_site_packages, jail_site_packages)
 
118
 
 
119
    # IMPORTANT: ivle/conf/conf.py contains details which could compromise security
 
120
    # if left in the jail (such as the DB password). We delete it now! It would be
 
121
    # shadowed by the per-user conf.py anyway, but it's best to be safe.
 
122
    os.unlink(os.path.join(jail_site_packages, 'conf/conf.py'))
 
123
    # XXX: Shouldn't copy the compiled files at all, but compile them in the jail!
 
124
    os.unlink(os.path.join(jail_site_packages, 'conf/conf.pyc'))
 
125
 
 
126
if os.spawnvp(os.P_WAIT, 'rsync', ['rsync', '-a', '--delete',
 
127
              build_path + '/', ivle.conf.jail_system]) != 0:
 
128
    print >> sys.stderr, "Jail copying failed."
 
129
    sys.exit(1)
 
130