# HG changeset patch # User Paul Boddie # Date 1271111185 -7200 # Node ID 0c1be594e7b06520a355a71337261dbcad88babf Installation and initialisation of MoinMoin Wiki sites. diff -r 000000000000 -r 0c1be594e7b0 moinsetup.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/moinsetup.py Tue Apr 13 00:26:25 2010 +0200 @@ -0,0 +1,155 @@ +#!/usr/bin/env python + +from os.path import abspath, exists, join, split +import os +import sys +import shutil +import re + +moin_cgi_prefix = re.compile("^#sys.path.insert\(0, 'PREFIX.*$", re.MULTILINE) +moin_cgi_wikiconfig = re.compile("^#sys.path.insert\(0, '/path/to/wikiconfigdir.*$", re.MULTILINE) +wikiconfig_py_site_name = re.compile(r"^(\s*sitename =).*$", re.MULTILINE) +wikiconfig_py_url_prefix_static = re.compile(r"^(\s*)#(url_prefix_static =).*$", re.MULTILINE) + +apache_site = """ +ScriptAlias %(url_path)s "%(web_app_dir)s/moin.cgi" +""" + +apache_site_extra_moin18 = """ +Alias %(static_path)s "%(prefix)s/share/moin/htdocs/" +""" + +def readfile(filename): + f = open(filename) + try: + return f.read() + finally: + f.close() + +def writefile(filename, s): + f = open(filename, "w") + try: + f.write(s) + finally: + f.close() + +def status(message): + print message + +def note(message): + print message + +def setup(moin_distribution, prefix, web_app_dir, common_dir, url_path, site_name): + + """ + Set up a Wiki installation using the following: + + * moin_distribution - the directory containing a MoinMoin source + distribution + * prefix - the installation prefix (equivalent to /usr) + * web_app_dir - the directory where Web applications and scripts + reside (such as /home/www-user/cgi-bin) + * common_dir - the directory where the Wiki configuration, + resources and instance will reside (such as + /home/www-user/mywiki) + * url_path - the URL path at which the Wiki will be made + available (such as / or /mywiki) + * site_name - the name of the site (such as My Wiki) + """ + + prefix, web_app_dir, common_dir = map(abspath, (prefix, web_app_dir, common_dir)) + + conf_dir = join(common_dir, "conf") + instance_dir = join(common_dir, "wikidata") + + for d in (conf_dir, instance_dir, web_app_dir): + if not exists(d): + os.makedirs(d) + + # Enter the distribution directory and run the setup script. + + this_dir = os.getcwd() + os.chdir(moin_distribution) + + log_filename = "install-%s.log" % split(common_dir)[-1] + + status("Installing MoinMoin in %s..." % prefix) + + os.system("python setup.py --quiet install --force --prefix='%s' --install-data='%s' --record='%s'" % ( + prefix, instance_dir, log_filename)) + + os.chdir(this_dir) + + # The default wikiconfig assumes data and underlay in the same directory. + + status("Installing data and underlay in %s..." % conf_dir) + + for d in ("data", "underlay"): + shutil.copytree(join(moin_distribution, "wiki", d), join(conf_dir, d)) + + # NOTE: Single Wiki only so far. + # NOTE: Static URLs seem to be different in MoinMoin 1.9.x. + + wikiconfig_py = join(moin_distribution, "wiki", "config", "wikiconfig.py") + + status("Editing configuration from %s..." % wikiconfig_py) + + s = readfile(wikiconfig_py) + s = wikiconfig_py_site_name.sub(r"\1 %r" % site_name, s) + s = wikiconfig_py_url_prefix_static.sub(r"\1\2 %r + url_prefix_static" % url_path, s) + writefile(join(conf_dir, "wikiconfig.py"), s) + + # Edit moin script. + + moin_script = join(prefix, "bin", "moin") + prefix_site_packages = join(prefix, "lib", "python%s.%s" % sys.version_info[:2], "site-packages") + + status("Editing moin script at %s..." % moin_script) + + s = readfile(moin_script) + s = s.replace("#import sys", "import sys\nsys.path.insert(0, %r)" % prefix_site_packages) + + writefile(moin_script, s) + + # Edit and install CGI script. + # NOTE: CGI only so far. + # NOTE: Permissions should be checked. + + moin_cgi = join(instance_dir, "share", "moin", "server", "moin.cgi") + moin_cgi_installed = join(web_app_dir, "moin.cgi") + + status("Editing moin.cgi script from %s..." % moin_cgi) + + s = readfile(moin_cgi) + s = moin_cgi_prefix.sub("sys.path.insert(0, %r)" % prefix_site_packages, s) + s = moin_cgi_wikiconfig.sub("sys.path.insert(0, %r)" % conf_dir, s) + + writefile(moin_cgi_installed, s) + os.system("chmod a+rx '%s'" % moin_cgi_installed) + + # Configure server. + # NOTE: Need to detect Apache sites directory. + # NOTE: Need to work with older MoinMoin versions. + # NOTE: Using local namespace for substitution. + + status("Writing Apache site definition to %s..." % site_name) + + writefile(site_name, apache_site % locals()) + + # General notes. + + for d in ("data", "underlay"): + note("chown -R www-data.www-data '%s'" % join(conf_dir, d)) + +if __name__ == "__main__": + try: + n = 6 + args = sys.argv[1:n+1] + args[n-1] + except (IndexError, ValueError): + print setup.__doc__ + sys.exit(1) + + setup(*args) + +# vim: tabstop=4 expandtab shiftwidth=4