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