paul@0 | 1 | #!/usr/bin/env python |
paul@0 | 2 | |
paul@0 | 3 | from os.path import abspath, exists, join, split |
paul@0 | 4 | import os |
paul@0 | 5 | import sys |
paul@0 | 6 | import shutil |
paul@0 | 7 | import re |
paul@0 | 8 | |
paul@0 | 9 | moin_cgi_prefix = re.compile("^#sys.path.insert\(0, 'PREFIX.*$", re.MULTILINE) |
paul@0 | 10 | moin_cgi_wikiconfig = re.compile("^#sys.path.insert\(0, '/path/to/wikiconfigdir.*$", re.MULTILINE) |
paul@0 | 11 | wikiconfig_py_site_name = re.compile(r"^(\s*sitename =).*$", re.MULTILINE) |
paul@0 | 12 | wikiconfig_py_url_prefix_static = re.compile(r"^(\s*)#(url_prefix_static =).*$", re.MULTILINE) |
paul@0 | 13 | |
paul@0 | 14 | apache_site = """ |
paul@0 | 15 | ScriptAlias %(url_path)s "%(web_app_dir)s/moin.cgi" |
paul@0 | 16 | """ |
paul@0 | 17 | |
paul@0 | 18 | apache_site_extra_moin18 = """ |
paul@0 | 19 | Alias %(static_path)s "%(prefix)s/share/moin/htdocs/" |
paul@0 | 20 | """ |
paul@0 | 21 | |
paul@0 | 22 | def readfile(filename): |
paul@0 | 23 | f = open(filename) |
paul@0 | 24 | try: |
paul@0 | 25 | return f.read() |
paul@0 | 26 | finally: |
paul@0 | 27 | f.close() |
paul@0 | 28 | |
paul@0 | 29 | def writefile(filename, s): |
paul@0 | 30 | f = open(filename, "w") |
paul@0 | 31 | try: |
paul@0 | 32 | f.write(s) |
paul@0 | 33 | finally: |
paul@0 | 34 | f.close() |
paul@0 | 35 | |
paul@0 | 36 | def status(message): |
paul@0 | 37 | print message |
paul@0 | 38 | |
paul@0 | 39 | def note(message): |
paul@0 | 40 | print message |
paul@0 | 41 | |
paul@0 | 42 | def setup(moin_distribution, prefix, web_app_dir, common_dir, url_path, site_name): |
paul@0 | 43 | |
paul@0 | 44 | """ |
paul@0 | 45 | Set up a Wiki installation using the following: |
paul@0 | 46 | |
paul@0 | 47 | * moin_distribution - the directory containing a MoinMoin source |
paul@0 | 48 | distribution |
paul@0 | 49 | * prefix - the installation prefix (equivalent to /usr) |
paul@0 | 50 | * web_app_dir - the directory where Web applications and scripts |
paul@0 | 51 | reside (such as /home/www-user/cgi-bin) |
paul@0 | 52 | * common_dir - the directory where the Wiki configuration, |
paul@0 | 53 | resources and instance will reside (such as |
paul@0 | 54 | /home/www-user/mywiki) |
paul@0 | 55 | * url_path - the URL path at which the Wiki will be made |
paul@0 | 56 | available (such as / or /mywiki) |
paul@0 | 57 | * site_name - the name of the site (such as My Wiki) |
paul@0 | 58 | """ |
paul@0 | 59 | |
paul@0 | 60 | prefix, web_app_dir, common_dir = map(abspath, (prefix, web_app_dir, common_dir)) |
paul@0 | 61 | |
paul@0 | 62 | conf_dir = join(common_dir, "conf") |
paul@0 | 63 | instance_dir = join(common_dir, "wikidata") |
paul@0 | 64 | |
paul@0 | 65 | for d in (conf_dir, instance_dir, web_app_dir): |
paul@0 | 66 | if not exists(d): |
paul@0 | 67 | os.makedirs(d) |
paul@0 | 68 | |
paul@0 | 69 | # Enter the distribution directory and run the setup script. |
paul@0 | 70 | |
paul@0 | 71 | this_dir = os.getcwd() |
paul@0 | 72 | os.chdir(moin_distribution) |
paul@0 | 73 | |
paul@0 | 74 | log_filename = "install-%s.log" % split(common_dir)[-1] |
paul@0 | 75 | |
paul@0 | 76 | status("Installing MoinMoin in %s..." % prefix) |
paul@0 | 77 | |
paul@0 | 78 | os.system("python setup.py --quiet install --force --prefix='%s' --install-data='%s' --record='%s'" % ( |
paul@0 | 79 | prefix, instance_dir, log_filename)) |
paul@0 | 80 | |
paul@0 | 81 | os.chdir(this_dir) |
paul@0 | 82 | |
paul@0 | 83 | # The default wikiconfig assumes data and underlay in the same directory. |
paul@0 | 84 | |
paul@0 | 85 | status("Installing data and underlay in %s..." % conf_dir) |
paul@0 | 86 | |
paul@0 | 87 | for d in ("data", "underlay"): |
paul@0 | 88 | shutil.copytree(join(moin_distribution, "wiki", d), join(conf_dir, d)) |
paul@0 | 89 | |
paul@0 | 90 | # NOTE: Single Wiki only so far. |
paul@0 | 91 | # NOTE: Static URLs seem to be different in MoinMoin 1.9.x. |
paul@0 | 92 | |
paul@0 | 93 | wikiconfig_py = join(moin_distribution, "wiki", "config", "wikiconfig.py") |
paul@0 | 94 | |
paul@0 | 95 | status("Editing configuration from %s..." % wikiconfig_py) |
paul@0 | 96 | |
paul@0 | 97 | s = readfile(wikiconfig_py) |
paul@0 | 98 | s = wikiconfig_py_site_name.sub(r"\1 %r" % site_name, s) |
paul@0 | 99 | s = wikiconfig_py_url_prefix_static.sub(r"\1\2 %r + url_prefix_static" % url_path, s) |
paul@0 | 100 | writefile(join(conf_dir, "wikiconfig.py"), s) |
paul@0 | 101 | |
paul@0 | 102 | # Edit moin script. |
paul@0 | 103 | |
paul@0 | 104 | moin_script = join(prefix, "bin", "moin") |
paul@0 | 105 | prefix_site_packages = join(prefix, "lib", "python%s.%s" % sys.version_info[:2], "site-packages") |
paul@0 | 106 | |
paul@0 | 107 | status("Editing moin script at %s..." % moin_script) |
paul@0 | 108 | |
paul@0 | 109 | s = readfile(moin_script) |
paul@0 | 110 | s = s.replace("#import sys", "import sys\nsys.path.insert(0, %r)" % prefix_site_packages) |
paul@0 | 111 | |
paul@0 | 112 | writefile(moin_script, s) |
paul@0 | 113 | |
paul@0 | 114 | # Edit and install CGI script. |
paul@0 | 115 | # NOTE: CGI only so far. |
paul@0 | 116 | # NOTE: Permissions should be checked. |
paul@0 | 117 | |
paul@0 | 118 | moin_cgi = join(instance_dir, "share", "moin", "server", "moin.cgi") |
paul@0 | 119 | moin_cgi_installed = join(web_app_dir, "moin.cgi") |
paul@0 | 120 | |
paul@0 | 121 | status("Editing moin.cgi script from %s..." % moin_cgi) |
paul@0 | 122 | |
paul@0 | 123 | s = readfile(moin_cgi) |
paul@0 | 124 | s = moin_cgi_prefix.sub("sys.path.insert(0, %r)" % prefix_site_packages, s) |
paul@0 | 125 | s = moin_cgi_wikiconfig.sub("sys.path.insert(0, %r)" % conf_dir, s) |
paul@0 | 126 | |
paul@0 | 127 | writefile(moin_cgi_installed, s) |
paul@0 | 128 | os.system("chmod a+rx '%s'" % moin_cgi_installed) |
paul@0 | 129 | |
paul@0 | 130 | # Configure server. |
paul@0 | 131 | # NOTE: Need to detect Apache sites directory. |
paul@0 | 132 | # NOTE: Need to work with older MoinMoin versions. |
paul@0 | 133 | # NOTE: Using local namespace for substitution. |
paul@0 | 134 | |
paul@0 | 135 | status("Writing Apache site definition to %s..." % site_name) |
paul@0 | 136 | |
paul@0 | 137 | writefile(site_name, apache_site % locals()) |
paul@0 | 138 | |
paul@0 | 139 | # General notes. |
paul@0 | 140 | |
paul@0 | 141 | for d in ("data", "underlay"): |
paul@0 | 142 | note("chown -R www-data.www-data '%s'" % join(conf_dir, d)) |
paul@0 | 143 | |
paul@0 | 144 | if __name__ == "__main__": |
paul@0 | 145 | try: |
paul@0 | 146 | n = 6 |
paul@0 | 147 | args = sys.argv[1:n+1] |
paul@0 | 148 | args[n-1] |
paul@0 | 149 | except (IndexError, ValueError): |
paul@0 | 150 | print setup.__doc__ |
paul@0 | 151 | sys.exit(1) |
paul@0 | 152 | |
paul@0 | 153 | setup(*args) |
paul@0 | 154 | |
paul@0 | 155 | # vim: tabstop=4 expandtab shiftwidth=4 |