146 lines
3.9 KiB
Nix
Executable file
146 lines
3.9 KiB
Nix
Executable file
{ 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;
|
|
};
|
|
};
|
|
}
|