silx: 2.1.1 -> 2.1.2 (#361612)
[NixPkgs.git] / nixos / modules / services / misc / zookeeper.nix
blobfc06d56b0d5a82998e941f81f1c209413ab9c92e
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.zookeeper;
5   zookeeperConfig = ''
6     dataDir=${cfg.dataDir}
7     clientPort=${toString cfg.port}
8     autopurge.purgeInterval=${toString cfg.purgeInterval}
9     ${cfg.extraConf}
10     ${cfg.servers}
11   '';
13   configDir = pkgs.buildEnv {
14     name = "zookeeper-conf";
15     paths = [
16       (pkgs.writeTextDir "zoo.cfg" zookeeperConfig)
17       (pkgs.writeTextDir "log4j.properties" cfg.logging)
18     ];
19   };
21 in {
23   options.services.zookeeper = {
24     enable = lib.mkEnableOption "Zookeeper";
26     port = lib.mkOption {
27       description = "Zookeeper Client port.";
28       default = 2181;
29       type = lib.types.port;
30     };
32     id = lib.mkOption {
33       description = "Zookeeper ID.";
34       default = 0;
35       type = lib.types.int;
36     };
38     purgeInterval = lib.mkOption {
39       description = ''
40         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.
41       '';
42       default = 1;
43       type = lib.types.int;
44     };
46     extraConf = lib.mkOption {
47       description = "Extra configuration for Zookeeper.";
48       type = lib.types.lines;
49       default = ''
50         initLimit=5
51         syncLimit=2
52         tickTime=2000
53       '';
54     };
56     servers = lib.mkOption {
57       description = "All Zookeeper Servers.";
58       default = "";
59       type = lib.types.lines;
60       example = ''
61         server.0=host0:2888:3888
62         server.1=host1:2888:3888
63         server.2=host2:2888:3888
64       '';
65     };
67     logging = lib.mkOption {
68       description = "Zookeeper logging configuration.";
69       default = ''
70         zookeeper.root.logger=INFO, CONSOLE
71         log4j.rootLogger=INFO, CONSOLE
72         log4j.logger.org.apache.zookeeper.audit.Log4jAuditLogger=INFO, CONSOLE
73         log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
74         log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
75         log4j.appender.CONSOLE.layout.ConversionPattern=[myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n
76       '';
77       type = lib.types.lines;
78     };
80     dataDir = lib.mkOption {
81       type = lib.types.path;
82       default = "/var/lib/zookeeper";
83       description = ''
84         Data directory for Zookeeper
85       '';
86     };
88     extraCmdLineOptions = lib.mkOption {
89       description = "Extra command line options for the Zookeeper launcher.";
90       default = [ "-Dcom.sun.management.jmxremote" "-Dcom.sun.management.jmxremote.local.only=true" ];
91       type = lib.types.listOf lib.types.str;
92       example = [ "-Djava.net.preferIPv4Stack=true" "-Dcom.sun.management.jmxremote" "-Dcom.sun.management.jmxremote.local.only=true" ];
93     };
95     preferIPv4 = lib.mkOption {
96       type = lib.types.bool;
97       default = true;
98       description = ''
99         Add the -Djava.net.preferIPv4Stack=true flag to the Zookeeper server.
100       '';
101     };
103     package = lib.mkPackageOption pkgs "zookeeper" { };
105     jre = lib.mkOption {
106       description = "The JRE with which to run Zookeeper";
107       default = cfg.package.jre;
108       defaultText = lib.literalExpression "pkgs.zookeeper.jre";
109       example = lib.literalExpression "pkgs.jre";
110       type = lib.types.package;
111     };
112   };
115   config = lib.mkIf cfg.enable {
116     environment.systemPackages = [cfg.package];
118     systemd.tmpfiles.rules = [
119       "d '${cfg.dataDir}' 0700 zookeeper - - -"
120       "Z '${cfg.dataDir}' 0700 zookeeper - - -"
121     ];
123     systemd.services.zookeeper = {
124       description = "Zookeeper Daemon";
125       wantedBy = [ "multi-user.target" ];
126       after = [ "network.target" ];
127       serviceConfig = {
128         ExecStart = ''
129           ${cfg.jre}/bin/java \
130             -cp "${cfg.package}/lib/*:${configDir}" \
131             ${lib.escapeShellArgs cfg.extraCmdLineOptions} \
132             -Dzookeeper.datadir.autocreate=false \
133             ${lib.optionalString cfg.preferIPv4 "-Djava.net.preferIPv4Stack=true"} \
134             org.apache.zookeeper.server.quorum.QuorumPeerMain \
135             ${configDir}/zoo.cfg
136         '';
137         User = "zookeeper";
138       };
139       preStart = ''
140         echo "${toString cfg.id}" > ${cfg.dataDir}/myid
141         mkdir -p ${cfg.dataDir}/version-2
142       '';
143     };
145     users.users.zookeeper = {
146       isSystemUser = true;
147       group = "zookeeper";
148       description = "Zookeeper daemon user";
149       home = cfg.dataDir;
150     };
151     users.groups.zookeeper = {};
152   };