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