nixos-config/modules/environment/user-impermanence.nix
Charlotte 🦝 Delenk 1e7d2808cb
All checks were successful
Hydra nixosConfigurations.container-default-x86_64-linux Hydra build #23366 of nixos-config:pr618:nixosConfigurations.container-default-x86_64-linux
Hydra nixosConfigurations.container-default-aarch64-linux Hydra build #23364 of nixos-config:pr618:nixosConfigurations.container-default-aarch64-linux
Hydra nixosConfigurations.container-default-riscv64-linux Hydra build #23365 of nixos-config:pr618:nixosConfigurations.container-default-riscv64-linux
Hydra nixosConfigurations.not522 Hydra build #23367 of nixos-config:pr618:nixosConfigurations.not522
Hydra checks.x86_64-linux.containers-default Hydra build #23363 of nixos-config:pr618:checks.x86_64-linux.containers-default
Hydra nixosConfigurations.not522-installer Hydra build #23368 of nixos-config:pr618:nixosConfigurations.not522-installer
fix eval
2024-11-03 13:32:18 +01:00

86 lines
2.6 KiB
Nix

{
config,
lib,
pkgs,
inTester,
...
}:
with lib; {
options = {
environment.impermanence.users = mkOption {
description = "Which users to clean up the home directory for";
default = [];
type = types.listOf types.str;
};
};
config = mkIf (config.environment.impermanence.enable && config.environment.impermanence.users != []) {
home-manager.users = listToAttrs (map (name: {
inherit name;
value.home.persistence.default = {
persistentStoragePath = "/persistent/home/${name}";
};
})
config.environment.impermanence.users);
systemd.services = listToAttrs (flatten (map (name: let
cfg = config.users.users.${name};
in [
{
name = "cleanup-home-${name}";
description = "Clean home directory for ${name}";
value = {
wantedBy = [
"user@${toString cfg.uid}.service"
];
before = [
"user@${toString cfg.uid}.service"
"home-manager-${name}.service"
];
partOf = [
"user@${toString cfg.uid}.service"
];
serviceConfig.Type = "oneshot";
script = ''
if [[ -e ${cfg.home} ]]; then
timestamp=$(date --date="@$(stat -c %X ${cfg.home})" "+%Y-%m-%d_%H:%M:%S")
mkdir -p /persistent/old-homedirs/${name}
mv ${cfg.home} /persistent/old-homedirs/${name}/$timestamp
fi
delete_subvolume_recursively() {
IFS=$'\n'
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
delete_subvolume_recursively "/persistent/old-homedirs/${name}/$i"
done
${pkgs.btrfs-progs}/bin/btrfs subvolume delete "$1"
}
for i in $(find /persistent/old-homedirs/${name} -maxdepth 1 -mtime +30); do
delete_subvolume_recursively "$i"
done
${pkgs.btrfs-progs}/bin/btrfs subvolume create ${cfg.home}
'';
};
}
{
name = "home-manager-${name}";
value = {
wantedBy = mkForce [
"user@${toString cfg.uid}.service"
];
after = [
"cleanup-home-${name}.service"
];
before = [
"user@${toString cfg.uid}.service"
];
partOf = [
"user@${toString cfg.uid}.service"
];
};
}
])
config.environment.impermanence.users));
};
}