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}