nixos/systemd-tmpfiles: add settings option

DavHau cae154a6 2caca43d

Changed files
+107 -1
nixos
modules
system
boot
systemd
tests
+103 -1
nixos/modules/system/boot/systemd/tmpfiles.nix
···
'';
};
systemd.tmpfiles.packages = mkOption {
type = types.listOf types.package;
default = [];
···
${concatStringsSep "\n" cfg.rules}
'';
})
-
];
systemd.tmpfiles.rules = [
"d /nix/var 0755 root root - -"
···
'';
};
+
systemd.tmpfiles.settings = mkOption {
+
description = lib.mdDoc ''
+
Declare systemd-tmpfiles rules to create, delete, and clean up volatile
+
and temporary files and directories.
+
+
Even though the service is called `*tmp*files` you can also create
+
persistent files.
+
'';
+
example = {
+
"10-mypackage" = {
+
"/var/lib/my-service/statefolder".d = {
+
mode = "0755";
+
user = "root";
+
group = "root";
+
};
+
};
+
};
+
default = {};
+
type = types.attrsOf (types.attrsOf (types.attrsOf (types.submodule ({ name, config, ... }: {
+
options.type = mkOption {
+
type = types.str;
+
default = name;
+
example = "d";
+
description = lib.mdDoc ''
+
The type of operation to perform on the file.
+
+
The type consists of a single letter and optionally one or more
+
modifier characters.
+
+
Please see the upstream documentation for the available types and
+
more details:
+
<https://www.freedesktop.org/software/systemd/man/tmpfiles.d>
+
'';
+
};
+
options.mode = mkOption {
+
type = types.str;
+
default = "-";
+
example = "0755";
+
description = lib.mdDoc ''
+
The file access mode to use when creating this file or directory.
+
'';
+
};
+
options.user = mkOption {
+
type = types.str;
+
default = "-";
+
example = "root";
+
description = lib.mdDoc ''
+
The user of the file.
+
+
This may either be a numeric ID or a user/group name.
+
+
If omitted or when set to `"-"`, the user and group of the user who
+
invokes systemd-tmpfiles is used.
+
'';
+
};
+
options.group = mkOption {
+
type = types.str;
+
default = "-";
+
example = "root";
+
description = lib.mdDoc ''
+
The group of the file.
+
+
This may either be a numeric ID or a user/group name.
+
+
If omitted or when set to `"-"`, the user and group of the user who
+
invokes systemd-tmpfiles is used.
+
'';
+
};
+
options.age = mkOption {
+
type = types.str;
+
default = "-";
+
example = "10d";
+
description = lib.mdDoc ''
+
Delete a file when it reaches a certain age.
+
+
If a file or directory is older than the current time minus the age
+
field, it is deleted.
+
+
If set to `"-"` no automatic clean-up is done.
+
'';
+
};
+
options.argument = mkOption {
+
type = types.str;
+
default = "";
+
example = "";
+
description = lib.mdDoc ''
+
An argument whose meaning depends on the type of operation.
+
+
Please see the upstream documentation for the meaning of this
+
parameter in different situations:
+
<https://www.freedesktop.org/software/systemd/man/tmpfiles.d>
+
'';
+
};
+
}))));
+
};
+
systemd.tmpfiles.packages = mkOption {
type = types.listOf types.package;
default = [];
···
${concatStringsSep "\n" cfg.rules}
'';
})
+
] ++ (mapAttrsToList (name: paths:
+
pkgs.writeTextDir "lib/tmpfiles.d/${name}.conf" (concatStrings (mapAttrsToList (path: types:
+
concatStrings (mapAttrsToList (_type: entry: ''
+
'${entry.type}' '${path}' '${entry.mode}' '${entry.user}' '${entry.group}' '${entry.age}' ${entry.argument}
+
'') types)
+
) paths ))
+
) cfg.settings);
systemd.tmpfiles.rules = [
"d /nix/var 0755 root root - -"
+4
nixos/tests/misc.nix
···
environment.variables.EDITOR = lib.mkOverride 0 "emacs";
documentation.nixos.enable = lib.mkOverride 0 true;
systemd.tmpfiles.rules = [ "d /tmp 1777 root root 10d" ];
virtualisation.fileSystems = { "/tmp2" =
{ fsType = "tmpfs";
options = [ "mode=1777" "noauto" ];
···
"systemctl start systemd-tmpfiles-clean",
)
machine.fail("[ -e /tmp/foo ]")
with subtest("whether automounting works"):
machine.fail("grep '/tmp2 tmpfs' /proc/mounts")
···
environment.variables.EDITOR = lib.mkOverride 0 "emacs";
documentation.nixos.enable = lib.mkOverride 0 true;
systemd.tmpfiles.rules = [ "d /tmp 1777 root root 10d" ];
+
systemd.tmpfiles.settings."10-test"."/tmp/somefile".d = {};
virtualisation.fileSystems = { "/tmp2" =
{ fsType = "tmpfs";
options = [ "mode=1777" "noauto" ];
···
"systemctl start systemd-tmpfiles-clean",
)
machine.fail("[ -e /tmp/foo ]")
+
+
with subtest("whether systemd-tmpfiles settings works"):
+
machine.succeed("[ -e /tmp/somefile ]")
with subtest("whether automounting works"):
machine.fail("grep '/tmp2 tmpfs' /proc/mounts")