{ 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; }; } ]; }