349 lines
10 KiB
Nix
349 lines
10 KiB
Nix
{ config, lib, pkgs, serverInfo, php, ... }:
|
||
|
||
with lib;
|
||
|
||
let
|
||
|
||
httpd = serverInfo.serverConfig.package;
|
||
|
||
version24 = !versionOlder httpd.version "2.4";
|
||
|
||
allGranted = if version24 then ''
|
||
Require all granted
|
||
'' else ''
|
||
Order allow,deny
|
||
Allow from all
|
||
'';
|
||
|
||
mediawikiConfig = pkgs.writeText "LocalSettings.php"
|
||
''
|
||
<?php
|
||
# Copied verbatim from the default (generated) LocalSettings.php.
|
||
if( defined( 'MW_INSTALL_PATH' ) ) {
|
||
$IP = MW_INSTALL_PATH;
|
||
} else {
|
||
$IP = dirname( __FILE__ );
|
||
}
|
||
|
||
$path = array( $IP, "$IP/includes", "$IP/languages" );
|
||
set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );
|
||
|
||
require_once( "$IP/includes/DefaultSettings.php" );
|
||
|
||
if ( $wgCommandLineMode ) {
|
||
if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
|
||
die( "This script must be run from the command line\n" );
|
||
}
|
||
}
|
||
|
||
$wgScriptPath = "${config.urlPrefix}";
|
||
|
||
# We probably need to set $wgSecretKey and $wgCacheEpoch.
|
||
|
||
# Paths to external programs.
|
||
$wgDiff3 = "${pkgs.diffutils}/bin/diff3";
|
||
$wgDiff = "${pkgs.diffutils}/bin/diff";
|
||
$wgImageMagickConvertCommand = "${pkgs.imagemagick.out}/bin/convert";
|
||
|
||
#$wgDebugLogFile = "/tmp/mediawiki_debug_log.txt";
|
||
|
||
# Database configuration.
|
||
$wgDBtype = "${config.dbType}";
|
||
$wgDBserver = "${config.dbServer}";
|
||
$wgDBuser = "${config.dbUser}";
|
||
$wgDBpassword = "${config.dbPassword}";
|
||
$wgDBname = "${config.dbName}";
|
||
|
||
# E-mail.
|
||
$wgEmergencyContact = "${config.emergencyContact}";
|
||
$wgPasswordSender = "${config.passwordSender}";
|
||
|
||
$wgSitename = "${config.siteName}";
|
||
|
||
${optionalString (config.logo != "") ''
|
||
$wgLogo = "${config.logo}";
|
||
''}
|
||
|
||
${optionalString (config.articleUrlPrefix != "") ''
|
||
$wgArticlePath = "${config.articleUrlPrefix}/$1";
|
||
''}
|
||
|
||
${optionalString config.enableUploads ''
|
||
$wgEnableUploads = true;
|
||
$wgUploadDirectory = "${config.uploadDir}";
|
||
''}
|
||
|
||
${optionalString (config.defaultSkin != "") ''
|
||
$wgDefaultSkin = "${config.defaultSkin}";
|
||
''}
|
||
|
||
${config.extraConfig}
|
||
?>
|
||
'';
|
||
|
||
# Unpack Mediawiki and put the config file in its root directory.
|
||
mediawikiRoot = pkgs.stdenv.mkDerivation rec {
|
||
name= "mediawiki-1.29.1";
|
||
|
||
src = pkgs.fetchurl {
|
||
url = "http://download.wikimedia.org/mediawiki/1.29/${name}.tar.gz";
|
||
sha256 = "03mpazbxvb011s2nmlw5p6dc43yjgl5yrsilmj1imyykm57bwb3m";
|
||
};
|
||
|
||
skins = config.skins;
|
||
extensions = config.extensions;
|
||
|
||
buildPhase =
|
||
''
|
||
for skin in $skins; do
|
||
cp -prvd $skin/* skins/
|
||
done
|
||
for extension in $extensions; do
|
||
cp -prvd $extension/* extensions/
|
||
done
|
||
''; # */
|
||
|
||
installPhase =
|
||
''
|
||
mkdir -p $out
|
||
cp -r * $out
|
||
cp ${mediawikiConfig} $out/LocalSettings.php
|
||
sed -i \
|
||
-e 's|/bin/bash|${pkgs.bash}/bin/bash|g' \
|
||
-e 's|/usr/bin/timeout|${pkgs.coreutils}/bin/timeout|g' \
|
||
$out/includes/limit.sh \
|
||
$out/includes/GlobalFunctions.php
|
||
'';
|
||
};
|
||
|
||
mediawikiScripts = pkgs.runCommand "mediawiki-${config.id}-scripts"
|
||
{ buildInputs = [ pkgs.makeWrapper ]; }
|
||
''
|
||
mkdir -p $out/bin
|
||
for i in changePassword.php createAndPromote.php userOptions.php edit.php nukePage.php update.php; do
|
||
makeWrapper ${php}/bin/php $out/bin/mediawiki-${config.id}-$(basename $i .php) \
|
||
--add-flags ${mediawikiRoot}/maintenance/$i
|
||
done
|
||
'';
|
||
|
||
in
|
||
|
||
{
|
||
|
||
extraConfig =
|
||
''
|
||
${optionalString config.enableUploads ''
|
||
Alias ${config.urlPrefix}/images ${config.uploadDir}
|
||
|
||
<Directory ${config.uploadDir}>
|
||
${allGranted}
|
||
Options -Indexes
|
||
</Directory>
|
||
''}
|
||
|
||
${if config.urlPrefix != "" then "Alias ${config.urlPrefix} ${mediawikiRoot}" else ''
|
||
RewriteEngine On
|
||
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
|
||
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
|
||
${concatMapStringsSep "\n" (u: "RewriteCond %{REQUEST_URI} !^${u.urlPath}") serverInfo.vhostConfig.servedDirs}
|
||
${concatMapStringsSep "\n" (u: "RewriteCond %{REQUEST_URI} !^${u.urlPath}") serverInfo.vhostConfig.servedFiles}
|
||
RewriteRule ${if config.enableUploads
|
||
then "!^/images"
|
||
else "^.*\$"
|
||
} %{DOCUMENT_ROOT}/${if config.articleUrlPrefix == ""
|
||
then ""
|
||
else "${config.articleUrlPrefix}/"
|
||
}index.php [L]
|
||
''}
|
||
|
||
<Directory ${mediawikiRoot}>
|
||
${allGranted}
|
||
DirectoryIndex index.php
|
||
</Directory>
|
||
|
||
${optionalString (config.articleUrlPrefix != "") ''
|
||
Alias ${config.articleUrlPrefix} ${mediawikiRoot}/index.php
|
||
''}
|
||
'';
|
||
|
||
documentRoot = if config.urlPrefix == "" then mediawikiRoot else null;
|
||
|
||
enablePHP = true;
|
||
|
||
options = {
|
||
|
||
id = mkOption {
|
||
default = "main";
|
||
description = ''
|
||
A unique identifier necessary to keep multiple MediaWiki server
|
||
instances on the same machine apart. This is used to
|
||
disambiguate the administrative scripts, which get names like
|
||
mediawiki-$id-change-password.
|
||
'';
|
||
};
|
||
|
||
dbType = mkOption {
|
||
default = "postgres";
|
||
example = "mysql";
|
||
description = "Database type.";
|
||
};
|
||
|
||
dbName = mkOption {
|
||
default = "mediawiki";
|
||
description = "Name of the database that holds the MediaWiki data.";
|
||
};
|
||
|
||
dbServer = mkOption {
|
||
default = ""; # use a Unix domain socket
|
||
example = "10.0.2.2";
|
||
description = ''
|
||
The location of the database server. Leave empty to use a
|
||
database server running on the same machine through a Unix
|
||
domain socket.
|
||
'';
|
||
};
|
||
|
||
dbUser = mkOption {
|
||
default = "mediawiki";
|
||
description = "The user name for accessing the database.";
|
||
};
|
||
|
||
dbPassword = mkOption {
|
||
default = "";
|
||
example = "foobar";
|
||
description = ''
|
||
The password of the database user. Warning: this is stored in
|
||
cleartext in the Nix store!
|
||
'';
|
||
};
|
||
|
||
emergencyContact = mkOption {
|
||
default = serverInfo.serverConfig.adminAddr;
|
||
example = "admin@example.com";
|
||
description = ''
|
||
Emergency contact e-mail address. Defaults to the Apache
|
||
admin address.
|
||
'';
|
||
};
|
||
|
||
passwordSender = mkOption {
|
||
default = serverInfo.serverConfig.adminAddr;
|
||
example = "password@example.com";
|
||
description = ''
|
||
E-mail address from which password confirmations originate.
|
||
Defaults to the Apache admin address.
|
||
'';
|
||
};
|
||
|
||
siteName = mkOption {
|
||
default = "MediaWiki";
|
||
example = "Foobar Wiki";
|
||
description = "Name of the wiki";
|
||
};
|
||
|
||
logo = mkOption {
|
||
default = "";
|
||
example = "/images/logo.png";
|
||
description = "The URL of the site's logo (which should be a 135x135px image).";
|
||
};
|
||
|
||
urlPrefix = mkOption {
|
||
default = "/w";
|
||
description = ''
|
||
The URL prefix under which the Mediawiki service appears.
|
||
'';
|
||
};
|
||
|
||
articleUrlPrefix = mkOption {
|
||
default = "/wiki";
|
||
example = "";
|
||
description = ''
|
||
The URL prefix under which article pages appear,
|
||
e.g. http://server/wiki/Page. Leave empty to use the main URL
|
||
prefix, e.g. http://server/w/index.php?title=Page.
|
||
'';
|
||
};
|
||
|
||
enableUploads = mkOption {
|
||
default = false;
|
||
description = "Whether to enable file uploads.";
|
||
};
|
||
|
||
uploadDir = mkOption {
|
||
default = throw "You must specify `uploadDir'.";
|
||
example = "/data/mediawiki-upload";
|
||
description = "The directory that stores uploaded files.";
|
||
};
|
||
|
||
defaultSkin = mkOption {
|
||
default = "";
|
||
example = "nostalgia";
|
||
description = "Set this value to change the default skin used by MediaWiki.";
|
||
};
|
||
|
||
skins = mkOption {
|
||
default = [];
|
||
type = types.listOf types.path;
|
||
description =
|
||
''
|
||
List of paths whose content is copied to the ‘skins’
|
||
subdirectory of the MediaWiki installation.
|
||
'';
|
||
};
|
||
|
||
extensions = mkOption {
|
||
default = [];
|
||
type = types.listOf types.path;
|
||
description =
|
||
''
|
||
List of paths whose content is copied to the 'extensions'
|
||
subdirectory of the MediaWiki installation.
|
||
'';
|
||
};
|
||
|
||
extraConfig = mkOption {
|
||
type = types.lines;
|
||
default = "";
|
||
example =
|
||
''
|
||
$wgEnableEmail = false;
|
||
'';
|
||
description = ''
|
||
Any additional text to be appended to MediaWiki's
|
||
configuration file. This is a PHP script. For configuration
|
||
settings, see <link xlink:href='http://www.mediawiki.org/wiki/Manual:Configuration_settings'/>.
|
||
'';
|
||
};
|
||
|
||
};
|
||
|
||
extraPath = [ mediawikiScripts ];
|
||
|
||
# !!! Need to specify that Apache has a dependency on PostgreSQL!
|
||
|
||
startupScript = pkgs.writeScript "mediawiki_startup.sh"
|
||
# Initialise the database automagically if we're using a Postgres
|
||
# server on localhost.
|
||
(optionalString (config.dbType == "postgres" && config.dbServer == "") ''
|
||
if ! ${pkgs.postgresql}/bin/psql -l | grep -q ' ${config.dbName} ' ; then
|
||
${pkgs.postgresql}/bin/createuser --no-superuser --no-createdb --no-createrole "${config.dbUser}" || true
|
||
${pkgs.postgresql}/bin/createdb "${config.dbName}" -O "${config.dbUser}"
|
||
( echo 'CREATE LANGUAGE plpgsql;'
|
||
cat ${mediawikiRoot}/maintenance/postgres/tables.sql
|
||
echo 'CREATE TEXT SEARCH CONFIGURATION public.default ( COPY = pg_catalog.english );'
|
||
echo COMMIT
|
||
) | ${pkgs.postgresql}/bin/psql -U "${config.dbUser}" "${config.dbName}"
|
||
fi
|
||
${php}/bin/php ${mediawikiRoot}/maintenance/update.php
|
||
'');
|
||
|
||
robotsEntries = optionalString (config.articleUrlPrefix != "")
|
||
''
|
||
User-agent: *
|
||
Disallow: ${config.urlPrefix}/
|
||
Disallow: ${config.articleUrlPrefix}/Special:Search
|
||
Disallow: ${config.articleUrlPrefix}/Special:Random
|
||
'';
|
||
|
||
}
|