1{ config, pkgs, lib, ... }: 2 3with lib; 4 5let 6 cfg = config.services.confd; 7 8 confdConfig = '' 9 backend = "${cfg.backend}" 10 confdir = "${cfg.confDir}" 11 interval = ${toString cfg.interval} 12 nodes = [ ${concatMapStringsSep "," (s: ''"${s}"'') cfg.nodes}, ] 13 prefix = "${cfg.prefix}" 14 log-level = "${cfg.logLevel}" 15 watch = ${if cfg.watch then "true" else "false"} 16 ''; 17 18in { 19 options.services.confd = { 20 enable = mkEnableOption "confd service"; 21 22 backend = mkOption { 23 description = "Confd config storage backend to use."; 24 default = "etcd"; 25 type = types.enum ["etcd" "consul" "redis" "zookeeper"]; 26 }; 27 28 interval = mkOption { 29 description = "Confd check interval."; 30 default = 10; 31 type = types.int; 32 }; 33 34 nodes = mkOption { 35 description = "Confd list of nodes to connect to."; 36 default = [ "http://127.0.0.1:4001" ]; 37 type = types.listOf types.str; 38 }; 39 40 watch = mkOption { 41 description = "Confd, whether to watch etcd config for changes."; 42 default = true; 43 type = types.bool; 44 }; 45 46 prefix = mkOption { 47 description = "The string to prefix to keys."; 48 default = "/"; 49 type = types.path; 50 }; 51 52 logLevel = mkOption { 53 description = "Confd log level."; 54 default = "info"; 55 type = types.enum ["info" "debug"]; 56 }; 57 58 confDir = mkOption { 59 description = "The path to the confd configs."; 60 default = "/etc/confd"; 61 type = types.path; 62 }; 63 64 package = mkOption { 65 description = "Confd package to use."; 66 default = pkgs.confd; 67 defaultText = "pkgs.confd"; 68 type = types.package; 69 }; 70 }; 71 72 config = mkIf cfg.enable { 73 systemd.services.confd = { 74 description = "Confd Service."; 75 wantedBy = [ "multi-user.target" ]; 76 after = [ "network.target" ]; 77 serviceConfig = { 78 ExecStart = "${cfg.package}/bin/confd"; 79 }; 80 }; 81 82 environment.etc = { 83 "confd/confd.toml".text = confdConfig; 84 }; 85 86 environment.systemPackages = [ cfg.package ]; 87 88 services.etcd.enable = mkIf (cfg.backend == "etcd") (mkDefault true); 89 }; 90}