1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.solr;
8
9 # Assemble all jars needed for solr
10 solrJars = pkgs.stdenv.mkDerivation {
11 name = "solr-jars";
12
13 src = pkgs.fetchurl {
14 url = http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.36/bin/apache-tomcat-5.5.36.tar.gz;
15 sha256 = "01mzvh53wrs1p2ym765jwd00gl6kn8f9k3nhdrnhdqr8dhimfb2p";
16 };
17
18 buildPhases = [ "unpackPhase" "installPhase" ];
19
20 installPhase = ''
21 mkdir -p $out/lib
22 cp common/lib/*.jar $out/lib/
23 ln -s ${pkgs.ant}/lib/ant/lib/ant.jar $out/lib/
24 ln -s ${cfg.solrPackage}/lib/ext/* $out/lib/
25 ln -s ${pkgs.jdk.home}/lib/tools.jar $out/lib/
26 '' + optionalString (cfg.extraJars != []) ''
27 for f in ${concatStringsSep " " cfg.extraJars}; do
28 cp $f $out/lib
29 done
30 '';
31 };
32
33in {
34
35 options = {
36 services.solr = {
37 enable = mkOption {
38 type = types.bool;
39 default = false;
40 description = ''
41 Enables the solr service.
42 '';
43 };
44
45 javaPackage = mkOption {
46 type = types.package;
47 default = pkgs.jre;
48 defaultText = "pkgs.jre";
49 description = ''
50 Which Java derivation to use for running solr.
51 '';
52 };
53
54 solrPackage = mkOption {
55 type = types.package;
56 default = pkgs.solr;
57 defaultText = "pkgs.solr";
58 description = ''
59 Which solr derivation to use for running solr.
60 '';
61 };
62
63 extraJars = mkOption {
64 type = types.listOf types.path;
65 default = [];
66 description = ''
67 List of paths pointing to jars. Jars are copied to commonLibFolder to be available to java/solr.
68 '';
69 };
70
71 log4jConfiguration = mkOption {
72 type = types.lines;
73 default = ''
74 log4j.rootLogger=INFO, stdout
75 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
76 log4j.appender.stdout.Target=System.out
77 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
78 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
79 '';
80 description = ''
81 Contents of the <literal>log4j.properties</literal> used. By default,
82 everything is logged to stdout (picked up by systemd) with level INFO.
83 '';
84 };
85
86 user = mkOption {
87 type = types.str;
88 description = ''
89 The user that should run the solr process and.
90 the working directories.
91 '';
92 };
93
94 group = mkOption {
95 type = types.str;
96 description = ''
97 The group that will own the working directory.
98 '';
99 };
100
101 solrHome = mkOption {
102 type = types.str;
103 description = ''
104 The solr home directory. It is your own responsibility to
105 make sure this directory contains a working solr configuration,
106 and is writeable by the the user running the solr service.
107 Failing to do so, the solr will not start properly.
108 '';
109 };
110
111 extraJavaOptions = mkOption {
112 type = types.listOf types.str;
113 default = [];
114 description = ''
115 Extra command line options given to the java process running
116 solr.
117 '';
118 };
119
120 extraWinstoneOptions = mkOption {
121 type = types.listOf types.str;
122 default = [];
123 description = ''
124 Extra command line options given to the Winstone, which is
125 the servlet container hosting solr.
126 '';
127 };
128 };
129 };
130
131 config = mkIf cfg.enable {
132
133 services.winstone.solr = {
134 serviceName = "solr";
135 inherit (cfg) user group javaPackage;
136 warFile = "${cfg.solrPackage}/lib/solr.war";
137 extraOptions = [
138 "--commonLibFolder=${solrJars}/lib"
139 "--useJasper"
140 ] ++ cfg.extraWinstoneOptions;
141 extraJavaOptions = [
142 "-Dsolr.solr.home=${cfg.solrHome}"
143 "-Dlog4j.configuration=file://${pkgs.writeText "log4j.properties" cfg.log4jConfiguration}"
144 ] ++ cfg.extraJavaOptions;
145 };
146
147 };
148
149}