parent
ea7c412368
commit
ac90177cb1
@ -0,0 +1,145 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.services.zookeeper; |
||||
|
||||
zookeeperConfig = '' |
||||
dataDir=${cfg.dataDir} |
||||
clientPort=${toString cfg.port} |
||||
autopurge.purgeInterval=${toString cfg.purgeInterval} |
||||
${cfg.extraConf} |
||||
${cfg.servers} |
||||
''; |
||||
|
||||
configDir = pkgs.buildEnv { |
||||
name = "zookeeper-conf"; |
||||
paths = [ |
||||
(pkgs.writeTextDir "zoo.cfg" zookeeperConfig) |
||||
(pkgs.writeTextDir "log4j.properties" cfg.logging) |
||||
]; |
||||
}; |
||||
|
||||
in { |
||||
|
||||
options.services.zookeeper = { |
||||
enable = mkOption { |
||||
description = "Whether to enable Zookeeper."; |
||||
default = false; |
||||
type = types.uniq types.bool; |
||||
}; |
||||
|
||||
port = mkOption { |
||||
description = "Zookeeper Client port."; |
||||
default = 2181; |
||||
type = types.int; |
||||
}; |
||||
|
||||
id = mkOption { |
||||
description = "Zookeeper ID."; |
||||
default = 0; |
||||
type = types.int; |
||||
}; |
||||
|
||||
purgeInterval = mkOption { |
||||
description = '' |
||||
The time interval in hours for which the purge task has to be triggered. Set to a positive integer (1 and above) to enable the auto purging. |
||||
''; |
||||
default = 1; |
||||
type = types.int; |
||||
}; |
||||
|
||||
extraConf = mkOption { |
||||
description = "Extra configuration for Zookeeper."; |
||||
type = types.lines; |
||||
default = '' |
||||
initLimit=5 |
||||
syncLimit=2 |
||||
tickTime=2000 |
||||
''; |
||||
}; |
||||
|
||||
servers = mkOption { |
||||
description = "All Zookeeper Servers."; |
||||
default = ""; |
||||
type = types.lines; |
||||
example = '' |
||||
server.0=host0:2888:3888 |
||||
server.1=host1:2888:3888 |
||||
server.2=host2:2888:3888 |
||||
''; |
||||
}; |
||||
|
||||
logging = mkOption { |
||||
description = "Zookeeper logging configuration."; |
||||
default = '' |
||||
zookeeper.root.logger=INFO, CONSOLE |
||||
log4j.rootLogger=INFO, CONSOLE |
||||
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender |
||||
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout |
||||
log4j.appender.CONSOLE.layout.ConversionPattern=[myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n |
||||
''; |
||||
type = types.lines; |
||||
}; |
||||
|
||||
dataDir = mkOption { |
||||
type = types.path; |
||||
default = "/var/lib/zookeeper"; |
||||
description = '' |
||||
Data directory for Zookeeper |
||||
''; |
||||
}; |
||||
|
||||
extraCmdLineOptions = mkOption { |
||||
description = "Extra command line options for the Zookeeper launcher."; |
||||
default = [ "-Dcom.sun.management.jmxremote" "-Dcom.sun.management.jmxremote.local.only=true" ]; |
||||
type = types.listOf types.string; |
||||
example = [ "-Djava.net.preferIPv4Stack=true" "-Dcom.sun.management.jmxremote" "-Dcom.sun.management.jmxremote.local.only=true" ]; |
||||
}; |
||||
|
||||
preferIPv4 = mkOption { |
||||
type = types.bool; |
||||
default = true; |
||||
description = '' |
||||
Add the -Djava.net.preferIPv4Stack=true flag to the Zookeeper server. |
||||
''; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
|
||||
config = mkIf cfg.enable { |
||||
systemd.services.zookeeper = { |
||||
description = "Zookeeper Daemon"; |
||||
wantedBy = [ "multi-user.target" ]; |
||||
after = [ "network-interfaces.target" ]; |
||||
environment = { ZOOCFGDIR = configDir; }; |
||||
serviceConfig = { |
||||
ExecStart = '' |
||||
${pkgs.jre}/bin/java \ |
||||
-cp "${pkgs.zookeeper}/lib/*:${pkgs.zookeeper}/${pkgs.zookeeper.name}.jar:${configDir}" \ |
||||
${toString cfg.extraCmdLineOptions} \ |
||||
-Dzookeeper.datadir.autocreate=false \ |
||||
${optionalString cfg.preferIPv4 "-Djava.net.preferIPv4Stack=true"} \ |
||||
org.apache.zookeeper.server.quorum.QuorumPeerMain \ |
||||
${configDir}/zoo.cfg |
||||
''; |
||||
User = "zookeeper"; |
||||
PermissionsStartOnly = true; |
||||
}; |
||||
preStart = '' |
||||
mkdir -m 0700 -p ${cfg.dataDir} |
||||
if [ "$(id -u)" = 0 ]; then chown zookeeper ${cfg.dataDir}; fi |
||||
echo "${toString cfg.id}" > ${cfg.dataDir}/myid |
||||
''; |
||||
}; |
||||
|
||||
users.extraUsers = singleton { |
||||
name = "zookeeper"; |
||||
uid = config.ids.uids.zookeeper; |
||||
description = "Zookeeper daemon user"; |
||||
home = cfg.dataDir; |
||||
}; |
||||
}; |
||||
} |
@ -0,0 +1,36 @@ |
||||
{ stdenv, fetchurl, jre, makeWrapper, bash }: |
||||
|
||||
stdenv.mkDerivation rec { |
||||
name = "zookeeper-3.4.6"; |
||||
|
||||
src = fetchurl { |
||||
url = "mirror://apache/zookeeper/${name}/${name}.tar.gz"; |
||||
sha256 = "01b3938547cd620dc4c93efe07c0360411f4a66962a70500b163b59014046994"; |
||||
}; |
||||
|
||||
buildInputs = [ makeWrapper jre ]; |
||||
|
||||
phases = ["unpackPhase" "installPhase"]; |
||||
|
||||
installPhase = '' |
||||
mkdir -p $out |
||||
cp -R conf docs lib ${name}.jar $out |
||||
mkdir -p $out/bin |
||||
cp -R bin/{zkCli,zkCleanup,zkEnv}.sh $out/bin |
||||
for i in $out/bin/{zkCli,zkCleanup}.sh; do |
||||
wrapProgram $i \ |
||||
--set JAVA_HOME "${jre}" \ |
||||
--prefix PATH : "${bash}/bin" |
||||
done |
||||
chmod -x $out/bin/zkEnv.sh |
||||
''; |
||||
|
||||
meta = with stdenv.lib; { |
||||
homepage = "http://zookeeper.apache.org"; |
||||
description = "Apache Zookeeper"; |
||||
license = licenses.asl20; |
||||
maintainers = [ maintainers.nathan-gs ]; |
||||
platforms = platforms.unix; |
||||
}; |
||||
|
||||
} |
Loading…
Reference in new issue