feat: refactored impermanence to be enableable for users on a system

This commit is contained in:
Leyla Becker 2025-10-13 09:36:48 -05:00
parent 337f03b4e7
commit 6d5a07e08f
31 changed files with 61 additions and 56 deletions

View file

@ -1,10 +1,9 @@
{ {
lib, lib,
config, config,
osConfig,
... ...
}: { }: {
config = lib.mkIf osConfig.host.impermanence.enable { config = lib.mkIf (config.impermanence.enable) {
home.persistence."/persist/home/leyla" = { home.persistence."/persist/home/leyla" = {
directories = [ directories = [
"desktop" "desktop"

View file

@ -5,6 +5,7 @@
./user.nix ./user.nix
./flipperzero.nix ./flipperzero.nix
./i18n.nix ./i18n.nix
./impermanence.nix
./openssh.nix ./openssh.nix
./gnome.nix ./gnome.nix
./programs ./programs

View file

@ -0,0 +1,31 @@
{
config,
lib,
osConfig,
...
}: let
cfg = config.impermanence;
in {
options.impermanence = {
enable = lib.mkEnableOption "impermanence for home directory";
};
config = lib.mkMerge [
(lib.mkIf config.impermanence.enable {
assertions = [
{
assertion = osConfig.impermanence.enable;
message = "impermanence can not be enabled for a user when it is not enabled for a configuration";
}
];
})
(lib.mkIf osConfig.host.impermanence.enable {
# If impermanence is not enabled for this user but system impermanence is enabled,
# persist the entire home directory as fallback
home.persistence."/persist/home/${config.home.username}" = lib.mkIf (!cfg.enable) {
directories = ["."];
allowOther = true;
};
})
];
}

View file

@ -95,7 +95,7 @@
); );
} }
) )
(lib.mkIf osConfig.host.impermanence.enable { (lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
files = lib.lists.flatten ( files = lib.lists.flatten (
builtins.map (hostKey: [".ssh/${hostKey.path}" ".ssh/${hostKey.path}.pub"]) config.programs.openssh.hostKeys builtins.map (hostKey: [".ssh/${hostKey.path}" ".ssh/${hostKey.path}.pub"]) config.programs.openssh.hostKeys

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.bitwarden = { options.programs.bitwarden = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/Bitwarden" "${config.xdg.configHome}/Bitwarden"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.bruno = { options.programs.bruno = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/bruno/" "${config.xdg.configHome}/bruno/"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.calibre = { options.programs.calibre = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/calibre" "${config.xdg.configHome}/calibre"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.davinci-resolve = { options.programs.davinci-resolve = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.dataHome}/DaVinciResolve" "${config.xdg.dataHome}/DaVinciResolve"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.dbeaver-bin = { options.programs.dbeaver-bin = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.dataHome}/DBeaverData/" "${config.xdg.dataHome}/DBeaverData/"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.discord = { options.programs.discord = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/discord/" "${config.xdg.configHome}/discord/"

View file

@ -1,7 +1,6 @@
{ {
lib, lib,
config, config,
osConfig,
... ...
}: let }: let
buildProfilePersistence = profile: { buildProfilePersistence = profile: {
@ -26,7 +25,7 @@
allowOther = true; allowOther = true;
}; };
in { in {
config = lib.mkIf (config.programs.firefox.enable && osConfig.host.impermanence.enable) { config = lib.mkIf (config.programs.firefox.enable && config.impermanence.enable) {
home.persistence."/persist${config.home.homeDirectory}" = lib.mkMerge ( home.persistence."/persist${config.home.homeDirectory}" = lib.mkMerge (
( (
lib.attrsets.mapAttrsToList lib.attrsets.mapAttrsToList

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.freecad = { options.programs.freecad = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/FreeCAD" "${config.xdg.configHome}/FreeCAD"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.gimp = { options.programs.gimp = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/GIMP" "${config.xdg.configHome}/GIMP"

View file

@ -16,7 +16,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
# configuration # configuration

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.inkscape = { options.programs.inkscape = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/inkscape" "${config.xdg.configHome}/inkscape"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.krita = { options.programs.krita = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/kritarc" "${config.xdg.configHome}/kritarc"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.libreoffice = { options.programs.libreoffice = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/libreoffice" "${config.xdg.configHome}/libreoffice"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.makemkv = { options.programs.makemkv = {
@ -30,7 +29,7 @@
home.file.".MakeMKV/settings.conf".source = config.lib.file.mkOutOfStoreSymlink config.sops.templates."MakeMKV.settings.conf".path; home.file.".MakeMKV/settings.conf".source = config.lib.file.mkOutOfStoreSymlink config.sops.templates."MakeMKV.settings.conf".path;
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
".MakeMKV" ".MakeMKV"

View file

@ -1,12 +1,11 @@
{ {
lib, lib,
config, config,
osConfig,
... ...
}: { }: {
config = lib.mkIf config.programs.obs-studio.enable (lib.mkMerge [ config = lib.mkIf config.programs.obs-studio.enable (lib.mkMerge [
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
# TODO: map impermanence for obs # TODO: map impermanence for obs
} }
) )

View file

@ -1,12 +1,11 @@
{ {
lib, lib,
config, config,
osConfig,
... ...
}: { }: {
config = lib.mkIf config.programs.obsidian.enable (lib.mkMerge [ config = lib.mkIf config.programs.obsidian.enable (lib.mkMerge [
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/obsidian" "${config.xdg.configHome}/obsidian"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.picard = { options.programs.picard = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/MusicBrainz" "${config.xdg.configHome}/MusicBrainz"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.polycule = { options.programs.polycule = {
@ -17,7 +16,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
# TODO: check that these are actually the correct folders # TODO: check that these are actually the correct folders
# directories = [ # directories = [

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.prostudiomasters = { options.programs.prostudiomasters = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/ProStudioMasters" "${config.xdg.configHome}/ProStudioMasters"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.protonvpn-gui = { options.programs.protonvpn-gui = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/protonvpn" "${config.xdg.configHome}/protonvpn"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.qbittorrent = { options.programs.qbittorrent = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/qBittorrent" "${config.xdg.configHome}/qBittorrent"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.qflipper = { options.programs.qflipper = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/qFlipper" "${config.xdg.configHome}/qFlipper"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.signal-desktop-bin = { options.programs.signal-desktop-bin = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/Signal" "${config.xdg.configHome}/Signal"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.steam = { options.programs.steam = {
@ -18,7 +17,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
{ {

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.tor-browser = { options.programs.tor-browser = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.dataHome}/torbrowser" "${config.xdg.dataHome}/torbrowser"

View file

@ -2,7 +2,6 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: { }: {
options.programs.ungoogled-chromium = { options.programs.ungoogled-chromium = {
@ -16,7 +15,7 @@
]; ];
} }
( (
lib.mkIf osConfig.host.impermanence.enable { lib.mkIf config.impermanence.enable {
home.persistence."/persist${config.home.homeDirectory}" = { home.persistence."/persist${config.home.homeDirectory}" = {
directories = [ directories = [
"${config.xdg.configHome}/chromium" "${config.xdg.configHome}/chromium"

View file

@ -1,10 +1,9 @@
{ {
lib, lib,
config, config,
osConfig,
... ...
}: { }: {
config = lib.mkIf (config.services.panoramax.enable && osConfig.host.impermanence.enable) { config = lib.mkIf (config.services.panoramax.enable && config.host.impermanence.enable) {
# TODO: configure impermanence for panoramax data # TODO: configure impermanence for panoramax data
# This would typically include directories like: # This would typically include directories like:
# - /var/lib/panoramax # - /var/lib/panoramax