home/modules/systemd-tmpfiles: vendor tmpfiles module from nixpkgs

This commit is contained in:
Oystein Kristoffer Tveit 2025-04-03 18:37:06 +02:00
parent cfd3f364a3
commit c2398ba93b
Signed by: oysteikt
GPG Key ID: 9F2F7D8250F35146
3 changed files with 170 additions and 0 deletions

@ -152,6 +152,7 @@
newsboat = ./home/modules/programs/newsboat;
mpd-auto-updater = ./home/modules/services/mpd.nix;
cargo = ./home/modules/programs/cargo;
systemd-tmpfiles = ./home/modules/systemd-tmpfiles.nix;
};
homeConfigurations = {

@ -50,6 +50,7 @@ in {
./modules/colors.nix
./modules/shellAliases.nix
./modules/uidGid.nix
./modules/systemd-tmpfiles.nix
./modules/programs/cargo
./modules/programs/gpg
./modules/programs/neovim/auto-clean-swapfiles.nix

@ -0,0 +1,168 @@
# Taken from nixpkgs: nixos/modules/system/boot/systemd/tmpfiles.nix
{ config, pkgs, lib, unstable-pkgs, ... }:
let
# TODO: 24.05, year of the types.attrsWith
inherit (unstable-pkgs.lib) types mkOption;
cfg = config.systemd.user.tmpfiles;
attrsWith' =
placeholder: elemType:
types.attrsWith {
inherit elemType;
inherit (lib) placeholder;
};
escapeArgument = lib.strings.escapeC [
"\t"
"\n"
"\r"
" "
"\\"
];
settingsOption = {
description = ''
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 = attrsWith' "config-name" (
attrsWith' "path" (
attrsWith' "tmpfiles-type" (
lib.types.submodule (
{ name, config, ... }:
{
options.type = mkOption {
type = types.str;
default = name;
defaultText = "tmpfiles-type";
example = "d";
description = ''
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:
{manpage}`tmpfiles.d(5)`
'';
};
options.mode = mkOption {
type = types.str;
default = "-";
example = "0755";
description = ''
The file access mode to use when creating this file or directory.
'';
};
options.user = mkOption {
type = types.str;
default = "-";
example = "root";
description = ''
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 = ''
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 = ''
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 = ''
An argument whose meaning depends on the type of operation.
Please see the upstream documentation for the meaning of this
parameter in different situations:
{manpage}`tmpfiles.d(5)`
'';
};
}
)
)
)
);
};
# generates a single entry for a tmpfiles.d rule
settingsEntryToRule = path: entry: ''
'${entry.type}' '${path}' '${entry.mode}' '${entry.user}' '${entry.group}' '${entry.age}' ${escapeArgument entry.argument}
'';
# generates a list of tmpfiles.d rules from the attrs (paths) under tmpfiles.settings.<name>
pathsToRules = lib.mapAttrsToList (
path: types: lib.concatStrings (lib.mapAttrsToList (_type: settingsEntryToRule path) types)
);
mkRuleFileContent = paths: lib.concatStrings (pathsToRules paths);
in
{
options.systemd.user.tmpfiles.settings = lib.mkOption settingsOption;
config = lib.mkIf (cfg.settings != { }) {
assertions = [
(lib.hm.assertions.assertPlatform "systemd.user.tmpfiles" pkgs
lib.platforms.linux)
];
xdg.configFile = {
"systemd/user/basic.target.wants/systemd-tmpfiles-setup.service".source =
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-setup.service";
"systemd/user/systemd-tmpfiles-setup.service".source =
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-setup.service";
"systemd/user/timers.target.wants/systemd-tmpfiles-clean.timer".source =
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-clean.timer";
"systemd/user/systemd-tmpfiles-clean.service".source =
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-clean.service";
} // (lib.mapAttrs' (name: paths: {
name = "user-tmpfiles.d/${name}.conf";
value = {
text = mkRuleFileContent paths;
onChange = "${pkgs.systemd}/bin/systemd-tmpfiles --user --create";
};
}) cfg.settings);
};
}