nixos/README.md: relax the requirement of providing option defaults (#334509)
[NixPkgs.git] / nixos / modules / system / boot / timesyncd.nix
bloba2a544bf982927d66718c87e3fc0c3d7dbe9e31e
1 { config, lib, ... }:
3 with lib;
5 let
6   cfg = config.services.timesyncd;
7 in
10   options = {
12     services.timesyncd = with types; {
13       enable = mkOption {
14         default = !config.boot.isContainer;
15         defaultText = literalExpression "!config.boot.isContainer";
16         type = bool;
17         description = ''
18           Enables the systemd NTP client daemon.
19         '';
20       };
21       servers = mkOption {
22         default = null;
23         type = nullOr (listOf str);
24         description = ''
25           The set of NTP servers from which to synchronise.
27           Setting this option to an empty list will write `NTP=` to the
28           `timesyncd.conf` file as opposed to setting this option to null which
29           will remove `NTP=` entirely.
31           See man:timesyncd.conf(5) for details.
32         '';
33       };
34       fallbackServers = mkOption {
35         default = config.networking.timeServers;
36         defaultText = literalExpression "config.networking.timeServers";
37         type = nullOr (listOf str);
38         description = ''
39           The set of fallback NTP servers from which to synchronise.
41           Setting this option to an empty list will write `FallbackNTP=` to the
42           `timesyncd.conf` file as opposed to setting this option to null which
43           will remove `FallbackNTP=` entirely.
45           See man:timesyncd.conf(5) for details.
46         '';
47       };
48       extraConfig = mkOption {
49         default = "";
50         type = lines;
51         example = ''
52           PollIntervalMaxSec=180
53         '';
54         description = ''
55           Extra config options for systemd-timesyncd. See
56           [
57           timesyncd.conf(5)](https://www.freedesktop.org/software/systemd/man/timesyncd.conf.html) for available options.
58         '';
59       };
60     };
61   };
63   config = mkIf cfg.enable {
65     systemd.additionalUpstreamSystemUnits = [ "systemd-timesyncd.service" ];
67     systemd.services.systemd-timesyncd = {
68       wantedBy = [ "sysinit.target" ];
69       aliases = [ "dbus-org.freedesktop.timesync1.service" ];
70       restartTriggers = [ config.environment.etc."systemd/timesyncd.conf".source ];
71       # systemd-timesyncd disables DNSSEC validation in the nss-resolve module by setting SYSTEMD_NSS_RESOLVE_VALIDATE to 0 in the unit file.
72       # This is required in order to solve the chicken-and-egg problem when DNSSEC validation needs the correct time to work, but to set the
73       # correct time, we need to connect to an NTP server, which usually requires resolving its hostname.
74       # In order for nss-resolve to be able to read this environment variable we patch systemd-timesyncd to disable NSCD and use NSS modules directly.
75       # This means that systemd-timesyncd needs to have NSS modules path in LD_LIBRARY_PATH. When systemd-resolved is disabled we still need to set
76       # NSS module path so that systemd-timesyncd keeps using other NSS modules that are configured in the system.
77       environment.LD_LIBRARY_PATH = config.system.nssModules.path;
79       preStart = (
80         # Ensure that we have some stored time to prevent
81         # systemd-timesyncd to resort back to the fallback time.  If
82         # the file doesn't exist we assume that our current system
83         # clock is good enough to provide an initial value.
84         ''
85           if ! [ -f /var/lib/systemd/timesync/clock ]; then
86             test -d /var/lib/systemd/timesync || mkdir -p /var/lib/systemd/timesync
87             touch /var/lib/systemd/timesync/clock
88           fi
89         ''
90         +
91           # workaround an issue of systemd-timesyncd not starting due to upstream systemd reverting their dynamic users changes
92           #  - https://github.com/NixOS/nixpkgs/pull/61321#issuecomment-492423742
93           #  - https://github.com/systemd/systemd/issues/12131
94           (lib.optionalString (versionOlder config.system.stateVersion "19.09") ''
95             if [ -L /var/lib/systemd/timesync ]; then
96               rm /var/lib/systemd/timesync
97               mv /var/lib/private/systemd/timesync /var/lib/systemd/timesync
98             fi
99           '')
100       );
101     };
103     environment.etc."systemd/timesyncd.conf".text =
104       ''
105         [Time]
106       ''
107       + optionalString (cfg.servers != null) ''
108         NTP=${concatStringsSep " " cfg.servers}
109       ''
110       + optionalString (cfg.fallbackServers != null) ''
111         FallbackNTP=${concatStringsSep " " cfg.fallbackServers}
112       ''
113       + cfg.extraConfig;
115     users.users.systemd-timesync = {
116       uid = config.ids.uids.systemd-timesync;
117       group = "systemd-timesync";
118     };
119     users.groups.systemd-timesync.gid = config.ids.gids.systemd-timesync;
120   };