{ config, lib, ... }: { options.mj.base.snapshot = { enable = lib.mkEnableOption "Enable zfs snapshots"; mountpoints = lib.mkOption { default = { }; type = with lib.types; listOf str; }; }; config = lib.mkIf config.mj.base.snapshot.enable { services.sanoid = { enable = true; templates.prod = { hourly = 24; daily = 7; autosnap = true; autoprune = true; }; extraArgs = [ "--verbose" ]; datasets = let fs_zfs = lib.filterAttrs (_: v: v.fsType == "zfs") config.fileSystems; mountpoint2fs = builtins.listToAttrs ( map (mountpoint: { name = mountpoint; value = builtins.getAttr mountpoint fs_zfs; }) config.mj.base.snapshot.mountpoints ); s_datasets = lib.mapAttrs' (_mountpoint: fs: { name = fs.device; value = { use_template = [ "prod" ]; }; }) mountpoint2fs; in s_datasets; }; }; }