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}