{ config, tmpLib, pkgs, lib, ... }:
let
inherit (tmpLib) mkTmpFile;
tmpFiles = lib.lists.filter (file: file.enable) config.tmpfiles.files;
in {
options = {
tmpfiles = {
selfManagement = {
enable = lib.mkEnableOption "tmpfiles self management";
targetDir = lib.mkOption {
type = lib.types.str;
};
configurationPackage = lib.mkOption {
type = lib.types.package;
description = ''
This package contains the tmpfiles configuration package
'';
};
};
defaultUser = lib.mkOption {
type = lib.types.nullOr lib.types.str;
};
defaultGroup = lib.mkOption {
type = lib.types.nullOr lib.types.str;
};
files = lib.mkOption {
type = lib.types.listOf tmpLib.tmpFileType;
default = [];
description = ''
The files to configure.
'';
};
configurationFileLines = lib.mkOption {
type = lib.types.listOf lib.types.str;
};
configurationPackage = lib.mkOption {
type = lib.types.package;
description = ''
This package contains the tmpfiles configuration package
'';
};
activationPackage = lib.mkOption {
type = lib.types.package;
description = ''
This package contains a script for activation of the tmp files using `systemd-tmpfiles`
'';
};
};
};
config = lib.mkMerge [
(lib.mkIf config.tmpfiles.selfManagement.enable {
tmpfiles.selfManagement.configurationPackage = pkgs.writeTextFile {
name = "99-tmpactivator.conf";
destination = "/share/user-tmpfiles.d/99-tmpactivator.conf";
text = ''
L+ ${config.tmpfiles.selfManagement.targetDir}/100-tmpactivator-files.conf - - - - ${config.tmpfiles.configurationPackage}/share/user-tmpfiles.d/100-tmpactivator-files.conf
r ${config.tmpfiles.selfManagement.targetDir}/100-tmpactivator-files.conf - - - - -
'';
};
tmpfiles.activationPackage = pkgs.symlinkJoin {
name = "tmpfiles-activation";
paths = [
(pkgs.writeShellScriptBin "activate" ''
systemd-tmpfiles --create "${config.tmpfiles.selfManagement.configurationPackage}/share/user-tmpfiles.d/99-tmpactivator.conf"
systemd-tmpfiles --create "${config.tmpfiles.configurationPackage}/share/user-tmpfiles.d/100-tmpactivator-files.conf"
'')
(pkgs.writeShellScriptBin "deactivate" ''
systemd-tmpfiles --remove "${config.tmpfiles.configurationPackage}/share/user-tmpfiles.d/100-tmpactivator-files.conf"
systemd-tmpfiles --remove "${config.tmpfiles.selfManagement.configurationPackage}/share/user-tmpfiles.d/99-tmpactivator.conf"
'')
config.tmpfiles.configurationPackage
config.tmpfiles.selfManagement.configurationPackage
];
};
})
(lib.mkIf (!config.tmpfiles.selfManagement.enable) {
tmpfiles.activationPackage = pkgs.symlinkJoin {
name = "tmpfiles-activation";
paths = [
(pkgs.writeShellScriptBin "activate" ''
systemd-tmpfiles --create "${config.tmpfiles.configurationPackage}/share/user-tmpfiles.d/100-tmpactivator-files.conf"
'')
(pkgs.writeShellScriptBin "deactivate" ''
systemd-tmpfiles --remove "${config.tmpfiles.configurationPackage}/share/user-tmpfiles.d/100-tmpactivator-files.conf"
'')
config.tmpfiles.configurationPackage
];
};
})
{
# assertions = builtins.map
# (file: {
# assertion = file.source == null || file.text == null;
# message = "Either text or source can be set, not both.";
# })
# tmpFiles;
#
tmpfiles.configurationFileLines = builtins.map (file: (tmpLib.mkTmpFile ({
type = file.type;
target = file.target;
mode = file.mode;
user = if file.user == null then config.tmpfiles.defaultUser else file.user;
group = if file.group == null then config.tmpfiles.defaultGroup else file.group;
contents = if file.source != null then file.source else file.text;
}))) tmpFiles;
tmpfiles.configurationPackage = pkgs.writeTextFile {
name = "100-tmpactivator-files.conf";
destination = "/share/user-tmpfiles.d/100-tmpactivator-files.conf";
text = lib.concatStringsSep "\n" config.tmpfiles.configurationFileLines;
};
}
];
}