77 lines
2 KiB
Nix
77 lines
2 KiB
Nix
![]() |
{
|
||
|
config,
|
||
|
pkgs,
|
||
|
lib,
|
||
|
...
|
||
|
}: let
|
||
|
inherit (lib) mkOption mkEnableOption types;
|
||
|
|
||
|
cfg = config.services.transience;
|
||
|
in {
|
||
|
meta.maintainers = [lib.maintainers.NotAShelf];
|
||
|
options.services.transience = {
|
||
|
enable = mkEnableOption "transience";
|
||
|
|
||
|
user = mkOption {
|
||
|
type = with types; nullOr string;
|
||
|
default = null;
|
||
|
description = "The user that the directories will be relative to";
|
||
|
};
|
||
|
|
||
|
days = mkOption {
|
||
|
type = types.int;
|
||
|
default = 30;
|
||
|
description = "Number of days after which files are deleted";
|
||
|
};
|
||
|
|
||
|
directories = mkOption {
|
||
|
type = with types; listOf path;
|
||
|
default = [];
|
||
|
description = ''
|
||
|
A list of directories that will be cleaned.
|
||
|
|
||
|
Must be relative to the user's home directory.
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config = {
|
||
|
assertions = [
|
||
|
{
|
||
|
assertion = cfg.enable -> cfg.user == null;
|
||
|
message = ''
|
||
|
You have enabled services.transience, but have not specified your user. You must specify a "main user"
|
||
|
for your system for Transience to work properly.
|
||
|
'';
|
||
|
}
|
||
|
{
|
||
|
assertion = cfg.directories == [];
|
||
|
message = ''
|
||
|
You have enabled services.transience, but have not specified any directories to clean up. Please specify
|
||
|
at least one folder. This option defaults to an empty list, but you must specify a list of directories for
|
||
|
Transience to work properly.
|
||
|
'';
|
||
|
}
|
||
|
];
|
||
|
|
||
|
systemd.user.services.transience = let
|
||
|
dirs =
|
||
|
map (
|
||
|
x:
|
||
|
config.home-manager.users.${cfg.user}.home.homeDirectory + "/" + x
|
||
|
)
|
||
|
cfg.directories;
|
||
|
in {
|
||
|
Install.wantedBy = ["default.target"];
|
||
|
Service.ExecStart = ''
|
||
|
${builtins.concatStringsSep "\n" (map (x: "find ${
|
||
|
lib.escapeShellArg x
|
||
|
} -mtime +${cfg.days} -exec rm -rv {} + -depth;")
|
||
|
dirs)}
|
||
|
'';
|
||
|
|
||
|
Unit.Description = "Clean up transient directories";
|
||
|
};
|
||
|
};
|
||
|
}
|