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

1092.1.46 by Matt Giuca
setup: Removed 'config' mode. It's now standalone.
1
#!/usr/bin/python
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
2
# IVLE - Informatics Virtual Learning Environment
1092.1.1 by William Grant
[Uber-commit of holiday work because I lacked a local copy of the branch.]
3
# Copyright (C) 2007-2009 The University of Melbourne
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
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
# Author: Matt Giuca, Refactored by David Coles
20
1092.1.1 by William Grant
[Uber-commit of holiday work because I lacked a local copy of the branch.]
21
'''Configures IVLE with machine-specific details, most notably, various paths.
22
Either prompts the administrator for these details or accepts them as
23
command-line args.
24
1092.1.51 by William Grant
Move trampoline UID configuration out of config.
25
Creates etc/ivle.conf
1092.1.1 by William Grant
[Uber-commit of holiday work because I lacked a local copy of the branch.]
26
'''
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
27
28
import optparse
29
import getopt
30
import os
819 by mattgiuca
setup/configure.py: Added "import sys".
31
import sys
1092.1.56 by William Grant
ivle-config now sets appropriate permissions (www-data:, 600) on any config
32
import stat
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
33
import hashlib
34
import uuid
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
35
1092.1.34 by Matt Giuca
setup.configure: Replaced use of legacy conf.py for loading existing values.
36
import ivle.config
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
37
1092.1.11 by Matt Giuca
Replaced Python config files (conf.py) with new config files system, using
38
import configobj
39
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
40
class ConfigOption:
41
    """A configuration option; one of the things written to conf.py."""
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
42
    def __init__(self, option_name, default, prompt, comment, ask=True):
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
43
        """Creates a configuration option.
44
        option_name: Name of the variable in conf.py. Also name of the
45
            command-line argument to setup.py conf.
46
        default: Default value for this variable.
47
        prompt: (Short) string presented during the interactive prompt in
48
            setup.py conf.
49
        comment: (Long) comment string stored in conf.py. Each line of this
50
            string should begin with a '#'.
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
51
        ask: Whether to ask the question in the default config run.
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
52
        """
53
        self.option_name = option_name
54
        self.default = default
55
        self.prompt = prompt
56
        self.comment = comment
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
57
        self.ask = ask
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
58
59
# Configuration options, defaults and descriptions
60
config_options = []
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
61
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
62
config_options.append(ConfigOption("urls/root", "/",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
63
    """Root directory where IVLE is located (in URL space):""",
64
    """
65
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
66
# with this).
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
67
# eg. "/" or "/ivle".""", ask=False))
68
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
69
config_options.append(ConfigOption("paths/prefix", "/usr/local",
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
70
    """In the local file system, the prefix to the system directory where IVLE
71
is installed. (This should either be /usr or /usr/local):""",
72
    """
73
# In the local file system, the prefix to the system directory where IVLE is
74
# installed. This should either be '/usr' or '/usr/local'.
75
# ('/usr/local' for the usual install, '/usr' for distribution packages)""",
76
    ask=False))
77
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
78
config_options.append(ConfigOption("paths/data",
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
79
    "/var/lib/ivle",
80
    "In the local file system, where user-modifiable data files should be "
81
    "located:",
82
    """
83
# In the local file system, where user-modifiable data files should be
84
# located.""", ask=False))
85
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
86
config_options.append(ConfigOption("paths/logs",
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
87
    "/var/log/ivle",
893 by dcoles
Dispatch: Now attempts to log unhandled exceptions to a log directory specified
88
    """Directory where IVLE log files are stored (on the local
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
89
file system). Note - this must be writable by the user the IVLE server 
90
process runs as (usually www-data):""",
893 by dcoles
Dispatch: Now attempts to log unhandled exceptions to a log directory specified
91
    """
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
92
# In the local file system, where IVLE error logs should be located.""",
93
    ask=False))
