2015-06-08 23:11:24 +01:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
cfg = config.services.gitit;
|
|
|
|
|
|
|
|
homeDir = "/var/lib/gitit";
|
|
|
|
|
2015-08-03 21:27:42 +01:00
|
|
|
toYesNo = b: if b then "yes" else "no";
|
|
|
|
|
2015-06-08 23:11:24 +01:00
|
|
|
gititShared = with cfg.haskellPackages; gitit + "/share/" + pkgs.stdenv.system + "-" + ghc.name + "/" + gitit.pname + "-" + gitit.version;
|
|
|
|
|
|
|
|
gititWithPkgs = hsPkgs: extras: hsPkgs.ghcWithPackages (self: with self; [ gitit ] ++ (extras self));
|
|
|
|
|
|
|
|
gititSh = hsPkgs: extras: with pkgs; let
|
|
|
|
env = gititWithPkgs hsPkgs extras;
|
|
|
|
in writeScript "gitit" ''
|
|
|
|
#!${stdenv.shell}
|
|
|
|
cd $HOME
|
|
|
|
export NIX_GHC="${env}/bin/ghc"
|
|
|
|
export NIX_GHCPKG="${env}/bin/ghc-pkg"
|
|
|
|
export NIX_GHC_DOCDIR="${env}/share/doc/ghc/html"
|
|
|
|
export NIX_GHC_LIBDIR=$( $NIX_GHC --print-libdir )
|
|
|
|
${env}/bin/gitit -f ${configFile}
|
|
|
|
'';
|
|
|
|
|
2015-08-03 21:27:42 +01:00
|
|
|
gititOptions = {
|
2015-06-08 23:11:24 +01:00
|
|
|
|
|
|
|
enable = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
description = "Enable the gitit service.";
|
|
|
|
};
|
|
|
|
|
|
|
|
haskellPackages = mkOption {
|
|
|
|
defaultText = "pkgs.haskellPackages";
|
|
|
|
example = literalExample "pkgs.haskell.packages.ghc784";
|
|
|
|
description = "haskellPackages used to build gitit and plugins.";
|
|
|
|
};
|
|
|
|
|
|
|
|
extraPackages = mkOption {
|
|
|
|
default = self: [];
|
|
|
|
example = literalExample ''
|
|
|
|
haskellPackages: [
|
|
|
|
haskellPackages.wreq
|
|
|
|
]
|
|
|
|
'';
|
|
|
|
description = ''
|
|
|
|
Extra packages available to ghc when running gitit. The
|
|
|
|
value must be a function which receives the attrset defined
|
|
|
|
in <varname>haskellPackages</varname> as the sole argument.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
address = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "0.0.0.0";
|
|
|
|
description = "IP address on which the web server will listen.";
|
|
|
|
};
|
|
|
|
|
|
|
|
port = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 5001;
|
|
|
|
description = "Port on which the web server will run.";
|
|
|
|
};
|
|
|
|
|
|
|
|
wikiTitle = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "Gitit!";
|
|
|
|
description = "The wiki title.";
|
|
|
|
};
|
|
|
|
|
|
|
|
repositoryType = mkOption {
|
|
|
|
type = types.enum ["git" "darcs" "mercurial"];
|
|
|
|
default = "git";
|
|
|
|
description = "Specifies the type of repository used for wiki content.";
|
|
|
|
};
|
|
|
|
|
|
|
|
repositoryPath = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = homeDir + "/wiki";
|
|
|
|
description = ''
|
|
|
|
Specifies the path of the repository directory. If it does not
|
|
|
|
exist, gitit will create it on startup.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
requireAuthentication = mkOption {
|
|
|
|
type = types.enum [ "none" "modify" "read" ];
|
|
|
|
default = "modify";
|
|
|
|
description = ''
|
|
|
|
If 'none', login is never required, and pages can be edited
|
|
|
|
anonymously. If 'modify', login is required to modify the wiki
|
|
|
|
(edit, add, delete pages, upload files). If 'read', login is
|
|
|
|
required to see any wiki pages.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
authenticationMethod = mkOption {
|
2015-09-10 15:49:09 +01:00
|
|
|
type = types.enum [ "form" "http" "generic" "github" ];
|
2015-06-08 23:11:24 +01:00
|
|
|
default = "form";
|
|
|
|
description = ''
|
|
|
|
'form' means that users will be logged in and registered using forms
|
|
|
|
in the gitit web interface. 'http' means that gitit will assume that
|
|
|
|
HTTP authentication is in place and take the logged in username from
|
|
|
|
the "Authorization" field of the HTTP request header (in addition,
|
|
|
|
the login/logout and registration links will be suppressed).
|
|
|
|
'generic' means that gitit will assume that some form of
|
|
|
|
authentication is in place that directly sets REMOTE_USER to the name
|
|
|
|
of the authenticated user (e.g. mod_auth_cas on apache). 'rpx' means
|
|
|
|
that gitit will attempt to log in through https://rpxnow.com. This
|
|
|
|
requires that 'rpx-domain', 'rpx-key', and 'base-url' be set below,
|
|
|
|
and that 'curl' be in the system path.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
userFile = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = homeDir + "/gitit-users";
|
|
|
|
description = ''
|
|
|
|
Specifies the path of the file containing user login information. If
|
|
|
|
it does not exist, gitit will create it (with an empty user list).
|
|
|
|
This file is not used if 'http' is selected for
|
|
|
|
authentication-method.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
sessionTimeout = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 60;
|
|
|
|
description = ''
|
|
|
|
Number of minutes of inactivity before a session expires.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
staticDir = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
description = ''
|
|
|
|
Specifies the path of the static directory (containing javascript,
|
|
|
|
css, and images). If it does not exist, gitit will create it and
|
|
|
|
populate it with required scripts, stylesheets, and images.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
defaultPageType = mkOption {
|
|
|
|
type = types.enum [ "markdown" "rst" "latex" "html" "markdown+lhs" "rst+lhs" "latex+lhs" ];
|
|
|
|
default = "markdown";
|
|
|
|
description = ''
|
|
|
|
Specifies the type of markup used to interpret pages in the wiki.
|
|
|
|
Possible values are markdown, rst, latex, html, markdown+lhs,
|
|
|
|
rst+lhs, and latex+lhs. (the +lhs variants treat the input as
|
|
|
|
literate Haskell. See pandoc's documentation for more details.) If
|
|
|
|
Markdown is selected, pandoc's syntax extensions (for footnotes,
|
|
|
|
delimited code blocks, etc.) will be enabled. Note that pandoc's
|
|
|
|
restructuredtext parser is not complete, so some pages may not be
|
|
|
|
rendered correctly if rst is selected. The same goes for latex and
|
|
|
|
html.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
math = mkOption {
|
|
|
|
type = types.enum [ "mathml" "raw" "mathjax" "jsmath" "google" ];
|
|
|
|
default = "mathml";
|
|
|
|
description = ''
|
|
|
|
Specifies how LaTeX math is to be displayed. Possible values are
|
|
|
|
mathml, raw, mathjax, jsmath, and google. If mathml is selected,
|
|
|
|
gitit will convert LaTeX math to MathML and link in a script,
|
|
|
|
MathMLinHTML.js, that allows the MathML to be seen in Gecko browsers,
|
|
|
|
IE + mathplayer, and Opera. In other browsers you may get a jumble of
|
|
|
|
characters. If raw is selected, the LaTeX math will be displayed as
|
|
|
|
raw LaTeX math. If mathjax is selected, gitit will link to the
|
|
|
|
remote mathjax script. If jsMath is selected, gitit will link to the
|
|
|
|
script /js/jsMath/easy/load.js, and will assume that jsMath has been
|
|
|
|
installed into the js/jsMath directory. This is the most portable
|
|
|
|
solution. If google is selected, the google chart API is called to
|
|
|
|
render the formula as an image. This requires a connection to google,
|
|
|
|
and might raise a technical or a privacy problem.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
mathJaxScript = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "https://d3eoax9i5htok0.cloudfront.net/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
|
|
|
|
description = ''
|
|
|
|
Specifies the path to MathJax rendering script. You might want to
|
|
|
|
use your own MathJax script to render formulas without Internet
|
|
|
|
connection or if you want to use some special LaTeX packages. Note:
|
|
|
|
path specified there cannot be an absolute path to a script on your
|
|
|
|
hdd, instead you should run your (local if you wish) HTTP server
|
|
|
|
which will serve the MathJax.js script. You can easily (in four lines
|
|
|
|
of code) serve MathJax.js using
|
|
|
|
http://happstack.com/docs/crashcourse/FileServing.html Do not forget
|
|
|
|
the "http://" prefix (e.g. http://localhost:1234/MathJax.js).
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
showLhsBirdTracks = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
|
|
|
Specifies whether to show Haskell code blocks in "bird style", with
|
|
|
|
"> " at the beginning of each line.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
templatesDir = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
description = ''
|
|
|
|
Specifies the path of the directory containing page templates. If it
|
|
|
|
does not exist, gitit will create it with default templates. Users
|
|
|
|
may wish to edit the templates to customize the appearance of their
|
|
|
|
wiki. The template files are HStringTemplate templates. Variables to
|
|
|
|
be interpolated appear between $\'s. Literal $\'s must be
|
|
|
|
backslash-escaped.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
logFile = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = homeDir + "/gitit.log";
|
|
|
|
description = ''
|
|
|
|
Specifies the path of gitit's log file. If it does not exist, gitit
|
|
|
|
will create it. The log is in Apache combined log format.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
logLevel = mkOption {
|
|
|
|
type = types.enum [ "DEBUG" "INFO" "NOTICE" "WARNING" "ERROR" "CRITICAL" "ALERT" "EMERGENCY" ];
|
|
|
|
default = "ERROR";
|
|
|
|
description = ''
|
|
|
|
Determines how much information is logged. Possible values (from
|
|
|
|
most to least verbose) are DEBUG, INFO, NOTICE, WARNING, ERROR,
|
|
|
|
CRITICAL, ALERT, EMERGENCY.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
frontPage = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "Front Page";
|
|
|
|
description = ''
|
|
|
|
Specifies which wiki page is to be used as the wiki's front page.
|
|
|
|
Gitit creates a default front page on startup, if one does not exist
|
|
|
|
already.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
noDelete = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "Front Page, Help";
|
|
|
|
description = ''
|
|
|
|
Specifies pages that cannot be deleted through the web interface.
|
|
|
|
(They can still be deleted directly using git or darcs.) A
|
|
|
|
comma-separated list of page names. Leave blank to allow every page
|
|
|
|
to be deleted.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
noEdit = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "Help";
|
|
|
|
description = ''
|
|
|
|
Specifies pages that cannot be edited through the web interface.
|
|
|
|
Leave blank to allow every page to be edited.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
defaultSummary = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "";
|
|
|
|
description = ''
|
|
|
|
Specifies text to be used in the change description if the author
|
|
|
|
leaves the "description" field blank. If default-summary is blank
|
|
|
|
(the default), the author will be required to fill in the description
|
|
|
|
field.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
tableOfContents = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = true;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
|
|
|
Specifies whether to print a tables of contents (with links to
|
|
|
|
sections) on each wiki page.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
plugins = mkOption {
|
2015-08-03 21:27:43 +01:00
|
|
|
type = with types; listOf str;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
2015-08-03 21:27:43 +01:00
|
|
|
Specifies a list of plugins to load. Plugins may be specified either
|
|
|
|
by their path or by their module name. If the plugin name starts
|
2015-06-08 23:11:24 +01:00
|
|
|
with Gitit.Plugin., gitit will assume that the plugin is an installed
|
|
|
|
module and will not try to find a source file.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
useCache = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
|
|
|
Specifies whether to cache rendered pages. Note that if use-feed is
|
|
|
|
selected, feeds will be cached regardless of the value of use-cache.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
cacheDir = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = homeDir + "/cache";
|
|
|
|
description = "Path where rendered pages will be cached.";
|
|
|
|
};
|
|
|
|
|
|
|
|
maxUploadSize = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "1000K";
|
|
|
|
description = ''
|
|
|
|
Specifies an upper limit on the size (in bytes) of files uploaded
|
|
|
|
through the wiki's web interface. To disable uploads, set this to
|
|
|
|
0K. This will result in the uploads link disappearing and the
|
|
|
|
_upload url becoming inactive.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
maxPageSize = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "1000K";
|
|
|
|
description = "Specifies an upper limit on the size (in bytes) of pages.";
|
|
|
|
};
|
|
|
|
|
|
|
|
debugMode = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = "Causes debug information to be logged while gitit is running.";
|
|
|
|
};
|
|
|
|
|
|
|
|
compressResponses = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = true;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = "Specifies whether HTTP responses should be compressed.";
|
|
|
|
};
|
|
|
|
|
|
|
|
mimeTypesFile = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = "/etc/mime/types.info";
|
|
|
|
description = ''
|
|
|
|
Specifies the path of a file containing mime type mappings. Each
|
|
|
|
line of the file should contain two fields, separated by whitespace.
|
|
|
|
The first field is the mime type, the second is a file extension.
|
|
|
|
For example:
|
2015-08-03 21:27:43 +01:00
|
|
|
<programlisting>
|
|
|
|
video/x-ms-wmx wmx
|
|
|
|
</programlisting>
|
2015-06-08 23:11:24 +01:00
|
|
|
If the file is not found, some simple defaults will be used.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
useReCaptcha = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
2015-08-03 21:27:42 +01:00
|
|
|
If true, causes gitit to use the reCAPTCHA service
|
2015-06-08 23:11:24 +01:00
|
|
|
(http://recaptcha.net) to prevent bots from creating accounts.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
reCaptchaPrivateKey = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
Specifies the private key for the reCAPTCHA service. To get
|
|
|
|
these, you need to create an account at http://recaptcha.net.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
reCaptchaPublicKey = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
Specifies the public key for the reCAPTCHA service. To get
|
|
|
|
these, you need to create an account at http://recaptcha.net.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
accessQuestion = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "What is the code given to you by Ms. X?";
|
|
|
|
description = ''
|
|
|
|
Specifies a question that users must answer when they attempt to
|
|
|
|
create an account
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
accessQuestionAnswers = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "RED DOG, red dog";
|
|
|
|
description = ''
|
|
|
|
Specifies a question that users must answer when they attempt to
|
|
|
|
create an account, along with a comma-separated list of acceptable
|
|
|
|
answers. This can be used to institute a rudimentary password for
|
|
|
|
signing up as a user on the wiki, or as an alternative to reCAPTCHA.
|
|
|
|
Example:
|
|
|
|
access-question: What is the code given to you by Ms. X?
|
|
|
|
access-question-answers: RED DOG, red dog
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
rpxDomain = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
Specifies the domain and key of your RPX account. The domain is just
|
|
|
|
the prefix of the complete RPX domain, so if your full domain is
|
|
|
|
'https://foo.rpxnow.com/', use 'foo' as the value of rpx-domain.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
rpxKey = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "RPX account access key.";
|
|
|
|
};
|
|
|
|
|
|
|
|
mailCommand = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "sendmail %s";
|
|
|
|
description = ''
|
|
|
|
Specifies the command to use to send notification emails. '%s' will
|
|
|
|
be replaced by the destination email address. The body of the
|
|
|
|
message will be read from stdin. If this field is left blank,
|
|
|
|
password reset will not be offered.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
resetPasswordMessage = mkOption {
|
|
|
|
type = types.lines;
|
|
|
|
default = ''
|
|
|
|
> From: gitit@$hostname$
|
|
|
|
> To: $useremail$
|
|
|
|
> Subject: Wiki password reset
|
|
|
|
>
|
|
|
|
> Hello $username$,
|
|
|
|
>
|
|
|
|
> To reset your password, please follow the link below:
|
|
|
|
> http://$hostname$:$port$$resetlink$
|
|
|
|
>
|
|
|
|
> Regards
|
|
|
|
'';
|
|
|
|
description = ''
|
|
|
|
Gives the text of the message that will be sent to the user should
|
|
|
|
she want to reset her password, or change other registration info.
|
|
|
|
The lines must be indented, and must begin with '>'. The initial
|
|
|
|
spaces and '> ' will be stripped off. $username$ will be replaced by
|
|
|
|
the user's username, $useremail$ by her email address, $hostname$ by
|
|
|
|
the hostname on which the wiki is running (as returned by the
|
|
|
|
hostname system call), $port$ by the port on which the wiki is
|
|
|
|
running, and $resetlink$ by the relative path of a reset link derived
|
|
|
|
from the user's existing hashed password. If your gitit wiki is being
|
|
|
|
proxied to a location other than the root path of $port$, you should
|
|
|
|
change the link to reflect this: for example, to
|
|
|
|
http://$hostname$/path/to/wiki$resetlink$ or
|
|
|
|
http://gitit.$hostname$$resetlink$
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
useFeed = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
|
|
|
Specifies whether an ATOM feed should be enabled (for the site and
|
|
|
|
for individual pages).
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
baseUrl = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
The base URL of the wiki, to be used in constructing feed IDs and RPX
|
2015-08-03 21:27:43 +01:00
|
|
|
token_urls. Set this if useFeed is false or authentication-method
|
2015-06-08 23:11:24 +01:00
|
|
|
is 'rpx'.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
absoluteUrls = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
|
|
|
Make wikilinks absolute with respect to the base-url. So, for
|
|
|
|
example, in a wiki served at the base URL '/wiki', on a page
|
|
|
|
Sub/Page, the wikilink '[Cactus]()' will produce a link to
|
2015-08-03 21:27:43 +01:00
|
|
|
'/wiki/Cactus' if absoluteUrls is true, and a relative link to
|
2015-06-08 23:11:24 +01:00
|
|
|
'Cactus' (referring to '/wiki/Sub/Cactus') if absolute-urls is 'no'.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
feedDays = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 14;
|
|
|
|
description = "Number of days to be included in feeds.";
|
|
|
|
};
|
|
|
|
|
|
|
|
feedRefreshTime = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 60;
|
|
|
|
description = "Number of minutes to cache feeds before refreshing.";
|
|
|
|
};
|
|
|
|
|
|
|
|
pdfExport = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
2015-08-03 21:27:43 +01:00
|
|
|
If true, PDF will appear in export options. PDF will be created using
|
2015-06-08 23:11:24 +01:00
|
|
|
pdflatex, which must be installed and in the path. Note that PDF
|
|
|
|
exports create significant additional server load.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
pandocUserData = mkOption {
|
|
|
|
type = with types; nullOr path;
|
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
If a directory is specified, this will be searched for pandoc
|
|
|
|
customizations. These can include a templates/ directory for custom
|
|
|
|
templates for various export formats, an S5 directory for custom S5
|
|
|
|
styles, and a reference.odt for ODT exports. If no directory is
|
|
|
|
specified, $HOME/.pandoc will be searched. See pandoc's README for
|
|
|
|
more information.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
xssSanitize = mkOption {
|
2015-08-03 21:27:42 +01:00
|
|
|
type = types.bool;
|
|
|
|
default = true;
|
2015-06-08 23:11:24 +01:00
|
|
|
description = ''
|
2015-08-03 21:27:43 +01:00
|
|
|
If true, all HTML (including that produced by pandoc) is filtered
|
2015-06-08 23:11:24 +01:00
|
|
|
through xss-sanitize. Set to no only if you trust all of your users.
|
|
|
|
'';
|
|
|
|
};
|
2015-09-10 15:49:09 +01:00
|
|
|
|
|
|
|
oauthClientId = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "OAuth client ID";
|
|
|
|
};
|
|
|
|
|
|
|
|
oauthClientSecret = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "OAuth client secret";
|
|
|
|
};
|
|
|
|
|
|
|
|
oauthCallback = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "OAuth callback URL";
|
|
|
|
};
|
|
|
|
|
|
|
|
oauthAuthorizeEndpoint = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "OAuth authorize endpoint";
|
|
|
|
};
|
|
|
|
|
|
|
|
oauthAccessTokenEndpoint = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "OAuth access token endpoint";
|
|
|
|
};
|
|
|
|
|
|
|
|
githubOrg = mkOption {
|
|
|
|
type = with types; nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "Github organization";
|
|
|
|
};
|
2015-06-08 23:11:24 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
configFile = pkgs.writeText "gitit.conf" ''
|
|
|
|
address: ${cfg.address}
|
|
|
|
port: ${toString cfg.port}
|
|
|
|
wiki-title: ${cfg.wikiTitle}
|
|
|
|
repository-type: ${cfg.repositoryType}
|
|
|
|
repository-path: ${cfg.repositoryPath}
|
|
|
|
require-authentication: ${cfg.requireAuthentication}
|
|
|
|
authentication-method: ${cfg.authenticationMethod}
|
|
|
|
user-file: ${cfg.userFile}
|
|
|
|
session-timeout: ${toString cfg.sessionTimeout}
|
|
|
|
static-dir: ${cfg.staticDir}
|
|
|
|
default-page-type: ${cfg.defaultPageType}
|
|
|
|
math: ${cfg.math}
|
|
|
|
mathjax-script: ${cfg.mathJaxScript}
|
2015-08-03 21:27:42 +01:00
|
|
|
show-lhs-bird-tracks: ${toYesNo cfg.showLhsBirdTracks}
|
2015-06-08 23:11:24 +01:00
|
|
|
templates-dir: ${cfg.templatesDir}
|
|
|
|
log-file: ${cfg.logFile}
|
|
|
|
log-level: ${cfg.logLevel}
|
|
|
|
front-page: ${cfg.frontPage}
|
|
|
|
no-delete: ${cfg.noDelete}
|
|
|
|
no-edit: ${cfg.noEdit}
|
|
|
|
default-summary: ${cfg.defaultSummary}
|
2015-08-03 21:27:42 +01:00
|
|
|
table-of-contents: ${toYesNo cfg.tableOfContents}
|
2015-08-03 21:27:43 +01:00
|
|
|
plugins: ${concatStringsSep "," cfg.plugins}
|
2015-08-03 21:27:42 +01:00
|
|
|
use-cache: ${toYesNo cfg.useCache}
|
2015-06-08 23:11:24 +01:00
|
|
|
cache-dir: ${cfg.cacheDir}
|
|
|
|
max-upload-size: ${cfg.maxUploadSize}
|
|
|
|
max-page-size: ${cfg.maxPageSize}
|
2015-08-03 21:27:42 +01:00
|
|
|
debug-mode: ${toYesNo cfg.debugMode}
|
|
|
|
compress-responses: ${toYesNo cfg.compressResponses}
|
2015-06-08 23:11:24 +01:00
|
|
|
mime-types-file: ${cfg.mimeTypesFile}
|
2015-08-03 21:27:42 +01:00
|
|
|
use-recaptcha: ${toYesNo cfg.useReCaptcha}
|
2015-06-08 23:11:24 +01:00
|
|
|
recaptcha-private-key: ${toString cfg.reCaptchaPrivateKey}
|
|
|
|
recaptcha-public-key: ${toString cfg.reCaptchaPublicKey}
|
|
|
|
access-question: ${cfg.accessQuestion}
|
|
|
|
access-question-answers: ${cfg.accessQuestionAnswers}
|
|
|
|
rpx-domain: ${toString cfg.rpxDomain}
|
|
|
|
rpx-key: ${toString cfg.rpxKey}
|
|
|
|
mail-command: ${cfg.mailCommand}
|
|
|
|
reset-password-message: ${cfg.resetPasswordMessage}
|
2015-08-03 21:27:42 +01:00
|
|
|
use-feed: ${toYesNo cfg.useFeed}
|
2015-06-08 23:11:24 +01:00
|
|
|
base-url: ${toString cfg.baseUrl}
|
2015-08-03 21:27:42 +01:00
|
|
|
absolute-urls: ${toYesNo cfg.absoluteUrls}
|
2015-06-08 23:11:24 +01:00
|
|
|
feed-days: ${toString cfg.feedDays}
|
|
|
|
feed-refresh-time: ${toString cfg.feedRefreshTime}
|
2015-08-03 21:27:42 +01:00
|
|
|
pdf-export: ${toYesNo cfg.pdfExport}
|
2015-06-08 23:11:24 +01:00
|
|
|
pandoc-user-data: ${toString cfg.pandocUserData}
|
2015-08-03 21:27:42 +01:00
|
|
|
xss-sanitize: ${toYesNo cfg.xssSanitize}
|
2015-09-10 15:49:09 +01:00
|
|
|
|
|
|
|
[Github]
|
2015-09-10 18:23:31 +01:00
|
|
|
oauthclientid: ${toString cfg.oauthClientId}
|
|
|
|
oauthclientsecret: ${toString cfg.oauthClientSecret}
|
|
|
|
oauthcallback: ${toString cfg.oauthCallback}
|
|
|
|
oauthauthorizeendpoint: ${toString cfg.oauthAuthorizeEndpoint}
|
|
|
|
oauthaccesstokenendpoint: ${toString cfg.oauthAccessTokenEndpoint}
|
|
|
|
github-org: ${toString cfg.githubOrg}
|
2015-06-08 23:11:24 +01:00
|
|
|
'';
|
|
|
|
|
|
|
|
in
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
options.services.gitit = gititOptions;
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
|
2015-07-28 09:25:31 +01:00
|
|
|
services.gitit = {
|
|
|
|
haskellPackages = mkDefault pkgs.haskellPackages;
|
|
|
|
staticDir = gititShared + "/data/static";
|
|
|
|
templatesDir = gititShared + "/data/templates";
|
2015-08-03 21:27:43 +01:00
|
|
|
plugins = [ ];
|
2015-07-28 09:25:31 +01:00
|
|
|
};
|
|
|
|
|
2015-06-08 23:11:24 +01:00
|
|
|
users.extraUsers.gitit = {
|
|
|
|
group = config.users.extraGroups.gitit.name;
|
|
|
|
description = "Gitit user";
|
|
|
|
home = homeDir;
|
|
|
|
createHome = true;
|
|
|
|
uid = config.ids.uids.gitit;
|
|
|
|
};
|
|
|
|
|
|
|
|
users.extraGroups.gitit.gid = config.ids.gids.gitit;
|
|
|
|
|
|
|
|
systemd.services.gitit = let
|
|
|
|
uid = toString config.ids.uids.gitit;
|
|
|
|
gid = toString config.ids.gids.gitit;
|
|
|
|
in {
|
|
|
|
description = "Git and Pandoc Powered Wiki";
|
|
|
|
after = [ "network.target" ];
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2015-08-03 21:27:43 +01:00
|
|
|
path = with pkgs; [ curl ]
|
|
|
|
++ optional cfg.pdfExport texLiveFull
|
|
|
|
++ optional (cfg.repositoryType == "darcs") darcs
|
|
|
|
++ optional (cfg.repositoryType == "mercurial") mercurial
|
|
|
|
++ optional (cfg.repositoryType == "git") git;
|
|
|
|
|
|
|
|
preStart = let
|
|
|
|
gm = "gitit@${config.networking.hostName}";
|
|
|
|
in
|
|
|
|
with cfg; ''
|
2015-06-08 23:11:24 +01:00
|
|
|
chown ${uid}:${gid} -R ${homeDir}
|
|
|
|
for dir in ${repositoryPath} ${staticDir} ${templatesDir} ${cacheDir}
|
|
|
|
do
|
|
|
|
if [ ! -d $dir ]
|
|
|
|
then
|
|
|
|
mkdir -p $dir
|
|
|
|
find $dir -type d -exec chmod 0750 {} +
|
|
|
|
find $dir -type f -exec chmod 0640 {} +
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
cd ${repositoryPath}
|
2015-08-03 21:27:43 +01:00
|
|
|
${
|
|
|
|
if repositoryType == "darcs" then
|
|
|
|
''
|
|
|
|
if [ ! -d _darcs ]
|
|
|
|
then
|
|
|
|
${pkgs.darcs}/bin/darcs initialize
|
|
|
|
echo "${gm}" > _darcs/prefs/email
|
|
|
|
''
|
|
|
|
else if repositoryType == "mercurial" then
|
|
|
|
''
|
|
|
|
if [ ! -d .hg ]
|
|
|
|
then
|
|
|
|
${pkgs.mercurial}/bin/hg init
|
|
|
|
cat >> .hg/hgrc <<NAMED
|
|
|
|
[ui]
|
|
|
|
username = gitit ${gm}
|
|
|
|
NAMED
|
|
|
|
''
|
|
|
|
else
|
|
|
|
''
|
|
|
|
if [ ! -d .git ]
|
|
|
|
then
|
|
|
|
${pkgs.git}/bin/git init
|
|
|
|
${pkgs.git}/bin/git config user.email "${gm}"
|
|
|
|
${pkgs.git}/bin/git config user.name "gitit"
|
|
|
|
''}
|
|
|
|
chown ${uid}:${gid} -R ${repositoryPath}
|
|
|
|
fi
|
|
|
|
cd -
|
2015-06-08 23:11:24 +01:00
|
|
|
'';
|
|
|
|
|
|
|
|
serviceConfig = {
|
|
|
|
User = config.users.extraUsers.gitit.name;
|
|
|
|
Group = config.users.extraGroups.gitit.name;
|
|
|
|
ExecStart = with cfg; gititSh haskellPackages extraPackages;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|