X-Git-Url: http://git.scottworley.com/nix-profile-gc/blobdiff_plain/390cc7d4f2d0dae9a7e50cba5e1a8c17782c5fc5..1f910c8b63eaecd0043615db59bcb0c27410da1b:/modules/profile-gc.nix diff --git a/modules/profile-gc.nix b/modules/profile-gc.nix index 6963264..bc6eb5a 100644 --- a/modules/profile-gc.nix +++ b/modules/profile-gc.nix @@ -22,10 +22,28 @@ let parsed=$(systemd-analyze timespan ${escapeShellArg duration} | awk '$1 == "μs:" { print $2 }') echo "$parsed" > "$out" ''; + gather_home_profiles = '' + while read -r home_dir;do + home_profile_dir="$home_dir/.local/state/nix/profiles" + if [[ -d "$home_profile_dir" ]];then + home_profile_dirs+=( "$home_profile_dir" ) + fi + done < <(${pkgs.coreutils}/bin/cut -d: -f6 /etc/passwd | ${pkgs.coreutils}/bin/sort -u) + ''; in { options = { nix.profile-gc = { enable = lib.mkEnableOption "Automatic profile garbage collection"; + monitorHomeProfiles = lib.mkOption { + description = "Monitor profiles in users' $HOME/.local/state/nix/profiles/"; + type = lib.types.bool; + default = true; + }; + manageHomeProfiles = lib.mkOption { + description = "Manage profiles in users' $HOME/.local/state/nix/profiles/"; + type = lib.types.bool; + default = false; # Will flip to true later + }; dryRun = lib.mkOption { description = "Say what would have been deleted rather than actually deleting profiles"; type = lib.types.bool; @@ -107,6 +125,10 @@ in { assertion = cfg.enable -> config.nix.gc.automatic; message = ''nix.profile-gc.enable requires nix.gc.automatic''; } + { + assertion = cfg.manageHomeProfiles -> cfg.monitorHomeProfiles; + message = ''nix.profile-gc.manageHomeProfiles requires nix.profile-gc.monitorHomeProfiles''; + } ]; systemd.services.nix-gc.serviceConfig.ExecStartPre = pkgs.writeShellScript "nix-profile-gc" '' set -euo pipefail @@ -160,6 +182,9 @@ in { verbose_topn ${cfg.logdir}/active-boot "" ${escapeShellArg cfg.keepLastActiveBoot } ) + home_profile_dirs=() + ${lib.optionalString cfg.manageHomeProfiles gather_home_profiles} + now=$(${pkgs.coreutils}/bin/date +%s) age_threshold="$(< ${parse-duration cfg.keepLatest})" while read -r profile;do @@ -209,7 +234,7 @@ in { rm "$p" ''} done - done < <(${pkgs.findutils}/bin/find "''${NIX_STATE_DIR:-/nix/var/nix}/profiles/" -type l -not -name '*[0-9]-link') + done < <(${pkgs.findutils}/bin/find "''${NIX_STATE_DIR:-/nix/var/nix}/profiles/" "''${home_profile_dirs[@]}" -type l -not -name '*[0-9]-link') ''; systemd.timers.profile-gc-log-active = { wantedBy = [ "timers.target" ]; @@ -221,10 +246,13 @@ in { "Log the active profiles for gc collection policy evaluation"; serviceConfig.Type = "oneshot"; script = '' + home_profile_dirs=() + ${lib.optionalString cfg.monitorHomeProfiles gather_home_profiles} + ${pkgs.coreutils}/bin/mkdir -p ${cfg.logdir} ${pkgs.coreutils}/bin/readlink /run/current-system >> ${cfg.logdir}/active-system ${pkgs.coreutils}/bin/readlink /run/booted-system >> ${cfg.logdir}/active-boot - ${pkgs.findutils}/bin/find ''${NIX_STATE_DIR:-/nix/var/nix}/profiles/ \ + ${pkgs.findutils}/bin/find ''${NIX_STATE_DIR:-/nix/var/nix}/profiles/ "''${home_profile_dirs[@]}" \ -type l -not -name '*[0-9]-link' \ -exec ${pkgs.stdenv.shell} -c ' for f;do