97
by mattgiuca
Moved template.py and setup.py to better places. |
1 |
#!/usr/bin/env python
|
2 |
# IVLE - Informatics Virtual Learning Environment
|
|
3 |
# Copyright (C) 2007-2008 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 |
# Module: setup
|
|
20 |
# Author: Matt Giuca
|
|
21 |
# Date: 12/12/2007
|
|
22 |
||
23 |
# This is a command-line application, for use by the administrator.
|
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
24 |
# This program configures, builds and installs IVLE in three separate steps.
|
25 |
# It is called with at least one argument, which specifies which operation to
|
|
26 |
# take.
|
|
27 |
||
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
28 |
# setup.py listmake (for developer use only)
|
29 |
# Recurses through the source tree and builds a list of all files which should
|
|
30 |
# be copied upon installation. This should be run by the developer before
|
|
31 |
# cutting a distribution, and the listfile it generates should be included in
|
|
32 |
# the distribution, avoiding the administrator having to run it.
|
|
33 |
||
316
by drtomc
setup.py - name the configuration command "config" to bring it into line with |
34 |
# setup.py config [args]
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
35 |
# Configures IVLE with machine-specific details, most notably, various paths.
|
36 |
# Either prompts the administrator for these details or accepts them as
|
|
37 |
# command-line args.
|
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
38 |
# Creates lib/conf/conf.py and trampoline/conf.h.
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
39 |
|
40 |
# setup.py build
|
|
41 |
# Compiles all files and sets up a jail template in the source directory.
|
|
42 |
# Details:
|
|
43 |
# Compiles (GCC) trampoline/trampoline.c to trampoline/trampoline.
|
|
44 |
# Creates jail/.
|
|
45 |
# Creates standard subdirs inside the jail, eg bin, opt, home, tmp.
|
|
46 |
# Copies console/ to a location within the jail.
|
|
47 |
# Copies OS programs and files to corresponding locations within the jail
|
|
48 |
# (eg. python and Python libs, ld.so, etc).
|
|
49 |
# Generates .pyc files for all the IVLE .py files.
|
|
50 |
||
51 |
# setup.py install [--nojail] [--dry|n]
|
|
52 |
# (Requires root)
|
|
53 |
# Create target install directory ($target).
|
|
54 |
# Create $target/bin.
|
|
55 |
# Copy trampoline/trampoline to $target/bin.
|
|
56 |
# chown and chmod the installed trampoline.
|
|
57 |
# Copy www/ to $target.
|
|
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
58 |
# Copy jail/ to jails __staging__ directory (unless --nojail specified).
|
97
by mattgiuca
Moved template.py and setup.py to better places. |
59 |
|
60 |
import os |
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
61 |
import stat |
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
62 |
import shutil |
97
by mattgiuca
Moved template.py and setup.py to better places. |
63 |
import sys |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
64 |
import getopt |
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
65 |
import string |
66 |
import errno |
|
117
by mattgiuca
setup.py: listmake uses mimetypes to select all files with certain mime types, |
67 |
import mimetypes |
116
by mattgiuca
setup.py: mkdir now properly obeys "dry". |
68 |
import compileall |
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
69 |
import getopt |
671
by dcoles
forum: Now uses a unique secret generated at './setup config' time for shared secret |
70 |
import hashlib |
71 |
import uuid |
|
746
by dcoles
Setup: During Build the system will now indicate what revision is being built |
72 |
import pysvn |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
73 |
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
74 |
# Import modules from the website is tricky since they're in the www
|
75 |
# directory.
|
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
76 |
sys.path.append(os.path.join(os.getcwd(), 'lib')) |
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
77 |
import conf |
78 |
import common.makeuser |
|
79 |
||
317
by mattgiuca
doc/dependencies: Added dependency on matplotlib. |
80 |
# Determine which Python version (2.4 or 2.5, for example) we are running,
|
81 |
# and use that as the filename to the Python directory.
|
|
82 |
# Just get the first 3 characters of sys.version.
|
|
83 |
PYTHON_VERSION = sys.version[0:3] |
|
84 |
||
251
by mattgiuca
setup.py: Worked the "files to copy into jail" out into a separate list |
85 |
# Operating system files to copy over into the jail.
|
86 |
# These will be copied from the given place on the OS file system into the
|
|
87 |
# same place within the jail.
|
|
88 |
JAIL_FILES = [ |
|
89 |
'/lib/ld-linux.so.2', |
|
90 |
'/lib/tls/i686/cmov/libc.so.6', |
|
91 |
'/lib/tls/i686/cmov/libdl.so.2', |
|
92 |
'/lib/tls/i686/cmov/libm.so.6', |
|
93 |
'/lib/tls/i686/cmov/libpthread.so.0', |
|
94 |
'/lib/tls/i686/cmov/libutil.so.1', |
|
253
by mattgiuca
setup.py: chmods python-console when building. |
95 |
'/etc/ld.so.conf', |
96 |
'/etc/ld.so.cache', |
|
97 |
# These 2 files do not exist in Ubuntu
|
|
98 |
#'/etc/ld.so.preload',
|
|
99 |
#'/etc/ld.so.nohwcap',
|
|
100 |
# UNIX commands
|
|
101 |
'/usr/bin/strace', |
|
102 |
'/bin/ls', |
|
103 |
'/bin/echo', |
|
104 |
# Needed by python
|
|
317
by mattgiuca
doc/dependencies: Added dependency on matplotlib. |
105 |
'/usr/bin/python%s' % PYTHON_VERSION, |
434
by drtomc
setup.py: add a bunch of shared objects to be added to the jail for svn. |
106 |
# Needed by fileservice
|
107 |
'/lib/libcom_err.so.2', |
|
108 |
'/lib/libcrypt.so.1', |
|
109 |
'/lib/libkeyutils.so.1', |
|
110 |
'/lib/libresolv.so.2', |
|
111 |
'/lib/librt.so.1', |
|
112 |
'/lib/libuuid.so.1', |
|
113 |
'/usr/lib/libapr-1.so.0', |
|
114 |
'/usr/lib/libaprutil-1.so.0', |
|
762
by mattgiuca
setup.py: Modified library files list so it works on the latest |
115 |
'/usr/lib/libapt-pkg-libc6.6-6.so.4.5', |
116 |
'/usr/lib/libdb-4.6.so', |
|
434
by drtomc
setup.py: add a bunch of shared objects to be added to the jail for svn. |
117 |
'/usr/lib/libexpat.so.1', |
118 |
'/usr/lib/libgcrypt.so.11', |
|
119 |
'/usr/lib/libgnutls.so.13', |
|
120 |
'/usr/lib/libgpg-error.so.0', |
|
121 |
'/usr/lib/libgssapi_krb5.so.2', |
|
122 |
'/usr/lib/libk5crypto.so.3', |
|
123 |
'/usr/lib/libkrb5.so.3', |
|
124 |
'/usr/lib/libkrb5support.so.0', |
|
125 |
'/usr/lib/liblber.so.2', |
|
762
by mattgiuca
setup.py: Modified library files list so it works on the latest |
126 |
'/usr/lib/liblber-2.4.so.2', |
434
by drtomc
setup.py: add a bunch of shared objects to be added to the jail for svn. |
127 |
'/usr/lib/libldap_r.so.2', |
762
by mattgiuca
setup.py: Modified library files list so it works on the latest |
128 |
'/usr/lib/libldap_r-2.4.so.2', |
129 |
'/usr/lib/libneon.so.27', |
|
434
by drtomc
setup.py: add a bunch of shared objects to be added to the jail for svn. |
130 |
'/usr/lib/libpq.so.5', |
131 |
'/usr/lib/libsasl2.so.2', |
|
132 |
'/usr/lib/libsqlite3.so.0', |
|
133 |
'/usr/lib/libsvn_client-1.so.1', |
|
134 |
'/usr/lib/libsvn_delta-1.so.1', |
|
135 |
'/usr/lib/libsvn_diff-1.so.1', |
|
136 |
'/usr/lib/libsvn_fs-1.so.1', |
|
137 |
'/usr/lib/libsvn_fs_base-1.so.1', |
|
138 |
'/usr/lib/libsvn_fs_fs-1.so.1', |
|
139 |
'/usr/lib/libsvn_ra-1.so.1', |
|
140 |
'/usr/lib/libsvn_ra_dav-1.so.1', |
|
141 |
'/usr/lib/libsvn_ra_local-1.so.1', |
|
142 |
'/usr/lib/libsvn_ra_svn-1.so.1', |
|
143 |
'/usr/lib/libsvn_repos-1.so.1', |
|
144 |
'/usr/lib/libsvn_subr-1.so.1', |
|
145 |
'/usr/lib/libsvn_wc-1.so.1', |
|
146 |
'/usr/lib/libtasn1.so.3', |
|
147 |
'/usr/lib/libxml2.so.2', |
|
253
by mattgiuca
setup.py: chmods python-console when building. |
148 |
# Needed by matplotlib
|
149 |
'/usr/lib/i686/cmov/libssl.so.0.9.8', |
|
150 |
'/usr/lib/i686/cmov/libcrypto.so.0.9.8', |
|
151 |
'/lib/tls/i686/cmov/libnsl.so.1', |
|
152 |
'/usr/lib/libz.so.1', |
|
153 |
'/usr/lib/atlas/liblapack.so.3', |
|
154 |
'/usr/lib/atlas/libblas.so.3', |
|
155 |
'/usr/lib/libg2c.so.0', |
|
156 |
'/usr/lib/libstdc++.so.6', |
|
157 |
'/usr/lib/libfreetype.so.6', |
|
158 |
'/usr/lib/libpng12.so.0', |
|
159 |
'/usr/lib/libBLT.2.4.so.8.4', |
|
160 |
'/usr/lib/libtk8.4.so.0', |
|
161 |
'/usr/lib/libtcl8.4.so.0', |
|
162 |
'/usr/lib/tcl8.4/init.tcl', |
|
163 |
'/usr/lib/libX11.so.6', |
|
164 |
'/usr/lib/libXau.so.6', |
|
165 |
'/usr/lib/libXdmcp.so.6', |
|
166 |
'/lib/libgcc_s.so.1', |
|
167 |
'/etc/matplotlibrc', |
|
547
by dcoles
settup.py: Added nss libaries and /etc files needed for resolving hostnames. |
168 |
# Needed for resolv
|
169 |
'/lib/libnss_dns.so.2', |
|
685
by dcoles
libs: The standard nsswitch.conf in 7.10 expects mdns4_minimal module. Without |
170 |
'/lib/libnss_mdns4_minimal.so.2', |
547
by dcoles
settup.py: Added nss libaries and /etc files needed for resolving hostnames. |
171 |
'/etc/hosts', |
172 |
'/etc/resolv.conf', |
|
173 |
#'/etc/hosts.conf',
|
|
174 |
#'/etc/hostname',
|
|
175 |
'/etc/nsswitch.conf', |
|
176 |
'/lib/libnss_files.so.2', |
|
740
by dcoles
Libs: Python Imaging Library |
177 |
# Needed for PIL
|
178 |
'/usr/lib/libjpeg.so.62', |
|
742
by dcoles
Libs: lxml requires extra shared objects |
179 |
# Needed by lxml
|
180 |
'/usr/lib/libxslt.so.1', |
|
181 |
'/usr/lib/libexslt.so.0', |
|
744
by dcoles
Libs: Added ElementTree 1.3alpha install docs |
182 |
# Needed by elementtree
|
183 |
'/usr/lib/libtidy-0.99.so.0', |
|
251
by mattgiuca
setup.py: Worked the "files to copy into jail" out into a separate list |
184 |
]
|
185 |
# Symlinks to make within the jail. Src mapped to dst.
|
|
186 |
JAIL_LINKS = { |
|
317
by mattgiuca
doc/dependencies: Added dependency on matplotlib. |
187 |
'python%s' % PYTHON_VERSION: 'jail/usr/bin/python', |
251
by mattgiuca
setup.py: Worked the "files to copy into jail" out into a separate list |
188 |
}
|
189 |
# Trees to copy. Src mapped to dst (these will be passed to action_copytree).
|
|
190 |
JAIL_COPYTREES = { |
|
317
by mattgiuca
doc/dependencies: Added dependency on matplotlib. |
191 |
'/usr/lib/python%s' % PYTHON_VERSION: |
192 |
'jail/usr/lib/python%s' % PYTHON_VERSION, |
|
743
by dcoles
Libs: Python dateutils are stored in |
193 |
'/var/lib/python-support/python%s' % PYTHON_VERSION: |
194 |
'jail/var/lib/python-support/python%s' %PYTHON_VERSION, |
|
253
by mattgiuca
setup.py: chmods python-console when building. |
195 |
'/usr/share/matplotlib': 'jail/usr/share/matplotlib', |
196 |
'/etc/ld.so.conf.d': 'jail/etc/ld.so.conf.d', |
|
740
by dcoles
Libs: Python Imaging Library |
197 |
'/usr/share/pycentral': 'jail/usr/share/pycentral', |
198 |
'/usr/share/pycentral-data': 'jail/usr/share/pycentral-data', |
|
682
by dcoles
Natural Language Tool Kit (nltk) for student code |
199 |
'/usr/share/nltk': 'jail/usr/share/nltk', |
251
by mattgiuca
setup.py: Worked the "files to copy into jail" out into a separate list |
200 |
}
|
201 |
||
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
202 |
class ConfigOption: |
203 |
"""A configuration option; one of the things written to conf.py."""
|
|
204 |
def __init__(self, option_name, default, prompt, comment): |
|
205 |
"""Creates a configuration option.
|
|
206 |
option_name: Name of the variable in conf.py. Also name of the
|
|
207 |
command-line argument to setup.py conf.
|
|
208 |
default: Default value for this variable.
|
|
209 |
prompt: (Short) string presented during the interactive prompt in
|
|
210 |
setup.py conf.
|
|
211 |
comment: (Long) comment string stored in conf.py. Each line of this
|
|
212 |
string should begin with a '#'.
|
|
213 |
"""
|
|
214 |
self.option_name = option_name |
|
215 |
self.default = default |
|
216 |
self.prompt = prompt |
|
217 |
self.comment = comment |
|
218 |
||
219 |
# Configuration options, defaults and descriptions
|
|
220 |
config_options = [] |
|
485
by mattgiuca
setup.py: Changed the defaut root_dir from "/ivle" to "/". |
221 |
config_options.append(ConfigOption("root_dir", "/", |
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
222 |
"""Root directory where IVLE is located (in URL space):""", |
223 |
"""
|
|
224 |
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
|
|
225 |
# with this).
|
|
226 |
# eg. "/" or "/ivle".""")) |
|
227 |
config_options.append(ConfigOption("ivle_install_dir", "/opt/ivle", |
|
228 |
'Root directory where IVLE will be installed (on the local file '
|
|
229 |
'system):', |
|
230 |
"""
|
|
231 |
# In the local file system, where IVLE is actually installed.
|
|
232 |
# This directory should contain the "www" and "bin" directories.""")) |
|
233 |
config_options.append(ConfigOption("jail_base", "/home/informatics/jails", |
|
530
by mattgiuca
setup.py: |
234 |
"""Location of Directories
|
235 |
=======================
|
|
236 |
Root directory where the jails (containing user files) are stored
|
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
237 |
(on the local file system):""", |
238 |
"""
|
|
239 |
# In the local file system, where are the student/user file spaces located.
|
|
240 |
# The user jails are expected to be located immediately in subdirectories of
|
|
241 |
# this location.""")) |
|
242 |
config_options.append(ConfigOption("subjects_base", |
|
243 |
"/home/informatics/subjects", |
|
244 |
"""Root directory where the subject directories (containing worksheets
|
|
245 |
and other per-subject files) are stored (on the local file system):""", |
|
246 |
"""
|
|
247 |
# In the local file system, where are the per-subject file spaces located.
|
|
248 |
# The individual subject directories are expected to be located immediately
|
|
249 |
# in subdirectories of this location.""")) |
|
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
250 |
config_options.append(ConfigOption("exercises_base", |
251 |
"/home/informatics/exercises", |
|
252 |
"""Root directory where the exercise directories (containing
|
|
253 |
subject-independent exercise sheets) are stored (on the local file
|
|
395
by mattgiuca
Tutorial: split subjects directory into subjects and problems. |
254 |
system):""", |
255 |
"""
|
|
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
256 |
# In the local file system, where are the subject-independent exercise sheet
|
395
by mattgiuca
Tutorial: split subjects directory into subjects and problems. |
257 |
# file spaces located.""")) |
673
by mattgiuca
Rebuilt the way Terms of Service are displayed: |
258 |
config_options.append(ConfigOption("tos_path", |
259 |
"/home/informatics/tos.html", |
|
260 |
"""Location where the Terms of Service document is stored (on the local
|
|
261 |
file system):""", |
|
262 |
"""
|
|
263 |
# In the local file system, where is the Terms of Service document located.""")) |
|
712
by mattgiuca
setup: Added config option "motd_path" to hold the path for message-of-the-day |
264 |
config_options.append(ConfigOption("motd_path", |
265 |
"/home/informatics/motd.html", |
|
266 |
"""Location where the Message of the Day document is stored (on the local
|
|
267 |
file system):""", |
|
268 |
"""
|
|
269 |
# In the local file system, where is the Message of the Day document
|
|
270 |
# located. This is an HTML file (just the body fragment), which will
|
|
271 |
# be displayed on the login page. It is optional.""")) |
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
272 |
config_options.append(ConfigOption("public_host", "public.localhost", |
273 |
"""Hostname which will cause the server to go into "public mode",
|
|
274 |
providing login-free access to student's published work:""", |
|
275 |
"""
|
|
276 |
# The server goes into "public mode" if the browser sends a request with this
|
|
277 |
# host. This is for security reasons - we only serve public student files on a
|
|
278 |
# separate domain to the main IVLE site.
|
|
279 |
# Public mode does not use cookies, and serves only public content.
|
|
280 |
# Private mode (normal mode) requires login, and only serves files relevant to
|
|
281 |
# the logged-in user.""")) |
|
282 |
config_options.append(ConfigOption("allowed_uids", "33", |
|
283 |
"""UID of the web server process which will run IVLE.
|
|
284 |
Only this user may execute the trampoline. May specify multiple users as
|
|
285 |
a comma-separated list.
|
|
286 |
(eg. "1002,78")""", |
|
287 |
"""
|
|
288 |
# The User-ID of the web server process which will run IVLE, and any other
|
|
289 |
# users who are allowed to run the trampoline. This is stores as a string of
|
|
290 |
# comma-separated integers, simply because it is not used within Python, only
|
|
291 |
# used by the setup program to write to conf.h (see setup.py config).""")) |
|
359
by mattgiuca
setup.py: Added config options for database settings. |
292 |
config_options.append(ConfigOption("db_host", "localhost", |
293 |
"""PostgreSQL Database config
|
|
294 |
==========================
|
|
295 |
Hostname of the DB server:""", |
|
296 |
"""
|
|
297 |
### PostgreSQL Database config ###
|
|
298 |
# Database server hostname""")) |
|
299 |
config_options.append(ConfigOption("db_port", "5432", |
|
300 |
"""Port of the DB server:""", |
|
301 |
"""
|
|
302 |
# Database server port""")) |
|
363
by mattgiuca
setup.py: Added new config option - "database name" |
303 |
config_options.append(ConfigOption("db_dbname", "ivle", |
304 |
"""Database name:""", |
|
305 |
"""
|
|
306 |
# Database name""")) |
|
624
by dcoles
forum: Removed the subsilver2 style and phpBB installer |
307 |
config_options.append(ConfigOption("db_forumdbname", "ivle_forum", |
308 |
"""Forum Database name:""", |
|
309 |
"""
|
|
310 |
# Forum Database name""")) |
|
359
by mattgiuca
setup.py: Added config options for database settings. |
311 |
config_options.append(ConfigOption("db_user", "postgres", |
312 |
"""Username for DB server login:""", |
|
313 |
"""
|
|
314 |
# Database username""")) |
|
315 |
config_options.append(ConfigOption("db_password", "", |
|
316 |
"""Password for DB server login:
|
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
317 |
(Caution: This password is stored in plaintext in lib/conf/conf.py)""", |
359
by mattgiuca
setup.py: Added config options for database settings. |
318 |
"""
|
319 |
# Database password""")) |
|
531
by mattgiuca
www/auth: Split authenticate.py into 3 modules: autherror and ldap_auth. |
320 |
config_options.append(ConfigOption("auth_modules", "ldap_auth", |
530
by mattgiuca
setup.py: |
321 |
"""Authentication config
|
322 |
=====================
|
|
323 |
Comma-separated list of authentication modules. Only "ldap" is available
|
|
324 |
by default.""", |
|
325 |
"""
|
|
326 |
# Comma-separated list of authentication modules.
|
|
327 |
# These refer to importable Python modules in the www/auth directory.
|
|
328 |
# Modules "ldap" and "guest" are available in the source tree, but
|
|
329 |
# other modules may be plugged in to auth against organisation-specific
|
|
330 |
# auth backends.""")) |
|
510
by mattgiuca
setup.py: Added 2 new config options for the LDAP authentication server. |
331 |
config_options.append(ConfigOption("ldap_url", "ldaps://www.example.com", |
530
by mattgiuca
setup.py: |
332 |
"""(LDAP options are only relevant if "ldap" is included in the list of
|
333 |
auth modules).
|
|
334 |
URL for LDAP authentication server:""", |
|
510
by mattgiuca
setup.py: Added 2 new config options for the LDAP authentication server. |
335 |
"""
|
336 |
# URL for LDAP authentication server""")) |
|
337 |
config_options.append(ConfigOption("ldap_format_string", |
|
338 |
"uid=%s,ou=users,o=example", |
|
339 |
"""Format string for LDAP auth request:
|
|
340 |
(Must contain a single "%s" for the user's login name)""", |
|
341 |
"""
|
|
342 |
# Format string for LDAP auth request
|
|
343 |
# (Must contain a single "%s" for the user's login name)""")) |
|
522
by drtomc
Add quite a lot of stuff to get usrmgt happening. |
344 |
config_options.append(ConfigOption("svn_addr", "http://svn.localhost/", |
530
by mattgiuca
setup.py: |
345 |
"""Subversion config
|
346 |
=================
|
|
347 |
The base url for accessing subversion repositories:""", |
|
522
by drtomc
Add quite a lot of stuff to get usrmgt happening. |
348 |
"""
|
349 |
# The base url for accessing subversion repositories.""")) |
|
460
by drtomc
setup.py: Add a bunch of config stuff we need. |
350 |
config_options.append(ConfigOption("svn_conf", "/opt/ivle/svn/svn.conf", |
351 |
"""The location of the subversion configuration file used by apache
|
|
352 |
to host the user repositories:""", |
|
353 |
"""
|
|
354 |
# The location of the subversion configuration file used by
|
|
355 |
# apache to host the user repositories.""")) |
|
467
by drtomc
makeuser: Add some of the helper functions for activating users. |
356 |
config_options.append(ConfigOption("svn_repo_path", "/home/informatics/repositories", |
357 |
"""The root directory for the subversion repositories:""", |
|
358 |
"""
|
|
359 |
# The root directory for the subversion repositories.""")) |
|
460
by drtomc
setup.py: Add a bunch of config stuff we need. |
360 |
config_options.append(ConfigOption("svn_auth_ivle", "/opt/ivle/svn/ivle.auth", |
361 |
"""The location of the password file used to authenticate users
|
|
362 |
of the subversion repository from the ivle server:""", |
|
363 |
"""
|
|
364 |
# The location of the password file used to authenticate users
|
|
365 |
# of the subversion repository from the ivle server.""")) |
|
366 |
config_options.append(ConfigOption("svn_auth_local", "/opt/ivle/svn/local.auth", |
|
367 |
"""The location of the password file used to authenticate local users
|
|
368 |
of the subversion repository:""", |
|
369 |
"""
|
|
370 |
# The location of the password file used to authenticate local users
|
|
371 |
# of the subversion repository.""")) |
|
372 |
config_options.append(ConfigOption("usrmgt_host", "localhost", |
|
530
by mattgiuca
setup.py: |
373 |
"""User Management Server config
|
374 |
============================
|
|
375 |
The hostname where the usrmgt-server runs:""", |
|
460
by drtomc
setup.py: Add a bunch of config stuff we need. |
376 |
"""
|
377 |
# The hostname where the usrmgt-server runs.""")) |
|
378 |
config_options.append(ConfigOption("usrmgt_port", "2178", |
|
379 |
"""The port where the usrmgt-server runs:""", |
|
380 |
"""
|
|
381 |
# The port where the usrmgt-server runs.""")) |
|
382 |
config_options.append(ConfigOption("usrmgt_magic", "", |
|
383 |
"""The password for the usrmgt-server:""", |
|
384 |
"""
|
|
385 |
# The password for the usrmgt-server.""")) |
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
386 |
|
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
387 |
# Try importing existing conf, but if we can't just set up defaults
|
388 |
# The reason for this is that these settings are used by other phases
|
|
389 |
# of setup besides conf, so we need to know them.
|
|
390 |
# Also this allows you to hit Return to accept the existing value.
|
|
391 |
try: |
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
392 |
confmodule = __import__("lib/conf/conf") |
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
393 |
for opt in config_options: |
394 |
try: |
|
395 |
globals()[opt.option_name] = confmodule.__dict__[opt.option_name] |
|
396 |
except: |
|
397 |
globals()[opt.option_name] = opt.default |
|
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
398 |
except ImportError: |
399 |
# Just set reasonable defaults
|
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
400 |
for opt in config_options: |
401 |
globals()[opt.option_name] = opt.default |
|
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
402 |
|
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
403 |
# Try importing install_list, but don't fail if we can't, because listmake can
|
404 |
# function without it.
|
|
405 |
try: |
|
406 |
import install_list |
|
407 |
except: |
|
408 |
pass
|
|
409 |
||
117
by mattgiuca
setup.py: listmake uses mimetypes to select all files with certain mime types, |
410 |
# Mime types which will automatically be placed in the list by listmake.
|
411 |
# Note that listmake is not intended to be run by the final user (the system
|
|
412 |
# administrator who installs this), so the developers can customize the list
|
|
413 |
# as necessary, and include it in the distribution.
|
|
414 |
listmake_mimetypes = ['text/x-python', 'text/html', |
|
415 |
'application/x-javascript', 'application/javascript', |
|
568
by mattgiuca
setup.py: Added "image/gif" to types which listmake copies over. |
416 |
'text/css', 'image/png', 'image/gif', 'application/xml'] |
117
by mattgiuca
setup.py: listmake uses mimetypes to select all files with certain mime types, |
417 |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
418 |
# Main function skeleton from Guido van Rossum
|
419 |
# http://www.artima.com/weblogs/viewpost.jsp?thread=4829
|
|
420 |
||
421 |
def main(argv=None): |
|
422 |
if argv is None: |
|
423 |
argv = sys.argv |
|
424 |
||
425 |
# Print the opening spiel including the GPL notice
|
|
426 |
||
427 |
print """IVLE - Informatics Virtual Learning Environment Setup |
|
97
by mattgiuca
Moved template.py and setup.py to better places. |
428 |
Copyright (C) 2007-2008 The University of Melbourne
|
429 |
IVLE comes with ABSOLUTELY NO WARRANTY.
|
|
430 |
This is free software, and you are welcome to redistribute it
|
|
431 |
under certain conditions. See LICENSE.txt for details.
|
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
432 |
|
433 |
IVLE Setup
|
|
434 |
"""
|
|
435 |
||
436 |
# First argument is the name of the setup operation
|
|
437 |
try: |
|
438 |
operation = argv[1] |
|
439 |
except IndexError: |
|
440 |
# Print usage message and exit
|
|
441 |
help([]) |
|
442 |
return 1 |
|
443 |
||
131
by mattgiuca
setup.py: |
444 |
# Disallow run as root unless installing
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
445 |
if (operation != 'install' and operation != 'updatejails' |
446 |
and os.geteuid() == 0): |
|
131
by mattgiuca
setup.py: |
447 |
print >>sys.stderr, "I do not want to run this stage as root." |
448 |
print >>sys.stderr, "Please run as a normal user." |
|
449 |
return 1 |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
450 |
# Call the requested operation's function
|
451 |
try: |
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
452 |
oper_func = { |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
453 |
'help' : help, |
316
by drtomc
setup.py - name the configuration command "config" to bring it into line with |
454 |
'config' : conf, |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
455 |
'build' : build, |
456 |
'listmake' : listmake, |
|
457 |
'install' : install, |
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
458 |
'updatejails' : updatejails, |
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
459 |
}[operation] |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
460 |
except KeyError: |
461 |
print >>sys.stderr, ( |
|
462 |
"""Invalid operation '%s'. Try python setup.py help."""
|
|
463 |
% operation) |
|
129
by mattgiuca
setup.py: Minor fix, exits cleanly if arguments are invalid. |
464 |
return 1 |
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
465 |
return oper_func(argv[2:]) |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
466 |
|
467 |
# Operation functions
|
|
468 |
||
469 |
def help(args): |
|
470 |
if args == []: |
|
471 |
print """Usage: python setup.py operation [args] |
|
472 |
Operation (and args) can be:
|
|
473 |
help [operation]
|
|
131
by mattgiuca
setup.py: |
474 |
listmake (developer use only)
|
316
by drtomc
setup.py - name the configuration command "config" to bring it into line with |
475 |
config [args]
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
476 |
build
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
477 |
install [--nojail] [--nosubjects] [-n|--dry]
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
478 |
"""
|
479 |
return 1 |
|
480 |
elif len(args) != 1: |
|
481 |
print """Usage: python setup.py help [operation]""" |
|
482 |
return 2 |
|
483 |
else: |
|
484 |
operation = args[0] |
|
485 |
||
486 |
if operation == 'help': |
|
487 |
print """python setup.py help [operation] |
|
488 |
Prints the usage message or detailed help on an operation, then exits."""
|
|
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
489 |
elif operation == 'listmake': |
490 |
print """python setup.py listmake |
|
491 |
(For developer use only)
|
|
492 |
Recurses through the source tree and builds a list of all files which should
|
|
493 |
be copied upon installation. This should be run by the developer before
|
|
494 |
cutting a distribution, and the listfile it generates should be included in
|
|
495 |
the distribution, avoiding the administrator having to run it."""
|
|
316
by drtomc
setup.py - name the configuration command "config" to bring it into line with |
496 |
elif operation == 'config': |
497 |
print """python setup.py config [args] |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
498 |
Configures IVLE with machine-specific details, most notably, various paths.
|
499 |
Either prompts the administrator for these details or accepts them as
|
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
500 |
command-line args. Will be interactive only if there are no arguments given.
|
501 |
Takes defaults from existing conf file if it exists.
|
|
133
by mattgiuca
setup.py: Now allows IVLE to be installed over itself, in order to allow |
502 |
|
503 |
To run IVLE out of the source directory (allowing development without having
|
|
504 |
to rebuild/install), just provide ivle_install_dir as the IVLE trunk
|
|
505 |
directory, and run build/install one time.
|
|
506 |
||
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
507 |
Creates lib/conf/conf.py and trampoline/conf.h.
|
133
by mattgiuca
setup.py: Now allows IVLE to be installed over itself, in order to allow |
508 |
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
509 |
Args are:"""
|
510 |
for opt in config_options: |
|
511 |
print " --" + opt.option_name |
|
512 |
print """As explained in the interactive prompt or conf.py. |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
513 |
"""
|
514 |
elif operation == 'build': |
|
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
515 |
print """python -O setup.py build [--dry|-n] |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
516 |
Compiles all files and sets up a jail template in the source directory.
|
116
by mattgiuca
setup.py: mkdir now properly obeys "dry". |
517 |
-O is recommended to cause compilation to be optimised.
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
518 |
Details:
|
519 |
Compiles (GCC) trampoline/trampoline.c to trampoline/trampoline.
|
|
520 |
Creates jail/.
|
|
521 |
Creates standard subdirs inside the jail, eg bin, opt, home, tmp.
|
|
522 |
Copies console/ to a location within the jail.
|
|
523 |
Copies OS programs and files to corresponding locations within the jail
|
|
524 |
(eg. python and Python libs, ld.so, etc).
|
|
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
525 |
Generates .pyc or .pyo files for all the IVLE .py files.
|
526 |
||
527 |
--dry | -n Print out the actions but don't do anything."""
|
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
528 |
elif operation == 'install': |
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
529 |
print """sudo python setup.py install [--nojail] [--nosubjects][--dry|-n] |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
530 |
(Requires root)
|
531 |
Create target install directory ($target).
|
|
532 |
Create $target/bin.
|
|
533 |
Copy trampoline/trampoline to $target/bin.
|
|
534 |
chown and chmod the installed trampoline.
|
|
535 |
Copy www/ to $target.
|
|
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
536 |
Copy jail/ to jails __staging__ directory (unless --nojail specified).
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
537 |
Copy subjects/ to subjects directory (unless --nosubjects specified).
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
538 |
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
539 |
--nojail Do not copy the jail.
|
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
540 |
--nosubjects Do not copy the subjects and exercises directories.
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
541 |
--dry | -n Print out the actions but don't do anything."""
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
542 |
elif operation == 'updatejails': |
543 |
print """sudo python setup.py updatejails [--dry|-n] |
|
544 |
(Requires root)
|
|
545 |
Copy jail/ to each subdirectory in jails directory.
|
|
546 |
||
547 |
--dry | -n Print out the actions but don't do anything."""
|
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
548 |
else: |
549 |
print >>sys.stderr, ( |
|
550 |
"""Invalid operation '%s'. Try python setup.py help."""
|
|
551 |
% operation) |
|
552 |
return 1 |
|
553 |
||
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
554 |
def listmake(args): |
555 |
# We build two separate lists, by walking www and console
|
|
556 |
list_www = build_list_py_files('www') |
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
557 |
list_lib = build_list_py_files('lib') |
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
558 |
list_subjects = build_list_py_files('subjects', no_top_level=True) |
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
559 |
list_exercises = build_list_py_files('exercises', no_top_level=True) |
477
by mattgiuca
setup.py: Fixed creation of "scripts" directory in listmake. |
560 |
list_scripts = [ |
561 |
"scripts/python-console", |
|
562 |
"scripts/fileservice", |
|
657
by drtomc
serve: use the trampoline to serve all files. |
563 |
"scripts/serveservice", |
477
by mattgiuca
setup.py: Fixed creation of "scripts" directory in listmake. |
564 |
"scripts/usrmgt-server", |
562
by dcoles
Added new app: Diff (SVN diff application) |
565 |
"scripts/diffservice", |
477
by mattgiuca
setup.py: Fixed creation of "scripts" directory in listmake. |
566 |
]
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
567 |
# Make sure that the files generated by conf are in the list
|
568 |
# (since listmake is typically run before conf)
|
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
569 |
if "lib/conf/conf.py" not in list_lib: |
427
by mattgiuca
setup.py: Fix (put conf.py in wrong list in listmake) |
570 |
list_lib.append("lib/conf/conf.py") |
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
571 |
# Write these out to a file
|
572 |
cwd = os.getcwd() |
|
573 |
# the files that will be created/overwritten
|
|
574 |
listfile = os.path.join(cwd, "install_list.py") |
|
575 |
||
576 |
try: |
|
577 |
file = open(listfile, "w") |
|
578 |
||
579 |
file.write("""# IVLE Configuration File |
|
580 |
# install_list.py
|
|
117
by mattgiuca
setup.py: listmake uses mimetypes to select all files with certain mime types, |
581 |
# Provides lists of all files to be installed by `setup.py install' from
|
582 |
# certain directories.
|
|
116
by mattgiuca
setup.py: mkdir now properly obeys "dry". |
583 |
# Note that any files with the given filename plus 'c' or 'o' (that is,
|
584 |
# compiled .pyc or .pyo files) will be copied as well.
|
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
585 |
|
117
by mattgiuca
setup.py: listmake uses mimetypes to select all files with certain mime types, |
586 |
# List of all installable files in www directory.
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
587 |
list_www = """) |
588 |
writelist_pretty(file, list_www) |
|
589 |
file.write(""" |
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
590 |
# List of all installable files in lib directory.
|
591 |
list_lib = """) |
|
592 |
writelist_pretty(file, list_lib) |
|
593 |
file.write(""" |
|
418
by mattgiuca
Renamed trunk/console to trunk/scripts. We are now able to put more scripts in |
594 |
# List of all installable files in scripts directory.
|
595 |
list_scripts = """) |
|
596 |
writelist_pretty(file, list_scripts) |
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
597 |
file.write(""" |
598 |
# List of all installable files in subjects directory.
|
|
599 |
# This is to install sample subjects and material.
|
|
600 |
list_subjects = """) |
|
601 |
writelist_pretty(file, list_subjects) |
|
395
by mattgiuca
Tutorial: split subjects directory into subjects and problems. |
602 |
file.write(""" |
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
603 |
# List of all installable files in exercises directory.
|
395
by mattgiuca
Tutorial: split subjects directory into subjects and problems. |
604 |
# This is to install sample exercise material.
|
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
605 |
list_exercises = """) |
606 |
writelist_pretty(file, list_exercises) |
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
607 |
|
608 |
file.close() |
|
609 |
except IOError, (errno, strerror): |
|
610 |
print "IO error(%s): %s" % (errno, strerror) |
|
611 |
sys.exit(1) |
|
612 |
||
613 |
print "Successfully wrote install_list.py" |
|
614 |
||
615 |
print
|
|
616 |
print ("You may modify the set of installable files before cutting the " |
|
617 |
"distribution:") |
|
618 |
print listfile |
|
619 |
print
|
|
620 |
||
621 |
return 0 |
|
622 |
||
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
623 |
def build_list_py_files(dir, no_top_level=False): |
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
624 |
"""Builds a list of all py files found in a directory and its
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
625 |
subdirectories. Returns this as a list of strings.
|
626 |
no_top_level=True means the file paths will not include the top-level
|
|
627 |
directory.
|
|
628 |
"""
|
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
629 |
pylist = [] |
630 |
for (dirpath, dirnames, filenames) in os.walk(dir): |
|
631 |
# Exclude directories beginning with a '.' (such as '.svn')
|
|
632 |
filter_mutate(lambda x: x[0] != '.', dirnames) |
|
633 |
# All *.py files are added to the list
|
|
634 |
pylist += [os.path.join(dirpath, item) for item in filenames |
|
117
by mattgiuca
setup.py: listmake uses mimetypes to select all files with certain mime types, |
635 |
if mimetypes.guess_type(item)[0] in listmake_mimetypes] |
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
636 |
if no_top_level: |
637 |
for i in range(0, len(pylist)): |
|
638 |
_, pylist[i] = pylist[i].split(os.sep, 1) |
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
639 |
return pylist |
640 |
||
641 |
def writelist_pretty(file, list): |
|
642 |
"""Writes a list one element per line, to a file."""
|
|
643 |
if list == []: |
|
644 |
file.write("[]\n") |
|
645 |
else: |
|
646 |
file.write('[\n') |
|
647 |
for elem in list: |
|
648 |
file.write(' %s,\n' % repr(elem)) |
|
649 |
file.write(']\n') |
|
650 |
||
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
651 |
def conf(args): |
487
by mattgiuca
setup.py: Added code to convert usrmgt_port into an int before writing to conf |
652 |
global db_port, usrmgt_port |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
653 |
# Set up some variables
|
654 |
||
655 |
cwd = os.getcwd() |
|
656 |
# the files that will be created/overwritten
|
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
657 |
conffile = os.path.join(cwd, "lib/conf/conf.py") |
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
658 |
jailconffile = os.path.join(cwd, "lib/conf/jailconf.py") |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
659 |
conf_hfile = os.path.join(cwd, "trampoline/conf.h") |
624
by dcoles
forum: Removed the subsilver2 style and phpBB installer |
660 |
phpBBconffile = os.path.join(cwd, "www/php/phpBB3/config.php") |
688
by apeel
setup.py now creates the /etc/init.d script for usrmgr-server, and install_proc.txt has instructions on installing it. |
661 |
usrmgtserver_initdfile = os.path.join(cwd, "doc/setup/usrmgt-server.init") |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
662 |
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
663 |
# Get command-line arguments to avoid asking questions.
|
664 |
||
364
by mattgiuca
setup.py: Fixed config command-line args (forgot to make general). |
665 |
optnames = [] |
666 |
for opt in config_options: |
|
667 |
optnames.append(opt.option_name + "=") |
|
668 |
(opts, args) = getopt.gnu_getopt(args, "", optnames) |
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
669 |
|
670 |
if args != []: |
|
671 |
print >>sys.stderr, "Invalid arguments:", string.join(args, ' ') |
|
672 |
return 2 |
|
673 |
||
674 |
if opts == []: |
|
675 |
# Interactive mode. Prompt the user for all the values.
|
|
676 |
||
677 |
print """This tool will create the following files: |
|
100
by mattgiuca
setup.py: Added a new config variable, ivle_install_dir. |
678 |
%s |
679 |
%s |
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
680 |
%s |
671
by dcoles
forum: Now uses a unique secret generated at './setup config' time for shared secret |
681 |
%s |
688
by apeel
setup.py now creates the /etc/init.d script for usrmgr-server, and install_proc.txt has instructions on installing it. |
682 |
%s |
97
by mattgiuca
Moved template.py and setup.py to better places. |
683 |
prompting you for details about your configuration. The file will be
|
684 |
overwritten if it already exists. It will *not* install or deploy IVLE.
|
|
685 |
||
686 |
Please hit Ctrl+C now if you do not wish to do this.
|
|
688
by apeel
setup.py now creates the /etc/init.d script for usrmgr-server, and install_proc.txt has instructions on installing it. |
687 |
""" % (conffile, jailconffile, conf_hfile, phpBBconffile, usrmgtserver_initdfile) |
97
by mattgiuca
Moved template.py and setup.py to better places. |
688 |
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
689 |
# Get information from the administrator
|
690 |
# If EOF is encountered at any time during the questioning, just exit
|
|
691 |
# silently
|
|
97
by mattgiuca
Moved template.py and setup.py to better places. |
692 |
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
693 |
for opt in config_options: |
694 |
globals()[opt.option_name] = \ |
|
695 |
query_user(globals()[opt.option_name], opt.prompt) |
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
696 |
else: |
697 |
opts = dict(opts) |
|
698 |
# Non-interactive mode. Parse the options.
|
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
699 |
for opt in config_options: |
700 |
if '--' + opt.option_name in opts: |
|
701 |
globals()[opt.option_name] = opts['--' + opt.option_name] |
|
120
by mattgiuca
setup.py: Added command-line argument mode for conf. This completely works! |
702 |
|
110
by mattgiuca
setup.py: Added to trampoline/conf.h an "allowed_uids" array. Asks the user |
703 |
# Error handling on input values
|
704 |
try: |
|
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
705 |
allowed_uids_list = map(int, allowed_uids.split(',')) |
110
by mattgiuca
setup.py: Added to trampoline/conf.h an "allowed_uids" array. Asks the user |
706 |
except ValueError: |
112
by mattgiuca
setup.py: A few comment changes. |
707 |
print >>sys.stderr, ( |
708 |
"Invalid UID list (%s).\n" |
|
709 |
"Must be a comma-separated list of integers." % allowed_uids) |
|
110
by mattgiuca
setup.py: Added to trampoline/conf.h an "allowed_uids" array. Asks the user |
710 |
return 1 |
364
by mattgiuca
setup.py: Fixed config command-line args (forgot to make general). |
711 |
try: |
712 |
db_port = int(db_port) |
|
713 |
if db_port < 0 or db_port >= 65536: raise ValueError() |
|
714 |
except ValueError: |
|
715 |
print >>sys.stderr, ( |
|
716 |
"Invalid DB port (%s).\n" |
|
717 |
"Must be an integer between 0 and 65535." % repr(db_port)) |
|
718 |
return 1 |
|
487
by mattgiuca
setup.py: Added code to convert usrmgt_port into an int before writing to conf |
719 |
try: |
720 |
usrmgt_port = int(usrmgt_port) |
|
721 |
if usrmgt_port < 0 or usrmgt_port >= 65536: raise ValueError() |
|
722 |
except ValueError: |
|
723 |
print >>sys.stderr, ( |
|
724 |
"Invalid user management port (%s).\n" |
|
725 |
"Must be an integer between 0 and 65535." % repr(usrmgt_port)) |
|
726 |
return 1 |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
727 |
|
671
by dcoles
forum: Now uses a unique secret generated at './setup config' time for shared secret |
728 |
# Generate the forum secret
|
729 |
forum_secret = hashlib.md5(uuid.uuid4().bytes).hexdigest() |
|
730 |
||
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
731 |
# Write lib/conf/conf.py
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
732 |
|
733 |
try: |
|
734 |
conf = open(conffile, "w") |
|
735 |
||
736 |
conf.write("""# IVLE Configuration File |
|
97
by mattgiuca
Moved template.py and setup.py to better places. |
737 |
# conf.py
|
738 |
# Miscellaneous application settings
|
|
739 |
||
358
by mattgiuca
setup.py: Gutted out the config options code. It was getting so there were |
740 |
""") |
741 |
for opt in config_options: |
|
364
by mattgiuca
setup.py: Fixed config command-line args (forgot to make general). |
742 |
conf.write('%s\n%s = %s\n' % (opt.comment, opt.option_name, |
743 |
repr(globals()[opt.option_name]))) |
|
110
by mattgiuca
setup.py: Added to trampoline/conf.h an "allowed_uids" array. Asks the user |
744 |
|
671
by dcoles
forum: Now uses a unique secret generated at './setup config' time for shared secret |
745 |
# Add the forum secret to the config file (regenerated each config)
|
746 |
conf.write('forum_secret = "%s"\n' % (forum_secret)) |
|
747 |
||
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
748 |
conf.close() |
749 |
except IOError, (errno, strerror): |
|
750 |
print "IO error(%s): %s" % (errno, strerror) |
|
751 |
sys.exit(1) |
|
752 |
||
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
753 |
print "Successfully wrote lib/conf/conf.py" |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
754 |
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
755 |
# Write conf/jailconf.py
|
756 |
||
757 |
try: |
|
758 |
conf = open(jailconffile, "w") |
|
759 |
||
760 |
# In the "in-jail" version of conf, we don't need MOST of the details
|
|
761 |
# (it would be a security risk to have them here).
|
|
762 |
# So we just write root_dir, and jail_base is "/".
|
|
763 |
# (jail_base being "/" means "jail-relative" paths are relative to "/"
|
|
764 |
# when inside the jail.)
|
|
765 |
conf.write("""# IVLE Configuration File |
|
766 |
# conf.py
|
|
767 |
# Miscellaneous application settings
|
|
768 |
# (User jail version)
|
|
769 |
||
770 |
||
771 |
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
|
|
772 |
# with this).
|
|
773 |
# eg. "/" or "/ivle".
|
|
774 |
root_dir = %s |
|
775 |
||
776 |
# In the local file system, where are the student/user file spaces located.
|
|
777 |
# The user jails are expected to be located immediately in subdirectories of
|
|
778 |
# this location.
|
|
779 |
jail_base = '/'
|
|
435
by drtomc
setup.py: Fix a couple of jail config glitches. |
780 |
|
781 |
# The hostname for serving publicly accessible pages
|
|
782 |
public_host = %s |
|
783 |
""" % (repr(root_dir),repr(public_host))) |
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
784 |
|
785 |
conf.close() |
|
786 |
except IOError, (errno, strerror): |
|
787 |
print "IO error(%s): %s" % (errno, strerror) |
|
788 |
sys.exit(1) |
|
789 |
||
790 |
print "Successfully wrote lib/conf/jailconf.py" |
|
791 |
||
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
792 |
# Write trampoline/conf.h
|
793 |
||
794 |
try: |
|
795 |
conf = open(conf_hfile, "w") |
|
796 |
||
797 |
conf.write("""/* IVLE Configuration File |
|
100
by mattgiuca
setup.py: Added a new config variable, ivle_install_dir. |
798 |
* conf.h
|
799 |
* Administrator settings required by trampoline.
|
|
800 |
* Note: trampoline will have to be rebuilt in order for changes to this file
|
|
801 |
* to take effect.
|
|
802 |
*/
|
|
803 |
||
804 |
/* In the local file system, where are the jails located.
|
|
805 |
* The trampoline does not allow the creation of a jail anywhere besides
|
|
806 |
* jail_base or a subdirectory of jail_base.
|
|
807 |
*/
|
|
808 |
static const char* jail_base = "%s"; |
|
110
by mattgiuca
setup.py: Added to trampoline/conf.h an "allowed_uids" array. Asks the user |
809 |
|
810 |
/* Which user IDs are allowed to run the trampoline.
|
|
811 |
* This list should be limited to the web server user.
|
|
812 |
* (Note that root is an implicit member of this list).
|
|
813 |
*/
|
|
112
by mattgiuca
setup.py: A few comment changes. |
814 |
static const int allowed_uids[] = { %s }; |
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
815 |
""" % (repr(jail_base)[1:-1], repr(allowed_uids_list)[1:-1])) |
816 |
# Note: The above uses PYTHON reprs, not C reprs
|
|
817 |
# However they should be the same with the exception of the outer
|
|
818 |
# characters, which are stripped off and replaced
|
|
100
by mattgiuca
setup.py: Added a new config variable, ivle_install_dir. |
819 |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
820 |
conf.close() |
821 |
except IOError, (errno, strerror): |
|
822 |
print "IO error(%s): %s" % (errno, strerror) |
|
823 |
sys.exit(1) |
|
824 |
||
825 |
print "Successfully wrote trampoline/conf.h" |
|
826 |
||
624
by dcoles
forum: Removed the subsilver2 style and phpBB installer |
827 |
# Write www/php/phpBB3/config.php
|
828 |
||
829 |
try: |
|
830 |
conf = open(phpBBconffile, "w") |
|
831 |
||
832 |
# php-pg work around
|
|
833 |
if db_host == 'localhost': |
|
834 |
forumdb_host = '127.0.0.1' |
|
835 |
else: |
|
836 |
forumdb_host = db_host |
|
837 |
||
838 |
conf.write( """<?php |
|
839 |
// phpBB 3.0.x auto-generated configuration file
|
|
840 |
// Do not change anything in this file!
|
|
841 |
$dbms = 'postgres';
|
|
842 |
$dbhost = '""" + forumdb_host + """'; |
|
843 |
$dbport = '""" + str(db_port) + """'; |
|
844 |
$dbname = '""" + db_forumdbname + """'; |
|
845 |
$dbuser = '""" + db_user + """'; |
|
846 |
$dbpasswd = '""" + db_password + """'; |
|
847 |
||
848 |
$table_prefix = 'phpbb_';
|
|
849 |
$acm_type = 'file';
|
|
850 |
$load_extensions = '';
|
|
851 |
@define('PHPBB_INSTALLED', true);
|
|
852 |
// @define('DEBUG', true);
|
|
853 |
//@define('DEBUG_EXTRA', true);
|
|
671
by dcoles
forum: Now uses a unique secret generated at './setup config' time for shared secret |
854 |
|
855 |
$forum_secret = '""" + forum_secret +"""'; |
|
624
by dcoles
forum: Removed the subsilver2 style and phpBB installer |
856 |
?>""" ) |
857 |
||
858 |
conf.close() |
|
859 |
except IOError, (errno, strerror): |
|
860 |
print "IO error(%s): %s" % (errno, strerror) |
|
861 |
sys.exit(1) |
|
862 |
||
863 |
print "Successfully wrote www/php/phpBB3/config.php" |
|
864 |
||
688
by apeel
setup.py now creates the /etc/init.d script for usrmgr-server, and install_proc.txt has instructions on installing it. |
865 |
# Write lib/conf/usrmgt-server.init
|
866 |
||
867 |
try: |
|
868 |
conf = open(usrmgtserver_initdfile, "w") |
|
869 |
||
870 |
conf.write( '''#! /bin/sh |
|
871 |
||
872 |
# Works for Ubuntu. Check before using on other distributions
|
|
873 |
||
874 |
### BEGIN INIT INFO
|
|
875 |
# Provides: usrmgt-server
|
|
876 |
# Required-Start: $syslog $networking $urandom
|
|
877 |
# Required-Stop: $syslog
|
|
878 |
# Default-Start: 2 3 4 5
|
|
879 |
# Default-Stop: 1
|
|
880 |
# Short-Description: IVLE user management server
|
|
881 |
# Description: Daemon connecting to the IVLE user management database.
|
|
882 |
### END INIT INFO
|
|
883 |
||
884 |
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
|
885 |
DESC="IVLE user management server"
|
|
886 |
NAME=usrmgt-server
|
|
887 |
DAEMON=/opt/ivle/scripts/$NAME
|
|
888 |
DAEMON_ARGS="''' + str(usrmgt_port) + ''' ''' + usrmgt_magic + '''" |
|
889 |
PIDFILE=/var/run/$NAME.pid
|
|
890 |
SCRIPTNAME=/etc/init.d/usrmgt-server
|
|
891 |
||
892 |
# Exit if the daemon does not exist
|
|
893 |
test -f $DAEMON || exit 0
|
|
894 |
||
895 |
# Load the VERBOSE setting and other rcS variables
|
|
896 |
[ -f /etc/default/rcS ] && . /etc/default/rcS
|
|
897 |
||
898 |
# Define LSB log_* functions.
|
|
899 |
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
|
900 |
. /lib/lsb/init-functions
|
|
901 |
||
902 |
#
|
|
903 |
# Function that starts the daemon/service
|
|
904 |
#
|
|
905 |
do_start()
|
|
906 |
{
|
|
907 |
# Return
|
|
908 |
# 0 if daemon has been started
|
|
909 |
# 1 if daemon was already running
|
|
910 |
# 2 if daemon could not be started
|
|
911 |
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ |
|
912 |
|| return 1
|
|
913 |
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ |
|
914 |
$DAEMON_ARGS \ |
|
915 |
|| return 2
|
|
916 |
# Add code here, if necessary, that waits for the process to be ready
|
|
917 |
# to handle requests from services started subsequently which depend
|
|
918 |
# on this one. As a last resort, sleep for some time.
|
|
919 |
}
|
|
920 |
||
921 |
#
|
|
922 |
# Function that stops the daemon/service
|
|
923 |
#
|
|
924 |
do_stop()
|
|
925 |
{
|
|
926 |
# Return
|
|
927 |
# 0 if daemon has been stopped
|
|
928 |
# 1 if daemon was already stopped
|
|
929 |
# 2 if daemon could not be stopped
|
|
930 |
# other if a failure occurred
|
|
931 |
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
|
|
932 |
RETVAL="$?"
|
|
933 |
[ "$RETVAL" = 2 ] && return 2
|
|
934 |
# Wait for children to finish too if this is a daemon that forks
|
|
935 |
# and if the daemon is only ever run from this initscript.
|
|
936 |
# If the above conditions are not satisfied then add some other code
|
|
937 |
# that waits for the process to drop all resources that could be
|
|
938 |
# needed by services started subsequently. A last resort is to
|
|
939 |
# sleep for some time.
|
|
940 |
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
|
|
941 |
[ "$?" = 2 ] && return 2
|
|
942 |
# Many daemons don't delete their pidfiles when they exit.
|
|
943 |
rm -f $PIDFILE
|
|
944 |
return "$RETVAL"
|
|
945 |
}
|
|
946 |
||
947 |
#
|
|
948 |
# Function that sends a SIGHUP to the daemon/service
|
|
949 |
#
|
|
950 |
do_reload() {
|
|
951 |
#
|
|
952 |
# If the daemon can reload its configuration without
|
|
953 |
# restarting (for example, when it is sent a SIGHUP),
|
|
954 |
# then implement that here.
|
|
955 |
#
|
|
956 |
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
|
|
957 |
return 0
|
|
958 |
}
|
|
959 |
||
960 |
case "$1" in
|
|
961 |
start)
|
|
962 |
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
|
|
963 |
do_start
|
|
964 |
case "$?" in
|
|
965 |
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
966 |
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
967 |
esac
|
|
968 |
;;
|
|
969 |
stop)
|
|
970 |
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
|
971 |
do_stop
|
|
972 |
case "$?" in
|
|
973 |
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
974 |
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
975 |
esac
|
|
976 |
;;
|
|
977 |
#reload|force-reload)
|
|
978 |
#
|
|
979 |
# If do_reload() is not implemented then leave this commented out
|
|
980 |
# and leave 'force-reload' as an alias for 'restart'.
|
|
981 |
#
|
|
982 |
#log_daemon_msg "Reloading $DESC" "$NAME"
|
|
983 |
#do_reload
|
|
984 |
#log_end_msg $?
|
|
985 |
#;;
|
|
986 |
restart|force-reload)
|
|
987 |
#
|
|
988 |
# If the "reload" option is implemented then remove the
|
|
989 |
# 'force-reload' alias
|
|
990 |
#
|
|
991 |
log_daemon_msg "Restarting $DESC" "$NAME"
|
|
992 |
do_stop
|
|
993 |
case "$?" in
|
|
994 |
0|1)
|
|
995 |
do_start
|
|
996 |
case "$?" in
|
|
997 |
0) log_end_msg 0 ;;
|
|
998 |
1) log_end_msg 1 ;; # Old process is still running
|
|
999 |
*) log_end_msg 1 ;; # Failed to start
|
|
1000 |
esac
|
|
1001 |
;;
|
|
1002 |
*)
|
|
1003 |
# Failed to stop
|
|
1004 |
log_end_msg 1
|
|
1005 |
;;
|
|
1006 |
esac
|
|
1007 |
;;
|
|
1008 |
*)
|
|
1009 |
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
|
1010 |
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
|
|
1011 |
exit 3
|
|
1012 |
;;
|
|
1013 |
esac
|
|
1014 |
||
1015 |
:
|
|
1016 |
''') |
|
1017 |
||
1018 |
conf.close() |
|
1019 |
except IOError, (errno, strerror): |
|
1020 |
print "IO error(%s): %s" % (errno, strerror) |
|
1021 |
sys.exit(1) |
|
1022 |
||
1023 |
# fix permissions as the file contains the database password
|
|
1024 |
try: |
|
1025 |
os.chmod('doc/setup/usrmgt-server.init', 0600) |
|
1026 |
except OSError, (errno, strerror): |
|
1027 |
print "WARNING: Couldn't chmod doc/setup/usrmgt-server.init:" |
|
1028 |
print "OS error(%s): %s" % (errno, strerror) |
|
1029 |
||
1030 |
print "Successfully wrote lib/conf/usrmgt-server.init" |
|
1031 |
||
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1032 |
print
|
1033 |
print "You may modify the configuration at any time by editing" |
|
1034 |
print conffile |
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1035 |
print jailconffile |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1036 |
print conf_hfile |
624
by dcoles
forum: Removed the subsilver2 style and phpBB installer |
1037 |
print phpBBconffile |
688
by apeel
setup.py now creates the /etc/init.d script for usrmgr-server, and install_proc.txt has instructions on installing it. |
1038 |
print usrmgtserver_initdfile |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1039 |
print
|
1040 |
return 0 |
|
1041 |
||
1042 |
def build(args): |
|
121
by mattgiuca
setup: build and install now read command line options |
1043 |
# Get "dry" variable from command line
|
1044 |
(opts, args) = getopt.gnu_getopt(args, "n", ['dry']) |
|
1045 |
opts = dict(opts) |
|
1046 |
dry = '-n' in opts or '--dry' in opts |
|
1047 |
||
1048 |
if dry: |
|
1049 |
print "Dry run (no actions will be executed\n" |
|
746
by dcoles
Setup: During Build the system will now indicate what revision is being built |
1050 |
|
1051 |
# Find out the revison number
|
|
1052 |
revnum = get_svn_revision() |
|
1053 |
print "Building Revision %s"%str(revnum) |
|
1054 |
if not dry: |
|
1055 |
vfile = open('BUILD-VERSION','w') |
|
1056 |
vfile.write(str(revnum) + '\n') |
|
1057 |
vfile.close() |
|
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1058 |
|
1059 |
# Compile the trampoline
|
|
349
by mattgiuca
setup.py: Changed so instead of directly calling gcc on the trampoline, calls |
1060 |
curdir = os.getcwd() |
1061 |
os.chdir('trampoline') |
|
1062 |
action_runprog('make', [], dry) |
|
1063 |
os.chdir(curdir) |
|
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1064 |
|
1065 |
# Create the jail and its subdirectories
|
|
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1066 |
# Note: Other subdirs will be made by copying files
|
116
by mattgiuca
setup.py: mkdir now properly obeys "dry". |
1067 |
action_mkdir('jail', dry) |
1068 |
action_mkdir('jail/home', dry) |
|
1069 |
action_mkdir('jail/tmp', dry) |
|
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1070 |
|
547
by dcoles
settup.py: Added nss libaries and /etc files needed for resolving hostnames. |
1071 |
# Chmod the tmp directory to world writable
|
1072 |
action_chmod_w('jail/tmp', dry) |
|
1073 |
||
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1074 |
# Copy all console and operating system files into the jail
|
418
by mattgiuca
Renamed trunk/console to trunk/scripts. We are now able to put more scripts in |
1075 |
action_copylist(install_list.list_scripts, 'jail/opt/ivle', dry) |
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1076 |
copy_os_files_jail(dry) |
253
by mattgiuca
setup.py: chmods python-console when building. |
1077 |
# Chmod the python console
|
418
by mattgiuca
Renamed trunk/console to trunk/scripts. We are now able to put more scripts in |
1078 |
action_chmod_x('jail/opt/ivle/scripts/python-console', dry) |
1079 |
action_chmod_x('jail/opt/ivle/scripts/fileservice', dry) |
|
657
by drtomc
serve: use the trampoline to serve all files. |
1080 |
action_chmod_x('jail/opt/ivle/scripts/serveservice', dry) |
253
by mattgiuca
setup.py: chmods python-console when building. |
1081 |
|
422
by mattgiuca
setup.py: Needs to copy the "lib" directory into the jail. Now does this and |
1082 |
# Also copy the IVLE lib directory into the jail
|
1083 |
# This is necessary for running certain scripts
|
|
1084 |
action_copylist(install_list.list_lib, 'jail/opt/ivle', dry) |
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1085 |
# IMPORTANT: The file jail/opt/ivle/lib/conf/conf.py contains details
|
1086 |
# which could compromise security if left in the jail (such as the DB
|
|
1087 |
# password).
|
|
1088 |
# The "safe" version is in jailconf.py. Delete conf.py and replace it with
|
|
1089 |
# jailconf.py.
|
|
435
by drtomc
setup.py: Fix a couple of jail config glitches. |
1090 |
action_copyfile('lib/conf/jailconf.py', |
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1091 |
'jail/opt/ivle/lib/conf/conf.py', dry) |
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1092 |
|
116
by mattgiuca
setup.py: mkdir now properly obeys "dry". |
1093 |
# Compile .py files into .pyc or .pyo files
|
1094 |
compileall.compile_dir('www', quiet=True) |
|
422
by mattgiuca
setup.py: Needs to copy the "lib" directory into the jail. Now does this and |
1095 |
compileall.compile_dir('lib', quiet=True) |
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1096 |
compileall.compile_dir('scripts', quiet=True) |
422
by mattgiuca
setup.py: Needs to copy the "lib" directory into the jail. Now does this and |
1097 |
compileall.compile_dir('jail/opt/ivle/lib', quiet=True) |
1098 |
||
1099 |
# Set up ivle.pth inside the jail
|
|
1100 |
# Need to set /opt/ivle/lib to be on the import path
|
|
1101 |
ivle_pth = \ |
|
1102 |
"jail/usr/lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION |
|
1103 |
f = open(ivle_pth, 'w') |
|
1104 |
f.write('/opt/ivle/lib\n') |
|
1105 |
f.close() |
|
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1106 |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1107 |
return 0 |
1108 |
||
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1109 |
def copy_os_files_jail(dry): |
1110 |
"""Copies necessary Operating System files from their usual locations
|
|
1111 |
into the jail/ directory of the cwd."""
|
|
1112 |
# Currently source paths are configured for Ubuntu.
|
|
251
by mattgiuca
setup.py: Worked the "files to copy into jail" out into a separate list |
1113 |
for filename in JAIL_FILES: |
1114 |
copy_file_to_jail(filename, dry) |
|
1115 |
for src, dst in JAIL_LINKS.items(): |
|
1116 |
action_symlink(src, dst, dry) |
|
1117 |
for src, dst in JAIL_COPYTREES.items(): |
|
1118 |
action_copytree(src, dst, dry) |
|
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1119 |
|
1120 |
def copy_file_to_jail(src, dry): |
|
1121 |
"""Copies a single file from an absolute location into the same location
|
|
1122 |
within the jail. src must begin with a '/'. The jail will be located
|
|
1123 |
in a 'jail' subdirectory of the current path."""
|
|
1124 |
action_copyfile(src, 'jail' + src, dry) |
|
1125 |
||
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1126 |
def install(args): |
121
by mattgiuca
setup: build and install now read command line options |
1127 |
# Get "dry" and "nojail" variables from command line
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1128 |
(opts, args) = getopt.gnu_getopt(args, "n", |
1129 |
['dry', 'nojail', 'nosubjects']) |
|
121
by mattgiuca
setup: build and install now read command line options |
1130 |
opts = dict(opts) |
1131 |
dry = '-n' in opts or '--dry' in opts |
|
1132 |
nojail = '--nojail' in opts |
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1133 |
nosubjects = '--nosubjects' in opts |
121
by mattgiuca
setup: build and install now read command line options |
1134 |
|
1135 |
if dry: |
|
1136 |
print "Dry run (no actions will be executed\n" |
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1137 |
|
1138 |
if not dry and os.geteuid() != 0: |
|
1139 |
print >>sys.stderr, "Must be root to run install" |
|
1140 |
print >>sys.stderr, "(I need to chown some files)." |
|
1141 |
return 1 |
|
1142 |
||
1143 |
# Create the target (install) directory
|
|
1144 |
action_mkdir(ivle_install_dir, dry) |
|
1145 |
||
1146 |
# Create bin and copy the compiled files there
|
|
1147 |
action_mkdir(os.path.join(ivle_install_dir, 'bin'), dry) |
|
1148 |
tramppath = os.path.join(ivle_install_dir, 'bin/trampoline') |
|
1149 |
action_copyfile('trampoline/trampoline', tramppath, dry) |
|
1150 |
# chown trampoline to root and set setuid bit
|
|
1151 |
action_chown_setuid(tramppath, dry) |
|
1152 |
||
528
by drtomc
usrmgt-server: robustify svn url handling a bit. |
1153 |
# Create a scripts directory to put the usrmgt-server in.
|
1154 |
action_mkdir(os.path.join(ivle_install_dir, 'scripts'), dry) |
|
1155 |
usrmgtpath = os.path.join(ivle_install_dir, 'scripts/usrmgt-server') |
|
1156 |
action_copyfile('scripts/usrmgt-server', usrmgtpath, dry) |
|
1157 |
action_chmod_x(usrmgtpath, dry) |
|
1158 |
||
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
1159 |
# Copy the www and lib directories using the list
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1160 |
action_copylist(install_list.list_www, ivle_install_dir, dry) |
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
1161 |
action_copylist(install_list.list_lib, ivle_install_dir, dry) |
524
by dcoles
forum: Changed setup to just copy the phpBB directory (probbaly can be made |
1162 |
|
1163 |
# Copy the php directory
|
|
681
by dcoles
setup.py: chown the phpBB3 directory to www-data for correct permissions |
1164 |
forum_dir = "www/php/phpBB3" |
1165 |
forum_path = os.path.join(ivle_install_dir, forum_dir) |
|
1166 |
action_copytree(forum_dir, forum_path, dry) |
|
1167 |
print "chown -R www-data:www-data %s" % forum_path |
|
1168 |
if not dry: |
|
1169 |
os.system("chown -R www-data:www-data %s" % forum_path) |
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1170 |
|
1171 |
if not nojail: |
|
1172 |
# Copy the local jail directory built by the build action
|
|
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
1173 |
# to the jails __staging__ directory (it will be used to help build
|
1174 |
# all the students' jails).
|
|
1175 |
action_copytree('jail', os.path.join(jail_base, '__staging__'), dry) |
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1176 |
if not nosubjects: |
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
1177 |
# Copy the subjects and exercises directories across
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1178 |
action_copylist(install_list.list_subjects, subjects_base, dry, |
1179 |
srcdir="./subjects") |
|
515
by stevenbird
Propagated "problem" -> "exercise" nomenclature change. |
1180 |
action_copylist(install_list.list_exercises, exercises_base, dry, |
1181 |
srcdir="./exercises") |
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1182 |
|
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1183 |
# Append IVLE path to ivle.pth in python site packages
|
1184 |
# (Unless it's already there)
|
|
1185 |
ivle_pth = os.path.join(sys.prefix, |
|
317
by mattgiuca
doc/dependencies: Added dependency on matplotlib. |
1186 |
"lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION) |
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1187 |
ivle_www = os.path.join(ivle_install_dir, "www") |
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
1188 |
ivle_lib = os.path.join(ivle_install_dir, "lib") |
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1189 |
write_ivle_pth = True |
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
1190 |
write_ivle_lib_pth = True |
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1191 |
try: |
1192 |
file = open(ivle_pth, 'r') |
|
1193 |
for line in file: |
|
1194 |
if line.strip() == ivle_www: |
|
1195 |
write_ivle_pth = False |
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
1196 |
elif line.strip() == ivle_lib: |
1197 |
write_ivle_lib_pth = False |
|
1198 |
file.close() |
|
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1199 |
except (IOError, OSError): |
1200 |
pass
|
|
1201 |
if write_ivle_pth: |
|
1202 |
action_append(ivle_pth, ivle_www) |
|
409
by mattgiuca
Moved www/conf and www/common to a new directory lib. This separates the "web" |
1203 |
if write_ivle_lib_pth: |
1204 |
action_append(ivle_pth, ivle_lib) |
|
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1205 |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1206 |
return 0 |
1207 |
||
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1208 |
def updatejails(args): |
1209 |
# Get "dry" variable from command line
|
|
1210 |
(opts, args) = getopt.gnu_getopt(args, "n", ['dry']) |
|
1211 |
opts = dict(opts) |
|
1212 |
dry = '-n' in opts or '--dry' in opts |
|
1213 |
||
1214 |
if dry: |
|
1215 |
print "Dry run (no actions will be executed\n" |
|
1216 |
||
1217 |
if not dry and os.geteuid() != 0: |
|
1218 |
print >>sys.stderr, "Must be root to run install" |
|
1219 |
print >>sys.stderr, "(I need to chown some files)." |
|
1220 |
return 1 |
|
1221 |
||
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
1222 |
# Update the staging jail directory in case it hasn't been installed
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1223 |
# recently.
|
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
1224 |
action_copytree('jail', os.path.join(jail_base, '__staging__'), dry) |
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1225 |
|
1226 |
# Re-link all the files in all students jails.
|
|
1227 |
for dir in os.listdir(jail_base): |
|
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
1228 |
if dir == '__staging__': continue |
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1229 |
# First back up the student's home directory
|
1230 |
temp_home = os.tmpnam() |
|
1231 |
action_rename(os.path.join(jail_base, dir, 'home'), temp_home, dry) |
|
1232 |
# Delete the student's jail and relink the jail files
|
|
755
by dcoles
Added support for an incremental rebuild of all the users jails. |
1233 |
action_linktree(os.path.join(jail_base, '__staging__'), |
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1234 |
os.path.join(jail_base, dir), dry) |
1235 |
# Restore the student's home directory
|
|
1236 |
action_rename(temp_home, os.path.join(jail_base, dir, 'home'), dry) |
|
1237 |
# Set up the user's home directory just in case they don't have a
|
|
1238 |
# directory for this yet
|
|
1239 |
action_mkdir(os.path.join(jail_base, dir, 'home', dir), dry) |
|
1240 |
||
1241 |
return 0 |
|
1242 |
||
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1243 |
# The actions call Python os functions but print actions and handle dryness.
|
1244 |
# May still throw os exceptions if errors occur.
|
|
1245 |
||
108
by mattgiuca
setup.py: Added RunError class. action_runprog now throws a RunError if the |
1246 |
class RunError: |
1247 |
"""Represents an error when running a program (nonzero return)."""
|
|
1248 |
def __init__(self, prog, retcode): |
|
1249 |
self.prog = prog |
|
1250 |
self.retcode = retcode |
|
1251 |
def __str__(self): |
|
1252 |
return str(self.prog) + " returned " + repr(self.retcode) |
|
1253 |
||
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1254 |
def action_runprog(prog, args, dry): |
1255 |
"""Runs a unix program. Searches in $PATH. Synchronous (waits for the
|
|
1256 |
program to return). Runs in the current environment. First prints the
|
|
1257 |
action as a "bash" line.
|
|
1258 |
||
108
by mattgiuca
setup.py: Added RunError class. action_runprog now throws a RunError if the |
1259 |
Throws a RunError with a retcode of the return value of the program,
|
1260 |
if the program did not return 0.
|
|
1261 |
||
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1262 |
prog: String. Name of the program. (No path required, if in $PATH).
|
1263 |
args: [String]. Arguments to the program.
|
|
1264 |
dry: Bool. If True, prints but does not execute.
|
|
1265 |
"""
|
|
1266 |
print prog, string.join(args, ' ') |
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
1267 |
if dry: return |
1268 |
ret = os.spawnvp(os.P_WAIT, prog, args) |
|
1269 |
if ret != 0: |
|
1270 |
raise RunError(prog, ret) |
|
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1271 |
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1272 |
def action_remove(path, dry): |
1273 |
"""Calls rmtree, deleting the target file if it exists."""
|
|
434
by drtomc
setup.py: add a bunch of shared objects to be added to the jail for svn. |
1274 |
try: |
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1275 |
print "rm -r", path |
1276 |
if not dry: |
|
1277 |
shutil.rmtree(path, True) |
|
434
by drtomc
setup.py: add a bunch of shared objects to be added to the jail for svn. |
1278 |
except OSError, (err, msg): |
1279 |
if err != errno.EEXIST: |
|
1280 |
raise
|
|
1281 |
# Otherwise, didn't exist, so we don't care
|
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1282 |
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1283 |
def action_rename(src, dst, dry): |
1284 |
"""Calls rename. Deletes the target if it already exists."""
|
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1285 |
action_remove(dst, dry) |
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1286 |
print "mv ", src, dst |
1287 |
if dry: return |
|
1288 |
try: |
|
1289 |
os.rename(src, dst) |
|
1290 |
except OSError, (err, msg): |
|
1291 |
if err != errno.EEXIST: |
|
1292 |
raise
|
|
1293 |
||
116
by mattgiuca
setup.py: mkdir now properly obeys "dry". |
1294 |
def action_mkdir(path, dry): |
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1295 |
"""Calls mkdir. Silently ignored if the directory already exists.
|
1296 |
Creates all parent directories as necessary."""
|
|
1297 |
print "mkdir -p", path |
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
1298 |
if dry: return |
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1299 |
try: |
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1300 |
os.makedirs(path) |
107
by mattgiuca
setup.py: Added "action" functions which encapsulate calling OS functions. |
1301 |
except OSError, (err, msg): |
1302 |
if err != errno.EEXIST: |
|
1303 |
raise
|
|
1304 |
||
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1305 |
def action_copytree(src, dst, dry): |
1306 |
"""Copies an entire directory tree. Symlinks are seen as normal files and
|
|
1307 |
copies of the entire file (not the link) are made. Creates all parent
|
|
1308 |
directories as necessary.
|
|
1309 |
||
1310 |
See shutil.copytree."""
|
|
529
by mattgiuca
setup.py: Fixed copytree; now able to handle copying a directory over itself |
1311 |
# Allow copying over itself
|
1312 |
if (os.path.normpath(os.path.join(os.getcwd(),src)) == |
|
1313 |
os.path.normpath(os.path.join(os.getcwd(),dst))): |
|
1314 |
return
|
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1315 |
action_remove(dst, dry) |
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1316 |
print "cp -r", src, dst |
1317 |
if dry: return |
|
132
by mattgiuca
setup.py: File copying is more robust - preserves symlinks and permissions |
1318 |
shutil.copytree(src, dst, True) |
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1319 |
|
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1320 |
def action_linktree(src, dst, dry): |
1321 |
"""Hard-links an entire directory tree. Same as copytree but the created
|
|
1322 |
files are hard-links not actual copies. Removes the existing destination.
|
|
1323 |
"""
|
|
433
by mattgiuca
setup.py: Conf now writes another file, lib/conf/jailconf.py. This file is a |
1324 |
action_remove(dst, dry) |
252
by mattgiuca
setup.py: Added action "updatejails" which wipes all student jails, replacing |
1325 |
print "<cp with hardlinks> -r", src, dst |
1326 |
if dry: return |
|
1327 |
common.makeuser.linktree(src, dst) |
|
1328 |
||
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1329 |
def action_copylist(srclist, dst, dry, srcdir="."): |
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1330 |
"""Copies all files in a list to a new location. The files in the list
|
1331 |
are read relative to the current directory, and their destinations are the
|
|
1332 |
same paths relative to dst. Creates all parent directories as necessary.
|
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1333 |
srcdir is "." by default, can be overridden.
|
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1334 |
"""
|
1335 |
for srcfile in srclist: |
|
1336 |
dstfile = os.path.join(dst, srcfile) |
|
313
by mattgiuca
test/test_framework: Updated examples, a bit of better descriptions, sample |
1337 |
srcfile = os.path.join(srcdir, srcfile) |
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1338 |
dstdir = os.path.split(dstfile)[0] |
1339 |
if not os.path.isdir(dstdir): |
|
1340 |
action_mkdir(dstdir, dry) |
|
1341 |
print "cp -f", srcfile, dstfile |
|
1342 |
if not dry: |
|
133
by mattgiuca
setup.py: Now allows IVLE to be installed over itself, in order to allow |
1343 |
try: |
1344 |
shutil.copyfile(srcfile, dstfile) |
|
1345 |
shutil.copymode(srcfile, dstfile) |
|
1346 |
except shutil.Error: |
|
1347 |
pass
|
|
118
by mattgiuca
setup.py: Added copytree and copylist actions. |
1348 |
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1349 |
def action_copyfile(src, dst, dry): |
1350 |
"""Copies one file to a new location. Creates all parent directories
|
|
1351 |
as necessary.
|
|
318
by mattgiuca
setup.py: action_copyfile now handles errors as warnings, instead of quitting |
1352 |
Warn if file not found.
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1353 |
"""
|
1354 |
dstdir = os.path.split(dst)[0] |
|
1355 |
if not os.path.isdir(dstdir): |
|
1356 |
action_mkdir(dstdir, dry) |
|
1357 |
print "cp -f", src, dst |
|
1358 |
if not dry: |
|
133
by mattgiuca
setup.py: Now allows IVLE to be installed over itself, in order to allow |
1359 |
try: |
1360 |
shutil.copyfile(src, dst) |
|
1361 |
shutil.copymode(src, dst) |
|
318
by mattgiuca
setup.py: action_copyfile now handles errors as warnings, instead of quitting |
1362 |
except (shutil.Error, IOError), e: |
1363 |
print "Warning: " + str(e) |
|
119
by mattgiuca
setup.py: Added install action. Completely works! |
1364 |
|
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1365 |
def action_symlink(src, dst, dry): |
1366 |
"""Creates a symlink in a given location. Creates all parent directories
|
|
1367 |
as necessary.
|
|
1368 |
"""
|
|
1369 |
dstdir = os.path.split(dst)[0] |
|
1370 |
if not os.path.isdir(dstdir): |
|
1371 |
action_mkdir(dstdir, dry) |
|
131
by mattgiuca
setup.py: |
1372 |
# Delete existing file
|
1373 |
if os.path.exists(dst): |
|
1374 |
os.remove(dst) |
|
1375 |
print "ln -fs", src, dst |
|
122
by mattgiuca
setup.py: build action now copies all operating system files into the jail. |
1376 |
if not dry: |
1377 |
os.symlink(src, dst) |
|
1378 |
||
256
by mattgiuca
Changed the way IVLE's path is loaded into Python's sys.path. Now a file |
1379 |
def action_append(ivle_pth, ivle_www): |
1380 |
file = open(ivle_pth, 'a+') |
|
1381 |
file.write(ivle_www + '\n') |
|
1382 |
file.close() |
|
1383 |
||
119
by mattgiuca
setup.py: Added install action. Completely works! |
1384 |
def action_chown_setuid(file, dry): |
1385 |
"""Chowns a file to root, and sets the setuid bit on the file.
|
|
1386 |
Calling this function requires the euid to be root.
|
|
1387 |
The actual mode of path is set to: rws--s--s
|
|
1388 |
"""
|
|
1389 |
print "chown root:root", file |
|
1390 |
if not dry: |
|
1391 |
os.chown(file, 0, 0) |
|
1392 |
print "chmod a+xs", file |
|
1393 |
print "chmod u+rw", file |
|
1394 |
if not dry: |
|
1395 |
os.chmod(file, stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH |
|
1396 |
| stat.S_ISUID | stat.S_IRUSR | stat.S_IWUSR) |
|
1397 |
||
253
by mattgiuca
setup.py: chmods python-console when building. |
1398 |
def action_chmod_x(file, dry): |
371
by mattgiuca
setup.py: Fixed chmodding python-console. (Turns out this was a bug in setup, |
1399 |
"""Chmod 755 a file (sets permissions to rwxr-xr-x)."""
|
1400 |
print "chmod 755", file |
|
253
by mattgiuca
setup.py: chmods python-console when building. |
1401 |
if not dry: |
371
by mattgiuca
setup.py: Fixed chmodding python-console. (Turns out this was a bug in setup, |
1402 |
os.chmod(file, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR |
1403 |
| stat.S_IXGRP | stat.S_IRGRP | stat.S_IXOTH | stat.S_IROTH) |
|
253
by mattgiuca
setup.py: chmods python-console when building. |
1404 |
|
547
by dcoles
settup.py: Added nss libaries and /etc files needed for resolving hostnames. |
1405 |
|
1406 |
def action_chmod_w(file, dry): |
|
1407 |
"""Chmod 777 a file (sets permissions to rwxrwxrwx)."""
|
|
1408 |
print "chmod 777", file |
|
1409 |
if not dry: |
|
1410 |
os.chmod(file, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR |
|
1411 |
| stat.S_IXGRP | stat.S_IWGRP | stat.S_IRGRP | stat.S_IXOTH |
|
1412 |
| stat.S_IWOTH | stat.S_IROTH) |
|
1413 |
||
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1414 |
def query_user(default, prompt): |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1415 |
"""Prompts the user for a string, which is read from a line of stdin.
|
1416 |
Exits silently if EOF is encountered. Returns the string, with spaces
|
|
1417 |
removed from the beginning and end.
|
|
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1418 |
|
1419 |
Returns default if a 0-length line (after spaces removed) was read.
|
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1420 |
"""
|
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1421 |
sys.stdout.write('%s\n (default: "%s")\n>' % (prompt, default)) |
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1422 |
try: |
1423 |
val = sys.stdin.readline() |
|
1424 |
except KeyboardInterrupt: |
|
1425 |
# Ctrl+C
|
|
1426 |
sys.stdout.write("\n") |
|
1427 |
sys.exit(1) |
|
1428 |
sys.stdout.write("\n") |
|
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1429 |
# If EOF, exit
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1430 |
if val == '': sys.exit(1) |
113
by mattgiuca
setup.py: Now loads defaults, if possible, from the existing conf.py. |
1431 |
# If empty line, return default
|
1432 |
val = val.strip() |
|
1433 |
if val == '': return default |
|
1434 |
return val |
|
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1435 |
|
114
by mattgiuca
setup.py: Wrote listmake (and ancillary functions). |
1436 |
def filter_mutate(function, list): |
1437 |
"""Like built-in filter, but mutates the given list instead of returning a
|
|
1438 |
new one. Returns None."""
|
|
1439 |
i = len(list)-1 |
|
1440 |
while i >= 0: |
|
1441 |
# Delete elements which do not match
|
|
1442 |
if not function(list[i]): |
|
1443 |
del list[i] |
|
1444 |
i -= 1 |
|
1445 |
||
746
by dcoles
Setup: During Build the system will now indicate what revision is being built |
1446 |
def get_svn_revision(): |
1447 |
"""Returns either the current SVN revision of this build, or None"""
|
|
1448 |
try: |
|
1449 |
svn = pysvn.Client() |
|
1450 |
entry = svn.info('.') |
|
1451 |
revnum = entry.revision.number |
|
1452 |
except pysvn.ClientError, e: |
|
1453 |
revnum = None |
|
1454 |
return revnum |
|
1455 |
||
104
by mattgiuca
setup.py: Replaced the simple script with a full options processing script |
1456 |
if __name__ == "__main__": |
1457 |
sys.exit(main()) |
|
746
by dcoles
Setup: During Build the system will now indicate what revision is being built |
1458 |