python312Packages.yoda: 2.0.1 -> 2.0.2
[NixPkgs.git] / nixos / modules / services / network-filesystems / rsyncd.nix
blob93dc41c3c956e84bf6534ef05df40af67ecf6620
1 { config, pkgs, lib, ... }:
2 let
3   cfg = config.services.rsyncd;
4   settingsFormat = pkgs.formats.ini { };
5   configFile = settingsFormat.generate "rsyncd.conf" cfg.settings;
6 in {
7   options = {
8     services.rsyncd = {
10       enable = lib.mkEnableOption "the rsync daemon";
12       port = lib.mkOption {
13         default = 873;
14         type = lib.types.port;
15         description = "TCP port the daemon will listen on.";
16       };
18       settings = lib.mkOption {
19         inherit (settingsFormat) type;
20         default = { };
21         example = {
22           global = {
23             uid = "nobody";
24             gid = "nobody";
25             "use chroot" = true;
26             "max connections" = 4;
27           };
28           ftp = {
29             path = "/var/ftp/./pub";
30             comment = "whole ftp area";
31           };
32           cvs = {
33             path = "/data/cvs";
34             comment = "CVS repository (requires authentication)";
35             "auth users" = [ "tridge" "susan" ];
36             "secrets file" = "/etc/rsyncd.secrets";
37           };
38         };
39         description = ''
40           Configuration for rsyncd. See
41           {manpage}`rsyncd.conf(5)`.
42         '';
43       };
45       socketActivated = lib.mkOption {
46         default = false;
47         type = lib.types.bool;
48         description = "If enabled Rsync will be socket-activated rather than run persistently.";
49       };
51     };
52   };
54   imports = (map (option:
55     lib.mkRemovedOptionModule [ "services" "rsyncd" option ]
56     "This option was removed in favor of `services.rsyncd.settings`.") [
57       "address"
58       "extraConfig"
59       "motd"
60       "user"
61       "group"
62     ]);
64   config = lib.mkIf cfg.enable {
66     services.rsyncd.settings.global.port = toString cfg.port;
68     systemd = let
69       serviceConfigSecurity = {
70         ProtectSystem = "full";
71         PrivateDevices = "on";
72         NoNewPrivileges = "on";
73       };
74     in {
75       services.rsync = {
76         enable = !cfg.socketActivated;
77         aliases = [ "rsyncd.service" ];
79         description = "fast remote file copy program daemon";
80         after = [ "network.target" ];
81         documentation = [ "man:rsync(1)" "man:rsyncd.conf(5)" ];
83         serviceConfig = serviceConfigSecurity // {
84           ExecStart =
85             "${pkgs.rsync}/bin/rsync --daemon --no-detach --config=${configFile}";
86           RestartSec = 1;
87         };
89         wantedBy = [ "multi-user.target" ];
90       };
92       services."rsync@" = {
93         description = "fast remote file copy program daemon";
94         after = [ "network.target" ];
96         serviceConfig = serviceConfigSecurity // {
97           ExecStart = "${pkgs.rsync}/bin/rsync --daemon --config=${configFile}";
98           StandardInput = "socket";
99           StandardOutput = "inherit";
100           StandardError = "journal";
101         };
102       };
104       sockets.rsync = {
105         enable = cfg.socketActivated;
107         description = "socket for fast remote file copy program daemon";
108         conflicts = [ "rsync.service" ];
110         listenStreams = [ (toString cfg.port) ];
111         socketConfig.Accept = true;
113         wantedBy = [ "sockets.target" ];
114       };
115     };
117   };
119   meta.maintainers = with lib.maintainers; [ ehmry ];
121   # TODO: socket activated rsyncd