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