94
1319 by Matt Giuca
Changed default domains from public.localhost / svn.localhost to public.ivle.localhost / svn.ivle.localhost. This is nicer and consistent with our documentation.
95
config_options.append(ConfigOption("urls/public_host",
96
    "public.ivle.localhost",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
97
    """Hostname which will cause the server to go into "public mode",
98
providing login-free access to student's published work:""",
99
    """
100
# The server goes into "public mode" if the browser sends a request with this
101
# host. This is for security reasons - we only serve public student files on a
102
# separate domain to the main IVLE site.
103
# Public mode does not use cookies, and serves only public content.
104
# Private mode (normal mode) requires login, and only serves files relevant to
105
# the logged-in user."""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
106
1152 by William Grant
Add the media version setting to ivle-config, so it can be easily set on the
107
config_options.append(ConfigOption("media/version", None,
108
    """Version of IVLE media resources (must change on each upgrade):""",
109
    """
110
# Version string for IVLE media resource URLs. When set, they are aggressively
111
# cached by the browser, so it must be either left unset or changed each time
112
# a media file is changed.""", ask=False))
113
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
114
config_options.append(ConfigOption("database/host", "localhost",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
115
    """PostgreSQL Database config
116
==========================
117
Hostname of the DB server:""",
118
    """
119
# Database server hostname"""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
120
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
121
config_options.append(ConfigOption("database/port", "5432",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
122
    """Port of the DB server:""",
123
    """
124
# Database server port"""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
125
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
126
config_options.append(ConfigOption("database/name", "ivle",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
127
    """Database name:""",
128
    """
129
# Database name"""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
130
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
131
config_options.append(ConfigOption("database/username", "postgres",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
132
    """Username for DB server login:""",
133
    """
134
# Database username"""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
135
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
136
config_options.append(ConfigOption("database/password", "",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
137
    """Password for DB server login:
1092.1.56 by William Grant
ivle-config now sets appropriate permissions (www-data:, 600) on any config
138
    (Caution: This password is stored in plaintext!)""",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
139
    """
140
# Database password"""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
141
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
142
config_options.append(ConfigOption("auth/modules", "",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
143
    """Authentication config
144
=====================
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
145
Comma-separated list of authentication modules.""",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
146
    """
147
# Comma-separated list of authentication modules.
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
148
# Note that auth is always enabled against the local database, and NO OTHER
149
# auth is enabled by default. This section is for specifying additional auth
150
# modules.
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
151
# These refer to importable Python modules in the www/auth directory.
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
152
# Modules "ldap_auth" and "guest" are available in the source tree, but
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
153
# other modules may be plugged in to auth against organisation-specific
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
154
# auth backends.""", ask=False))
155
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
156
config_options.append(ConfigOption("auth/ldap_url", "ldaps://www.example.com",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
157
    """(LDAP options are only relevant if "ldap" is included in the list of
158
auth modules).
159
URL for LDAP authentication server:""",
160
    """
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
161
# URL for LDAP authentication server""", ask=False))
162
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
163
config_options.append(ConfigOption("auth/ldap_format_string",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
164
    "uid=%s,ou=users,o=example",
165
    """Format string for LDAP auth request:
166
    (Must contain a single "%s" for the user's login name)""",
167
    """
168
# Format string for LDAP auth request
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
169
# (Must contain a single "%s" for the user's login name)""", ask=False))
170
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
171
config_options.append(ConfigOption("auth/subject_pulldown_modules", "",
819 by mattgiuca
setup/configure.py: Added "import sys".
172
    """Comma-separated list of subject pulldown modules.
173
Add proprietary modules to automatically enrol students in subjects.""",
174
    """
175
# Comma-separated list of subject pulldown modules.
176
# These refer to importable Python modules in the lib/pulldown_subj directory.
820 by mattgiuca
lib: Added new package pulldown_subj, a collection of modules designed to
177
# Only "dummy_subj" is available in the source tree (an example), but
819 by mattgiuca
setup/configure.py: Added "import sys".
178
# other modules may be plugged in to pulldown against organisation-specific
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
179
# pulldown backends.""", ask=False))
180
1319 by Matt Giuca
Changed default domains from public.localhost / svn.localhost to public.ivle.localhost / svn.ivle.localhost. This is nicer and consistent with our documentation.
181
config_options.append(ConfigOption("urls/svn_addr",
182
    "http://svn.ivle.localhost/",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
183
    """Subversion config
184
=================
185
The base url for accessing subversion repositories:""",
186
    """
187
# The base url for accessing subversion repositories."""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
188
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
189
config_options.append(ConfigOption("usrmgt/host", "localhost",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
190
    """User Management Server config
191
============================
192
The hostname where the usrmgt-server runs:""",
193
    """
194
# The hostname where the usrmgt-server runs."""))
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
195
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
196
config_options.append(ConfigOption("usrmgt/port", "2178",
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
197
    """The port where the usrmgt-server runs:""",
198
    """
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
199
# The port where the usrmgt-server runs.""", ask=False))
200
1092.1.33 by Matt Giuca
setup.configure: Replaced all of the config option names with the new path
201
config_options.append(ConfigOption("usrmgt/magic", None,
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
202
    """The password for the usrmgt-server:""",
203
    """
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
204
# The password for the usrmgt-server.""", ask=False))
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
205
1405 by William Grant
Allow ivle-config to set jail/{suite,mirror,devmode}.
206
config_options.append(ConfigOption("jail/suite", "hardy",
207
    """The distribution release to use to build the jail:""",
208
    """
209
# The distribution release to use to build the jail.""", ask=True))
210
211
config_options.append(ConfigOption("jail/mirror", "archive.ubuntu.com",
212
    """The archive mirror to use to build the jail:""",
213
    """
214
# The archive mirror to use to build the jail.""", ask=True))
215
216
config_options.append(ConfigOption("jail/devmode", False,
217
    """Whether jail development mode be activated:""",
218
    """
219
# Should jail development mode be activated?""", ask=False))
220
221
# The password for the usrmgt-server.""", ask=False))
1092.1.44 by Matt Giuca
setup.util: Moved query_user to setup.configure. (It's the only user of this
222
def query_user(default, prompt):
223
    """Prompts the user for a string, which is read from a line of stdin.
224
    Exits silently if EOF is encountered. Returns the string, with spaces
225
    removed from the beginning and end.
226
227
    Returns default if a 0-length line (after spaces removed) was read.
228
    """
229
    if default is None:
230
        # A default of None means the value will be computed specially, so we
231
        # can't really tell you what it is
232
        defaultstr = "computed"
233
    elif isinstance(default, basestring):
234
        defaultstr = '"%s"' % default
235
    else:
236
        defaultstr = repr(default)
237
    sys.stdout.write('%s\n    (default: %s)\n>' % (prompt, defaultstr))
238
    try:
239
        val = sys.stdin.readline()
240
    except KeyboardInterrupt:
241
        # Ctrl+C
242
        sys.stdout.write("\n")
243
        sys.exit(1)
244
    sys.stdout.write("\n")
245
    # If EOF, exit
246
    if val == '': sys.exit(1)
247
    # If empty line, return default
248
    val = val.strip()
249
    if val == '': return default
250
    return val
251
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
252
def configure(args):
253
    # Try importing existing conf, but if we can't just set up defaults
254
    # The reason for this is that these settings are used by other phases
255
    # of setup besides conf, so we need to know them.
256
    # Also this allows you to hit Return to accept the existing value.
1092.1.37 by Matt Giuca
setup.configure: Now handles the case of a missing config file.
257
    try:
258
        conf = ivle.config.Config()
259
    except ivle.config.ConfigError:
260
        # Couldn't find a config file anywhere.
261
        # Create a new blank config object (not yet bound to a file)
262
        # All lookups (below) will fail, so it will be initialised with all
263
        # the default values.
264
        conf = ivle.config.Config(blank=True)
265
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
266
    # Check that all the options are present, and if not, load the default
1092.1.34 by Matt Giuca
setup.configure: Replaced use of legacy conf.py for loading existing values.
267
    for opt in config_options:
268
        try:
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
269
            conf.get_by_path(opt.option_name)
1092.1.34 by Matt Giuca
setup.configure: Replaced use of legacy conf.py for loading existing values.
270
        except KeyError:
1092.1.41 by Matt Giuca
setup.configure: Fixed "None" as the default - now writes nothing rather than
271
            # If the default is None, omit it
272
            # Else ConfigObj will write the string 'None' to the conf file
273
            if opt.default is not None:
274
                conf.set_by_path(opt.option_name, opt.default)
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
275
276
    # Store comments in the conf object
277
    for opt in config_options:
1092.1.45 by Matt Giuca
setup.configure: Fixed bug if usrmgt_magic is None. Does not write comment if
278
        # Omitted if the key doesn't exist
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
279
        conf.set_by_path(opt.option_name, comment=opt.comment)
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
280
281
    # Set up some variables
282
    cwd = os.getcwd()
283
284
    # the files that will be created/overwritten
1092.1.54 by William Grant
./etc is no longer a special case in the ivle.conf search path.
285
    try:
286
        confdir = os.environ['IVLECONF']
287
    except KeyError:
288
        confdir = '/etc/ivle'
289
290
    conffile = os.path.join(confdir, 'ivle.conf')
1092.1.60 by William Grant
ivle-config now creates /etc/ivle/plugins.d/000default.conf.
291
    plugindefaultfile = os.path.join(confdir, 'plugins.d/000default.conf')
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
292
293
    # Get command-line arguments to avoid asking questions.
294
295
    optnames = []
296
    for opt in config_options:
297
        optnames.append(opt.option_name + "=")
298
    (opts, args) = getopt.gnu_getopt(args, "", optnames)
299
300
    if args != []:
1391 by David Coles
Fix ivle-config's (broken) use of the depricated string module
301
        print >>sys.stderr, "Invalid arguments:", ' '.join(args)
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
302
        return 2
303
304
    if opts == []:
305
        # Interactive mode. Prompt the user for all the values.
306
1092.1.52 by William Grant
Remove phpBB3 configuration from ivle-config.
307
        print """This tool will create %s, prompting you for details about
1092.1.56 by William Grant
ivle-config now sets appropriate permissions (www-data:, 600) on any config
308
your configuration. The file will be updated with modified options if it already
309
exists. If it does not already exist, it will be created with sane defaults and
310
restrictive permissions.
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
311
1092.1.60 by William Grant
ivle-config now creates /etc/ivle/plugins.d/000default.conf.
312
%s will also be overwritten with the default list of plugins.
313
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
314
Please hit Ctrl+C now if you do not wish to do this.
1092.1.60 by William Grant
ivle-config now creates /etc/ivle/plugins.d/000default.conf.
315
""" % (conffile, plugindefaultfile)
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
316
317
        # Get information from the administrator
318
        # If EOF is encountered at any time during the questioning, just exit
319
        # silently
320
321
        for opt in config_options:
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
322
            if opt.ask:
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
323
                conf.set_by_path(opt.option_name,
324
                    query_user(conf.get_by_path(opt.option_name), opt.prompt))
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
325
    else:
326
        opts = dict(opts)
327
        # Non-interactive mode. Parse the options.
328
        for opt in config_options:
329
            if '--' + opt.option_name in opts:
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
330
                conf.set_by_path(opt.option_name,
331
                                 opts['--' + opt.option_name])
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
332
333
    # Error handling on input values
334
    try:
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
335
        conf['database']['port'] = int(conf['database']['port'])
336
        if (conf['database']['port'] < 0
337
            or conf['database']['port'] >= 65536):
1092.1.30 by Matt Giuca
setup.configure: Replaced all uses of config-variable global variables with
338
            raise ValueError()
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
339
    except ValueError:
1099.1.173 by William Grant
ivle-config now allows a blank port to be specified.
340
        if conf['database']['port'] == '' or conf['database']['port'] is None:
341
            pass
342
        else:
343
            print >>sys.stderr, (
344
            "Invalid DB port (%s).\n"
345
            "Must be an integer between 0 and 65535." %
346
                repr(conf['database']['port']))
347
            return 1
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
348
    try:
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
349
        conf['usrmgt']['port'] = int(conf['usrmgt']['port'])
350
        if (conf['usrmgt']['port'] < 0 or conf['usrmgt']['port'] >= 65536):
1092.1.30 by Matt Giuca
setup.configure: Replaced all uses of config-variable global variables with
351
            raise ValueError()
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
352
    except ValueError:
353
        print >>sys.stderr, (
354
        "Invalid user management port (%s).\n"
1092.1.32 by Matt Giuca
configure.py: Fixed missing reference to conf_options in error case.
355
        "Must be an integer between 0 and 65535." %
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
356
            repr(conf['usrmgt']['port']))
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
357
        return 1
358
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
359
    # By default we generate the magic randomly.
1092.1.45 by Matt Giuca
setup.configure: Fixed bug if usrmgt_magic is None. Does not write comment if
360
    try:
361
        conf['usrmgt']['magic']     # Throw away; just check for KeyError
362
    except KeyError:
1092.1.39 by Matt Giuca
setup.configure: Replaced the use of an intermediate dictionary for storing
363
        conf['usrmgt']['magic'] = hashlib.md5(uuid.uuid4().bytes).hexdigest()
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
364
1092.1.56 by William Grant
ivle-config now sets appropriate permissions (www-data:, 600) on any config
365
    clobber_permissions = not os.path.exists(conffile)
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
366
1092.1.37 by Matt Giuca
setup.configure: Now handles the case of a missing config file.
367
    # Write ./etc/ivle.conf (even if we loaded from a different filename)
1092.1.11 by Matt Giuca
Replaced Python config files (conf.py) with new config files system, using
368
    conf.filename = conffile
369
    conf.initial_comment = ["# IVLE Configuration File"]
370
    conf.write()
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
371
1092.1.56 by William Grant
ivle-config now sets appropriate permissions (www-data:, 600) on any config
372
    # We need to restrict permissions on a new file, as it contains
373
    # a nice database password.
374
    if clobber_permissions:
375
        os.chown(conffile, 33, 33) # chown to www-data
376
        os.chmod(conffile, stat.S_IRUSR | stat.S_IWUSR) # No g/o perms!
377
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
378
    print "Successfully wrote %s" % conffile
1092.1.60 by William Grant
ivle-config now creates /etc/ivle/plugins.d/000default.conf.
379
380
    plugindefault = open(plugindefaultfile, 'w')
381
    plugindefault.write("""# IVLE default plugin configuration file
382
[ivle.webapp.core#Plugin]
383
[ivle.webapp.admin.user#Plugin]
384
[ivle.webapp.tutorial#Plugin]
385
[ivle.webapp.admin.subject#Plugin]
386
[ivle.webapp.filesystem.browser#Plugin]
387
[ivle.webapp.filesystem.diff#Plugin]
388
[ivle.webapp.filesystem.svnlog#Plugin]
389
[ivle.webapp.filesystem.serve#Plugin]
390
[ivle.webapp.groups#Plugin]
391
[ivle.webapp.console#Plugin]
392
[ivle.webapp.security#Plugin]
393
[ivle.webapp.media#Plugin]
394
[ivle.webapp.help#Plugin]
395
[ivle.webapp.tos#Plugin]
396
[ivle.webapp.userservice#Plugin]
1099.1.152 by William Grant
Quick port of fileservice to the new framework. It's still very much old-style,
397
[ivle.webapp.fileservice#Plugin]
1165.1.8 by William Grant
Start a submission UI in ivle.webapp.submit.
398
[ivle.webapp.submit#Plugin]
1092.1.60 by William Grant
ivle-config now creates /etc/ivle/plugins.d/000default.conf.
399
""")
400
    plugindefault.close()
401
    print "Successfully wrote %s" % plugindefaultfile
402
1092.1.52 by William Grant
Remove phpBB3 configuration from ivle-config.
403
    print
404
    print "You may modify the configuration at any time by editing " + conffile
803 by dcoles
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should
405
    
406
    return 0
1092.1.46 by Matt Giuca
setup: Removed 'config' mode. It's now standalone.
407
408
def main(argv=None):
409
    if argv is None:
410
        argv = sys.argv
411
412
    # Print the opening spiel including the GPL notice
413
414
    print """IVLE - Informatics Virtual Learning Environment Setup
415
Copyright (C) 2007-2009 The University of Melbourne
416
IVLE comes with ABSOLUTELY NO WARRANTY.
417
This is free software, and you are welcome to redistribute it
418
under certain conditions. See LICENSE.txt for details.
419
420
IVLE Configuration
421
"""
422
423
    return configure(argv[1:])
424
425
if __name__ == "__main__":
426
    sys.exit(main())