19
19
# Author: Matt Giuca, Refactored by David Coles
23
# Compiles all files and sets up a jail template in the source directory.
25
# Compiles (GCC) trampoline/trampoline.c to trampoline/trampoline.
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.
27
from setup import util
36
from setuputil import *
30
39
usage = """usage: %prog build [options]
45
53
parser.add_option("-n", "--dry",
46
54
action="store_true", dest="dry",
47
55
help="Print out the actions but don't do anything.")
48
parser.add_option("-j", "--rebuildjail",
49
action="store_true", dest="rebuildjail",
50
help="Don't recreate jail/ - just update its IVLE code.")
51
56
parser.add_option("-m", "--mirror",
52
57
action="store", dest="apt_mirror",
53
58
help="Sets the APT mirror used to build the jail.")
54
59
(options, args) = parser.parse_args(args)
56
61
# Call the real function
57
return __build(options.dry, options.rebuildjail, options.apt_mirror)
62
__build(options.dry, options.apt_mirror)
59
def __build(dry=False,rebuildjail=False,apt_mirror=None):
60
# We need to import the one in the working copy, not in the system path.
61
confmodule = __import__("ivle/conf/conf")
62
install_list = util.InstallList()
64
def __build(dry=False,apt_mirror="http://archive.ubuntu.com/ubuntu/"):
65
# Importing configuration is a little tricky
66
sys.path.append(os.pardir)
64
69
# Must be run as root or a dry run
70
75
print >>sys.stderr, "(I need to chroot)."
73
if not rebuildjail and not os.path.exists('jail'):
74
print >> sys.stderr, "No jail exists -- please rerun with -j."
78
# Find out the revison number
79
revnum = get_svn_revision()
80
print "Building Revision %s"%str(revnum)
82
vfile = open('BUILD-VERSION','w')
83
vfile.write(str(revnum) + '\n')
77
86
# Compile the trampoline
78
87
curdir = os.getcwd()
79
os.chdir('bin/trampoline')
80
util.action_runprog('make', [], dry)
85
os.chdir('bin/timount')
86
util.action_runprog('make', [], dry)
90
# Create the jail and its subdirectories
91
# Note: Other subdirs will be made by copying files
92
if apt_mirror != None:
93
os.environ['MIRROR'] = apt_mirror
94
util.action_runprog('setup/buildjail.sh', [], dry)
88
os.chdir('trampoline')
89
action_runprog('make', [], dry)
92
# Create the jail and its subdirectories
93
# Note: Other subdirs will be made by copying files
94
action_runprog('./buildjail.sh', [], dry)
96
96
# Copy all console and operating system files into the jail
97
jail_share = os.path.join('jail', confmodule.share_path[1:])
98
jail_services = os.path.join(jail_share, 'services')
99
util.action_copylist(install_list.list_services, jail_share, dry)
97
action_copylist(install_list.list_scripts, 'jail/opt/ivle', dry)
101
99
# Chmod the python console
102
util.action_chmod_x(os.path.join(jail_services, 'python-console'), dry)
103
util.action_chmod_x(os.path.join(jail_services, 'fileservice'), dry)
104
util.action_chmod_x(os.path.join(jail_services, 'serveservice'), dry)
100
action_chmod_x('jail/opt/ivle/scripts/python-console', dry)
101
action_chmod_x('jail/opt/ivle/scripts/fileservice', dry)
102
action_chmod_x('jail/opt/ivle/scripts/serveservice', dry)
106
104
# Also copy the IVLE lib directory into the jail
107
# This is necessary for running certain services
108
jail_site_packages = os.path.join('jail',
109
confmodule.python_site_packages[1:])
110
util.action_copylist(install_list.list_ivle_lib, jail_site_packages, dry)
111
# IMPORTANT: ivle/conf/conf.py contains details
105
# This is necessary for running certain scripts
106
action_copylist(install_list.list_lib, 'jail/opt/ivle', dry)
107
# IMPORTANT: The file jail/opt/ivle/lib/conf/conf.py contains details
112
108
# which could compromise security if left in the jail (such as the DB
114
110
# The "safe" version is in jailconf.py. Delete conf.py and replace it with
116
util.action_copyfile('ivle/conf/jailconf.py',
117
os.path.join(jail_site_packages, 'ivle/conf/conf.py'), dry)
112
action_copyfile('lib/conf/jailconf.py',
113
'jail/opt/ivle/lib/conf/conf.py', dry)
119
115
# Compile .py files into .pyc or .pyo files
120
116
compileall.compile_dir('www', quiet=True)
121
compileall.compile_dir('ivle', quiet=True)
122
compileall.compile_dir('services', quiet=True)
123
compileall.compile_dir(os.path.join(jail_site_packages, 'ivle'),quiet=True)
117
compileall.compile_dir('lib', quiet=True)
118
compileall.compile_dir('scripts', quiet=True)
119
compileall.compile_dir('jail/opt/ivle/lib', quiet=True)
121
# Set up ivle.pth inside the jail
122
# Need to set /opt/ivle/lib to be on the import path
124
"jail/usr/lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION
125
f = open(ivle_pth, 'w')
126
f.write('/opt/ivle/lib\n')