| 
									
										
										
										
											2014-05-05 14:58:51 -04:00
										 |  |  | { config, pkgs, lib, ... }: | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 14:58:51 -04:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cfg = config.services.rsyncd; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |   motdFile = builtins.toFile "rsyncd-motd" cfg.motd; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-21 19:14:03 +01:00
										 |  |  |   foreach = attrs: f: | 
					
						
							|  |  |  |     concatStringsSep "\n" (mapAttrsToList f attrs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cfgFile = ''
 | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |     ${optionalString (cfg.motd != "") "motd file = ${motdFile}"} | 
					
						
							|  |  |  |     ${optionalString (cfg.address != "") "address = ${cfg.address}"} | 
					
						
							|  |  |  |     ${optionalString (cfg.port != 873) "port = ${toString cfg.port}"} | 
					
						
							|  |  |  |     ${cfg.extraConfig} | 
					
						
							| 
									
										
										
										
											2017-07-21 19:14:03 +01:00
										 |  |  |     ${foreach cfg.modules (name: module: ''
 | 
					
						
							|  |  |  |       [${name}] | 
					
						
							|  |  |  |       ${foreach module (k: v: | 
					
						
							|  |  |  |         "${k} = ${v}" | 
					
						
							|  |  |  |       )} | 
					
						
							|  |  |  |     '')}
 | 
					
						
							|  |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   options = { | 
					
						
							|  |  |  |     services.rsyncd = { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 20:05:26 +02:00
										 |  |  |       enable = mkEnableOption "the rsync daemon"; | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       motd = mkOption { | 
					
						
							| 
									
										
										
										
											2019-08-08 22:48:27 +02:00
										 |  |  |         type = types.str; | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |         default = ""; | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |         description = ''
 | 
					
						
							|  |  |  |           Message of the day to display to clients on each connect. | 
					
						
							|  |  |  |           This usually contains site information and any legal notices. | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       port = mkOption { | 
					
						
							|  |  |  |         default = 873; | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |         type = types.int; | 
					
						
							|  |  |  |         description = "TCP port the daemon will listen on."; | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       address = mkOption { | 
					
						
							|  |  |  |         default = ""; | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |         example = "192.168.1.2"; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           IP address the daemon will listen on; rsyncd will listen on | 
					
						
							|  |  |  |           all addresses if this is not specified. | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       extraConfig = mkOption { | 
					
						
							|  |  |  |         type = types.lines; | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |         default = ""; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |             Lines of configuration to add to rsyncd globally. | 
					
						
							|  |  |  |             See <command>man rsyncd.conf</command> for options. | 
					
						
							|  |  |  |           '';
 | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       modules = mkOption { | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |         default = {}; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |             A set describing exported directories. | 
					
						
							|  |  |  |             See <command>man rsyncd.conf</command> for options. | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         type = types.attrsOf (types.attrsOf types.str); | 
					
						
							| 
									
										
										
										
											2020-04-02 07:39:04 +02:00
										 |  |  |         example = literalExample ''
 | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  |           { srv = | 
					
						
							|  |  |  |              { path = "/srv"; | 
					
						
							|  |  |  |                "read only" = "yes"; | 
					
						
							|  |  |  |                comment = "Public rsync share."; | 
					
						
							|  |  |  |              }; | 
					
						
							| 
									
										
										
										
											2020-04-02 07:39:04 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2014-12-07 15:42:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-21 20:15:27 +01:00
										 |  |  |       user = mkOption { | 
					
						
							|  |  |  |         type = types.str; | 
					
						
							|  |  |  |         default = "root"; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           The user to run the daemon as. | 
					
						
							|  |  |  |           By default the daemon runs as root. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       group = mkOption { | 
					
						
							|  |  |  |         type = types.str; | 
					
						
							|  |  |  |         default = "root"; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           The group to run the daemon as. | 
					
						
							|  |  |  |           By default the daemon runs as root. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### implementation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = mkIf cfg.enable { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-21 19:14:03 +01:00
										 |  |  |     environment.etc."rsyncd.conf".text = cfgFile; | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     systemd.services.rsyncd = { | 
					
						
							|  |  |  |       description = "Rsync daemon"; | 
					
						
							|  |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							| 
									
										
										
										
											2017-07-21 19:14:21 +01:00
										 |  |  |       restartTriggers = [ config.environment.etc."rsyncd.conf".source ]; | 
					
						
							| 
									
										
										
										
											2017-07-21 20:15:27 +01:00
										 |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         ExecStart = "${pkgs.rsync}/bin/rsync --daemon --no-detach"; | 
					
						
							|  |  |  |         User = cfg.user; | 
					
						
							|  |  |  |         Group = cfg.group; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2014-04-11 07:35:06 -04:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2014-05-05 14:58:51 -04:00
										 |  |  | } |