diff --git a/home/modules/fish/default.nix b/home/modules/fish/default.nix index e1f9572b..9b835f79 100644 --- a/home/modules/fish/default.nix +++ b/home/modules/fish/default.nix @@ -133,33 +133,6 @@ in { ns = "nix shell nixpkgs#"; } - # Impermanence - # TODO: Those should be a single script to be called with the search path (/ or /home/christoph or just .) - (let - fdIgnoreHome = "fdignore-home"; - fdIgnoreRoot = "fdignore-root"; - - cmdHome = "sudo fd --one-file-system --base-directory /home/${username} --type f --hidden --ignore-file /home/${username}/.config/impermanence/${fdIgnoreHome}"; - cmdRoot = "sudo fd --one-file-system --base-directory / --type f --hidden --ignore-file /home/${username}/.config/impermanence/${fdIgnoreRoot}"; - - fzfHome = "sudo fzf --preview 'bat --color=always --theme=ansi --style=numbers --line-range=:100 {}'"; - fzfRoot = "sudo fzf --preview 'bat --color=always --theme=ansi --style=numbers --line-range=:100 /{}'"; - - mvHome = "mkdir -p /persist/home/${username}/$(dirname {}) && mv {} /persist/home/${username}/$(dirname {})"; - mvRoot = "sudo mkdir -p /persist/$(dirname {}) && sudo mv {} /persist/$(dirname {})"; - - header = "--header 'Press CTRL-R to reload, CTRL-M to move, CTRL-F to ignore file'"; - - ignoreFileHome = "echo '{}' >> /home/${username}/.config/impermanence/${fdIgnoreHome}"; - ignoreFileRoot = "echo '{}' >> /home/${username}/.config/impermanence/${fdIgnoreRoot}"; - - bindHome = "--bind 'ctrl-r:reload(${cmdHome}),ctrl-m:execute(${mvHome}),ctrl-f:execute(${ignoreFileHome})'"; - bindRoot = "--bind 'ctrl-r:reload(${cmdRoot}),ctrl-m:execute(${mvRoot}),ctrl-f:execute(${ignoreFileRoot})'"; - in { - newhome = ''${cmdHome} | ${fzfHome} ${header} ${bindHome}''; - newroot = ''${cmdRoot} | ${fzfRoot} ${header} ${bindRoot}''; - }) - # Abbrs only available if package is installed (abbrify pkgs.duf { @@ -211,6 +184,8 @@ in { # grep = rg; }) + (lib.optionalAttrs config.modules.rmpc.enable {r = "rcmp";}) + (abbrify pkgs.rsync rec { rsync = "rsync -ahv --inplace --partial --info=progress2"; copy = rsync; diff --git a/system/modules/impermanence/default.nix b/system/modules/impermanence/default.nix index 8ce5ef02..8498d7ac 100644 --- a/system/modules/impermanence/default.nix +++ b/system/modules/impermanence/default.nix @@ -38,15 +38,17 @@ in { # group = config.users.users.${user}.group; # }; }; + + mkRDir = mkDir "root"; + mkRFile = mkFile "root"; + mkUDir = mkDir "${username}"; + mkUFile = mkFile "${username}"; in lib.mkIf impermanence.enable { - environment.persistence."/persist" = let - mkRDir = mkDir "root"; - mkRFile = mkFile "root"; - mkUDir = mkDir "${username}"; - mkUFile = mkFile "${username}"; - in { - hideMounts = true; # Sets x-gvfs-hide option + # TODO: Create options to allow host-specific impermanence setup + # inside the respective modules + environment.persistence."/persist" = { + hideMounts = false; # Sets x-gvfs-hide option files = [ (mkRFile "/etc/adjtime" m644) @@ -155,14 +157,57 @@ in { }; }; - # NOTE: This is REQUIRED for HM activation! Otherwise the home directory won't be writable! + # Add some helper scripts to identify files that might need persisting + environment.systemPackages = let + base = { + "root" = "/"; + "home" = "/home/${username}"; + }; + ignore = { + "root" = "/home/${username}/.config/impermanence/fdignore-root"; + "home" = "/home/${username}/.config/impermanence/fdignore-home"; + }; + move = { + "root" = "/persist/$(dirname {})"; + "home" = "/persist/home/${username}/$(dirname {})"; + }; + + mkHeader = "Press CTRL-R to reload, CTRL-M to move, CTRL-I to ignore file"; + mkPreview = mode: "bat --color=always --theme=ansi --style=numbers --line-range=:100 ${base.${mode}}/{}"; + mkReload = mode: "sudo fd --one-file-system --type f --hidden --base-directory ${base.${mode}} --ignore-file ${ignore.${mode}}"; + mkIgnore = mode: "echo '{}' >> ${ignore.${mode}}"; + mkMove = mode: "sudo mkdir -p ${move.${mode}} && sudo mv {} ${move.${mode}}"; + + mkScript = mode: '' + sudo ${mkReload mode} | \ + sudo fzf \ + --header "${mkHeader}" \ + --preview "${mkPreview mode}" \ + --bind "ctrl-r:reload:(${mkReload mode})" \ + --bind "ctrl-i:execute:(${mkIgnore mode})" \ + --bind "ctrl-m:execute:(${mkMove mode})" + ''; + + newroot = pkgs.writeShellScriptBin "newroot" (mkScript "root"); + newhome = pkgs.writeShellScriptBin "newhome" (mkScript "home"); + in [ + newroot + newhome + ]; + + # NOTE: This is REQUIRED for HM activation! + # Otherwise the home directory won't be writable! systemd.services."impermanence-fix-home-ownership" = let homeDir = "/home/${username}"; - homeUser = builtins.toString config.users.users.${username}.uid; - homeGroup = builtins.toString config.users.groups.${config.users.users.${username}.group}.gid; + homeUser = + builtins.toString + config.users.users.${username}.uid; + homeGroup = + builtins.toString + config.users.groups.${config.users.users.${username}.group}.gid; in { description = "Fix impermanent home ownership"; - wantedBy = ["home-manager-${username}.service"]; # Required for HM activation + wantedBy = ["home-manager-${username}.service"]; before = ["home-manager-${username}.service"]; after = ["home.mount"]; partOf = ["home.mount"]; @@ -201,21 +246,18 @@ in { backupDuration = "7"; # Days mountDir = "/btrfs_tmp"; persistDir = "${mountDir}/persist"; - - homeUser = builtins.toString config.users.users.${username}.uid; - homeGroup = builtins.toString config.users.groups.${config.users.users.${username}.group}.gid; in { description = "Clean impermanent btrfs subvolumes"; wantedBy = ["initrd.target"]; - # after = ["dev-mapper-crypted.device"]; after = ["systemd-cryptsetup@crypted.service"]; before = ["sysroot.mount"]; unitConfig.DefaultDependencies = "no"; serviceConfig.Type = "oneshot"; - # path = ["/bin" config.system.build.extraUtils pkgs.coreutils-full]; - # NOTE: If any single line of this script fails, the entire system might be bricked - # NixOS automatically sets "-e", so if unlucky, the subvolumes won'e exist for mounting + # NOTE: If any single line of this script fails + # the entire system might be bricked. + # NixOS automatically sets "-e", so if unlucky, + # the subvolumes won'e exist for mounting... script = let mvSubvolToPersist = subvol: '' if [[ -e ${mountDir}/${subvol} ]]; then @@ -239,6 +281,7 @@ in { fi ''; + # TODO: This fails and bricks the system deleteOldBackups = subvol: '' for old_${subvol} in $(find ${persistDir}/old_${subvol}s/ -maxdepth 1 -mtime +${backupDuration}); do delete_subvolume_recursively "$old_${subvol}"