|
|
|
@ -6,142 +6,105 @@ let |
|
|
|
|
|
|
|
|
|
cfg = config.services.solr; |
|
|
|
|
|
|
|
|
|
# Assemble all jars needed for solr |
|
|
|
|
solrJars = pkgs.stdenv.mkDerivation { |
|
|
|
|
name = "solr-jars"; |
|
|
|
|
|
|
|
|
|
src = pkgs.fetchurl { |
|
|
|
|
url = http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.36/bin/apache-tomcat-5.5.36.tar.gz; |
|
|
|
|
sha256 = "01mzvh53wrs1p2ym765jwd00gl6kn8f9k3nhdrnhdqr8dhimfb2p"; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
installPhase = '' |
|
|
|
|
mkdir -p $out/lib |
|
|
|
|
cp common/lib/*.jar $out/lib/ |
|
|
|
|
ln -s ${pkgs.ant}/lib/ant/lib/ant.jar $out/lib/ |
|
|
|
|
ln -s ${cfg.solrPackage}/lib/ext/* $out/lib/ |
|
|
|
|
ln -s ${pkgs.jdk.home}/lib/tools.jar $out/lib/ |
|
|
|
|
'' + optionalString (cfg.extraJars != []) '' |
|
|
|
|
for f in ${concatStringsSep " " cfg.extraJars}; do |
|
|
|
|
cp $f $out/lib |
|
|
|
|
done |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
in { |
|
|
|
|
in |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
options = { |
|
|
|
|
services.solr = { |
|
|
|
|
enable = mkOption { |
|
|
|
|
type = types.bool; |
|
|
|
|
default = false; |
|
|
|
|
description = '' |
|
|
|
|
Enables the solr service. |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
javaPackage = mkOption { |
|
|
|
|
type = types.package; |
|
|
|
|
default = pkgs.jre; |
|
|
|
|
defaultText = "pkgs.jre"; |
|
|
|
|
description = '' |
|
|
|
|
Which Java derivation to use for running solr. |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
enable = mkEnableOption "Enables the solr service."; |
|
|
|
|
|
|
|
|
|
solrPackage = mkOption { |
|
|
|
|
package = mkOption { |
|
|
|
|
type = types.package; |
|
|
|
|
default = pkgs.solr; |
|
|
|
|
defaultText = "pkgs.solr"; |
|
|
|
|
description = '' |
|
|
|
|
Which solr derivation to use for running solr. |
|
|
|
|
''; |
|
|
|
|
description = "Which Solr package to use."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
extraJars = mkOption { |
|
|
|
|
type = types.listOf types.path; |
|
|
|
|
default = []; |
|
|
|
|
description = '' |
|
|
|
|
List of paths pointing to jars. Jars are copied to commonLibFolder to be available to java/solr. |
|
|
|
|
''; |
|
|
|
|
port = mkOption { |
|
|
|
|
type = types.int; |
|
|
|
|
default = 8983; |
|
|
|
|
description = "Port on which Solr is ran."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
log4jConfiguration = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = '' |
|
|
|
|
log4j.rootLogger=INFO, stdout |
|
|
|
|
log4j.appender.stdout=org.apache.log4j.ConsoleAppender |
|
|
|
|
log4j.appender.stdout.Target=System.out |
|
|
|
|
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout |
|
|
|
|
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n |
|
|
|
|
''; |
|
|
|
|
description = '' |
|
|
|
|
Contents of the <literal>log4j.properties</literal> used. By default, |
|
|
|
|
everything is logged to stdout (picked up by systemd) with level INFO. |
|
|
|
|
''; |
|
|
|
|
stateDir = mkOption { |
|
|
|
|
type = types.path; |
|
|
|
|
default = "/var/lib/solr"; |
|
|
|
|
description = "The solr home directory containing config, data, and logging files."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
user = mkOption { |
|
|
|
|
type = types.str; |
|
|
|
|
description = '' |
|
|
|
|
The user that should run the solr process and. |
|
|
|
|
the working directories. |
|
|
|
|
''; |
|
|
|
|
extraJavaOptions = mkOption { |
|
|
|
|
type = types.listOf types.str; |
|
|
|
|
default = []; |
|
|
|
|
description = "Extra command line options given to the java process running Solr."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
group = mkOption { |
|
|
|
|
user = mkOption { |
|
|
|
|
type = types.str; |
|
|
|
|
description = '' |
|
|
|
|
The group that will own the working directory. |
|
|
|
|
''; |
|
|
|
|
default = "solr"; |
|
|
|
|
description = "User under which Solr is ran."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
solrHome = mkOption { |
|
|
|
|
group = mkOption { |
|
|
|
|
type = types.str; |
|
|
|
|
description = '' |
|
|
|
|
The solr home directory. It is your own responsibility to |
|
|
|
|
make sure this directory contains a working solr configuration, |
|
|
|
|
and is writeable by the the user running the solr service. |
|
|
|
|
Failing to do so, the solr will not start properly. |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
extraJavaOptions = mkOption { |
|
|
|
|
type = types.listOf types.str; |
|
|
|
|
default = []; |
|
|
|
|
description = '' |
|
|
|
|
Extra command line options given to the java process running |
|
|
|
|
solr. |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
extraWinstoneOptions = mkOption { |
|
|
|
|
type = types.listOf types.str; |
|
|
|
|
default = []; |
|
|
|
|
description = '' |
|
|
|
|
Extra command line options given to the Winstone, which is |
|
|
|
|
the servlet container hosting solr. |
|
|
|
|
''; |
|
|
|
|
default = "solr"; |
|
|
|
|
description = "Group under which Solr is ran."; |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
config = mkIf cfg.enable { |
|
|
|
|
|
|
|
|
|
services.winstone.solr = { |
|
|
|
|
serviceName = "solr"; |
|
|
|
|
inherit (cfg) user group javaPackage; |
|
|
|
|
warFile = "${cfg.solrPackage}/lib/solr.war"; |
|
|
|
|
extraOptions = [ |
|
|
|
|
"--commonLibFolder=${solrJars}/lib" |
|
|
|
|
"--useJasper" |
|
|
|
|
] ++ cfg.extraWinstoneOptions; |
|
|
|
|
extraJavaOptions = [ |
|
|
|
|
"-Dsolr.solr.home=${cfg.solrHome}" |
|
|
|
|
"-Dlog4j.configuration=file://${pkgs.writeText "log4j.properties" cfg.log4jConfiguration}" |
|
|
|
|
] ++ cfg.extraJavaOptions; |
|
|
|
|
environment.systemPackages = [ cfg.package ]; |
|
|
|
|
|
|
|
|
|
systemd.services.solr = { |
|
|
|
|
after = [ "network.target" "remote-fs.target" "nss-lookup.target" "systemd-journald-dev-log.socket" ]; |
|
|
|
|
wantedBy = [ "multi-user.target" ]; |
|
|
|
|
|
|
|
|
|
environment = { |
|
|
|
|
SOLR_HOME = "${cfg.stateDir}/data"; |
|
|
|
|
LOG4J_PROPS = "${cfg.stateDir}/log4j2.xml"; |
|
|
|
|
SOLR_LOGS_DIR = "${cfg.stateDir}/logs"; |
|
|
|
|
SOLR_PORT = "${toString cfg.port}"; |
|
|
|
|
}; |
|
|
|
|
path = with pkgs; [ |
|
|
|
|
gawk |
|
|
|
|
procps |
|
|
|
|
]; |
|
|
|
|
preStart = '' |
|
|
|
|
mkdir -p "${cfg.stateDir}/data"; |
|
|
|
|
mkdir -p "${cfg.stateDir}/logs"; |
|
|
|
|
|
|
|
|
|
if ! test -e "${cfg.stateDir}/data/solr.xml"; then |
|
|
|
|
install -D -m0640 ${cfg.package}/server/solr/solr.xml "${cfg.stateDir}/data/solr.xml" |
|
|
|
|
install -D -m0640 ${cfg.package}/server/solr/zoo.cfg "${cfg.stateDir}/data/zoo.cfg" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if ! test -e "${cfg.stateDir}/log4j2.xml"; then |
|
|
|
|
install -D -m0640 ${cfg.package}/server/resources/log4j2.xml "${cfg.stateDir}/log4j2.xml" |
|
|
|
|
fi |
|
|
|
|
''; |
|
|
|
|
|
|
|
|
|
serviceConfig = { |
|
|
|
|
User = cfg.user; |
|
|
|
|
Group = cfg.group; |
|
|
|
|
ExecStart="${cfg.package}/bin/solr start -f -a \"${concatStringsSep " " cfg.extraJavaOptions}\""; |
|
|
|
|
ExecStop="${cfg.package}/bin/solr stop"; |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
users.users = optionalAttrs (cfg.user == "solr") (singleton |
|
|
|
|
{ name = "solr"; |
|
|
|
|
group = cfg.group; |
|
|
|
|
home = cfg.stateDir; |
|
|
|
|
createHome = true; |
|
|
|
|
uid = config.ids.uids.solr; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
users.groups = optionalAttrs (cfg.group == "solr") (singleton |
|
|
|
|
{ name = "solr"; |
|
|
|
|
gid = config.ids.gids.solr; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|