101
101
# Needed by python
102
102
'/usr/bin/python%s' % PYTHON_VERSION,
103
# Needed by fileservice
104
'/lib/libcom_err.so.2',
105
'/lib/libcrypt.so.1',
106
'/lib/libkeyutils.so.1',
107
'/lib/libresolv.so.2',
110
'/usr/lib/libapr-1.so.0',
111
'/usr/lib/libaprutil-1.so.0',
112
'/usr/lib/libdb-4.4.so',
113
'/usr/lib/libexpat.so.1',
114
'/usr/lib/libgcrypt.so.11',
115
'/usr/lib/libgnutls.so.13',
116
'/usr/lib/libgpg-error.so.0',
117
'/usr/lib/libgssapi_krb5.so.2',
118
'/usr/lib/libk5crypto.so.3',
119
'/usr/lib/libkrb5.so.3',
120
'/usr/lib/libkrb5support.so.0',
121
'/usr/lib/liblber.so.2',
122
'/usr/lib/libldap_r.so.2',
123
'/usr/lib/libneon.so.26',
124
'/usr/lib/libpq.so.5',
125
'/usr/lib/libsasl2.so.2',
126
'/usr/lib/libsqlite3.so.0',
127
'/usr/lib/libsvn_client-1.so.1',
128
'/usr/lib/libsvn_delta-1.so.1',
129
'/usr/lib/libsvn_diff-1.so.1',
130
'/usr/lib/libsvn_fs-1.so.1',
131
'/usr/lib/libsvn_fs_base-1.so.1',
132
'/usr/lib/libsvn_fs_fs-1.so.1',
133
'/usr/lib/libsvn_ra-1.so.1',
134
'/usr/lib/libsvn_ra_dav-1.so.1',
135
'/usr/lib/libsvn_ra_local-1.so.1',
136
'/usr/lib/libsvn_ra_svn-1.so.1',
137
'/usr/lib/libsvn_repos-1.so.1',
138
'/usr/lib/libsvn_subr-1.so.1',
139
'/usr/lib/libsvn_wc-1.so.1',
140
'/usr/lib/libtasn1.so.3',
141
'/usr/lib/libxml2.so.2',
142
103
# Needed by matplotlib
143
104
'/usr/lib/i686/cmov/libssl.so.0.9.8',
144
105
'/usr/lib/i686/cmov/libcrypto.so.0.9.8',
229
179
# In the local file system, where are the per-subject file spaces located.
230
180
# The individual subject directories are expected to be located immediately
231
181
# in subdirectories of this location."""))
232
config_options.append(ConfigOption("exercises_base",
233
"/home/informatics/exercises",
234
"""Root directory where the exercise directories (containing
235
subject-independent exercise sheets) are stored (on the local file
238
# In the local file system, where are the subject-independent exercise sheet
239
# file spaces located."""))
240
182
config_options.append(ConfigOption("public_host", "public.localhost",
241
183
"""Hostname which will cause the server to go into "public mode",
242
184
providing login-free access to student's published work:""",
272
214
"""Database name:""",
274
216
# Database name"""))
275
config_options.append(ConfigOption("db_forumdbname", "ivle_forum",
276
"""Forum Database name:""",
278
# Forum Database name"""))
279
217
config_options.append(ConfigOption("db_user", "postgres",
280
218
"""Username for DB server login:""",
282
220
# Database username"""))
283
221
config_options.append(ConfigOption("db_password", "",
284
222
"""Password for DB server login:
285
(Caution: This password is stored in plaintext in lib/conf/conf.py)""",
223
(Caution: This password is stored in plaintext in www/conf/conf.py)""",
287
225
# Database password"""))
288
config_options.append(ConfigOption("auth_modules", "ldap_auth",
289
"""Authentication config
290
=====================
291
Comma-separated list of authentication modules. Only "ldap" is available
294
# Comma-separated list of authentication modules.
295
# These refer to importable Python modules in the www/auth directory.
296
# Modules "ldap" and "guest" are available in the source tree, but
297
# other modules may be plugged in to auth against organisation-specific
298
# auth backends."""))
299
config_options.append(ConfigOption("ldap_url", "ldaps://www.example.com",
300
"""(LDAP options are only relevant if "ldap" is included in the list of
302
URL for LDAP authentication server:""",
304
# URL for LDAP authentication server"""))
305
config_options.append(ConfigOption("ldap_format_string",
306
"uid=%s,ou=users,o=example",
307
"""Format string for LDAP auth request:
308
(Must contain a single "%s" for the user's login name)""",
310
# Format string for LDAP auth request
311
# (Must contain a single "%s" for the user's login name)"""))
312
config_options.append(ConfigOption("svn_addr", "http://svn.localhost/",
315
The base url for accessing subversion repositories:""",
317
# The base url for accessing subversion repositories."""))
318
config_options.append(ConfigOption("svn_conf", "/opt/ivle/svn/svn.conf",
319
"""The location of the subversion configuration file used by apache
320
to host the user repositories:""",
322
# The location of the subversion configuration file used by
323
# apache to host the user repositories."""))
324
config_options.append(ConfigOption("svn_repo_path", "/home/informatics/repositories",
325
"""The root directory for the subversion repositories:""",
327
# The root directory for the subversion repositories."""))
328
config_options.append(ConfigOption("svn_auth_ivle", "/opt/ivle/svn/ivle.auth",
329
"""The location of the password file used to authenticate users
330
of the subversion repository from the ivle server:""",
332
# The location of the password file used to authenticate users
333
# of the subversion repository from the ivle server."""))
334
config_options.append(ConfigOption("svn_auth_local", "/opt/ivle/svn/local.auth",
335
"""The location of the password file used to authenticate local users
336
of the subversion repository:""",
338
# The location of the password file used to authenticate local users
339
# of the subversion repository."""))
340
config_options.append(ConfigOption("usrmgt_host", "localhost",
341
"""User Management Server config
342
============================
343
The hostname where the usrmgt-server runs:""",
345
# The hostname where the usrmgt-server runs."""))
346
config_options.append(ConfigOption("usrmgt_port", "2178",
347
"""The port where the usrmgt-server runs:""",
349
# The port where the usrmgt-server runs."""))
350
config_options.append(ConfigOption("usrmgt_magic", "",
351
"""The password for the usrmgt-server:""",
353
# The password for the usrmgt-server."""))
355
227
# Try importing existing conf, but if we can't just set up defaults
356
228
# The reason for this is that these settings are used by other phases
357
229
# of setup besides conf, so we need to know them.
358
230
# Also this allows you to hit Return to accept the existing value.
360
confmodule = __import__("lib/conf/conf")
232
confmodule = __import__("www/conf/conf")
361
233
for opt in config_options:
363
235
globals()[opt.option_name] = confmodule.__dict__[opt.option_name]
522
394
def listmake(args):
523
395
# We build two separate lists, by walking www and console
524
396
list_www = build_list_py_files('www')
525
list_lib = build_list_py_files('lib')
397
list_console = build_list_py_files('console')
526
398
list_subjects = build_list_py_files('subjects', no_top_level=True)
527
list_exercises = build_list_py_files('exercises', no_top_level=True)
529
"scripts/python-console",
530
"scripts/fileservice",
531
"scripts/usrmgt-server",
532
"scripts/diffservice",
534
399
# Make sure that the files generated by conf are in the list
535
400
# (since listmake is typically run before conf)
536
if "lib/conf/conf.py" not in list_lib:
537
list_lib.append("lib/conf/conf.py")
401
if "www/conf/conf.py" not in list_www:
402
list_www.append("www/conf/conf.py")
403
# Make sure that console/python-console is in the list
404
if "console/python-console" not in list_console:
405
list_console.append("console/python-console")
538
406
# Write these out to a file
539
407
cwd = os.getcwd()
540
408
# the files that will be created/overwritten
555
423
writelist_pretty(file, list_www)
557
# List of all installable files in lib directory.
559
writelist_pretty(file, list_lib)
561
# List of all installable files in scripts directory.
563
writelist_pretty(file, list_scripts)
425
# List of all installable files in console directory.
427
writelist_pretty(file, list_console)
565
429
# List of all installable files in subjects directory.
566
430
# This is to install sample subjects and material.
567
431
list_subjects = """)
568
432
writelist_pretty(file, list_subjects)
570
# List of all installable files in exercises directory.
571
# This is to install sample exercise material.
572
list_exercises = """)
573
writelist_pretty(file, list_exercises)
576
435
except IOError, (errno, strerror):
708
556
print "IO error(%s): %s" % (errno, strerror)
711
print "Successfully wrote lib/conf/conf.py"
713
# Write conf/jailconf.py
716
conf = open(jailconffile, "w")
718
# In the "in-jail" version of conf, we don't need MOST of the details
719
# (it would be a security risk to have them here).
720
# So we just write root_dir, and jail_base is "/".
721
# (jail_base being "/" means "jail-relative" paths are relative to "/"
722
# when inside the jail.)
723
conf.write("""# IVLE Configuration File
725
# Miscellaneous application settings
726
# (User jail version)
729
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
731
# eg. "/" or "/ivle".
734
# In the local file system, where are the student/user file spaces located.
735
# The user jails are expected to be located immediately in subdirectories of
739
# The hostname for serving publicly accessible pages
741
""" % (repr(root_dir),repr(public_host)))
744
except IOError, (errno, strerror):
745
print "IO error(%s): %s" % (errno, strerror)
748
print "Successfully wrote lib/conf/jailconf.py"
559
print "Successfully wrote www/conf/conf.py"
750
561
# Write trampoline/conf.h
783
591
print "Successfully wrote trampoline/conf.h"
785
# Write www/php/phpBB3/config.php
788
conf = open(phpBBconffile, "w")
791
if db_host == 'localhost':
792
forumdb_host = '127.0.0.1'
794
forumdb_host = db_host
797
// phpBB 3.0.x auto-generated configuration file
798
// Do not change anything in this file!
800
$dbhost = '""" + forumdb_host + """';
801
$dbport = '""" + str(db_port) + """';
802
$dbname = '""" + db_forumdbname + """';
803
$dbuser = '""" + db_user + """';
804
$dbpasswd = '""" + db_password + """';
806
$table_prefix = 'phpbb_';
808
$load_extensions = '';
809
@define('PHPBB_INSTALLED', true);
810
// @define('DEBUG', true);
811
//@define('DEBUG_EXTRA', true);
815
except IOError, (errno, strerror):
816
print "IO error(%s): %s" % (errno, strerror)
819
print "Successfully wrote www/php/phpBB3/config.php"
822
594
print "You may modify the configuration at any time by editing"
848
618
action_mkdir('jail/home', dry)
849
619
action_mkdir('jail/tmp', dry)
851
# Chmod the tmp directory to world writable
852
action_chmod_w('jail/tmp', dry)
854
621
# Copy all console and operating system files into the jail
855
action_copylist(install_list.list_scripts, 'jail/opt/ivle', dry)
622
action_copylist(install_list.list_console, 'jail/opt/ivle', dry)
856
623
copy_os_files_jail(dry)
857
624
# Chmod the python console
858
action_chmod_x('jail/opt/ivle/scripts/python-console', dry)
859
action_chmod_x('jail/opt/ivle/scripts/fileservice', dry)
625
action_chmod_x('jail/opt/ivle/console/python-console', dry)
861
# Also copy the IVLE lib directory into the jail
862
# This is necessary for running certain scripts
863
action_copylist(install_list.list_lib, 'jail/opt/ivle', dry)
864
# IMPORTANT: The file jail/opt/ivle/lib/conf/conf.py contains details
865
# which could compromise security if left in the jail (such as the DB
867
# The "safe" version is in jailconf.py. Delete conf.py and replace it with
869
action_copyfile('lib/conf/jailconf.py',
870
'jail/opt/ivle/lib/conf/conf.py', dry)
872
628
# Compile .py files into .pyc or .pyo files
873
629
compileall.compile_dir('www', quiet=True)
874
compileall.compile_dir('lib', quiet=True)
875
compileall.compile_dir('scripts', quiet=True)
876
compileall.compile_dir('jail/opt/ivle/lib', quiet=True)
878
# Set up ivle.pth inside the jail
879
# Need to set /opt/ivle/lib to be on the import path
881
"jail/usr/lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION
882
f = open(ivle_pth, 'w')
883
f.write('/opt/ivle/lib\n')
630
compileall.compile_dir('console', quiet=True)
929
675
# chown trampoline to root and set setuid bit
930
676
action_chown_setuid(tramppath, dry)
932
# Create a scripts directory to put the usrmgt-server in.
933
action_mkdir(os.path.join(ivle_install_dir, 'scripts'), dry)
934
usrmgtpath = os.path.join(ivle_install_dir, 'scripts/usrmgt-server')
935
action_copyfile('scripts/usrmgt-server', usrmgtpath, dry)
936
action_chmod_x(usrmgtpath, dry)
938
# Copy the www and lib directories using the list
678
# Copy the www directory using the list
939
679
action_copylist(install_list.list_www, ivle_install_dir, dry)
940
action_copylist(install_list.list_lib, ivle_install_dir, dry)
942
# Copy the php directory
943
action_copytree('www/php/phpBB3',os.path.join(ivle_install_dir,'www/php/phpBB3'),
947
682
# Copy the local jail directory built by the build action
949
684
# for all the students' jails).
950
685
action_copytree('jail', os.path.join(jail_base, 'template'), dry)
951
686
if not nosubjects:
952
# Copy the subjects and exercises directories across
687
# Copy the subjects directory across
953
688
action_copylist(install_list.list_subjects, subjects_base, dry,
954
689
srcdir="./subjects")
955
action_copylist(install_list.list_exercises, exercises_base, dry,
956
srcdir="./exercises")
958
691
# Append IVLE path to ivle.pth in python site packages
959
692
# (Unless it's already there)
960
693
ivle_pth = os.path.join(sys.prefix,
961
694
"lib/python%s/site-packages/ivle.pth" % PYTHON_VERSION)
962
695
ivle_www = os.path.join(ivle_install_dir, "www")
963
ivle_lib = os.path.join(ivle_install_dir, "lib")
964
696
write_ivle_pth = True
965
write_ivle_lib_pth = True
967
698
file = open(ivle_pth, 'r')
968
699
for line in file:
969
700
if line.strip() == ivle_www:
970
701
write_ivle_pth = False
971
elif line.strip() == ivle_lib:
972
write_ivle_lib_pth = False
974
703
except (IOError, OSError):
976
705
if write_ivle_pth:
977
706
action_append(ivle_pth, ivle_www)
978
if write_ivle_lib_pth:
979
action_append(ivle_pth, ivle_lib)