nixos/ssh: use correct executable for grep in ssh-askpass-wrapper (#373746)
[NixPkgs.git] / nixos / modules / system / boot / systemd / sysupdate.nix
blobdff4a6066ec0e4dc03149b9a24d3963c2219f2bd
2   config,
3   lib,
4   pkgs,
5   utils,
6   ...
7 }:
9 let
10   cfg = config.systemd.sysupdate;
12   format = pkgs.formats.ini { listToValue = toString; };
14   definitionsDirectory = utils.systemdUtils.lib.definitions "sysupdate.d" format cfg.transfers;
17   options.systemd.sysupdate = {
19     enable = lib.mkEnableOption "systemd-sysupdate" // {
20       description = ''
21         Atomically update the host OS, container images, portable service
22         images or other sources.
24         If enabled, updates are triggered in regular intervals via a
25         `systemd.timer` unit.
27         Please see
28         <https://www.freedesktop.org/software/systemd/man/systemd-sysupdate.html>
29         for more details.
30       '';
31     };
33     timerConfig = utils.systemdUtils.unitOptions.timerOptions.options.timerConfig // {
34       default = { };
35       description = ''
36         The timer configuration for performing the update.
38         By default, the upstream configuration is used:
39         <https://github.com/systemd/systemd/blob/main/units/systemd-sysupdate.timer>
40       '';
41     };
43     reboot = {
44       enable = lib.mkEnableOption "automatically rebooting after an update" // {
45         description = ''
46           Whether to automatically reboot after an update.
48           If set to `true`, the system will automatically reboot via a
49           `systemd.timer` unit but only after a new version was installed.
51           This uses a unit completely separate from the one performing the
52           update because it is typically advisable to download updates
53           regularly while the system is up, but delay reboots until the
54           appropriate time (i.e. typically at night).
56           Set this to `false` if you do not want to reboot after an update. This
57           is useful when you update a container image or another source where
58           rebooting is not necessary in order to finalize the update.
59         '';
60       };
62       timerConfig = utils.systemdUtils.unitOptions.timerOptions.options.timerConfig // {
63         default = { };
64         description = ''
65           The timer configuration for rebooting after an update.
67           By default, the upstream configuration is used:
68           <https://github.com/systemd/systemd/blob/main/units/systemd-sysupdate-reboot.timer>
69         '';
70       };
71     };
73     transfers = lib.mkOption {
74       type = with lib.types; attrsOf format.type;
75       default = { };
76       example = {
77         "10-uki" = {
78           Transfer = {
79             ProtectVersion = "%A";
80           };
82           Source = {
83             Type = "url-file";
84             Path = "https://download.example.com/";
85             MatchPattern = [
86               "nixos_@v+@l-@d.efi"
87               "nixos_@v+@l.efi"
88               "nixos_@v.efi"
89             ];
90           };
92           Target = {
93             Type = "regular-file";
94             Path = "/EFI/Linux";
95             PathRelativeTo = "boot";
96             MatchPattern = ''
97               nixos_@v+@l-@d.efi"; \
98               nixos_@v+@l.efi \
99               nixos_@v.efi
100             '';
101             Mode = "0444";
102             TriesLeft = 3;
103             TriesDone = 0;
104             InstancesMax = 2;
105           };
106         };
107       };
108       description = ''
109         Specify transfers as a set of the names of the transfer files as the
110         key and the configuration as its value. The configuration can use all
111         upstream options. See
112         <https://www.freedesktop.org/software/systemd/man/sysupdate.d.html>
113         for all available options.
114       '';
115     };
117   };
119   config = lib.mkIf cfg.enable {
121     systemd.additionalUpstreamSystemUnits = [
122       "systemd-sysupdate.service"
123       "systemd-sysupdate.timer"
124       "systemd-sysupdate-reboot.service"
125       "systemd-sysupdate-reboot.timer"
126     ];
128     systemd.timers = {
129       "systemd-sysupdate" = {
130         wantedBy = [ "timers.target" ];
131         timerConfig = cfg.timerConfig;
132       };
133       "systemd-sysupdate-reboot" = lib.mkIf cfg.reboot.enable {
134         wantedBy = [ "timers.target" ];
135         timerConfig = cfg.reboot.timerConfig;
136       };
137     };
139     environment.etc."sysupdate.d".source = definitionsDirectory;
140   };
142   meta.maintainers = with lib.maintainers; [ nikstur ];