1{ config, lib, pkgs, serverInfo, ... }:
2
3with lib;
4
5let
6
7 # Build a Subversion instance with Apache modules and Swig/Python bindings.
8 subversion = pkgs.subversion.override {
9 bdbSupport = true;
10 httpServer = true;
11 pythonBindings = true;
12 apacheHttpd = httpd;
13 };
14
15 httpd = serverInfo.serverConfig.package;
16
17 versionPre24 = versionOlder httpd.version "2.4";
18
19in
20
21{
22
23 options = {
24
25 projectsLocation = mkOption {
26 description = "URL path in which Trac projects can be accessed";
27 default = "/projects";
28 };
29
30 projects = mkOption {
31 description = "List of projects that should be provided by Trac. If they are not defined yet empty projects are created.";
32 default = [];
33 example =
34 [ { identifier = "myproject";
35 name = "My Project";
36 databaseURL="postgres://root:password@/tracdb";
37 subversionRepository="/data/subversion/myproject";
38 }
39 ];
40 };
41
42 user = mkOption {
43 default = "wwwrun";
44 description = "User account under which Trac runs.";
45 };
46
47 group = mkOption {
48 default = "wwwrun";
49 description = "Group under which Trac runs.";
50 };
51
52 ldapAuthentication = {
53 enable = mkOption {
54 default = false;
55 description = "Enable the ldap authentication in trac";
56 };
57
58 url = mkOption {
59 default = "ldap://127.0.0.1/dc=example,dc=co,dc=ke?uid?sub?(objectClass=inetOrgPerson)";
60 description = "URL of the LDAP authentication";
61 };
62
63 name = mkOption {
64 default = "Trac server";
65 description = "AuthName";
66 };
67 };
68
69 };
70
71 extraModules = singleton
72 { name = "python"; path = "${pkgs.mod_python}/modules/mod_python.so"; };
73
74 extraConfig = ''
75 <Location ${config.projectsLocation}>
76 SetHandler mod_python
77 PythonHandler trac.web.modpython_frontend
78 PythonOption TracEnvParentDir /var/trac/projects
79 PythonOption TracUriRoot ${config.projectsLocation}
80 PythonOption PYTHON_EGG_CACHE /var/trac/egg-cache
81 </Location>
82 ${if config.ldapAuthentication.enable then ''
83 <LocationMatch "^${config.projectsLocation}[^/]+/login$">
84 AuthType Basic
85 AuthName "${config.ldapAuthentication.name}"
86 AuthBasicProvider "ldap"
87 AuthLDAPURL "${config.ldapAuthentication.url}"
88 ${if versionPre24 then "authzldapauthoritative Off" else ""}
89 require valid-user
90 </LocationMatch>
91 '' else ""}
92 '';
93
94 globalEnvVars = singleton
95 { name = "PYTHONPATH";
96 value =
97 makeSearchPathOutput "lib" "lib/${pkgs.python.libPrefix}/site-packages"
98 [ pkgs.mod_python
99 pkgs.pythonPackages.trac
100 pkgs.pythonPackages.setuptools
101 pkgs.pythonPackages.genshi
102 pkgs.pythonPackages.psycopg2
103 subversion
104 ];
105 };
106
107 startupScript = pkgs.writeScript "activateTrac" ''
108 mkdir -p /var/trac
109 chown ${config.user}:${config.group} /var/trac
110
111 ${concatMapStrings (project:
112 ''
113 if [ ! -d /var/trac/${project.identifier} ]
114 then
115 export PYTHONPATH=${pkgs.pythonPackages.psycopg2}/lib/${pkgs.python.libPrefix}/site-packages
116 ${pkgs.pythonPackages.trac}/bin/trac-admin /var/trac/${project.identifier} initenv "${project.name}" "${project.databaseURL}" svn "${project.subversionRepository}"
117 fi
118 '' ) (config.projects)}
119 '';
120
121}