| 
									
										
										
										
											2015-04-25 16:10:49 +02:00
										 |  |  | { config, pkgs, lib, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   cfg = config.services.confd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   confdConfig = ''
 | 
					
						
							|  |  |  |     backend = "${cfg.backend}" | 
					
						
							|  |  |  |     confdir = "${cfg.confDir}" | 
					
						
							|  |  |  |     interval = ${toString cfg.interval} | 
					
						
							|  |  |  |     nodes = [ ${concatMapStringsSep "," (s: ''"${s}"'') cfg.nodes}, ] | 
					
						
							|  |  |  |     prefix = "${cfg.prefix}" | 
					
						
							|  |  |  |     log-level = "${cfg.logLevel}" | 
					
						
							|  |  |  |     watch = ${if cfg.watch then "true" else "false"} | 
					
						
							|  |  |  |   '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | in { | 
					
						
							|  |  |  |   options.services.confd = { | 
					
						
							| 
									
										
										
										
											2015-06-21 18:19:46 +03:00
										 |  |  |     enable = mkEnableOption "confd service"; | 
					
						
							| 
									
										
										
										
											2015-04-25 16:10:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     backend = mkOption { | 
					
						
							|  |  |  |       description = "Confd config storage backend to use."; | 
					
						
							|  |  |  |       default = "etcd"; | 
					
						
							|  |  |  |       type = types.enum ["etcd" "consul" "redis" "zookeeper"]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     interval = mkOption { | 
					
						
							|  |  |  |       description = "Confd check interval."; | 
					
						
							|  |  |  |       default = 10; | 
					
						
							|  |  |  |       type = types.int; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     nodes = mkOption { | 
					
						
							|  |  |  |       description = "Confd list of nodes to connect to."; | 
					
						
							|  |  |  |       default = [ "http://127.0.0.1:4001" ]; | 
					
						
							|  |  |  |       type = types.listOf types.str; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     watch = mkOption { | 
					
						
							|  |  |  |       description = "Confd, whether to watch etcd config for changes."; | 
					
						
							|  |  |  |       default = true; | 
					
						
							|  |  |  |       type = types.bool; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     prefix = mkOption { | 
					
						
							|  |  |  |       description = "The string to prefix to keys."; | 
					
						
							|  |  |  |       default = "/"; | 
					
						
							|  |  |  |       type = types.path; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     logLevel = mkOption { | 
					
						
							|  |  |  |       description = "Confd log level."; | 
					
						
							|  |  |  |       default = "info"; | 
					
						
							|  |  |  |       type = types.enum ["info" "debug"]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     confDir = mkOption { | 
					
						
							|  |  |  |       description = "The path to the confd configs."; | 
					
						
							|  |  |  |       default = "/etc/confd"; | 
					
						
							|  |  |  |       type = types.path; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     package = mkOption { | 
					
						
							|  |  |  |       description = "Confd package to use."; | 
					
						
							| 
									
										
										
										
											2015-08-29 12:55:52 -07:00
										 |  |  |       default = pkgs.confd; | 
					
						
							| 
									
										
										
										
											2016-01-17 19:34:55 +01:00
										 |  |  |       defaultText = "pkgs.confd"; | 
					
						
							| 
									
										
										
										
											2015-04-25 16:10:49 +02:00
										 |  |  |       type = types.package; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = mkIf cfg.enable { | 
					
						
							|  |  |  |     systemd.services.confd = { | 
					
						
							|  |  |  |       description = "Confd Service."; | 
					
						
							|  |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |       after = [ "network.target" ]; | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							| 
									
										
										
										
											2016-06-13 23:32:16 +02:00
										 |  |  |         ExecStart = "${cfg.package.bin}/bin/confd"; | 
					
						
							| 
									
										
										
										
											2015-04-25 16:10:49 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     environment.etc = { | 
					
						
							|  |  |  |       "confd/confd.toml".text = confdConfig; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     environment.systemPackages = [ cfg.package ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     services.etcd.enable = mkIf (cfg.backend == "etcd") (mkDefault true); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |