# Requires boot.initrd.enable = true and boot.initrd.systemd.enable = true! { config, lib, pkgs, ... }: with lib; let cfg = config.sydnix.impermanence; in { options = { sydnix.impermanence = { enable = mkOption { description = "Enable Impermanence"; type = types.bool; default = false; }; directories = mkOption { description = ""; type = with types; listOf anything; default = []; }; files = mkOption { description = ""; type = with types; listOf anything; default = []; }; rollbackTo = mkOption { type = types.str; }; archiveTo = mkOption { type = types.str; default = "/persist/previous/home"; }; dataset = mkOption { type = types.str; }; archiveLimit = mkOption { type = types.ints.positive; default = 3; }; }; }; config = mkIf cfg.enable { boot.initrd.systemd.initrdBin = with pkgs; [ zfs ]; boot.initrd.systemd.services.erase-darlings = let service = { description = "Rollback filesystem to a blank state on boot"; wantedBy = [ "initrd.target" ]; after = [ # "zfs-import.service" "zfs-import-rpool.service" ]; before = [ "sysroot.mount" ]; path = [ pkgs.zfs ]; unitConfig.DefaultDependencies = "no"; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; script = /* bash */ '' zfs rollback -r rpool/local/root@blank \ && echo ">> >> rollback complete << <<" ''; }; in if config.boot.initrd.systemd.enable then service else throw "sydnix.impermanence currently requires config.boot.initrd.systemd.enable'!"; systemd.services.erase-home-darlings = { description = "Rollback home to a blank state on boot"; wantedBy = [ "multi-user.target" ]; after = [ "home.mount" ]; path = [ pkgs.zfs pkgs.babashka ]; # unitConfig.DefaultDependencies = "no"; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; ExecStart = let script = ./erase-home-darlings.clj; in ''${pkgs.babashka}/bin/bb "${script}" -n "${toString cfg.archiveLimit}" --dataset "${cfg.dataset}" --rollback-to "${cfg.rollbackTo}"''; }; stopIfChanged = false; restartIfChanged = false; }; environment.persistence."/persist" = { directories = cfg.directories; files = cfg.files; }; }; }