 478e7184f8
			
		
	
	
		478e7184f8
		
			
		
	
	
	
	
		
			
			And replace them with a more appropriate type Also fix up some minor module problems along the way
		
			
				
	
	
		
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, pkgs, lib, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
| 
 | |
|   cfg = config.services.rsyncd;
 | |
| 
 | |
|   motdFile = builtins.toFile "rsyncd-motd" cfg.motd;
 | |
| 
 | |
|   foreach = attrs: f:
 | |
|     concatStringsSep "\n" (mapAttrsToList f attrs);
 | |
| 
 | |
|   cfgFile = ''
 | |
|     ${optionalString (cfg.motd != "") "motd file = ${motdFile}"}
 | |
|     ${optionalString (cfg.address != "") "address = ${cfg.address}"}
 | |
|     ${optionalString (cfg.port != 873) "port = ${toString cfg.port}"}
 | |
|     ${cfg.extraConfig}
 | |
|     ${foreach cfg.modules (name: module: ''
 | |
|       [${name}]
 | |
|       ${foreach module (k: v:
 | |
|         "${k} = ${v}"
 | |
|       )}
 | |
|     '')}
 | |
|   '';
 | |
| in
 | |
| 
 | |
| {
 | |
|   options = {
 | |
|     services.rsyncd = {
 | |
| 
 | |
|       enable = mkOption {
 | |
|         default = false;
 | |
|         description = "Whether to enable the rsync daemon.";
 | |
|       };
 | |
| 
 | |
|       motd = mkOption {
 | |
|         type = types.str;
 | |
|         default = "";
 | |
|         description = ''
 | |
|           Message of the day to display to clients on each connect.
 | |
|           This usually contains site information and any legal notices.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       port = mkOption {
 | |
|         default = 873;
 | |
|         type = types.int;
 | |
|         description = "TCP port the daemon will listen on.";
 | |
|       };
 | |
| 
 | |
|       address = mkOption {
 | |
|         default = "";
 | |
|         example = "192.168.1.2";
 | |
|         description = ''
 | |
|           IP address the daemon will listen on; rsyncd will listen on
 | |
|           all addresses if this is not specified.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       extraConfig = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = ''
 | |
|             Lines of configuration to add to rsyncd globally.
 | |
|             See <command>man rsyncd.conf</command> for options.
 | |
|           '';
 | |
|       };
 | |
| 
 | |
|       modules = mkOption {
 | |
|         default = {};
 | |
|         description = ''
 | |
|             A set describing exported directories.
 | |
|             See <command>man rsyncd.conf</command> for options.
 | |
|           '';
 | |
|         type = types.attrsOf (types.attrsOf types.str);
 | |
|         example =
 | |
|           { srv =
 | |
|              { path = "/srv";
 | |
|                "read only" = "yes";
 | |
|                comment = "Public rsync share.";
 | |
|              };
 | |
|           };
 | |
|       };
 | |
| 
 | |
|       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.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   ###### implementation
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
| 
 | |
|     environment.etc."rsyncd.conf".text = cfgFile;
 | |
| 
 | |
|     systemd.services.rsyncd = {
 | |
|       description = "Rsync daemon";
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       restartTriggers = [ config.environment.etc."rsyncd.conf".source ];
 | |
|       serviceConfig = {
 | |
|         ExecStart = "${pkgs.rsync}/bin/rsync --daemon --no-detach";
 | |
|         User = cfg.user;
 | |
|         Group = cfg.group;
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| }
 |